トップページ -> PythonでTwitterのデータを取得する -> 最終アクティビティからアクティブユーザーか否かを調べる

最終アクティビティからアクティブユーザーか否かを調べる

注意

このページに書かれている内容はTwitter APIの有料化により無料では使用できなくなっています.

フォローしているアカウントがアクティブかどうかを最終ツイート(と最終いいね)の日付を確認することで調べます. アカウントの活発さを判断したい方は最近のアクティビティ数からアカウントの活発さを調べるをご覧ください.

所要時間について

最終ツイートの確認だけであればほとんど時間はかかりません. 最終いいねをいつしているかの確認に関しては時間がかかります. よくいいねしてくれる人を調べるでいいねの情報の取得方法と所要時間について紹介していますので,気になる方はそちらをご覧ください.

APIオブジェクトを作成する

APIキー アクセストークンを使ってAPIオブジェクトを作成します. 以下のコードをコピペしてAPIキー アクセストークンの部分だけ書き換えてください. 今回はAPIオブジェクトの作成時にwait_on_rate_limitを設定してレート制限によるエラーを回避します. APIキー アクセストークンを忘れた方はアクセストークン・API Keyについてをご覧ください.


# tweepy.__version__ ==  '4.12.1'
import tweepy

# アクセストークンなどの識別コードを入力します
access_token= "Access Tokenを入力してください"
access_secret = "Access Token Secretを入力してください"
api_key = "API Keyを入力してください"
api_key_secret = "API Key Secretを入力してください"
bearer_token = "Bearer Tokenを入力してください"

# APIオブジェクトを作成します
auth = tweepy.OAuthHandler(api_key, api_key_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth, wait_on_rate_limit=True)

最終ツイートが何日前かを表示する

特定のユーザーのフォロー・フォロワーを確認するを少し応用することで簡単に最終ツイート時刻を得ることができます. lookup_usersでuserを得た後にuser.statusによって最終ツイートに関する情報を得ています. 確認用にURLも表示するようにしています.


import datetime

follow_id_list = []
cursor = -1 # 最初の位置は-1で指定します

# すべて読み込み終わったら cursor=0 になります
while cursor!=0:
    id_cursor = api.get_friend_ids(cursor=cursor)
    follow_id_list += id_cursor[0] # フォローしているアカウントのIDをfollow_id_listに追加します
    cursor = id_cursor[1][1] # [previous_cursor, next_cursor]の順に格納されています
    
# 最終ツイート日時の辞書を作る
last_tweet_dict = {}
for i in range(0, len(follow_id_list), 100):
    # 15分で900件まで
    for user in api.lookup_users(user_id=follow_id_list[i:i+100]):
        # ツイート数が0の場合は1年1月1日にする
        if user.statuses_count == 0:
            last_tweet_dict[user.screen_name] = datetime.datetime(1,1,1,0,tzinfo=datetime.timezone.utc)
        else:
            last_tweet_dict[user.screen_name] = user.status.created_at
            
last_tweet_info = sorted(last_tweet_dict.items(), key = lambda x:x[1], reverse=True)

current_time = datetime.datetime.utcnow()
for info in last_tweet_info:
    screen_name, last_tweet_time = info
    # tzinfoを省いて現在時刻との差を求める
    time_delta = current_time - datetime.datetime(last_tweet_time.year, last_tweet_time.month, last_tweet_time.day, last_tweet_time.hour, last_tweet_time.minute, last_tweet_time.second)
    # 日数 秒数によって表示の仕方を変える
    if time_delta.days > 0:
        print(f"@{screen_name} {time_delta.days}日前")
    elif time_delta.seconds >= 3600:
        print(f"@{screen_name} {time_delta.seconds//3600}時間前")
    elif time_delta.seconds >= 60:
        print(f"@{screen_name} {time_delta.seconds//60}分前")
    else:
        print(f"@{screen_name} {time_delta.seconds}秒前")

    print(f"https://twitter.com/{screen_name}")
    print("===========================")
        

最終アクティビティが何日前かを表示する

よくいいねしてくれる人を調べるでいいねに関する情報を取得している方向けの内容です. 最後にツイートまたはいいねをした時刻を最終アクティビティ時刻とすることで最終アクティビティが何日前かを表示します.


import pickle

