Twitterから特定の単語を新着検索し、結果をLINEに通知する

#完成イメージ
![スクリーンショット (50).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/657000/255e6e4f-732f-a132-110e-854f31bbebf4.png)


#環境

* Windows10
* Python 3.7.6
* Jupyter Notebook


#前提
Twitterの情報を扱うためにAPI登録を済ませておきましょう
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

#準備
PythonでOAuth認証をするために、Requests-OAuthlib（ライブラリ）が必要です
コマンドプロンプトを起動して下記のコードを実行

```
pip install requests-oauthlib
```
この後ツイート検索に用いるOAuth1Sessionには下記の入力が必要

* consumer_key
* consumer_secret
* acces_token
* acces_token_secret

こちらを参考に進めてみてください
[PythonでTwitterしてみた](https://qiita.com/konojunya/items/59a68d35e44db8b87186)



```config.py
consumer_key = '********'
consumer_secret = '********'
access_token = '********'
access_token_secret = '********'
```
`*********`に自分のキーをペーストしておきましょう！

##Tweetを取得する

```Tweet_search.py
import json,config
from requests_oauthlib import OAuth1Session

ck = config.consumer_key
cs = config.consumer_secret
at = config.access_token
ats = config.access_token_secret

twitter = OAuth1Session(ck, cs, at,ats)#OAuth認証


API_URL = "https://api.twitter.com/1.1/search/tweets.json?q="
keyword = "可愛い　猫　-RT"
what_type_result_data = "resent"  # mixed, recent, popular
how = 1
url = API_URL + keyword + "&result_type=" + what_type_result_data + "&count=" + str(how)
response = twitter.get(url)

response_data = json.loads(response.text) 
response_data #データ可視化
```

API_URLは[Twitter Developer](https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets)に記載されている、検索用ツールを用いたものです

* `keyword `:検索したいワードを入力すると出力します
and検索に対応、`-RT`で検索段階でリツイートの除外を推奨

* `what_type_result_date `: `recent`は新着順表示です

* `how`はツイートの取得数
あとはgetメソッドを行い、jsonで読み込んでいます


**実行するとこんな感じに表示されます**

```
{'statuses': [{'created_at': 'Tue Jun 16 14:37:12 +0000 2020',
   'id': 1272901044272586754,
   'id_str': '1272901044272586754',
   'text': '努力しなくても可愛いのは猫だけ、、、、🤔',
   'truncated': False,
   'entities': {'hashtags': [],
    'symbols': [],
    'user_mentions': [],
    'urls': []},
   'metadata': {'iso_language_code': 'ja', 'result_type': 'recent'},
   'source': '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>',
   'in_reply_to_status_id': None,
   'in_reply_to_status_id_str': None,
   'in_reply_to_user_id': None,
   'in_reply_to_user_id_str': None,
   'in_reply_to_screen_name': None,
   'user': {'id': 152910352,
    'id_str': '152910352',
    'name': 'ドライなマブ🎞',
    'screen_name': 'usarin_Dry_mabu',
    'location': 'ゆかり王国ときどき湘南',
    'description': '田村ゆかりさんのライブやイベントは大体参加／(・х・)＼あとは上坂すみれさん高垣彩陽さん水樹奈々さん分島花音さんJUNNAさん石原夏織さんを中心に参加しています。',
    'url': None,
    'entities': {'description': {'urls': []}},
    'protected': False,
    'followers_count': 160,
    'friends_count': 414,
    'listed_count': 6,
    'created_at': 'Mon Jun 07 05:25:44 +0000 2010',
    'favourites_count': 9299,
    'utc_offset': None,
    'time_zone': None,
    'geo_enabled': True,
    'verified': False,
    'statuses_count': 19301,
    'lang': None,
    'contributors_enabled': False,
    'is_translator': False,
    'is_translation_enabled': False,
    'profile_background_color': 'DBE9ED',
    'profile_background_image_url': 'http://abs.twimg.com/images/themes/theme17/bg.gif',
    'profile_background_image_url_https': 'https://abs.twimg.com/images/themes/theme17/bg.gif',
    'profile_background_tile': True,
    'profile_image_url': 'http://pbs.twimg.com/profile_images/1198478023982346240/S3JxLKxY_normal.jpg',
    'profile_image_url_https': 'https://pbs.twimg.com/profile_images/1198478023982346240/S3JxLKxY_normal.jpg',
    'profile_banner_url': 'https://pbs.twimg.com/profile_banners/152910352/1590751230',
    'profile_link_color': 'CC3366',
    'profile_sidebar_border_color': 'DBE9ED',
    'profile_sidebar_fill_color': 'E6F6F9',
    'profile_text_color': '333333',
    'profile_use_background_image': True,
    'has_extended_profile': True,
    'default_profile': False,
    'default_profile_image': False,
    'following': False,
    'follow_request_sent': False,
    'notifications': False,
    'translator_type': 'none'},
   'geo': None,
   'coordinates': None,
   'place': None,
   'contributors': None,
   'is_quote_status': False,
   'retweet_count': 0,
   'favorite_count': 0,
   'favorited': False,
   'retweeted': False,
   'lang': 'ja'}],
 'search_metadata': {'completed_in': 0.019,
  'max_id': 1272901044272586754,
  'max_id_str': '1272901044272586754',
  'next_results': '?max_id=1272901044272586753&q=%E7%8C%AB%E3%80%80%E5%8F%AF%E6%84%9B%E3%81%84&count=1&include_entities=1&result_type=resent',
  'query': '%E7%8C%AB%E3%80%80%E5%8F%AF%E6%84%9B%E3%81%84',
  'refresh_url': '?since_id=1272901044272586754&q=%E7%8C%AB%E3%80%80%E5%8F%AF%E6%84%9B%E3%81%84&result_type=resent&include_entities=1',
  'count': 1,
  'since_id': 0,
  'since_id_str': '0'}}

```

####これらを参考に必要な情報を抜き出します

```Tweet_search.py
data = response_data['statuses'][0]
what = data['text']
twitter_url = 'https://twitter.com/yjbtjn/status/' + str(data['id'])
who = data['user']['name']#任意
when = data['created_at'][:19]#任意
where = data['place']#任意
profile =  data['description']#任意

output = (what) + (twitter_url)
```
上記のコードでは日時やユーザー情報といった必要以上の情報まで抽出していますが、**最低限の情報だけ取得したい**場合には、**#任意**と書かれている行は削除して構いません

` output = (what) + (twitter_url)` ではライン上で通知したい情報を入力しています
LINE上では最低限ツイート内容と発言者さえ分かれば良いと思うので、今回は**what**と**twitter_url**を使用します


#LINEに送信する
今回使うのはLINE Notifyという、実行したものをLINEでキャッチするものです
LINE Notfyを使用するのもトークンが必要なので、こちらを参考に登録してみてください
[Pythonの自動売買ボットからLINEへ通知を飛ばす方法〜仮想通貨自動売買〜](https://www.takeiho.com/python-line-bot)

```Tweet_search.py
import requests
 
def LineNotify(message):
    line_notify_token = "*********************************"
    line_notify_api = "https://notify-api.line.me/api/notify"
 
    payload = {"message":message}
    headers = {"Authorization":"Bearer " + line_notify_token}
    requests.post(line_notify_api, data = payload, headers = headers)
 
LineNotify(output)
```
トークンを******の部分にペーストしたら完成です！


#定期実行について
windows内ですべて完結させる
今回はタスクスケジューラーというソフトを使って定期実行を行います
こちらを参考に進めてみてください
[windows10でPythonスクリプトを定期的に自動実行する方法　タスクスケジューラ](https://karupoimou.hatenablog.com/entry/2019/04/30/194017)

###エラーが頻発する場合
タスクスケジューラーは起動画面でエラーが頻発する不具合報告が上がっています
大抵の場合はこちらのブログで紹介されているツールで解決できます
[タスクスケジューラーのエラーを修復してくれるツール　RepairTask](http://moguttyo55.blog103.fc2.com/blog-entry-1106.html)

#参考にしたサイト
[Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ](https://qiita.com/kngsym2018/items/2524d21455aac111cdee)

[Pythonの自動売買ボットからLINEへ通知を飛ばす方法〜仮想通貨自動売買〜](https://www.takeiho.com/python-line-bot)

[windows10でPythonスクリプトを定期的に自動実行する方法　タスクスケジューラ](https://karupoimou.hatenablog.com/entry/2019/04/30/194017)

[タスクスケジューラーのエラーを修復してくれるツール　RepairTask](http://moguttyo55.blog103.fc2.com/blog-entry-1106.html)

[【Twitter×Python】自分専用のエゴサーチボットを作る方法](https://blog.codecamp.jp/twitter-python-bot)

[素人が今更Twitter APIで遊ぶ　〜その１〜](https://qiita.com/masahiro_isono/items/a6cfdd073686100f0ef1)