Open9

BlueSky API で永続化されたアクセストークンを使って投稿する(JavaScript)

amay077amay077
await agent.login({
  identifier: 'example.com',
  password: 'hunter2'
})

して、その後、投稿(post) などが行えますよーと書いてあるが、パスワードを永続化しておくわけにはいかんでしょ。

公式以外でも「ユーザー/パスワード でログインして投稿する」という例は多く見つかるが、アクセストークンか何かベースで API 叩けるよね?

amay077amay077

login メソッドの戻り値には accessJwt, refreshJwt などの情報があり、これらのトークンを使って API が呼び出せるはず。

単純な POST リクエストなら header に付けるのだろうが、@atproto/api というライブラリではどうやるのだ?

amay077amay077

agent のソースコードを調べていたら、resumeSession(session: AtpSessionData) というメソッドがあり、これっぽい。

amay077amay077

こんな感じで動きはした。

ログイン

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()
})
amay077amay077

BskyAgent.resumeSession って公式ドキュメントに載ってなくない?

アクセストークンのリフレッシュは BskyAgent が勝手にやってくれるのか?リフレッシュされたら再永続化しなきゃ、とかいろいろあるが、とりあえず目的は達成できた。

amay077amay077

んー、トークンのリフレッシュを行わないと、expire してるようだ。そりゃそうか。

amay077amay077

これでいけるっぽい。

await agent.refreshSession();
const refreshedSession = agent.session;

// TODO refreshedSession を永続化