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

UserStreamの終焉

Twitterは8月17日にUserStreamを廃止しました。

h.s64.jp

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

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

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

UserStreamの代用品

statuses/filter.jsonではパラメータにtrack(検索キーワードを指定)やfollow(検索対象ユーザーのIDを指定)を使い、カンマ区切りで条件を指定します。

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

この方法では従来のUserStreamに対して以下のような制限があります。

  • 自分のツイートがふぁぼられたり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はクソ