Twitter APIを使ってデータ収集する機会がありました。
Twitter APIには、Googleの検索のように、ツイートを検索するSearch APIがあって、今回それを使いました。
普段Twitterは、主にリーダーとして利用していたので、あまり機能を意識することは無かったのですが、 Search APIでツイートを、色々条件を指定して検索しようとすると、Twitterの用語やら機能やら構成やらが絡んでくるので混乱しました。
ここでは、TwitterのSearch APIを使って、目的のツイートを検索する方法についてまとめてみました。
Twitter APIの使い方は別記事にまとめました。
Twitterの構成
Search APIは、外部に公開されているツイートが検索対象になります。
外部に公開されているツイートとは、下記のような構成になります。
「user_A」と「user_B」のタイムラインがあって、user_Aは「通常ツイート」「user_Bのリツイート」「user_Bの引用リツイート」「user_Bへの返信」をしています。
ツイートの種類
ツイートには、「ツイート」「リツイート」「引用リツイート」「返信」の4種類があります。
- ツイート
- いわゆる通常のツイート
- ツイートした本人のタイムラインに表示させる
- リツイート
- 他の人のツイートを、自分のタイムラインにツイートとして表示させる
- リツイートしたいツイートで、リツイートボタンを押して「リツイート」で行う
- 引用リツイート
- 他の人のツイートに、自分のコメントをつけて、自分のタイムラインにツイートとして表示させる
- 引用リツイートしたいツイートで、リツイートボタンを押して「コメントを付けてリツイート」で行う
- 返信
- ツイートに対し、ツイートする。ツイートのスレッドと、返信した人のタイムラインに表示される。
Twitterのデータ構成
Twitterの構成を念頭に置いて、Twitterのデータ構成を見てみます。
「text」は、そのツイートの本文で、キーワード・ハッシュタグで検索した時の検索対象になる部分です。
他の要素は、「リツイート」「引用リツイート」「返信」の、ツイートの種類によって付加されるデータで、これにより受け取ったデータからツイートの種類を識別することができます。
目的別検索条件例
基本的な書き方
基本的には、Googleで検索するように、検索したい文字列や条件をクエリ文字列として書いて、APIに渡します。
複数の条件がある場合は、スペースで開けて並べて書くと、ANDで検索してくれます。
NOT条件は、条件の前に「-」を付けます。
例えば、「キーワード1」と「#ハッシュタグ1」を含む、「ユーザー1」以外のツイートを検索するには、下記のクエリになります。
キーワード1 #ハッシュタグ1 -from:ユーザー1
以下、よくやる検索を、目的別にまとめてみました。
キーワードで検索
キーワード_1 キーワード_2 ...
ハッシュタグで検索
#ハッシュタグ_1 #ハッシュタグ_2 ...
特定のユーザーのツート
from:user_A
ユーザーは「@」以下の表示名を使います。
特定のユーザーに対する返信
to:user_A
特定のユーザーに対するリツイートと返信
@user_A
「@」はリツイートと返信の両方を含むので注意が必要です。
リツイートのみ
filter:retweets
特定のユーザーに対するリツイート
@user_A filter:retweets
「@」はリツイートと返信の両方を含むので、返信を除外してリツイートのみを検索したい場合は、「リツイートのみ」のフィルター条件を組合わせます。
リツイート除外
-filter:retweet
リツイートは、言わば元ツイートのコピーなので、リツイートは除外して、純粋に投稿のみを検索したい時などに使います。
引用リツイートが検索できない
ここが、今回一番つまづいたところです。
「引用リツイート」はリツイートと名前は付いていますが、リツイートではありません。
困ったことに、リツイートを検索しても、引用リツイートは含まれないのです。
更に困ったことに、リツイートのような、引用リツイートを絞り込む検索条件が無いのです。
そして、データ構造を見ると分かるように、リツイートは本文がリツイート元のツイート内容になっているのですが、引用リツートは、コメントが引用リツートの本文で、引用元ツイート文章は本文に含まれません。
これの何が困るかというと、元ツイートの文章の内容で検索しても、引用リツイートは引っかからないのです。
まとめると…
Search APIで検索しようとして、リツイートなら、
- リツイートに絞り込んだ検索
- リツイートを除外した検索
- リツイートの文章を対象とした、キーワード・ハッシュタグによる検索
ができるのですが、引用リツイートの場合
- 引用リツイートに絞り込んだ検索
- 引用リツイートを除外した検索
- 引用内容の文章を対象とした、キーワード・ハッシュタグによる検索
ができません。
つまり、
- 特定のツイートに対する引用リツート
- 特定のユーザーに対する引用リツート
- 特定のユーザーによる引用リツート
の検索ができないのです。
引用リツイートを検索する
しかし「特定のツイートに対する引用リツート」だけは、検索条件の工夫で検索することができます。
Search APIには、含まれるURLを検索する検索条件があり、ここに引用元ツイートのURLの一部を指定することにより、特定のツイートの引用リツイートを検索することができます。
ツイートのURLは、ツイートをクリックして開くと、ブラウザーアドレスに表示されるのですが、下記のようなものになります。
https://twitter.com/<@以下のユーザー名>/status/<id_str(数字のTweetID)>
数字の「id_str」がツイートのIDで、URLに指定することにより、そのツイートの引用リツイートを検索できます。
ただし、それだとリツイートも含まれるので、リツイートを除外したものが、引用リツイートになります。
url:<id_str> -filter:retweets
検索は最新順
Search APIには、無償版と有償版があるのですが、無償版では直近7日ののツイートしか検索できません。
検索結果が多数の場合はページングしていくのですが、古いツイートは引っかからないため、ページは最新結果もしくは指定した最終日から順に、過去に遡る形でページ送りされる仕様になっています。
感想など
大きめのプロモーションを打った時は、Twitter社の方でツイート集計お願いできたりするのですが、些細な集計だと言いづらく、仕方なく定期的にクロールすることにしました。
引用リツイートが、リツイートと同じ感覚で検索できればよかったのですが、引用リツイートは特定のツイート単位でしか検索できないので面倒ですね。
引用リツイートの検索条件入れて欲しいなぁ…。