はじめに
Twitter上には様々な有効な情報が流れています。
特に重要なアカウントはフォローしますが、それでも見逃したり、フォロー外で流れていく情報は把握しきれません。
それを少しでも解消するためにTwitterを任意の単語で検索し、その単語を含むTweetの一覧を取得する方法を紹介します。
いくつかの方法があるのですが、今回は「TwitterAPI1.1」を使う方法を紹介します。
使用するパッケージ
- OAuth
- 認証のためのOAuth1.0プロトコル実装
- https://docs.juliahub.com/OAuth/YjgKz/0.9.0/
- JSON
- Dates
- 日時操作(標準で組み込まれています)
- https://docs.julialang.org/en/v1/stdlib/Dates/
- TimeZones
準備:TwitterのAPIキーを取得
検索は、TwitterのAPIを呼び出して実行します。そのAPIを使用するためには、Twitterアカウントの取得に加えて、APIキーを取得する必要があります。今回はAPI1.1を使うので、次の4つをTwitter開発者プラットフォームにて取得してください。
- API Key
- API Key Secret
- Access Token
- Access Token Secret
取得する手順はいろいろなところで紹介されているのでここでは割愛します。例えば次のページなどを参考にするとよいでしょう。
APIの申請手順は時々変更になることがあるので、最新の情報を見るようにしてください。ウェブ上には、古い情報(現在の申請画面とは異なる説明をしている)が残っていることがあるので注意が必要です。
API呼び出しのエンドポイント
今回使用するのは、Standard v1.1 のAPIです。
検索のAPIは、「Search Tweets: Standard v1.1」になります。
実際に使用するのは、ここに書かれている Resource URL で、下記になります。
https://api.twitter.com/1.1/search/tweets.json
このURLに、APIキーや検索文字列を引き渡して呼び出すことで、検索が実行され、結果がJSONで返ってきます。
このほかにも様々な引数があります。引数については該当ページをご覧ください。
APIキーによる認証
前述の「準備」で説明した4つのAPIキーを使います。
- apikey
- apisecret
- accesstoken
- accesstokensecret
それぞれ、複数の英数字(accesstokenは「-」文字含む)で構成されています。
検索の実行
今回は検索文字列と結果の最大数を指定します。引数は辞書型(Dict)に格納して渡します。
検索文字列は、日本語でも構いません。検索結果数は、デフォルト15件、指定できるのは100件までです。
options = Dict("q" => "コロナ", "count" => 10)
エンドポイントは、前述のURLを指定します。
endpoint = "https://api.twitter.com/1.1/search/tweets.json"
これらと、APIキーを「oauth_request_resource()」に渡して呼び出します。
r = oauth_request_resource(endpoint, "GET", options, apikey, apisecret, accesstoken, accesstokensecret)
戻り値はバイト列なので、これをJSONとして変換し処理できるようにします。
data = JSON.parse(String(r.body))
statuses = data["statuses"]
statusesにTweetデータの列が入っています。
これを1件ずつ取り出して、さらに必要な情報を抽出します。Twitterから返ってくる情報は膨大なので、ここでは一部のみを紹介します。下記の表の「status」は「statuses」の要素、すなわちTweetデータ1件に相当します。
TweetのID | status[“id”] |
Tweetの日時 | status[“created_at”] |
アカウント名 | status[“user”][“name”] |
名前 | status[“user”][“screen_name”] |
本文 | status[“text”] |
日時情報の扱い
前述の情報の中で、特に注意したいのが日時文字列です。Twitterの検索結果に含まれる日時文字列は次のような表現になっています。C言語のctime()関数のフォーマットに準じているようで、少し扱いにくい形です。
Tue Apr 12 05:19:39 +0000 2022
これは、標準の日時処理「DateTimes.jl」だけでは、正しく処理することはできません。問題となるのは、TimeZoneの扱いです。
今回は、TimeZone解析に対応している「TimeZones.jl」のZonedDateTimeを使います。
日時文字列を日時情報として読み込む際にフォーマット文字列を使います。
Twitterの日時文字列を読み込むには次のようなフォーマット文字列を使います。
"e u d H:M:S zzzz y"
それぞれの文字は前述のTwitterでの日時文字列の表現に対応しています。詳細は、次をご覧ください。
このフォーマット文字列でTwitterの日時表現を読み込みます。しかし、TimeZoneはUTC(協定世界時)になっています。我々は日本時間でのデータを必要としているので、さらに「astimezone()」によって、TimeZoneを日本時間に切り替えます。
julia> t1 = "Tue Apr 12 05:19:39 +0000 2022"
"Tue Apr 12 05:19:39 +0000 2022"
julia> t2 = ZonedDateTime(t1, dateformat"e u d H:M:S zzzz y")
2022-04-12T05:19:39+00:00
julia> zdt = astimezone(t2, tz"Asia/Tokyo")
2022-04-12T14:19:39+09:00
julia> dt = DateTime(zdt)
2022-04-12T14:19:39
これで、Twitterの日時文字列をJuliaで処理できる形式に変換することができました。
まとめ
上記をまとめたコードを下記に公開しています。
ただし、APIキーは空になっているので、それぞれが取得したAPIキーを記入したうえで実行することができます。

おまけ:パッケージ「Twitter.jl」は使わない方がよいみたい
※Windows10上での確認です。他のOSや実行環境によっては状況が違う場合があります。
「Twitter.jl」というパッケージがあります。TwitterAPI1.1をラッピングして使いやすくしたもののようです。
実際に使ってみると、動作します。しかし、一度使った後で、一旦Juliaを終了し、再度Juliaを立ち上げるとエラーが出て動作しなくなります。「Twitter.jl」を使う方法だけでなく、上記のAPIを直接使う方法も動作しなくなっているので、OAuthかHTTPアクセス関連がおかしくなっているのだと思いますが、エラーを解消する方法が見つかりません。
どうやら、Juliaの再インストールが必要なようです。
しかし、単純に、アンインストール→インストールでは、状況は回復しませんでした。
試行錯誤の結果、アンインストール後に下記のフォルダを丸ごと削除してからインストールすると、正常動作に戻りました。(一部のサブフォルダの削除なども試したのですが、うまくいきませんでした。)
C:\Users\<アカウント名>\.julia
このフォルダー中には、インストールしたパッケージなどの情報が残されているようです。削除しておかないと、再インストール後も、この中に残っているおかしくなった情報が使われてしまうということのようです。
なお、フォルダの位置は、それぞれの環境によって異なる場合があるので、各々ご確認ください。
コメント