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


重複投稿/二重投稿を防ぎたい

マストドン API を利用時、トゥートの投稿に失敗した際のリトライで重複投稿するのを避けたい

例えば、500 系のエラー発生やネットワークの問題などでタイムアウトした場合のリトライで、「Mastodon 側の反応が悪いことによる重複投稿」をしないようにポカよけしたい。

  • マストドンとは1

TL; DR (今北産業)

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

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

bashサンプル
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

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

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 があるのですが、サーバーやネットワークの混雑からか、たまに失敗することがあります。

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

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

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


  1. マストドンとは、ミニブログ・タイプの SNS の一種で、そのプログラムおよびサービスを指します。Facebook や twitter のように、1社もしくは1つのサーバー(ドメイン)に依存する「中央集権型 SNS」と異なり、共通のプロトコルを持ったサーバー間で通信を行う「連合型 SNS」の1つです。マストドン・サーバー間だけでなく、ActivityPub と呼ばれる共通のプロトコルを使ったサーバーであれば通信できます。ちなみに Qiita の SNS である Qiitadon はマストドンを使っています。
    マストドン」@ Wikipedia
    マストドン公式サイト