Twitter API は場所を指定して検索することができるのだ

#はじめに
Twitter APIでは、場所を指定して検索する機能があります。
この機能を使うと、例えば、とあるイベントの半径１Km内でどんなことがつぶやかれているかをみて、道や駅の込み具合やイベントの盛り上がりを知ったり、電車で事故があった場合に、その周辺でどんなことがつぶやかれているかをみて、電車遅延の情報や乗り換え情報などを知ったり、といった、その場所のリアルタイムな情報を知ることができる、的な使い方ができるようになります。
他にもいろいろな応用が利きそうなこの機能をいろいろと調べて使ってみました。

#環境
Python3.7
python-twitter

#前提
Twitter APIが使える状態にあること
（Twitter Developerでappを作成し、API keyとAccess Tokenを取得していること）
python-twitterがインストールしてあり使える状態のこと

#Twitter API：GET search/tweets
Twitter Developerのドキュメントに、Twitter APIの解説があります。
その中の、[GET search/tweets](http://westplain.sakuraweb.com/translate/twitter/Documentation/REST-APIs/Public-API/GET-search-tweets.cgi)を確認してみましょう。
このAPIは、指定したクエリに合致する関連ツイートを取得することができます。検索文字列や検索結果数など、いくつかのパラメータを指定することができます。
そのパラメータのなかに、`geocode`というものあります。

**パラメータ geocode**
**経度、緯度、半径を指定し、その経度・緯度の半径内にいるユーザーのツイートを取得します。位置情報はジオタグAPIから優先して取得しますが、取得できなかった場合はそのユーザーのTwitterプロフィールから取得します。 このパラメータ値は“latitude,longitude,radius”と指定し、radius の部分には“mi” (マイル) か “km” (キロメートル)のいずれかを指定しなければなりません。 このAPIではジオコードの位置指定にnear演算子を使うことができないので注意してください;しかし、この geocodeパラメータを使って直接近くのジオコードを検索することができます。 A maximum of 1,000 distinct “sub-regions” will be considered when using the radius modifier.**

**サンプル値: 37.781157,-122.398720,1mi**

これを使うと、場所を指定したツイートの検索ができます。

#APIでの場所の特定方法
上記パラメータの説明を読むと、「位置情報はジオタグAPIから優先して取得しますが、取得できなかった場合はそのユーザーのTwitterプロフィールから取得します」と書いてあります。

####ジオタグAPI
時は2009年11月19日、Twitterは同年8月に発表したジオタグ機能を実現するためのAPIを正式にリリースしたと発表しました。この機能はデバイスのGPS機能を使って、発信した場所が自動的にツイートに追加されます。
しかし、2019年6月19日にこの機能が削除されることが発表されました。なにー！

以下、公式ツイート
**Most people don't tag their precise location in Tweets, so we're removing this ability to simplify your Tweeting experience. You'll still be able to tag your precise location in Tweets through our updated camera. It's helpful when sharing on-the-ground moments.**
ほとんどの人がツイート内に正確な位置をタグ付けしません。それで、我々はあなたのツイッター体験を簡易なものにするため、この機能を削除することにしました。でも、まだ、ツイッターのカメラ経由でツイートしたら位置をタグ付けできます。・・・（松尾訳）。

理由は、誰も使ってないから、だそうです。つぶやいた場所が特定されるなんて怖いですもんね。
ただし、Twitterアプリを介してカメラを利用した場合は引き続き位置情報が利用できるそうです。

####プロフィールの位置情報
上記が使えない場合は、Twitterプロフィールから取得されるそうです。
ここで指定したものですね。（下記はPC版のプロフィール画面です。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/59a50f23-b820-0928-d06f-d97ed091a784.png)

#場所情報の取得
このAPIを利用するには、場所の緯度と経度が必要です。緯度と経度を取得するには、ジオコーディングが必要です。
Google Map APIなどを利用すると、住所から緯度経度またはその逆を取得することができます。

