Open9
BlueSky API で永続化されたアクセストークンを使って投稿する(JavaScript)
JavaScript/TypeScript の話。
公式では @atproto/api パッケージを使う方法が示されている。
await agent.login({
identifier: 'example.com',
password: 'hunter2'
})
して、その後、投稿(post) などが行えますよーと書いてあるが、パスワードを永続化しておくわけにはいかんでしょ。
公式以外でも「ユーザー/パスワード でログインして投稿する」という例は多く見つかるが、アクセストークンか何かベースで API 叩けるよね?
login メソッドの戻り値には accessJwt, refreshJwt などの情報があり、これらのトークンを使って API が呼び出せるはず。
単純な POST リクエストなら header に付けるのだろうが、@atproto/api というライブラリではどうやるのだ?
agent のソースコードを調べていたら、resumeSession(session: AtpSessionData)
というメソッドがあり、これっぽい。
こんな感じで動きはした。
ログイン
const res = await agent.login({
identifier: 'example.com',
password: 'hunter2'
});
const sessionData: AtpSessionData = res.data;
// sessionData を永続化しておく
投稿
const sessionData: AtpSessionData = // 永続化されたデータから復元
const agent = new BskyAgent({
service: 'https://bsky.social',
});
// ログインせず、セッションを復元
await agent.resumeSession(sessionData);
// 投稿
await agent.post({
text: 'Hello world! I posted this via the API.',
createdAt: new Date().toISOString()
})
BskyAgent.resumeSession って公式ドキュメントに載ってなくない?
アクセストークンのリフレッシュは BskyAgent が勝手にやってくれるのか?リフレッシュされたら再永続化しなきゃ、とかいろいろあるが、とりあえず目的は達成できた。
んー、トークンのリフレッシュを行わないと、expire してるようだ。そりゃそうか。
これでいけるっぽい。
await agent.refreshSession();
const refreshedSession = agent.session;
// TODO refreshedSession を永続化
OGP が出ないなあと思ったら、投稿時に設定する必要があるらしい。
AT Protocol APIでBlueskyに投稿する - くらげになりたい。 - https://www.memory-lovers.blog/entry/2023/07/09/152224