ケヴィンのなんかいろいろ

ハースストーンとかその他色々なことについて話すブログです

MENU

【C#】CoreTweetを使って特定ユーザのツイートをリアルタイムで検知する

kvin_aiに僕のツイートをリアルタイムで食べさせたかったので、試行錯誤してたらできた。やったね!

どうやるの

var token = Tokens.Create([ConsumerKey], [ConsumerSecretKey], [AccessToken], [AccessSecretToken]);
token.Streaming.Filter(follow: [user_id]).OfType<StatusMessage>().Select(x => x.Status));

とします。

で終わらせるとQiitaのクソ記事なので、ちょっとだけ中身書きます。

UserStreamじゃなくてPublicStream

「リアルタイムって、UserStream廃止されたからできないんじゃないの?」 分かる。僕もそう思ってて、公式の代替としてはActivity APIってのにしてねってなってるんだけど何かめんどくさそうだった。どうしよっかなーって思ってたら

はえーーーーー!!!!!

というわけでPublicStreamというのを使ってます。

何してるの

var token = Tokens.Create([ConsumerKey], [ConsumerSecretKey], [AccessToken], [AccessSecretToken]);
token.Streaming.Filter(follow: [user_id]).OfType<StatusMessage>().Select(x => x.Status));

前者はリクエスト用のトークンを取得してるだけなので省略。後者ですね。

Streaming.Filter()

StreamingのうちのFilterをするよ(SampleとFilterとUser(廃止された)があるみたい)。Sampleが全体の1%、Filterが色々指定してやるやつ。

Filter(follow: [user_id])

ユーザーを指定して取得するよ。

ちなみにここには罠が2つあって、user_idであってscreen_nameじゃないことと、IEnumelable<long>で渡さないといけないこと。

前者はこれ使って取得した。

idtwi | Twitter IDチェッカー(変更履歴の追跡)

後者は適当にList<long>を作って突っ込みました。

ユーザーID以外に指定できるものは公式リファレンスに書いてありました。CoreTweetは公式仕様に則って作ってくれてるので楽ですね。

POST statuses/filter — Twitter Developers

  • follow : user_idでユーザーを指定して取得
  • track : 文字列を指定して取得
  • locations : 場所(緯度,経度)を指定して取得
  • delimited : 指定した文字数以下のツイートを取得(?)
  • stall_warnings : 接続が切断されそうになったら通知する

delimitedはよく分かってないです。

.OfType()

OfType<T>()自体は標準のLinqの構文ですね。指定した型の奴を取得する。

StatusMessageはCoreTweetが用意してくれてる型で、これを指定してあげるとツイート(RTも含む)だけが取得できます。

ここを変えると取得できるものも変わりますが、そこはCoreTweet公式Wikiを見ましょう。というかこの記事自体ほぼこのページの写しだけどね。

github.com

.Select(x => x.Status)

ラムダ式x.Status = ツイートの情報を返すようにしてます。Statusの定義はここ。

CoreTweet: CoreTweet.Status Class Reference

実装例

コード

using System;
using System.Collections.Generic;
using System.Linq;
using CoreTweet;
using CoreTweet.Streaming;
using System.Reactive.Linq;

namespace Console_PublicStream
{
    class Program
    {
        static void Main(string[] args)
        {
            var token = Tokens.Create([consumerKey], [consumerSecretKey], [accessToken], [accessSecretToken]);

            var follow = new List<long>();
            follow.Add(747407594004766721); //ぼくのuser_id

            foreach (var m in token.Streaming.Filter(follow: follow).OfType<StatusMessage>().Select(x => x.Status))
            {
                Console.WriteLine("{0}: {1}", m.User.ScreenName, m.Text);
            }
        }
    }
}

結果

f:id:kvin_MisterD:20181210002744p:plain

おわり

RT省く時は文中からRTって探せば良さそうだけど、なんか美しくないから何とかしたいね。

CoreTweet使うとめっちゃ簡単にStreamingできるからみんなもやろうね。