【2021年7月執筆】Twitterでのsearch APIの制約について

私事ではありますが、2020年5月にコーギーという中型犬をお迎えしました。
<b>[愛犬のブログ](https://corgi-komugi.com/)</b>を運営してますので、見てもらえると嬉しいです。

<img width="400" alt="corgi_komugi" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/e2b5f15a-5b47-2e88-0ced-202394c022cd.jpeg">

<b>「コーギーについて、TwitterAPIで根掘り葉掘り分析してやる！」</b>

と意気込んでいましたが、TwitterAPIの制約により上手くいきませんでした。
今回はその話をしたいと思います。

## 対象者
- TwitterAPIのsearch apiを使ってみたが、検索結果が上手く表示できず困っている人
- TwitterAPIのsearch apiの使用を検討しており、何ができるか知りたい人<br>

TwitterAPIのsearch apiでは、「特定の語句を指定して、tweetを収集する」ことができます。
「Twitterのuser_idで検索する」「自分のtweetの一覧を表示する」といった場合には、search api以外の機能を使用するため、もろもろの条件も異なります。

<b>また、今回の説明にはコードは出てきません。ご留意ください。</b>

## 簡単な結論

- TwitterAPIの無料版だと、直近7日分のTweetしか検索できない<br>(長期にわたるtweet取得には、計画性が必要)
- その他のAPIでのTweet取得も検討したが、あまり効果的ではなかった
- 最終的には、TwitterAPIを使わずに、twitterのHP上で条件を絞り込んで検索した


## APIでのもろもろの検討
### ボツ案1 TwitterAPIのSearch APIの検討した
2021年7月現在、Twitter社が提供しているStandard search APIを使用すると、7日分のTweetしか検索できません。
[Developer Platform](https://developer.twitter.com/en)でTwitter社が明言してます。

<img width="600" alt="twitter_HP" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/ab69755b-df9f-a1ec-8309-4e0f87444073.png">

引用元は[こちら](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets)
<br>
また、検索結果は完璧とは言い難いです。
> Please note that Twitter's search service and, by extension, the Search API is not meant to be an exhaustive source of Tweets. Not all Tweets will be indexed or made available via the search interface.

引用元は[こちら](https://developer.twitter.com/en/docs/twitter-api/v1/tweets/search/api-reference/get-search-tweets)

<br>
有料版のPremium search APIに契約すれば、期間制限なしで使用できるようです。
詳細が気になる場合は、[こちら](https://developer.twitter.com/en/docs/twitter-api/premium/search-api/quick-start/premium-full-archive)から確認ください。
(私は試していないので、詳細は省きます。)

### ボツ案2 Githubによいライブラリがないか検討した
GIthubに[GetOldTweets-python](https://github.com/Jefferson-Henrique/GetOldTweets-python/)というライブラリを見つけました。
<br>
Detailを読むと、「Twitter official APIでは1週間以上前のtweetを無料で取得できないので、取得できるライブラリを開発したぜ！」と書いてあります。
> Twitter Official API has the bother limitation of time constraints, you can't get older tweets than a week. Some tools provide access to older tweets but in the most of them you have to spend some money before. I was searching other tools to do this job but I didn't found it, so after analyze how Twitter Search through browser works I understand its flow. 



これで解決かと思いましたが、GetOldTweets-pythonをさらに詳しく調べていくと、<b>2020年9月以降はUnexpected errorにより使用できないことが判明しました。</b>

> Unexpected error: \<class 'urllib.error.HTTPError'\>

引用元は[こちらのGIthubのIssue](https://github.com/Jefferson-Henrique/GetOldTweets-python/issues/274)です。

真偽のほどは不明ですが、Twitterの仕様変更のためと言われています。

## 次善策

ここからは、技術的制約の中でできることを検討していきます。

### 次善策1 TwitterAPIの無料枠を、可能な限り活用する

「[大量ツイートの収集・分析を個人で手軽に実現可能にする方法の提案](https://www.ipsj.or.jp/dp/contents/publication/41/S1101-R1802.html
)」という、推薦投稿論文を見つけました。

簡単に説明すると、ボツ案1のStandard search API(Twitter APIの無料版)を、無料枠の上限まで最大限活用することで、大量のツイートを収集する、というものです。

この方法で短時間での大量のツイートを収集することが可能ですが、<b>依然として7日以上前のツイートを収集できない</b>ため、この方法は断念しました。

論文が2020年1月に掲載されているため、提案時は7日以上前のツイートを収集できましたが、ボツ案2のGetOldTweets-pythonと同様、2020年9月以降は7日以上前のツイートを収集できなくなっていると推測されます。


### 次善策2 Twitter HPの検索を最大限活用する
Twitter HPでツイートを検索する際に、クエリの条件を細かく指定することで、収集したいツイートを表示することができます。

※「検索」は、下の画面の赤枠で行えます。

<img width="600" alt="twitter_HP" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/c5223afd-1ba3-73b4-b6e6-36deedd4f367.png">


例えば、

- 「コーギー」又「#コーギー」というワードが使用されている
- Retweetは除く
- いいねを100以上獲得している
- 日本語以外の言語

という条件でのTweet取得は、以下のクエリで行えます。

> "#コーギー' OR 'コーギー' exclude:retweets min_faves:100 -lang:ja"

cucmberiumさんがGithubで詳しく書いてくれてるので、興味がある人は[こちら](https://gist.github.com/cucmberium/e687e88565b6a9ca7039)を確認ください。

また上のリンクでは、「search/tweets では一週間以上前のツイートは検索できないので注意」と記載がありますが、2021年7月現在は、1週間以上前のツイートも表示されています。

【2021年7月8日追記】
GUIを重視する場合は、[Twitter Advanced search](https://twitter.com/search-advanced?lang=ja)を使用してもいいかもしれません。

~~もはやAPIは使用していませんが、~~効果的でした。

## 実施したこと
Twitter HP で世界のコーギーの人気ツイートを以下のクエリで検索し、ブログにまとめました。

> "#corgi OR 'corgi' exclude:retweets min_faves:1000 -lang:ja"

- '#corgi' または 'corgi' という文字が含まれている
- リツイートは除く
- 最低のfavが1000以上
- 日本語で書かれていない

という全ての条件に当てはまるツイートを抽出しました。

<b>結果は[こちら](https://corgi-komugi.com/twitter_202106/)です。興味があれば確認ください！</b>

<img width="400" alt="corgi_komugi" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/522259/1b3f0447-f365-50ee-9e96-ac3134ffad25.jpeg">