このページに書かれている内容はTwitter APIの有料化により無料では使用できなくなっています.
フォローしているアカウントの最近のツイート数 いいね件数を調べることで,アカウントの活発さを判断します. 具体的には最近30日で何回ツイート・いいねをしているかを最大で1000件まで取得し活発さの指標として用います. より簡単にアクティブユーザーか否かを判定したい場合は最終アクティビティからアクティブユーザーか否かを調べるをご覧ください.
最終ツイートの確認だけであればほとんど時間はかかりません. 最終いいねをいつしているかの確認に関しては時間がかかります. よくいいねしてくれる人を調べるでいいねの情報の取得について紹介していますので,気になる方はそちらをご覧ください.
APIキー アクセストークンを使ってAPIオブジェクトを作成します. 以下のコードをコピペしてAPIキー アクセストークンの部分だけ書き換えてください. 今回はAPIオブジェクトの作成時にwait_on_rate_limitを設定してレート制限によるエラーを回避します. APIキー アクセストークンを忘れた方はこちら.
# 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くらいは毎日とは言わなくてもそこそこ活動しているようです.