8 个版本
0.1.7 | 2024 年 8 月 13 日 |
---|---|
0.1.6 | 2024 年 7 月 19 日 |
0.1.3 | 2024 年 6 月 26 日 |
341 在 Web 编程
每月 276 次下载
用于 2 crates
1MB
24K SLoC
Bsky SDK:基于 ATrium 的 Bluesky SDK。
- ✔️ ATProto 和 Bluesky 的 API。
- ✔️ 会话管理(与
atrium-api
的AtpAgent
相同)。 - ✔️ 管理API。
- ✔️ 富文本库。
使用方法
会话管理
使用这些 API 登录到服务器。大多数方法都需要一个活跃的会话。
use bsky_sdk::BskyAgent;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = BskyAgent::builder().build().await?;
let session = agent.login("[email protected]", "hunter2").await?;
Ok(())
}
您可以将代理配置(包括会话)保存到文件中,并在以后加载它
use bsky_sdk::agent::config::FileStore;
use bsky_sdk::BskyAgent;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = BskyAgent::builder().build().await?;
agent.login("...", "...").await?;
agent
.to_config()
.await
.save(&FileStore::new("config.json"))
.await?;
Ok(())
}
use bsky_sdk::agent::config::{Config, FileStore};
use bsky_sdk::BskyAgent;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = BskyAgent::builder()
.config(Config::load(&FileStore::new("config.json")).await?)
.build()
.await?;
let result = agent.api.com.atproto.server.get_session().await;
assert!(result.is_ok());
Ok(())
}
管理
管理 API 几乎与官方 SDK (@atproto/api) 具有相同的功能。
use bsky_sdk::moderation::decision::DecisionContext;
use bsky_sdk::BskyAgent;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let agent = BskyAgent::builder().build().await?;
// log in...
// First get the user's moderation prefs and their label definitions
let preferences = agent.get_preferences(true).await?;
let moderator = agent.moderator(&preferences).await?;
// in feeds
let output = agent
.api
.app
.bsky
.feed
.get_timeline(
atrium_api::app::bsky::feed::get_timeline::ParametersData {
algorithm: None,
cursor: None,
limit: None,
}
.into(),
)
.await?;
for feed_view_post in &output.feed {
// We call the appropriate moderation function for the content
let post_mod = moderator.moderate_post(&feed_view_post.post);
// don't include in feeds?
println!(
"{:?} (filter: {})",
feed_view_post.post.cid.as_ref(),
post_mod.ui(DecisionContext::ContentList).filter()
);
}
Ok(())
}
富文本
从字符串创建 RichText 对象
use bsky_sdk::rich_text::RichText;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let rt = RichText::new_with_detect_facets(
"Hello @alice.com, check out this link: https://example.com",
)
.await?;
let segments = rt.segments();
assert_eq!(segments.len(), 4);
assert!(segments[0].text == "Hello ");
assert!(segments[1].text == "@alice.com" && segments[1].mention().is_some());
assert!(segments[2].text == ", check out this link: ");
assert!(segments[3].text == "https://example.com" && segments[3].link().is_some());
let record_data = atrium_api::app::bsky::feed::post::RecordData {
created_at: atrium_api::types::string::Datetime::now(),
embed: None,
entities: None,
facets: rt.facets,
labels: None,
langs: None,
reply: None,
tags: None,
text: rt.text,
};
println!("{:?}", record_data);
Ok(())
}
计算字符串长度
use bsky_sdk::rich_text::RichText;
fn main() {
let rt = RichText::new("👨👩👧👧", None);
assert_eq!(rt.text.len(), 25);
assert_eq!(rt.grapheme_len(), 1);
}
依赖
~6–19MB
~268K SLoC