# いいねの情報の読み込み
with open("FavoriteDict.pkl", "rb") as tf:
    favorite_dict = pickle.load(tf)

# 最終アクティビティの辞書を作る
last_activity_dict = {}
for screen_name in last_tweet_dict:
    last_tweet_time = last_tweet_dict[screen_name]
    last_favorite_time = datetime.datetime(1,1,1,0,tzinfo=datetime.timezone.utc)
    # favorite_dict に情報がある場合のみ調べる
    if screen_name in favorite_dict.keys():
        if len(favorite_dict[screen_name]) > 0:
            last_favorite_time = favorite_dict[screen_name][0][0]
            
    # ツイートかいいねの最新の方を最終アクティビティ時刻にする
    last_activity_time = max(last_tweet_time,last_favorite_time)
    last_activity_dict[screen_name] = last_activity_time
        
# 最終アクティビティが最近の人が上に来るように並び替え
last_activity_info = sorted(last_activity_dict.items(), key = lambda x:x[1], reverse=True)   

current_time = datetime.datetime.utcnow()
for info in last_activity_info:
    screen_name, last_activity_time = info
    # tzinfoを省いて現在時刻との差を求める
    time_delta = current_time - datetime.datetime(last_activity_time.year, last_activity_time.month, last_activity_time.day, last_activity_time.hour, last_activity_time.minute, last_activity_time.second)
    # 日数 秒数によって表示の仕方を変える
    if time_delta.days > 0:
        print(f"@{screen_name} {time_delta.days}日前")
    elif time_delta.seconds >= 3600:
        print(f"@{screen_name} {time_delta.seconds//3600}時間前")
    elif time_delta.seconds >= 60:
        print(f"@{screen_name} {time_delta.seconds//60}分前")
    else:
        print(f"@{screen_name} {time_delta.seconds}秒前")

    print(f"https://twitter.com/{screen_name}")
    print("===========================")
        
最終アクティビティから180日以上経っているアカウントは停止しているとみていいかもしれませんね.

グラフを表示する

せっかくですのでグラフも表示してみます.


import matplotlib.pyplot as plt

last_activity_dict = {}
for screen_name in last_tweet_dict:
    last_tweet_time = last_tweet_dict[screen_name]
    last_favorite_time = datetime.datetime(1,1,1,0,tzinfo=datetime.timezone.utc)
    # favorite_dict に情報がある場合のみ調べる
    if screen_name in favorite_dict.keys():
        if len(favorite_dict[screen_name]) > 0:
            last_favorite_time = favorite_dict[screen_name][0][0]
            
    # ツイートかいいねの最新の方を最終アクティビティ時刻にする
    last_activity_time = max(last_tweet_time,last_favorite_time)
    last_activity_dict[screen_name] = last_activity_time
        
last_activity_info = sorted(last_activity_dict.items(), key = lambda x:x[1], reverse=True)   

activity_bar = [0,0,0,0,0,0,0]
current_time = datetime.datetime.utcnow()
for info in last_activity_info:
    screen_name, last_activity_time = info
    # tzinfoを省いて現在時刻との差を求める
    time_delta = current_time - datetime.datetime(last_activity_time.year, last_activity_time.month, last_activity_time.day, last_activity_time.hour, last_activity_time.minute, last_activity_time.second)
    # 1日以内
    if time_delta.days < 1:
        activity_bar[0] += 1
    # 3日以内
    elif time_delta.days <= 3:
        activity_bar[1] += 1
    # 7日以内
    elif time_delta.days <= 7:
        activity_bar[2] += 1
    # 30日以内
    elif time_delta.days <= 30:
        activity_bar[3] += 1
    # 60日以内
    elif time_delta.days <= 60:
        activity_bar[4] += 1
    # 180日以内
    elif time_delta.days <= 180:
        activity_bar[5] += 1
    # それ以上
    else:
        activity_bar[6] += 1
        
plt.bar(x=[0,1,2,3,4,5,6],height=activity_hist,width=1)
plt.xticks([0,1,2,3,4,5,6], ["1日","3日","7日","30日","60日","180日","180日以上"],fontname="Meiryo")
plt.show()
私の場合はこんな感じになりました. 半分くらいは毎日活動していて,1/4くらいは毎日とは言わなくてもそこそこ活動しているようです.
最終アクティビティのグラフ

<- 前へ戻る 【目次に戻る】 次へ進む ->