This repository has been archived by the owner on Sep 1, 2023. It is now read-only.
ストリーミング API を使う
Acid Chicken (硫酸鶏) edited this page Aug 30, 2018
·
7 revisions
Tokens.Streaming
からストリーミング API にアクセスすることができます。
StreamingApi クラスのメソッドは以下の API に対応します。
-
User: GET user(廃止されました) -
Site: GET site(廃止されました) - Filter: POST statuses/filter(CoreTweet では GET メソッドでリクエストします)
- Sample: GET statuses/sample
- Firehose: GET statuses/firehose
各メソッドの戻り値は IEnumerable<StreamingMessage>
です。
StreamingMessage
はストリーミングで受信するメッセージを表す基底クラスです。
MessageType
プロパティでメッセージの種類を確認でき、メッセージのインスタンスを以下のクラスにキャストできることが保証されます。
- DeleteStatus
- DeleteDirectMessage
- ダイレクトメッセージが削除されました。
- DeleteMessage
- ScrubGeo
- StatusWithheld
- UserWithheld
- Disconnect
- ストリームが何らかの理由で切断されます。
- これは Twitter から切断の理由を示すメッセージが送られてきたことを表すものであり、実際に切断されたことを表すものではありません。またこのメッセージなしで切断されることもあるので注意してください。
- DisconnectMessage
- Warning
- Event
- Envelopes
- 1 ユーザに対するメッセージです。 (SiteStreams)
- EnvelopesMessage
- Create
- ツイートを受信しました。
- StatusMessage
- DirectMessage
- Friends
- Limit
- Control
- UserDelete
- ユーザが削除されました。公式ドキュメントでの記述はありません。
- UserMessage
- RawJson
- 上記の型のいずれにも当てはまらない場合に列挙されます。
- RawJsonMessage
このコードでは「茶」が含まれるツイートを 10 件取得して標準出力に出力して切断します。
// using System;
// using System.Linq;
// using CoreTweet;
// using CoreTweet.Streaming;
foreach(var m in t.Streaming.Filter(track: "茶")
.OfType<StatusMessage>()
.Select(x => x.Status)
.Take(10))
Console.WriteLine("お茶についてのツイート {0}: {1}", m.User.ScreenName, m.Text);
.NET Framework 3.5 以外では、通常のストリーミング API のメソッド名に「AsObservable」がついたメソッドを呼び出すことで IObservable による非同期イベントストリームを取得することができます。
これらのメソッドの戻り値は IObservable<StreamingMessage>
となります。
Subscribe
時に返される IDisposable
の Dispose()
を呼ぶことで切断することが出来ます。
このコードでは 30 秒間、フォロー中のユーザの一覧とツイートを標準出力に出力した後に切断します。このサンプルには Reactive Extensions を使用しています。 (User Streamは廃止されたため、このサンプルコードはもはや動作しません。)
// using System;
// using System.Reactive.Linq;
// using System.Threading.Tasks;
// using CoreTweet;
// using CoreTweet.Streaming;
var stream = t.Streaming.UserAsObservable().Publish();
stream.OfType<FriendsMessage>()
.Subscribe(x => Console.WriteLine("フォロー中: " + string.Join(", ", x)));
stream.OfType<StatusMessage>()
.Subscribe(x => Console.WriteLine("{0}: {1}", x.Status.User.ScreenName, x.Status.Text));
var disposable = stream.Connect();
await Task.Delay(30 * 1000);
disposable.Dispose();