YOU

BlueSkyのAPIを使って遊んでみたい!

公式で推してくるのはこちらのAtprotoですが、ローカル環境ならともかく安価なレンタルサーバーでは使えないことも多いです。
そんなわけで、比較的どこでも使えるはずのPHPでやってみます。

まずはAPIの利用に必要なアクセストークンを取得します。

$args = [
  "identifier" => "bluesky handle",  // ハンドル名
  "password" => "app password",  // パスワード
];

$headers = [
  "Content-Type: application/json",
];

$ch = curl_init();
curl_setopt_array($ch, [
  CURLOPT_URL => "https://bsky.social/xrpc/com.atproto.server.createSession",
  CURLOPT_HTTPHEADER => $headers,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($args),
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_SSL_VERIFYPEER => true,  // 必要に応じて false に指定
]);
$response = curl_exec($ch);
curl_close($ch);

$response = json_decode($response, false);
var_dump($response);

ハンドル名はBlueSkyの「@ほにゃらら」の部分です。自分のアカウントの場合だと「cross-clover.info」になります。(@は不要)パスワードはBlueSkyの設定画面から発行してください。問題がなければこれでAPIの利用に必要なアクセストークンが取得できます。

// アカウント固有の識別子
$did = $response->did;
// アクセストークン
$accessJwt = $response->accessJwt;
// リフレッシュトークン
$refreshJwt = $response->refreshJwt;

didはハンドルでも代用可能ですが、ハンドルを変更してもdidは変わらないようなので、こちらを利用する方がベターです。アクセストークンは意外と使用期限が短いので注意が必要です。(遊んでたらすぐに期限切れになります)

必要な情報は取得できたので、ポストしてみます。

$args = [
  "repo" => $did,
  "collection" => "app.bsky.feed.post",
  "record" => [
      '$type' => "app.bsky.feed.post",
      "text" => "APIからのテスト投稿\n意外と簡単に使えます",
      "createdAt" => (new \DateTime())->format("c"),
      "langs" => ["ja"]
  ],
];

$headers = [
  'Content-Type: application/json',
  'Authorization: Bearer ' . $accessJwt,
];

$ch = curl_init();
curl_setopt_array($ch, [
  CURLOPT_URL => 'https://bsky.social/xrpc/com.atproto.repo.createRecord',
  CURLOPT_HTTPHEADER => $headers,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => json_encode($args),
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_SSL_VERIFYPEER => true,
]);
$response = curl_exec($ch);
curl_close($ch);

var_dump($response);

Headerの内容にトークンが追加されたことと、送信するパラメータが違うくらいですね。あとは大体似たような感じ。

送信した結果はこんな感じ。

cURLを使用してのポスト投稿

トークンの取得ができればcURLで十分に活用できそうです。

……と思っていたんですが、画像の埋め込みで少し躓いています。こちらはまた改めて検証してみるつもりです。エラーは出ていないんだけどなぁ。