プログラミング歴10日の人がTwitterAPIに負けた話　#2

前回） [プログラミング歴10日の人がTwitterAPIに負けた話　#1](https://qiita.com/johnsakagami/items/7202368fe11e570e060e)
前回までで、最近のツイートの検索・取得・リスト作成までができました。
##本当にやりたかった（けどできない）こと
特定の文字列と前後10文字を含むリストを過去までさかのぼって取得
→共起する文字列の経過変化を見てみたい
端的な結論としては、TwitterAPIの制限によって「**過去までさかのぼって**」が不可能でした。
##なぜいけると思ったのか
昔と今とでAPI制限などが違ったのかもしれませんが、以下のような記事を見たためでした。
>**日単位で取得すれば7日前までしか取得できない制限を突破できます**
untilには7日より前の日付を指定しても取得することができませんが、sinceとuntilで1日ずつ取得すれば7日より前の過去も取得できます。
引用元：[TwitterAPIで期間指定してTweetを取得する方法](https://qiita.com/areph/items/0745cb744a12810334c6)

古い記事なのでまあしゃーない。
また、下記はtwitter.com上では可能ですが、APIを使った検索ではできませんでした。

>[Twitterの検索で時間を含む期間指定をする方法](https://qiita.com/kai_kou/items/336a9d1290c13abba7e2)

##普通にできない
試しに、エンドポイントに渡すキーワードにsinceやuntilを含める際、1週間より前の日付を指定すると、エラーも何も出ずに処理が終わります。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508374/d57b986b-9f61-1494-6462-20dd8fbbf56c.png)
（ｽﾝ…）という感じ。上記は'"ピクミン" since:2019-09-05_00:00:00_JST until:2019-09-06_00:00:00_JST'をキーワードとして渡しています。
since・untilを現在から1週間以内の過去に指定すれば、ちゃんとリストを出してくれます。
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508374/59dd6707-e54d-9e05-f350-9b08c5d29a35.png)
上記は'"ピクミン" since:2019-10-05_00:00:00_JST until:2019-10-06_00:00:00_JST'をキーワードとして渡しています。twitter.com上での検索とも一致していました。
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508374/5c94bbbd-91e5-1516-3e7a-251d90dd7e17.png)
この対照で気づきましたが、APIでの検索ではアカウント名に「ピクミン」が入っているものは弾かれています（twitter.com上での検索ではこちらが多数を占めました。全消ししてあるやつ）。
あと、1ツイートに複数回「ピクミン」が含まれるものは（リスト化が下手な所為で）2度目の「ピクミン」が削られてしまっていますね。。。

さて、APIでの過去のツイート検索ができない空気が濃厚ですが、実際のところTwitter developerドキュメントにも明確に書いてあります。

>今の API v1.1 ではリクエストには認証が必須となっているので注意してください。認証方法の詳細な情報については Authentication & Authorizationのドキュメントを確認してください。また、twitter.comの検索結果では過去のツイートも取得できる一方、検索APIは通常ここ一週間のツイートのみ提供しているので注意してください。
引用元：[Twitter 開発者 ドキュメント日本語訳](http://westplain.sakuraweb.com/translate/twitter/Documentation/REST-APIs/Public-API/The-Search-API.cgi)

##なんとかならないことはない
なんとかならないものか、と思って調べていると、ややグレーな手段はあるみたいですね。
普通のAPIの検索では、「GET search/tweets」を使いますが、（現在は）これだと上記の1週間制限は突破できなくなりました。
一方、「GET search/universal」を使うと、Twitterの全履歴から検索ができるそうですが、これは公式のConsumer keyが必要とのことです。公式のConsumer key？

>[Twitter公式クライアントのコンシューマキー](https://gist.github.com/uhfx/3922268)

これらが発覚（流出）当時の状況は知らないので何とも言えませんが、これらのConsumer keyを使うとTwitter for iPhoneなどの身分を装うことができ、（Twitter for iPhone上で可能な）GET search/universalを使うことができる、ということみたいです。
友達にも相談しましたが、やめときました（余裕でBANされる可能性がありますし、卒論にグレーなソースを使うことは避けるべきですし）。

公式な手段としては、developer accountでPremium購読すると、過去の全ツイートへのアクセス権を得られます。（Sandboxは無料ですが、1か月につき50リクエストまでです）

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508374/d13eac9e-df3a-0208-8346-5c51016d7a3e.png)
しかしPremiumでも最大リクエスト数/月ごとに課金額がことなります。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508374/fa5cb8f5-5003-3e2d-90ed-67dbb2e1ee45.png)
Premium版で1リクエストあたり得られるツイート数が最大500であることを考えると、$99課金すれば過去ツイートを月に最大5万件取得できることになります。
……学部生には厳しいもんだ。

それかデータを丸ごと買うかみたいですね。こちらはさらに手が出ません。
→[Twitterデータ提供サービス(NTT DATA Corporation)](https://nttdata-nazuki.jp/data/twitter.html)

以上、やっぱり公式はｽｹﾞｴﾝﾀﾞﾅｰと思いました。

##まとめ：がんばって卒論を書きます
さて、私はこうして無料のTwitterAPIを使って（1週間以上前の）過去のツイートを取得することは難しい、という結論に至りました。
今後はGET search/universalの力をもったtwitter.com上で、なんとかデータ収集ができないかを検討していかなければなりません。せっかくPythonに手をつけたことだし、GUIオートメーションで何とかならないかな～とかも考えましたが、まだスキルが足りなさそうです。

この記事を読んで、「こうすればいい」的なことがありましたら、ぜひご教授ください。
また、私の認識に間違いなどございましたらご指摘ください。おそらく私が間違っていると思います。

大学院入試には合格しているので、ひとまず無事に卒業できるように頑張りたいと思います。
読んでいただきありがとうございました。