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
77KB
1.5K SLoC
注意:此库仅涵盖了我其他项目中关键路径上的三个 api,该 下载用户频道的所有剪辑。最终我希望达到 100% 的覆盖率,至少对于 应用程序端点。
twitch-api
用于构建和发送请求到 twitch helix api 的 twitch crate。
示例:获取创作者的前 20 个剪辑
要获取 Twitch API 中的剪辑列表,按直播者显示名称,有以下 4 个步骤。
- 获取应用程序 ClientId 和 ClientSecret 1
- 请求客户端流认证令牌
- 使用该令牌根据显示名称请求用户信息
- 使用该请求返回的 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