今回は、Twitter APIの実験なので、一旦Google APIは使わず、Google Mapから取得します。
Google Mapで例えば「横浜駅」とかで検索します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/3aa1c401-82c4-cd47-4020-b97f4e21f73d.png)

この時、URLの部分に、緯度と経度が表示されています。
黄色く塗った部分が経度と緯度です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/508288/a8d99026-0ef9-8a9f-7703-5f5fb3a9093d.png)

横浜駅は、緯度が35.4657901度で経度が139.6201245度ですね。
これでいったん場所が取れました。

#Twitter API呼び出し
場所が分かったので、Twitter APIで検索してみましょう。
ここでは、python-twitterを使用しています。
まずは、APIを初期化します。下記コードの [　] 内には各アプリケーションのKEYを指定してください。

```python:twitter
import twitter
import json

api = twitter.Api(consumer_key='[CONSUMER_KEYを記述]',
                  consumer_secret='[CONSUMER_SECREを記述]',
                  access_token_key='[ACCESS_TOKEN_KEYを記述]',
                  access_token_secret='ACCESS_TOKEN_SECRETを記述]',
                  tweet_mode='extended')
```
検索を呼び出します。
横浜駅周辺で「雨」に関するつぶやきを検索してみます。

```python:twitter
results = api.GetSearch(
    raw_query="q=雨%20&result_type=recent&geocode=35.4657901,139.6201245,1km")

for result in results:
    print(json.loads(result.AsJsonString())['full_text'])
    print('--')
```
結果が以下のようになりました。

```text
2日目スタート！今日は一日雨みたいなんで「東急線りんかい線お台場パス」を購入して雨用の観光を。 (@ 東急東横線/みなとみらい線 横浜駅 in 横浜市, 神奈川県) https://t.co/nXOLR9OXpf https://t.co/YF3ygDLKt0
--
雨やんだ (@ 横浜駅 in 横浜市, 神奈川県 w/ @dj_m1lk) https://t.co/ysYIhN0BA1
--
なかなか本気モードの雨なので、傘の要らないルートで出勤中です。(・ω・)ﾉ
--
本日も雨ですが☔️お休みの方や、仕事終わりにでもお待ちしています🤗
.
"80s Champion" reverse weave parka"
.
ほぼデッドストックのような美品です。真っ赤なリバースも可愛いです！
.
#champion #LUCKY_YOKOHAMA 場所: LUCKY https://t.co/PqOhLPtmI5
--
本日も雨ですが☔️お休みの方や、仕事終わりにでもお待ちしています🤗
.
"90s Champion" reverse weave parka"
.
フードも中々入らなくなってしまいましたが紐付きでの入荷✨お早めに！
.
#champion #LUCKY_YOKOHAMA 場所: LUCKY https://t.co/VKwMJltDuw
--
本日も雨ですが☔️お休みの方や、仕事終わりにでもお待ちしています🤗
.
"90s Champion reverse weave sweat"
.
鉄板グレー。現行でも出てますがアメリカ製とのボディーの違いを是非実感してみてください✨
.
#champion #LUCKY_YOKOHAMA 場所: LUCKY https://t.co/35SdUehXLR
--
本日も雨ですが☔️お休みの方や、仕事終わりにでもお待ちしています🤗
.
"80s Champion" reverse weave sweat"
.
目無しです！ベージュカラーで良い色、文句なしです。
.
#champion #LUCKY_YOKOHAMA 場所: LUCKY https://t.co/Z5Kp5FW50R
--
本日も雨ですが☔️お休みの方や、仕事終わりにでもお待ちしています🤗
.
"90s Champion" reverse weave sweat
.
オートミールカラーの霜降り。グリーンのプリントも良いです！
.
#champion #LUCKY_YOKOHAMA 場所: LUCKY https://t.co/MiDzlMnEW3
--
本日も雨ですが☔️お休みの方や、仕事終わりにでもお待ちしています🤗
.
"Czech army" cook pants
.
チェコ軍のコックパンツが4色のカラバリで入荷しています👨‍🍳
ベイカーパンツの様な太めシルエット、ウエストは絞れます。 場所: LUCKY https://t.co/FLw1XjVqHC
--
雨なので流石に今日はこっち (@ 横浜駅西口地下駐車場 in 横浜市, 神奈川県) https://t.co/rYakUe1CsX
--
```
横浜でつぶやかれているっぽいツイートもいくつかありますね。うまくいっているようです。
範囲を10kmに広げてみます。

