【Python】TwitterAPIとtweepyでいいねの自動化をしてみた

今回は、検索したツイートに対していいねする処理を自動化するという実装を行いました。
勉強になりつつ楽しめると思うので、参考にしていただけますと幸いです。

# 実装準備
まず、「いいね自動化」を実装するにあたり、前提として、`TwitterAPI`で「プロジェクト」登録を行い、`API_KEY`や`ACCESS_TOKEN`を取得している必要があるので、取得できていない方は、APIの設定から始めてください。

> [Twitter Developers](https://developer.twitter.com/en/portal/projects-and-apps)

# 実装
以下が実装した内容です。
順次、解説します。
```python:auto_fav_tweet.py
import tweepy

import config

api_key = config.TWEETER_API_KEY
api_secret_key = config.TWEETER_API_SECRET_KEY
access_token = config.TWEETER_ACCESS_TOKEN
access_secret_token = config.TWEETER_ACCESS_SECRET_TOKEN

# 認証を行う
auth = tweepy.OAuthHandler(api_key, api_secret_key)
auth.set_access_token(access_token, access_secret_token)

# すべてのリクエストでauthを認証情報に使う
api = tweepy.API(auth)

# "エンジニア"を含む最近の投稿を5件取得
tweets = api.search_tweets(q="エンジニア", result_type="recent", count=5)

for tweet in tweets:
  try:
    # ツイートのidを取得
    favorite_id = tweet.id
    # 指定したIDのツイートにいいねする
    api.create_favorite(favorite_id)
    # いいねした投稿を取得
    favorite_text = tweet.text
    print(favorite_text)
    
  # tweepyの例外が発生した場合
  except tweepy.TweepyException as e:
    # エラー情報を出力する
    print(e)
```

## ①認証情報の設定
まずはTwitter・TwitterAPIにリクエストを送信するための認証を行う必要があります。
以下が、認証情報を設定しているコードです。
```python:auto_fav_tweet.py
api_key = config.TWEETER_API_KEY
api_secret_key = config.TWEETER_API_SECRET_KEY
access_token = config.TWEETER_ACCESS_TOKEN
access_secret_token = config.TWEETER_ACCESS_SECRET_TOKEN

# 認証を行う
auth = tweepy.OAuthHandler(api_key, api_secret_key)
auth.set_access_token(access_token, access_secret_token)

# すべてのリクエストでauthを認証情報に使う
api = tweepy.API(auth)
```
tweepyモジュールには、認証を行う`OAuthHandler()`があるのでそちらに、`api_key`と`api_secret_key`を渡します。

さらに、認証情報にトークンを設定する必要があるので、そちらも`set_access_token()`で行います。
これでTwitter・TwitterAPIにリクエストを送ることができます。

APIにもよりますが、基本的に**ログインが必要なサービスが提供しているAPI**は`OAuth等`の認証が必要になります。

次に、すべてのリクエストで設定した認証情報を使用するため`tweepy.API(auth)`とし、APIに認証情報を渡します。

## ②ツイートを検索する
認証情報の設定が完了したので、次にTwitterに検索をかけ、条件に合致するツイートを取得します。
以下が、それを実装しているコードです。
```python:auto_fav_tweet.py
# すべてのリクエストでauthを認証情報に使う
api = tweepy.API(auth)

# "エンジニア"を含む最近の投稿を5件取得
tweets = api.search_tweets(q="エンジニア", result_type="recent", count=5)
```
tweepyのAPI情報が持つ`search_tweets()関数`使用して、条件に合致する投稿を取得します。
条件の指定は引数で行います。

第一引数の`q`は`query`として検索ワードを設定します。
次に`result_type`ですが、`recent`を指定し、直近の投稿を取得するよう指定します。第三引数の`count`は文字通り、取得件数を指定しています。

これで条件に合致するツイートを取得できます。

## ③ツイートにいいねをする
最後に、実際に取得した投稿に対して、いいねを行います。

```python:auto_fav_tweet.py
for tweet in tweets:
  # ツイートのidを取得
  favorite_id = tweet.id
  # 指定したIDのツイートにいいねする
  api.create_favorite(favorite_id)
  # いいねした投稿を取得
  favorite_text = tweet.text
  print(favorite_text)
```
これは取得したツイートに対して順に行う処理のため`for文`を使用します。
その中で、`どのツイートにいいねするか`という識別子として、検索したツイートのIDを取得します。

そして、APIの`create_favorite()`に上記で取得したIDを渡し、いいねするツイートを特定し、いいねを実行します。

ここままでで、いいねの実行処理の実装は完了ですが、「どんなツイートにいいねしたかを確認したい」といった場合には、`tweet.text`とすることでツイート内容を取得できるので、それを出力してあげればOKです。

## ④例外処理の実装
最後に、既にいいねしている等の事由によって、例外がでることがあるので、`try-except`を使用して、例外処理を実装します。

```python:auto_fav_tweet.py
for tweet in tweets:
  try:
    # ツイートのidを取得
    favorite_id = tweet.id
    # 指定したIDのツイートにいいねする
    api.create_favorite(favorite_id)
    # いいねした投稿を取得
    favorite_text = tweet.text
    print(favorite_text)
    
  # tweepyの例外が発生した場合
  except tweepy.TweepyException as e:
    # エラー情報を出力する
    print(e)
```
実装は簡単で、for文内の処理をtryにネストし、exceptで実際に発せられる例外を指定し、エラー情報を出力するだけで実装できます。

ここまで実装できたら、pyファイルを実行してみてください。
いいねができているはずです。

# 自動化の設定
ただ、ここまで実装しても定時的な自動化はできていません。
そこで、`cron`を使用して、定時的な自動化の設定を行います。

※ 私の場合は、Macでの環境なので、cronを使用しますが、Windows環境の方は「タスクマネージャー」で簡単に設定できます。

## ①cronにアクセス権を付与
まず、cronにアクセス権を付与しないと、macのセキュリティに弾かれるので、アクセス権を付与します。

[システム環境設定>セキュリティとプライバシー>プライバシー>フルディスクアクセス]を指定し、鍵マークを押下します。
macの承認後「+」ボタンを押下します。
![スクリーンショット 2022-06-12 14.02.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879778/98b78e18-81ff-ae8a-49d2-5534c0bfe601.png)

アプリケーションの選択画面で[command]+[shift]+[G]を押し、検索欄に`/usr/sbin/cron`と入力し、cronを追加します。
![スクリーンショット 2022-06-12 14.09.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879778/5922b203-ad30-5983-c652-fc8a606f01ed.png)

## ②ターミナルでcronに自動化処理を登録
続いてターミナルで自動化したい処理をcronに登録するのですが、その前に、cronに記述する内容を見てみましょう。
```terminal
"分 時 日 月 曜日 /Python3のフルパス /実行したいプログラム"
時間を指定しない場合は　*　を入れる
```
分 0〜59
時 0〜23
日 1〜31
月 1〜12
曜日 0〜7（0,7=日曜、1=月曜、2=火曜、3=水曜、4=木曜、5=金曜、6=土曜）

上記を入力するので、`Python3のフルパス`と`実行プログラムのパス`を取得します。

Python3のフルパスの取得はターミナルで以下を実行します。
その際に、返却されたパスを控えておいてください。
```terminal
% which python3
```
実行したいプログラムのパスは各自で取得しておいてください。

最後にcronに登録します。
以下を実行して、cronに記述していきます。

```terminal
% crontab -e
```
ターミナルのエディタが開くので`i`と入力し**INSERTモード**で、最初に見たcronの記述を書いていきます。

例えば、毎朝9時に実行したい場合は以下を記述します。
```terminal
0 9 * * * /python3のフルパス　/実行したいプログラムのフルパス
```

毎朝8時30分の場合
```terminal
30 8 * * * /python3のフルパス　/実行したいプログラムのフルパス
```

毎時30分の場合
```terminal
30 * * * * /python3のフルパス　/実行したいプログラムのフルパス
```

ここまでできたら`:wq`でエディタを閉じ保存します。

### 注意点
cronの記述をすると、よく以下のエラーが出ることがあります。
```terminal
crontab: errors in crontab file, can't install
Do you want to retry the same edit? 
```
上記のエラーが出たら、 「y」を押し、cronのエディタにエラーがないか確かめます。
よくあるのは**半角スペース**の多い・少ないが原因というものです。

時間の指定は**値ごとに半角区切り**ですし、python3と実行するプログラムのフルパスの間にも**半角スペース**が必要です。

これで定時的な処理の自動化の実装が完了です。

# 参考文献
・[Pythonで自動でツイッターフォロワーを伸ばすプログラムを書いてみた](https://www.youtube.com/watch?v=zAchrWYLrUs&list=PLOWLnU4Su26-EUOMUrcvp9gYv36bBS-vg&index=3)

・[API — tweepy 4.10.0 documentation](https://docs.tweepy.org/en/stable/api.html)

・[【Python】macOSのcronでpythonを自動実行してみた](https://qiita.com/hirockio2206/items/5055c44246ca5239d3da)