+++ date = "2023-02-25" tags = ["bluesky","atproto"] title = "blueskyのclientを少しだけやってみた" slug = "bluesky-atproto" +++ 今回は、blueskyのclientを作ってcliからpostしてみたので、なにか書きます。 これはbsky.social特有のものかもしれませんが、requestを投げる先と投げる要素が結構変わっていたので、ハマりました。あとtypoに気づかずmatrixに質問を投げるなどやらかしていました。 基本的には公式の`lexicons`を見ていけばいい感じでした。 https://atproto.com/lexicons/com-atproto-account blueskyではpostの一式をrecordと呼びます。 `createdAt`を自分で入れなきゃなのなぜでしょう。あと、`validate`は`true`なので`false`にしてもいいかも。 下記のscriptは解説のために載せているだけなので読み替えてください。 例えば、`date %3N`はgnu-dateです。 ```sh:record.sh #!/bin/sh # com.atproto.session.create # com.atproto.repo.createRecord #brew install coreutils #PATH="/opt/homebrew/opt/coreutils/libexec/gnubin:$PATH" date=`date "+%Y-%m-%dT%H:%M:%S.%3NZ"` host=bsky.social user=$USER pass=xxx curl -X POST -H "Content-Type: application/json" \ -d "{\"handle\":\"$user.$host\",\"password\":\"$pass\"}" \ https://$host/xrpc/com.atproto.session.create > token.json token=`cat token.json|jq -r .accessJwt` did=`cat token.json|jq -r .did` url=https://$host/xrpc/com.atproto.repo.createRecord json='{ "did": "did:plc:xxx", "collection": "app.bsky.feed.post", "record": { "text": "t", "createdAt": "2023-02-25T05:06:50.330Z", "$type": "app.bsky.feed.post" } }' curl -X POST -H "Content-Type: application/json" \ -H "Authorization: Bearer $token" \ -d "$json" $url ``` ```rust:src/main.rs #[tokio::main] async fn feed_req(url: String, user: String, col: String) -> reqwest::Result<()> { let client = reqwest::Client::new(); let body = client.get(url) .query(&[("user", &user),("collection", &col)]) .send() .await? .text() .await?; println!("{}", body); Ok(()) } #[allow(unused_must_use)] fn feed_com(c :&Context) -> reqwest::Result<()> { let data = Datas::new().unwrap(); let data = Datas { host: data.host, user: data.user, pass: data.pass, }; let url = "https://".to_owned() + &data.host + &"/xrpc/com.atproto.repo.listRecords"; let col = "app.bsky.feed.post".to_string(); if let Ok(user) = c.string_flag("user") { feed_req(url, user, col); } else { let user = data.user + &"." + &data.host.to_string(); feed_req(url, user, col); } Ok(()) } fn feed(c: &Context) { feed_com(c).unwrap(); } ``` 今回もrustで書いていたのですが、時間がかかりそうだったので、途中からshellでした。また、時間がある時にrustで書き直すかも。