YOU

前回の続きです。
今回は画像付きのポストをしてみます。

アクセストークンは取得済みとします。

まずは、画像のアップロードから行ってみます。

// 画像データは事前にアップロードされているものとします
$image = file_get_contents('./sample.png');

// MIMEタイプは画像にあったものを指定
$headers = [
  'Content-Type: image/png',
  'Authorization: Bearer ' . $accessJwt,
];

$ch = curl_init();
curl_setopt_array($ch, [
  CURLOPT_URL => 'https://bsky.social/xrpc/com.atproto.repo.uploadBlob',
  CURLOPT_HTTPHEADER => $headers,
  CURLOPT_POST => true,
  CURLOPT_POSTFIELDS => $image,  // 今回は画像データをPOSTします
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_SSL_VERIFYPEER => false,
]);
$response = curl_exec($ch);
curl_close($ch);

エラーがなければこれで画像のアップロードが成功しています。
取得したレスポンスをもとに、投稿をポストしましょう。

$response = json_decode($response, false);
$image = $response->blob;

$args = [
  "repo" => $did,
  "collection" => "app.bsky.feed.post",
  "record" => [
      '$type' => "app.bsky.feed.post",
      "text" => "画像添付のテストだよ",
      "createdAt" => (new \DateTime())->format("c"),
      "langs" => ["ja"],
      // ここからが画像の埋め込みデータ
      "embed" => [
        '$type' => 'app.bsky.embed.images',
        'images' => [  // 最大4枚まで指定が可能
          [
            'alt' => 'alt text',
            'image' => $image,
          ]
        ]
      ]
  ],
];

$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 => false,
]);
$response = curl_exec($ch);
curl_close($ch);

embedのパラメータが増える以外は、通常のポストと特に変化ありません。
成功した場合はタイムラインに表示されています。

画像投稿のテスト結果

画像の投稿も簡単にできました!やったね!!