VB.NETとCoreTweetを使って、特定のキーワードを含むツイートを大量に取得してみました。
Twitterを利用したデータ収集等に使えそうな気がします。
TwitterAPIでは1リクエストで100件までしかツイートを取得できないので、NextResultsがある場合は、取得したツイートの中で一番古いツイートのIDの一つ前のIDを取り出し、次の検索条件のMAXIDに設定して再検索しています。
※練習がてら組んだソースなので、例外処理とか省いてとりあえず動くよくらいのものです。
Sub sample()
Dim tokens As CoreTweet.Tokens
Dim result As CoreTweet.SearchResult
Dim query As String
Dim tweetCount As Long
Dim maxid As Long
Dim selecor As System.Func(Of CoreTweet.Status, Long)
tokens = CoreTweet.Tokens.Create(
"{API key}" _
, "{API secret}" _
, "{Access token}" _
, "{Access token secret}")
query = "大阪 since:2017-01-21_00:00:00_JST until:2017-01-21_23:59:59_JST"
result = tokens.Search.Tweets(q:=query _
, count:=100 _
, tweet_mode:=CoreTweet.TweetMode.extended)
tweetCount = result.Count
If result.Count > 0 Then
selecor = New System.Func(Of CoreTweet.Status, Long)(AddressOf getID)
While Not IsNothing(result.SearchMetadata.NextResults)
maxid = result.Min(selecor) - 1
result = tokens.Search.Tweets(q:=query _
, count:=100 _
, max_id:=maxid _
, tweet_mode:=CoreTweet.TweetMode.extended)
tweetCount += result.Count
If result.RateLimit.Remaining = 0 Then
Exit While
End If
End While
End If
Console.WriteLine(tweetCount)
End Sub
Function getID(ByVal status As CoreTweet.Status) As Long
Return status.Id
End Function
注意するところ
上記コードでちょっと苦戦したのは以下の2点。1.件数があまりに多過ぎるとAPI制限がかかってしまう
単純なキーワードだけだと検索が終わらないので、クエリに日時を指定することにした。時刻の指定の仕方がわからなくていろいろ調べた結果、以下のように指定すると時刻まで指定できた。
since = yyyy-MM-dd_HH:mm:dd_JST
until = yyyy-MM-dd_HH:mm:dd_JST
until = yyyy-MM-dd_HH:mm:dd_JST
2.取得したツイートの中で一番古いツイートIDの取り方
ツイートIDの最小値を取得する時に、はじめは、maxid = result.Min.Id - 1
としていたのだけど、System.ArgumentExceptionが発生し、「少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。」と言われてしまった。試行錯誤した結果、CoretTweet.StatusからIdを取り出すFunction「getID」を作成してMinの引数としてみたら動いた。
これが正解なのかはわからないが、動いたから良しとする。
感想
今更感がありますが、CoreTweetって良くできているなぁと感動しました。以上


0 件のコメント :
コメントを投稿