Mastodon API で「返信」をトゥートする 1 行サンプル（bash, PHP）

## TL;DR

> 基本的に[新規トゥート](https://qiita.com/KEINOS/items/27d201afed4ed665cb11)と同じ。
> 唯一の違いは `Request Body` の `in_reply_to_id` キーの値に toot の ID 番号を指定して `POST` すること。

### マストドンの特定トゥートに返信する `curl` １行サンプル

以下の構文で `curl` を使って Mastodon API 経由でトゥートできます。`${}` 内の変数を適宜自身の環境に置き換えてください。

```bash:bash
curl -X POST \
     -d "status=${toot_msg}" \
     -d "visibility=${visibility}" \
     -d "in_reply_to_id=${toot_id}" \
     --header "Authorization: Bearer ${access_token}" \
     -sS https://${host}/api/v1/statuses
```

## TS;DR

Mastodon で特定トゥートに返信するには、基本的に通常のトゥートを `POST` するのと同じですが、`in_reply_to_id` キーが含まれると返信トゥート扱いになります。その際の `in_reply_to_id` キーの値は返信先のトゥート ID です。

- 参考資料：[Mastodon API の仕様書 | statuses](https://docs.joinmastodon.org/methods/statuses/)

### Mastodon API 返信プロトコル

以下は返信トゥートを行う（RESTful リクエストする）ための必須項目です。

|項目|内容|
|:---|:---|
| **エンドポイント** | `https://${host}/api/v1/statuses`<br>（例：`https://qiitadon.com/api/v1/statues`）|
| **メソッド** | `POST` |
| **ヘッダー** | `Authorization: Bearer ${access_token}`<br>（アクセストークンは必須です）|
| **`POST` するデータ**|下記 POST データをご覧ください|

#### POST データ

|キー|値|
|:---|:---|
|`status`|返信内容。`curl` で送信する場合は UTF-8 文字列を URL エンコードした文字列。|
|`visibility`|公開レベル。以下の４つがあります。<br>`direct`, `public`, `unlisted`, `private`|
|`in_reply_to_id`|返信先のトゥートID|

#### 戻り値

|項目|内容|
|:---|:---|
| **戻り値** | `JSON`形式の [`status` データ](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#status)|

### トゥート ID の確認

トゥートは、Mastodon の内部では「`status`」もしくは「`statuses`」と呼ばれており、各トゥートは「`ID`」を持っています。

新規トゥートの場合は、[API 経由でトゥート](https://qiita.com/KEINOS/items/27d201afed4ed665cb11)した時の戻り値である JSON 形式の [`status` データ](https://github.com/tootsuite/documentation/blob/master/Using-the-API/API.md#status)を解析することで、そのトゥートに割り当てられた ID が得られます。

返信トゥートの場合も、基本的にはトゥートと同じく API にリクエストした際の戻り値から確認でき、いずれも `id` キーがそのトゥートの ID となります。

この ID は各々のマストドン・サーバー（インスタンス）ごとで異なり、マストドン・サーバー間でのユニークな ID（連合間の一意の ID）は JSON の `uri` キーになります。

トゥート ID を戻り値以外から得るには、以下の３つの方法があります。

1. [Mastodon のタイムラインから取得](https://qiita.com/KEINOS/items/94b755c1afc5e3ab34ff)する。
2. [ストリーミング API ](https://qiita.com/KEINOS/items/75febc1d5391ae5c7bd9)を通して取得する。
3. ブラウザから手動で取得する。

ブラウザから手動で取得するのは、非合理的ですが、検証のため簡単に確認したい場合に便利です。自分の Mastodon インスタンスを開き、返信したい先のトゥートをクリックしたときの URL の末尾にある数値の ID がトゥート ID になります。

ここで表示される ID は、そのインスタンス内で割り当てられたトゥート ID です。先述したように ID はインスタンス毎に振られる ID であるため **API に送信する先のホストと同じホスト（インスタンス）から取得した ID である必要があります**。

## リクエスト文を作成する PHP サンプル

以下は、文頭の cURL 文を PHP で作成し、外部コマンドで `cURL` を実行するサンプルです。

```sample.php
$schema       = 'https';
$host         = 'qiitadon.com';
$method       = 'POST';
$endpoint     = '/api/v1/statuses';
$access_token = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX';
$toot_msg     = 'Hello Qiitadon too!';
$toot_msg     = rawurlencode($toot_msg); //メッセージをcURL用にURLエスケープ
$visibility   = 'unlisted'; // ※１
$toot_id      = xxxxxx;     // ※２ 

// ※１ 投稿のプライバシー設定
//    「未収載」    -> 'unlisted'
//    「公開」      -> 'public'
//    「非公開」    -> 'private'
//    「ダイレクト」 -> 'direct'
// ※２ toot の URL に記載されている statuses の番号、もしくはオリジナルの toot の送信結果
//    から得られる `id` 番号

/* cURL クエリ文作成 */
$query  = "curl -X ${method}";
$query .= " -d 'status=${toot_msg}'";
$query .= " -d 'visibility=${visibility}'";
$query .= " -d 'in_reply_to_id=${toot_id}'";
$query .= " --header 'Authorization: Bearer ${access_token}'";
$query .= " -sS ${schema}://${host}${endpoint};";

/* cURL リクエストの送信 */
$result_json= `$query`; //バッククォートで実行。JSONで結果が返ってくる
print_r($result_json);
```

# 合わせて読みたい Qiita 記事
- [Mastodon API から「LTL」を取得する 1 行サンプル](https://qiita.com/KEINOS/items/94b755c1afc5e3ab34ff) @ Qiita
- [Mastodon API から「未収載」でトゥートする PHP サンプル](http://qiita.com/KEINOS/items/27d201afed4ed665cb11) @ Qiita
- [Mastodon API で「You are being redirected」とアクセストークンの取得](http://qiita.com/KEINOS/items/78445aad59e5818bf87e) @ Qiita
- [Mastodon API のリクエスト制限と確認（quota 残量確認）](http://qiita.com/KEINOS/items/8ad7a88d42e94d894f0d) @ Qiita

# 参考文献
- Toot dicts | Mastodon.py 1.0.8 Documentation @ readthedocs.io<br>http://mastodonpy.readthedocs.io/en/latest/#toot-dicts