前回ツイッターを操作する時に必要な情報をウィンドウで入力して実行させる画面を表示させるところまでやりました。
今度は実際に画面の入力情報からツイッターの実行をする処理をします。
★やりたいこと
- 自動ログイン
- 自動フォローとアンフォロー
- 自動ツイート
上記3点をpythonでやりたいと思います。その為にchromeからログインさせたり、画面を作成したりとやったのですが、実際にフォローとアンフォローをするとログインとから画面とかなくてもどうにかなることが分かりました。というかむしろない方がいい感じに出来るので前回までの内容がなくてもフォローとアンフォローを実行するようにしましたww
★今回する事
- ツイッターにアクセスするための情報(アクセストークン等)をCSVにして読み込む
- 読み込んだ情報を基にフォローとアンフォロー実行
① プログラム(CSV読み込み)
まずはアクセストークン等を取得し、CSVファイルにしたものを作成する。取得する情報は他にいっぱい解説してくださってるサイト様があるのでそちらを参考にしてください。この取得する情報はツイッターのアカウント毎に必要になるので注意!!
CSVの内容は「アカウント」「パス」「CONSUMER_KEY」「CONSUMER_SECRET」「ACCESS_TOKEN」「ACCESS_SECRET」「検索ワード」をファイル化します。
「アカウント」はツイッターのユーザー名の「@~」の「~」の部分
「パス」は使用しませんがアカウント管理の意味を含めて
「CONSUMER_KEY」「CONSUMER_SECRET」「ACCESS_TOKEN」「ACCESS_SECRET」は取得した情報
「検索ワード」はフォローする時のキーワード。これは複数アカウントを処理する事を考えてそれぞれ違うので個々に設定
1 2 |
csv_file = open("./ouath_data.csv", "r", encoding="ms932", errors="", newline="") f = csv.DictReader(csv_file) |
pythonはCSVファイルを読み込む時に「csv.DictReader」で辞書型として読み込めます。これはkeyと値をペアにした変数の一種でkeyから値を取得できます。
これを使うとCSVのヘッダーをkeyにして各行の値を辞書型にして取得できます。かなり便利です。いちいち変数を作ってセットしなくても良いですヾ(*´∀`*)ノ
次は読み込んだCSVの情報を使って認証をします。
② プログラム(認証)
①でCSVを辞書型でとってきたのでそれを1行ずつfor文で回してフォロー、アンフォローを実行します。その前にアクセストークン等を使ってOAuth認証をします。
pythonからツイッターの処理を実行するのにtweepyを使います。tweepyのインポートやインストールは他にいっぱい解説し以下ry
この処理は関数を作成して呼び出します。引数に読み込んだCSVの1行分を渡してkeyから値を取得して認証を行います。
1 2 3 4 5 6 7 8 9 10 |
def get_apikey(row): CONSUMER_KEY = row['CONSUMER_KEY'] CONSUMER_SECRET = row['CONSUMER_SECRET'] ACCESS_TOKEN = row['ACCESS_TOKEN'] ACCESS_TOKEN_SECRET = row['ACCESS_SECRET'] auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET) api = tweepy.API(auth) return api |
認証した後のAPIを戻り値として返します。
③ プログラム(フォロー)
この処理も関数を作成して呼び出します。引数に読み込んだ②の戻り値のAPI、検索ワードとフォローする数を渡してフォローを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
def follow(api, keyword, a_cnt): follow_cnt = 0 skip_cnt = 0 # 検索ワードと追加フォロー数をセットし検索実行 search_results = api.search(q=keyword, count=a_cnt) for result in search_results: if follow_cnt <= a_cnt: try: screen_id = result.user._json["screen_name"] if result.user.following == False and\ result.user.friends_count > result.user.followers_count and\ result.user.follow_request_sent == False: api.create_friendship(screen_id) print("{0}をフォローしました。".format(screen_id)) time.sleep(2) follow_cnt += 1 else: print("{0}をスキップしました。".format(screen_id)) skip_cnt += 1 except tweepy.error.TweepError: print("フォローが失敗しました。") return follow_cnt, skip_cnt |
まず、検索ワードに該当するユーザーをフォローしたい数分検索します。
1 |
search_results = api.search(q=keyword, count=a_cnt) |
検索結果をfor分でぐるぐる回して1件ずつフォローしていきます
1 2 3 4 5 |
if result.user.following == False and\ result.user.friends_count > result.user.followers_count and\ result.user.follow_request_sent == False: api.create_friendship(screen_id) print("{0}をフォローしました。".format(screen_id)) |
フォローする時に対象のユーザーがフォローしている数とフォロワーの数を比較してフォロー数が多くて自分がフォローしていない人で更に鍵付きユーザーにフォロー申請していないユーザーを対象にフォローをします。
③ プログラム(アンフォロー)
この処理も関数を作成して呼び出します。引数に読み込んだ②の戻り値のAPI、自分のフォローとフォロワーを渡してアンフォローを実行します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def unfollow(api, followers, friends): unfollow_cnt = 0 for f in friends: if f not in followers: if unfollow_cnt <= 100: api.destroy_friendship(f) print("{0}のフォローを解除しました。".format(api.get_user(f).screen_name)) time.sleep(2) unfollow_cnt += 1 else: print('一度に解除可能な人数に達したため処理を中断します。') break return unfollow_cnt |
はっきりしないけど、どうやら1度にアンフォローできるのは100件らしいので100件まで処理します。
③ プログラム(メイン)
メイン部分でCSVのファイル読み込みとフォロー、アンフォローの呼び出しをします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
if __name__ == "__main__": u_cnt = 0 f_cnt = 0 s_cnt = 0 csv_file = open("./ouath_data.csv", "r", encoding="ms932", errors="", newline="") f = csv.DictReader(csv_file) for row in f: api = get_apikey(row) screen_name = row['アカウント'] search_word = row['検索ワード'] followers = api.followers_ids(screen_name) friends = api.friends_ids(screen_name) keyword = search_word print('アカウント:{}, 検索ワード:{}'.format(screen_name, keyword)) choice = input("フォロー解除を実行しますか? [y/N]: ").lower() if yes_no_input(choice): u_cnt = unfollow(api, followers, friends) a_count = input("追加フォロー数:") a_cnt = int(a_count) choice = input("フォローを実行しますか? [y/N]: ").lower() if yes_no_input(choice): if(a_cnt > 0): f_cnt, s_cnt = follow(api, keyword, a_cnt) print('{}人をフォロー解除、{}人をフォロー、{}人をスキップしました。'.format(u_cnt, f_cnt, s_cnt)) friends_cnt = len(api.friends_ids(screen_name)) followers_cnt = len(api.followers_ids(screen_name)) print('{}人のフォロー、{}人のフォロワー。'.format(friends_cnt, followers_cnt)) input() |
実行した時の注意点として「Read-only application cannot POST」とエラーがでてフォローもアンフォローもできないことがあります。実際に発生してハマりましたorz
この場合はエラーが発生したアカウントのトークン等の情報を一度削除して取得しなおすとなおります。自分はそれで直りました。
※あまりやり過ぎるとスパム垢と判断されて凍結されるので注意!!
こんな感じでフォロー、アンフォローを複数垢自動化できました(≧▽≦)