```python:twitter
results = api.GetSearch(
    raw_query="q=雨%20&result_type=recent&geocode=35.4657901,139.6201245,10km")
```
川崎あたりも範囲に含まれているみたいです。

```text
☔雨です。 (@ 川崎駅 - @jreast_official in 川崎市, 神奈川県) https://t.co/uzCcXP5V7N https://t.co/F3CD7Whiqi
--
★ブログ更新しました★

今日はこちら！ 雨よ！ 早めにやんでくれ！！

#三島 #大場 #大場deナイト
https://t.co/kKcjsznmAM
--
RT @hamhamsters: 河野太郎防衛相「誇り持てる自衛隊を作りたい」

「私は地元で雨男といわれ、防衛相になってすでに台風が３つ（来た）」「そのたびに自衛隊員が出てくれている」「あらゆるところで自衛隊に頑張ってもらっている。隊員の処遇改善をきちんとやらなければならない…
--
@xhidex6 また雨ですねぇ…(´･ω･`)
暖かくして過ごしましょ。
--
RT @hamhamsters: 河野太郎防衛相「誇り持てる自衛隊を作りたい」

「私は地元で雨男といわれ、防衛相になってすでに台風が３つ（来た）」「そのたびに自衛隊員が出てくれている」「あらゆるところで自衛隊に頑張ってもらっている。隊員の処遇改善をきちんとやらなければならない…
--
@eemvoXHSVd0uEFh また今日も雨です☂️
--
@o0516t_e_88 出かけるならDVD見れるね(^o^)
15時以降だっけ？入荷されるの
でも雨降ってるよね（−＿−；）
私もパラパラで終わった
最後の写真だけ見て💦
--
@mscircle19_112 こんにちはm(_ _)m 今日もお疲れ様です。
19:00になりましたら、投票します。
雨☔ですが、この後も良い火曜日をお過ごし下さいm(_ _)m
--
寒い寒い
雨嫌い
--
RT @hamhamsters: 河野太郎防衛相「誇り持てる自衛隊を作りたい」

「私は地元で雨男といわれ、防衛相になってすでに台風が３つ（来た）」「そのたびに自衛隊員が出てくれている」「あらゆるところで自衛隊に頑張ってもらっている。隊員の処遇改善をきちんとやらなければならない…
--
@mikamikatn @abechi06 こんにちはm(_ _)m 今日もお疲れ様です。
雨☔ですが、この後も良い火曜日をお過ごし下さいm(_ _)m
--
古紙・古布の回収日と雨が重なるとちょっと残念
--
@sena_hattori こんにちはm(_ _)m 今日もお疲れ様です。雨☔ですが、この後も良い火曜日をお過ごし下さいm(_ _)m
--
RT @hamhamsters: 河野太郎防衛相「誇り持てる自衛隊を作りたい」

「私は地元で雨男といわれ、防衛相になってすでに台風が３つ（来た）」「そのたびに自衛隊員が出てくれている」「あらゆるところで自衛隊に頑張ってもらっている。隊員の処遇改善をきちんとやらなければならない…
--
@xLgBl3nZq8syhDS 雨などもありますからね～
やっぱり消耗品ですね～
充電しないわけでわなく
充電する、しないを繰り返す雰囲気ですね
接点なのか
なんなのかって感じです😞
--
```

#さいごに
位置情報機能じたいがほとんど使われていなくて消えゆく機能と知った時点で、投稿のモチベーションがダダ下がり気味でしたが、写真のジオタグやプロフィールの位置情報はまだ生きつづけるようなので、少しは使える機能なのではないかなと思います。

関連情報での取得はハッシュタグベースがやっぱりいいのかなぁと思う今日この頃でした・・・。