CoreTweetで特定のキーワードを含むツイートを大量取得する


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

2.取得したツイートの中で一番古いツイートIDの取り方

ツイートIDの最小値を取得する時に、はじめは、
maxid = result.Min.Id - 1
としていたのだけど、System.ArgumentExceptionが発生し、「少なくとも 1 つのオブジェクトで IComparable を実装しなければなりません。」と言われてしまった。
試行錯誤した結果、CoretTweet.StatusからIdを取り出すFunction「getID」を作成してMinの引数としてみたら動いた。
これが正解なのかはわからないが、動いたから良しとする。

感想

今更感がありますが、CoreTweetって良くできているなぁと感動しました。

以上

<スポンサーリンク>


0 件のコメント :

コメントを投稿