Mastodon API で二重トゥートを防ぐ簡単な方法(Idempotency-Key で重複投稿防止)

重複投稿を防ぎたい


マストドンの API 利用時、500 系のエラー発生やネットワークの問題などでトゥートの投稿に失敗した場合、リトライする際に重複投稿するのを避けたい



TL;DR


Mastodon のトゥート API は idempotency冪等)に対応しています。


リクエスト・ヘッダーに "Idempotency-Key: <UNIQUE ID>" を含めると、同一 <UNIQUE ID> のトゥートは1つのみが適用されます

注意: 同じ Idempotency-Key で処理済み(トゥート済み)の場合は HTTP/1.1 404 Not Found エラーになります。

curl -X POST \

-d 'status=Hello%20Qiitadon%21' \
-d 'visibility=unlisted' \
--header 'Authorization: Bearer <YOUR ACCESS TOEKN>' \
--header 'Idempotency-Key: <UNIQUE ID>' \
-sS https://qiitadon.com/api/v1/statuses


TS;DR


Note: In order to prevent duplicate statuses, this endpoint accepts an Idempotency-Key header, which should be set to a unique string for each new status. In the event of a network error, a request can be retried with the same Idempotency-Key. Only one status will be created regardless of how many requests with the same Idempotency-Key did go through.

See https://stripe.com/blog/idempotency for more on idempotency and idempotency keys.

("Posting a new status" | Statuses | API overview | Mastodon 公式 API @ より)


▼ 筆者訳


注: statuses(以下トゥート)の重複を防ぐために、このエンドポイントは Idempotency-Key ヘッダーを受け入れます。このヘッダーには、新しいトゥートごとに一意の文字列を設定する必要があります。ネットワークエラーが発生した場合は、同じ Idempotency-Key でリクエストを再試行できます。同じ Idempotency-Key のリクエストがいくつ通過したかにかかわらず、トゥートは1つだけ作成されます。

Idempotency および Idempotency-Key についての詳細は、https://stripe.com/blog/idempotency を参照してください。


Qiita の SNS「Qiitadon」(Qiita のマストドン・サーバー)で、時報をトゥートする BOT新着 Qiita 記事をトゥートする BOT があるのですが、サーバーやネットワークの混雑からか、たまに失敗することがあります。

失敗した場合はリトライをするのですが、重複を避けるためにリトライ前に API で投稿済みのトゥートを調べていました。

BOT のリファクタをしようと API のドキュメントを眺めていたら、いつのまにか(2018/03 には)新規トゥートの重複投稿に関する注意書きが追加されていて、しかも 2017 年 3 月にはこの重複投稿の予防は実装されていました

気づくの遅いよっ!! :wave: バシッ