#twitch #api #request #auth-token #user #client-secret #channel

twitch-api-rs

使用 reqwest 的 twitch api(helix)的异步绑定

3 个不稳定版本

0.2.1 2021年2月1日
0.2.0 2021年2月1日
0.1.0 2020年10月19日

#1776 in Web 编程

每月 35 次下载
用于 twitch-clip-downloader

GPL-3.0-or-later

77KB
1.5K SLoC

Crates.io Docs.rs Gihub Actions Testing CI

注意:此库仅涵盖了我其他项目中关键路径上的三个 api,该 下载用户频道的所有剪辑。最终我希望达到 100% 的覆盖率,至少对于 应用程序端点

twitch-api

用于构建和发送请求到 twitch helix api 的 twitch crate。

Twitch API 参考

示例:获取创作者的前 20 个剪辑

要获取 Twitch API 中的剪辑列表,按直播者显示名称,有以下 4 个步骤。

  1. 获取应用程序 ClientId 和 ClientSecret 1
  2. 请求客户端流认证令牌
  3. 使用该令牌根据显示名称请求用户信息
  4. 使用该请求返回的 UserId 请求与其频道关联的剪辑列表。
use std::env;
use std::sync::Arc;

#[tokio::main]
async fn main() {
    use twitch_api_rs::prelude::*;
    use twitch_api_rs::auth::{ClientId, ClientSecret};

    let client_id: ClientId =
        env::var("TWITCH_API_RS_TEST_CLIENT_ID")
            .expect("Client Id environment variable not defined")
            .into();

    let client_secret: ClientSecret =
        env::var("TWITCH_API_RS_TEST_CLIENT_SECRET")
            .expect("Client Secret environment variable not defined")
            .into();

    // Make a reqwest client to send the requests, and wrap it in an arc so it
    // can be reused in multiple futures
    let client = Arc::new(reqwest::Client::new());

    use twitch_api_rs::auth::client_credentials::{
        ClientAuthRequest, ClientAuthResponse, ClientAuthToken,
    };

    // Get a client credentials (application) access token and wrap it in an arc
    // to be used across multiple tasks without repeating
    let auth_token: Arc<ClientAuthToken> = Arc::new(
        match ClientAuthRequest::builder()
            .set_client_id(client_id.clone())
            .set_client_secret(client_secret)
            .make_request(client.clone())
            .await {
                Ok(resp) => {
                    // Create the token from the token value provided by twitch and
                    // your client_id
                    ClientAuthToken::from_client(resp, client_id)
                }

                // Better error handling can be performed here by matching against
                // the type of this requests::RequestError. Elided for conciseness
                Err(e) => panic!("Could not complete auth request for reason {}", e),
            }
    );

    use twitch_api_rs::values::users::UserId;
    use twitch_api_rs::resource::users::get_users::*;

    let user_ids: Vec<UserId> =
        match GetUsersRequest::builder()
            .set_auth(auth_token.clone())
            .add_login("TheHoodlum12")
            .make_request(client.clone())
            .await {
                Ok(mut resp) => {
                    resp.users.into_iter().map(|i| i.id).collect()
                }

                Err(e) =>
                    panic!("Could not complete request for user by display name for reason {}", e),
            };

    use twitch_api_rs::resource::clips::ClipInfo;
    use twitch_api_rs::resource::clips::get_clips::*;
    use twitch_api_rs::values::clips::ClipTitle;

    for user_id in user_ids {
        let auth_token = auth_token.clone();
        let client = client.clone();

        tokio::spawn(async move {
            match GetClipsRequest::builder()
                .set_auth(auth_token)
                .set_broadcaster_id(user_id.clone())
                .make_request(client)
                .await {
                    Ok(resp) => {
                        // Print out the response
                        for clip in resp.clips {
                            eprintln!(
                                "Found clip for broadcaster {:?} titled {:?}",
                                &user_id, clip.title
                            );
                        }
                    }
                    Err(e) =>
                        panic!("Could not get clips for user {:?} for reason {}", user_id, e),
                }
        });
    }
}

1:如果您还没有这些,则需要登录到您的 Twitch 开发者控制台,创建一个新应用程序并记录下相关值。
您在此过程中获取的客户端密钥,如果您请求新的密钥,则立即失效,并且您在生成它的页面上离开后不会显示,因此请确保将其安全地记录下来。建议您将其视为密码。

测试

要运行集成测试,您需要使用来自 Twitch 开发者控制台 的有效值设置环境变量。

TWITCH_API_RS_TEST_CLIENT_ID=<client_id> /
TWITCH_API_RS_TEST_CLIENT_SECRET=<client_secret> /
cargo test -- --nocapture

如果您使用 cargo-make,则还可以将以下内容添加到您的 Makefile.toml

[tasks.test-env]
env = { "TWITCH_API_RS_TEST_CLIENT_ID" = "<client_id>", "TWITCH_API_RS_TEST_CLIENT_SECRET" = "<client_secret>" }
command = "cargo"
args = [ "test", "--", "--nocapture" ]

维护者:oldwomanjosiah ([email protected])

依赖关系

~3–8MB
~184K SLoC