仮想サーファーの波乗り

仮想化エンジニアの日常

プログラミング・SNS分析・仮想通貨・自動化などに関してよく書く雑記ブログ

Pythonでwebアプリケーション開発⑥ ~TwitterAPIで自動フォロー/アンフォロー~


こんばんは!


TwitterのAPIを触ってみよう企画の第3回目です。今回は、TwitterAPIを使って特定のユーザーをフォローしていきます。


TwitterのAPI利用準備


まだTwitterのAPI準備をしていない方は、こちらを参考にAPIを使える状態にしておいてください。


特定条件のアカウントをフォロー


今回もこれまで同様Tweepyを使っていきます。まずは、「search_follow_user.py」というファイルに、以下の条件でユーザーをフォローしていく処理を記述します。
・特定の単語で検索に引っかかる
・まだフォローしていない
・フォローは最大でも5人までにする

import tweepy
import os

# TwitterAPIの認証データを取得して認証
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# 特定の単語でつぶやいているユーザーを10人検索して、フォローしているか判定し、まだフォローしていなければフォロー。
# フォロー人数が5人になるまでフォローしていく。
query = "ブロックチェーン"
search_count = 10
loop_count = 0
api = tweepy.API(auth)
search_results = api.search(q=query, count=search_count)

for result in search_results:
    user_id = result.user.id
    screen_name = result.user.screen_name
    user_name = result.user.name
    print("----------------------")
    try:
        api.create_friendship(user_id)
        print(user_id, ":", user_name + "@" + screen_name, "をフォローしました")
        loop_count += 1
    except:
        print(user_id, ":", user_name + "@" + screen_name, "はフォロー済みだったぽいね")
    if loop_count >= 5:
        break


それでは、ファイルを実行してみましょう。

$ forego run python search_follow_user.py


Terminal上に、フォロー結果が表示されました。 f:id:virtual-surfer:20180212155909p:plain


本当にフォローされているのか結果の1人目を確認してみると、フォローされていることを確認できました。 f:id:virtual-surfer:20180212155925p:plain


次に、「既にフォローされているアカウントはフォローしなくてもいいし、フォロワー少なすぎるアカウントはちょっとなあ。。。」という時を想定して「search_unfollowed_user.py」というファイルに、以下の条件でユーザーをフォローしていく処理を記述します。
・特定の単語で検索に引っかかる
・まだフォローされておらず、フォローもしていない
・フォロワーが200人以上いる

import tweepy
import os

# TwitterAPIの認証データを取得して認証
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# 特定の単語でつぶやいているユーザーを5人検索して、フォローされておらず、フォロワーが200人以上いればフォロー。
api = tweepy.API(auth)
query = "仮想通貨"
search_count = 5
my_screen_name = "virtual_techX"

followers_ids = api.followers_ids(my_screen_name)
search_results = api.search(q=query, count=search_count)
for result in search_results:
    user_id = result.user.id
    # 検索結果のユーザーにすでにフォローされていたら、フォロー処理をせずにループを次に進める。
    if user_id in followers_ids:
        break
    # 検索結果のユーザーにまだフォローされておらず、フォロワーが200人以上いればフォロー。いなければ無視。
    user_follower_count = api.get_user(result.user.id).followers_count
    user_name = result.user.name
    screen_name = result.user.screen_name
    print("----------------------")
    if user_follower_count < 200:
        print(user_id, ":", user_name + "@" + screen_name, "はフォロワーが" + str(user_follower_count) + "人しかいないからフォローしなかったす")
    else:
        try:
            api.create_friendship(user_id)
            print(user_id, ":", user_name + "@" + screen_name, "はフォロワーが" + str(user_follower_count) + "人もいるからフォローしたっす")
        except:
            print(user_id, ":", user_name + "@" + screen_name, "はフォロー済みだったぽいね")


ファイルを実行してみると、ちゃんと200人以上の場合はフォローするようにしてくれています。 f:id:virtual-surfer:20180212163324p:plain


ちなみに、「str(文字列型)とint(整数型)の連結、普通にできるっしょ!」と普段書いているJavaのノリで実行してエラーになりました。「str(int)」でintを明示的にstrに型変換する必要あるのですね。ちょっと勉強になった。


特定条件のアカウントをアンフォロー


ついでに、フォロワー少なすぎるアカウントのフォローを外す処理も実装します。以下の条件で今フォローしているアカウントのフォローを外す「remove_user.py」ファイルを作成します。
・自分がフォローしているアカウントの内、フォロワーが10人以下のアカウント

import tweepy
import os

# TwitterAPIの認証データを取得して認証
CONSUMER_KEY = os.environ['CONSUMER_KEY']
CONSUMER_SECRET = os.environ['CONSUMER_SECRET']
ACCESS_TOKEN = os.environ['ACCESS_TOKEN']
ACCESS_TOKEN_SECRET = os.environ['ACCESS_TOKEN_SECRET']
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

api = tweepy.API(auth)
my_screen_name = "virtual_techX"

# フォローしているアカウントのフォロワーが10人以下ならフォロー外す。10人より多ければ無視
following_ids = api.friends_ids(my_screen_name)
for following_id in following_ids:
    following = api.get_user(following_id)
    user_id = following.id
    user_follower_count = following.followers_count
    user_name = following.name
    screen_name = following.screen_name
    if user_follower_count <= 10:
        print("----------------------")
        api.destroy_friendship(user_id)
        print(user_id, ":", user_name + "@" + screen_name, "はフォロワーが" + str(user_follower_count) + "人しかいないからフォロー外したっす")


ファイルを実行してみると、フォロワー10人以下のユーザーがどんどんアンフォローされていきます。 f:id:virtual-surfer:20180212165827p:plain


これでフォロー、特定の条件でのアンフォローの実装ができるようになったので、あとは条件を変えていけば自分のフォローしたい/アンフォローしたいアカウントを定期的に自動で操作してくれます。最高。


まとめ


ここまでで、ツイート、タイムラインの取得、フォロー・アンフォローの実行処理を書いてきましたが、ここまでできればTwitterを画面から操作することは今後なさそうです。terminalとファイル操作で処理の内容だけ書いて、あとは実行しておくようにすれば実質の作業時間5分とかで時間の短縮になりますしね。毎回フォロー/アンフォローの操作のために画面ポチポチして20分とかかけてた頃が懐かしい...。


次は処理を定期実行するようにしたいところですね。条件と定期実行するタイミングを画面からいじれるようなアプリケーションを作れば、晴れてTwitterのポチポチ操作を卒業できそうです。


では!
(面白いと思っていただけたら、「B!ブックマーク」していただけると嬉しいです!!)