Tweepyで自動フォロー＆ファボを実装し、Cronで定期実行

#自動ファボ
Twitter APIのKey取得方法は、他にも色々リソースがあるので割愛

```python
import tweepy

#xxxxxxxxxxxxxxxxxxxxxは各自取得したAPIをkeyを入れてください。
CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxx'
CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxxxxxxxxxxxxx'
ACCESS_SECRET = 'xxxxxxxxxxxxxxxxxxxxx'


# インスタンス作成
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)

auth.set_access_token(ACCESS_TOKEN, ACCESS_SECRET)
api = tweepy.API(auth)


# ここで検索をかけています。
# 検索したいワードをqという変数に入れます。今回は"プログラミング"でやってます。
# 取得したいTweet数をcountという変数に入れます。今回は100でやってます。
search_results = api.search(q="プログラミング", count=100)


for result in search_results:
    tweet_id = result.id #Tweetのidを取得
    user_id = result.user._json['id'] #ユーザーのidを取得


    try:
        api.create_favorite(tweet_id) #ファボする
        api.create_friendship(user_id) #フォローする
    except Exception as e:
        print(e)
```

# 自動フォローアンフォロー
（Cronでも実装できるように実験中）

```python
# coding: utf-8
#! /usr/bin/python
import tweepy
import time
 
def get_api():
    keys = dict(
        screen_name = 'XXXXXXXXX',
        consumer_key = 'XXXXXXXXX',
        consumer_secret = 'XXXXXXXXX',
        access_token =  'XXXXXXXXX',
        access_token_secret = 'XXXXXXXXX',
    )
    
    SCREEN_NAME = keys['screen_name']
    CONSUMER_KEY = keys['consumer_key']
    CONSUMER_SECRET = keys['consumer_secret']
    ACCESS_TOKEN = keys['access_token']
    ACCESS_TOKEN_SECRET = keys['access_token_secret']
 
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    api = tweepy.API(auth)
    return api, SCREEN_NAME
 
def unfollow(api,followers, friends):
    unfollow_cnt = 0
    for f in friends:
        if f not in followers:
            if unfollow_cnt <= 50:
                api.destroy_friendship(f)
                print("{0}のフォローを解除しました。".format(api.get_user(f).screen_name))
                time.sleep(10)
                unfollow_cnt += 1
            else:
                print('一度に解除可能な人数(50人)に達したため処理を中断します。')
                break
    return unfollow_cnt
 
def follow(api, followers, friends):
    follow_cnt = 0
    for followerId in followers:
        count=0
        for friendId in friends:
            if followerId == friendId:
                break
            count += 1
        if count == len(friends):
            try:
                api.create_friendship(followerId, True)
                print("ID:{0}をフォローしました。".format(api.get_user(followerId).screen_name))
                time.sleep(10)
                follow_cnt += 1
            except tweepy.error.TweepError:
                print('フォローが失敗しました。')
    return follow_cnt
 
def yes_no_input(choice):
    while True:
        if choice in ['y', 'Y']:
            return True
        else:
            return False
 
if __name__ == "__main__":
    u_cnt = 0
    f_cnt = 0
    api, SCREEN_NAME = get_api()
    followers = api.followers_ids(SCREEN_NAME)
    friends = api.friends_ids(SCREEN_NAME)
    choice = input("フォロー解除を実行しますか? [y/N]: ").lower()
    if yes_no_input(choice):
        u_cnt = unfollow(api, followers, friends)
    choice = input("フォローを実行しますか? [y/N]: ").lower()
    if yes_no_input(choice):
        f_cnt = follow(api, followers, friends)
    print('{}人をフォロー解除、{}人をフォローしました。'.format(u_cnt,f_cnt))
    input()
```
# Cronで定期的に実行

Python3で実行するため、まずはPythonの絶対PATHを指定（PATHが無いとimportエラーになるため）
ターミナルで下記を実行

```
python --version
```

```
echo $PATH
```

表示される
「/Users/ユーザー名/anaconda3/bin:/opt……/hg/bin」みたいなやつをコピー


ターミナルで下記を入力

```
crontab -e
```

vimの操作画面で（i）を打って、INSERT画面に移行

```
i
```
先ほどのPATHを、下記の形でペースト（PATH=）

```
PATH=/Users/ユーザー名/anaconda3/bin:/opt……/hg/bin
```


続いてcronコマンドを入力するが、コマンドは下記の形で入力する

```
┌───────────── 分 (0 - 59)
│ ┌───────────── 時間 (0 - 23) 
│ │ ┌───────────── 日 (1 - 31)
│ │ │ ┌───────────── 月 (1 - 12)
│ │ │ │ ┌───────────── 曜日 (0 - 6) (日から土;7はシステムによっては日)
│ │ │ │ │                                       
│ │ │ │ │
│ │ │ │ │
* * * * *  実行するコマンド
```

cron入力例

```
12 7 * * *　　　　　　　　　毎日7:12に実行
0 21 * * *　　　　　　　　　毎日21:00分に実行
0 18 * * 2　　　　　　　　　毎週火曜の18:00に実行
0,10 18 * * 1-5　　　　　　 毎平日の18:00と18:10に実行
0,10,20,30,40,50 * * * *　　　毎日10分毎に実行
*/10 * * * * 　　　　　　 　　毎日10分毎に実行
0 9 1 * * 　　　　　　 　　　毎月1日の9:00に実行
* * * * * 　　　　　　 　　　 毎分実行
```
毎日朝9時に実行させる場合のサンプルコードを、PATHの次の行に入力

```
0 9 * * * python /Users/ユーザー名/Desktop/ファイル名.py
```

escボタンを押してvimを閉じ、下記を入力すれば完了

```
:wq
```

ターミナルに『installing new crontab』と表示されていれば成功
失敗する場合は、下記に書き換えることでエラー箇所を表示するログをデスクトップに作成

```
0 9 * * * python /Users/ユーザー名/Desktop/ファイル名.py > /Users/ユーザー名/Desktop/exec-error.log 2>&1
```

複数のスクリプトを実行したい場合は、「;」で区切るとファイル1の実行結果に関わらず
ファイル2も実行される
「&&」で区切る場合、ファイル1の実行に成功した場合ファイル2が実行される

```
0 9 * * * python /Users/ユーザー名/Desktop/ファイル名1.py ; python /Users/ユーザー名/Desktop/ファイル名2.py
```

#API制限
ツイートとリツイート（合算値）：3時間で300件
いいね：24時間で1000件
フォロー：24時間で1000件
ダイレクトメッセージ：24時間で1万5000件

#リファレンス
[自動フォロー＆ファボ](https://www.torikun.com/entry/twitter-developer-api)
[フォローアンフォロー](https://kia-tips.com/it/python/write-twitter-bot-python-tweepy-unfollow-non-followers)
[cron](https://tanuhack.com/python/cron/)
[ターミナル](http://blog.mollywhite.net/how-to-create-a-twitter-bot/)
[API制限](https://matome.naver.jp/odai/2136085696920497901)