パラメータ

全開ツイートの取得に成功したわけですがそこで使用したメソッドについてパラメータの指定を殆どしてなかったので調べました。

twitterAPIそのままっぽいです。

原文はこちら

GET statuses/mentions | Twitter Developers

んでもって訳してるサイト様

Twitter API mentions メンションタイムライン @ユーザー「つぶやき」 一覧 表示 取得 php oauth接続 | TRYPHP!

 

端的に必要な事を書くと

count 取得するレコード件数を指定。指定できるのは200件まで。指定無しだと800件かな??

since_id  指定されたID(ツイートのユニークID)より新しいものだけ取得

max_id 指定されたID(ツイートのユニークID)より古いものだけ取得

trim_user ユーザー情報をIDだけにして他を省く

contributor_details 貢献者の表示名を取得する。

include_entities  ツイッターの情報にエンティティを含める

exclude_replies リプライを含めない

 

貢献者って何?と思ってたらこういう機能の情報らしい。

 

Twitterがライター機能を公開、Salesforceが利用開始 - TechCrunch

複数人で一つのIDでツイートできるけど内部的には個人IDも持っていてその個人IDの方を取得するかどうかの模様。

身近にこれやってる人が居ないからテストが難しいし個人用のアプリだから要らないかなー。公式ツイートの情報拾ってくると面白いかも。

ツイート情報

まだ色々問題あるけどとりあえずツイートを取得してみようと思う。

まずはトークンから取得出来るStatusクラス配下のメンバ。

ライブラリはこちら

CoreTweet: CoreTweet.Rest.Statuses Class Reference

以下自分用メモ。

実際に値が取得出来た物。

DateTimeOffset CreatedAt ツイートの作成日時。時分秒。

long id ツイートに振られている通し番号

String Text ツイートの本文

User User ツイートした人に関する概略情報

bool IsFavorited ログインユーザーがお気に入りに入れたかどうか

bool IsRetweeted ログインユーザーがリツイートしたかどうか

bool IsTruncated 本文が省略されているかどうか。

int FavoriteCount お気に入りされた数

int RetweetCount リツイートされた数

だと思う←

とりあえず直近で使いそうな物だけ。お気に入り件数ってintなんだね。

 

 

 

ツイートの取得

ようやくやってきましたTLの取得っ!

長かったー凄く長かったー。

まぁ結局ツイートの取得に半日悩んだわけですが。

最初に使用した処理はお手本にもあるこちら。

var stream = tokens.Streaming.StartStream(CoreTweet.Streaming.StreamingType.User,
new StreamingParameters(replies => "all"));

foreach(var message in stream)
{
 if(message is StatusMessage)
 {
  var status = (message as StatusMessage).Status;
  Console.WriteLine(string.Format("{0}:{1}", status.User.ScreenName

   ,status.Text));
 }
 else if(message is EventMessage)
 {
  var ev = message as EventMessage;
  Console.WriteLine(string.Format("{0}:{1}->{2}",
  ev.Event, ev.Source.ScreenName, ev.Target.ScreenName));
 }
}

※参考

C#でTwitterアプリを作る 第3回 Streaming - LINQになりたい

だけど問題はお手本にもあるようにこのままだと同期処理なので延々foreachが回る。一度上限数を決めてbreakする仕様にもしてみたけれど、上限まで満たないとツイートが流れてくるのを待つのでやっぱりレスポンスが遅い。なので調べてみたら非同期処理もちゃんとある。

非同期メソッドを使う · CoreTweet/CoreTweet Wiki · GitHub

拡張無しでも使える処理だからこれで何とかなる!と喜んだのもつかの間、どうにもコンパイルエラーになって処理が通らない。

結論として私がC#よく分かってなかっただけだったわけですが。

悩んだ末の現在のコード

public async void HomeTimelineAsync(){
 foreach (var status in await

  tokens.Statuses.HomeTimelineAsync(count => 10))
 {
  String str = null;
  str = string.Format("{0}:{1}", status.User.ScreenName, status.Text);
  if (str != null)
  {
   str = str+"\n"+this.textBox1.Text;
   this.textBox1.Text = str;
  }
 }
}

ミソは太字の部分。このasync つけたメソッド内でawait指定したtaskの処理を待つって代物。HomeTimelineAsyncはその時取れるTLから10件取得するようになっている、のかな?多分。

とりあえずテキストボックス置いて中に追記で書かせてますが見づらいのでその辺りも考えてもうちょい試行錯誤します。

というかもうちょっとちゃんと説明書き読めという話。

トークンを取得

前回どうにかこうにかPINが取れたので改めてトークンの取得。

といってもこれだけ。

var session=CoreTweet.OAuth.Authorize(CONSUMER_KEY, CONSUMER_SECRET);

var tkn = CoreTweet.OAuth.GetTokens(session, "取得したpin"); 

 

接続エラーになるとExeptionでキャッチできるのでそちらも記述。

まぁ、もっとやっかいな物があったわけですが。

PINを取得する

前回お手本通りの接続が出来なかったわけですがそもそもコンソールアプリで作っててPINを後入れしたらそりゃ繋がらないですよねっていう話。

画面でPINをいれさせるという選択肢もあったけど折角認証画面があるんだからそこから取得しませうって事でトライ。

 

コンソール上にwebBrowzerを貼り付けてそこに認証画面を展開

this.webBrowser1.Navigate(session.AuthorizeUri.AbsoluteUri);

 

webBrowzer内に新たにコードを読み込むたびにチェック

HtmlDocument doc = this.webBrowser1.Document;
var v0 = doc.GetElementById("code-desc");
if (v0 != null)
{
  string info = v0.InnerText;
  if (info != null || info.IndexOf("PIN") > 1)
  {
     string pin = doc.GetElementById("oauth_pin")

    .GetElementsByTagName("code")[0].InnerText;
  }
}

code-descっていうのがPINが記載されているブロックのID。

念のためその中にPINって文字列があったら認証が成功していると見なして取得処理を行う。

oauth_pin内のcode要素内はPINしかないのでべた書きで0番目を取ってくる。とりあえずこれでPINは取得できたので次はこれでtokenを取得する。