LoginSignup
3

More than 1 year has passed since last update.

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

Last updated at Posted at 2019-05-22

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

マストドン 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 月にはこの重複投稿の予防は実装されていました

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


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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3