TwitterにおけるUserStreamの終焉とその代用

UserStreamの終焉

Twitterは6月20日にUserStreamを廃止します。

h.s64.jp

これは1ツイッタークライアント作者として非常に困ることです。 デスクトップクライアントはWebなどの公式に対してリアルタイムでツイートを受信できるところがある意味一つの魅力だったわけですが、 これができないと無限にAPIを叩ける公式のComsumerKeyなどを使わない限り1分に1回しかタイムラインの取得ができなくなってしまいます。

しかしながらTwitterには幸いにもstatuses/filter.jsonというストリーミングAPIが存在します (こちらはstatuses/sample.jsonとともに廃止予定はなさそう)

このストリーミングAPI、様々な条件を指定してその条件にあったツイートをリアルタイムで受信するというものなのですが、 ユーザーを複数指定してツイートを受信することも可能であるため、ユーザーストリームの代用として使用することができます。

UserStreamの代用品

statuses/filter.jsonではパラメータにtrackやfollowを使い、カンマ区切りで条件を指定します。

followに対して自分がフォローしているユーザーのIdを指定することで擬似的にユーザーストリームを再現できます。

この方法では

  • 自分のツイートがふぁぼられたりRTされた通知、フォローされた通知などを受け取ることは不可能
  • 自分のフォローしているユーザーが自分のフォローしていないユーザーに対して投げたリプライも受信 (userstreamにrepliesを指定したときの挙動と同じ?)
  • 5000ユーザーまで取得可能
  • 非公開アカウントのツイートは受信できない
  • statuses/filter は1認証あたり1つしか使えない (複数ストリームを使用することは不可能)

などの制限はあります。 しかしUserStreamが廃止されてリアルタイムにツイートが受信できなくなるよりはましだと思われますので、各クライアント作者にはこの方法を活用してほしいと思います。

CoreTweetでのサンプルは以下の様になります。

var userList = await Tokens.Friends.IdsAsync(screen_name => "cucmberium", count => 5000);
var param = new Dictionary<string, object>
{
    { "follow", string.Join(",", userList) }
};
iObservable = Tokens.Streaming.FilterAsObservable(param);
iObservable
    .SubscribeOn(NewThreadScheduler.Default)
    .Catch(
        (Exception ex) => iObservable.DelaySubscription(TimeSpan.FromSeconds(15)).Retry())
    .Repeat()
    .Subscribe(x => {
        省略 ここでユーザーのリプライやリツイートに関する処理を挟む
    })

簡単ですね。 この方法、ユーザーの任意のリストや検索を同様の方法でリアルタイムに取得できたりするので便利です。

Flantterの今後のアップデートについて

本当はこっちをメインで書きたかったのですがせっかくなのでFlantterでどうやってユーザーストリームをどのように再現するかを踏まえた上で今後について触れたいと思います。

  • UserStreamはFilterStreamで対応できるところまである程度対応
  • イベントカラム廃止、Mentionカラムに統合 (Mastodon)
  • DMカラム廃止 (メニューから見れるような形にする予定)
  • プッシュ通知はTwitter廃止 Mastodon継続 (Webhookのベータが取れたときのTwitterの対応による)

みたいな感じでいきたいな思っていますが、正直どうなるかはわかっていません。 Account Activity API (webhookのやつ)も申請したらアカウント凍結したみたいなこともあったらしいのであんまりTwitterに関わりたくありませんね…

blog.tmyt.jp

Twitterはクソ