LoginSignup
10
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-02-19

自動ファボ

Twitter APIのKey取得方法は、他にも色々リソースがあるので割愛

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でも実装できるように実験中)

# 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件

リファレンス

自動フォロー&ファボ
フォローアンフォロー
cron
ターミナル
API制限

10
13
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
13