2021年5月にTwitter APIがバージョンアップされました!
今回の記事では、新機能「liking_users」を使ったプログラムを共有します。
特定のキーワード・ハッシュタグのいいね周り回数が多いユーザーをランキング形式で表示してみました!
このような集計結果をコンソールに表示します👇
共有するプログラムで皆さんも集計してみてください^^
Twitter API 新機能の liking_users でできること
自作プログラムの説明をする前に、liking_usersについて調べたことを共有しますね。
もう知ってるよ!って方はこの章は飛ばしてOKです 👉 ポチッと
liking_usersで出来ること/出来ないこと
liking_usersで出来ることはこんな感じ👇
- 特定のツイートにいいねしたユーザーを最高100人まで取得できる
- 15分の間にAPIを75回コールできる
あってもよさそうな機能ですが、今回が初実装なんですね🎉
出来ることを踏まえると、liking_usersで出来ないことはこんな感じ👇
- ツイートを取得するAPIと組み合わせて使う必要がある
- 100いいねを超えている場合でも100人までしか取得できない
- 15分の間では最大75ツイートのいいねしか集計できない(最大7500いいね)
1000いいね越えのバズってるツイート等には使えないですね^^;
また、「いいねされているツイート」を指定する必要があります。
なので、ツイート検索系のAPIと組み合わせて使うのも、liking_usersの特徴です。
liking_usersのAPIリファレンス
簡単にAPIリファレンスをまとめてみました。
✅ エンドポイント
– https://api.twitter.com/2/tweets/:id/liking_users
– :id にはツイートIDを設定する
✅ APIコール上限
– 15分間で75回まで
✅ リクエストパラメータ
– 取得したいユーザー情報などを設定する
– 今回のプログラムで設定したパラメータは以下
– user.fields: id,username,name,public_metrics
✅ レスポンスパラメータ
– リクエストパラメータで設定した情報が返ってくる
– 今回のプログラムのレスポンスは以下
{
“data”: [{
“id”: “1234567890”,
“name”: “ツイ太郎”,
“username”: “__twitaro__”
“public_metrics”: {
“followers_count”: 123, # フォロワー数
“following_count”: 123, # フォロー数
“tweet_count”: 123, # これまでのツイート数
“listed_count”: 123, # 登録リスト数
}]
}
他に設定できるパラメータもたくさんありますよ!
知りたい方は公式のAPIリファレンスを見てね!
\\ liking_usersのDocumentationを開く//
いいね周りユーザー集計プログラムの概要
今回作成した「いいね周りユーザー集計プログラム」について、説明していきますね。
説明いらないから、プログラムだけちょうだい!って方はこの章は飛ばしてOKです 👉 ポチッと
いいねユーザー集計プログラムの処理概要
- 検索したいキーワード・ハッシュタグを指定
- 検索コマンドも併用可能(-filter:replies、-filter:retweetsなど)
- 検索ツイート数を指定
- Twitter API v1.1の「search/tweets.json」を使用
- 指定したキーワード・ハッシュタグを含むツイートを検索
- 検索したツイートの中からいいね数が多い75件に絞り込み
- いいね周りを多くしているユーザーをランキング形式で表示
- 表示している項目は以下
- ユーザー名
- いいね数
- いいね率(75件中いいねを押している割合)
- FF比(人気アカウント指数、フォロワー数 / フォロー中の人数)
- フォロワー数
- フォロー中の人数
- 総ツイート数
- 作成リスト数
- プロフィールURL
「いいね周りユーザー集計プログラム」の出力結果はこんな感じです👇
いいね周りユーザー集計プログラムの処理詳細
次は処理の詳細を1つずつ説明しますね。
今回のプログラムはPythonで作成しました。
Pythonの実行環境はGoogleアカウントがあれば無料で使える「Google Colab」を使用しています。
Google Colabは環境構築が不要なので、初心者でも安心して使えますね。
Google Colabを使用したことがない方は、こちらの記事でザッと使ってみるのをお勧めします。
📝 GoogleドライブにTwitter API のキー情報を保存
Twitter API のアクセスにはAPIキー、アクセストークンを使用します。
このキーは外部に漏れてしまうと、悪用されてしまう危険性も。
誤って公開しているGithubに保存してしまうと..😇
なので、今回のプログラムではキー情報をオンコーディングしません。
システム開発の現場でもキーやパスワード情報のオンコーディングはご法度🙅♂️
このような実装を普段から意識することをオススメします。
Googleアカウントを持っていれば気軽に使える外部ストレージ「Googleドライブ」にキー情報を保存しましょう。
ちょっと面倒だし、オンコーディングでいいや!って方はこの章は飛ばしてOKです 👉 ポチッと
まずは環境変数に設定したい値をファイルに定義します。
今回はTwitter API を利用する上で必要な4つのキーを定義。
以下にサンプルを用意したので、値を書き換えて作成してください。
API_KEY=APIKeySvHYqbutGLOuyAPIKey
API_SECRET=APISecretLpGjE4s9YVEsNToUBB0IXuV1ifQRlXXhAPISecret
ACCESS_TOKEN=1234567890-AccessTokenfGTuqqyIAccessToken
ACCESS_TOKEN_SECRET=AccessTokenSecretfnNtCQVRml7AccessTokenSecret
ファイル名は「.env」としましょう。
Google Colabと作成したファイルを連携させたい場合はGoogleドライブを活用します。
作成したファイルをGoogleドライブにアップロード。
まずは他のプライベートなファイルと混ざらないように、.envファイルを格納するフォルダを作成することをオススメします。
サンプルプログラムでは「twitter_api」というフォルダがある前提で実装しました。
自分が管理しやすい名前に変えてもOK🙆♂️
作成したディレクトリに.envファイルをアップロードしてください。
🚧 プログラム環境セットアップ
それではプログラムの説明を始めますね。
まずはプログラムの環境セットアップの部分から説明します。
Google Colab上にはあらかじめデータ分析によく使われるライブラリがいくつか入っています。
不足している分は下記のようにインストール可能です。
!pip install python-dotenv
Google Colabでは、先頭に「!」をつけるとターミナル上のコマンドが実行できます。
今回は.envファイルを環境変数に設定するライブラリをインストールしました。
キーなどのオンコーディング派の方はコメントアウトしてOK🙆♂️
今回使用するライブラリをインポートします。
import collections
import math
import os
from requests_oauthlib import OAuth1Session
Twitter API のエラーハンドリング用の関数を定義してます。
def is_response_ok(response):
if response.status_code == 429:
return False
elif response.status_code >= 300:
return False
return True
def raise_api_exception(response):
raise Exception(
f"HTTP status: {response.status_code}, reason: {response.reason}"
)
ちなみに、HTTPステータスコードの429は「15分間のコール数上限を超えた」ときに発生します。
本当はHTTPステータスが429の場合は、所定の時間待機し、リトライ処理をいれたほうがいいです。
今回はプログラムをシンプルに説明したかったので、リトライ処理の実装は割愛します。
🔑 Twitter APIアクセス準備
ここではTwitter APIと認証するための情報を設定します。
Twitter APIを利用するには、Twitter社に申請し、Twitter APIキー、アクセストークンなどを発行する必要があります。
まだ申請してないよ!って方は次の記事を参考に申請してみてください。
先ほどGoogleドライブに保存した.envファイルを読み込みます。
キーなどのオンコーディング派の方は全体的にコメントアウトして、このステップは飛ばしてOKです。
from dotenv import load_dotenv
from google.colab import drive
ENV_FILE_GOOGLE_DRIVE_PATH = "twitter_api/.env"
env_file_path = os.path.join("/drive/My Drive", ENV_FILE_GOOGLE_DRIVE_PATH.lstrip("/"))
drive.mount("/drive")
load_dotenv(env_file_path)
Googleドライブで.envファイルのパスを変えた場合は、定数「ENV_FILE_GOOGLE_DRIVE_PATH」の値を変更してください。
「drive.mount」でGoogleコラボ上から「自分のGoogleドライブのファイル」にアクセスできるようにしてます。
アクセスする際は、第一引数で指定している「/drive」からアクセス可能です。
ここも好きな名前に変えてもOK🙆♂️
Twitter API との認証情報をセットします。
キーなどのオンコーディング派の方は、os.environ.get(“xxx”)の箇所を削除し、値を直接書いてください。
session = OAuth1Session(
os.environ.get("API_KEY"),
os.environ.get("API_SECRET"),
os.environ.get("ACCESS_TOKEN"),
os.environ.get("ACCESS_TOKEN_SECRET"),
)
🔍 検索設定
検索したいキーワード・ハッシュタグを入力します。
TWEET_SERACH_QUERY = "#駆け出しエンジニアと繋がりたい -filter:replies -filter:retweets min_faves:10"
TWEET_SEARCH_MAX_COUNT = 1000
「TWEET_SERACH_QUERY」に検索したいキーワード・ハッシュタグを入力してください。
さらに、Twitterの検索コマンドの入力も可能です。
「TWEET_SEARCH_MAX_COUNT」に検索して取得する最大のツイート数を入力してください。
ただし、いいねユーザー取得API(liking_users)のAPI呼び出し上限は75コールです。
ここで指定したツイート全てのいいねを取得するわけではありませんので、ご了承ください🙇♂️
🐦 ツイート取得
検索キーワードなどを元に、ツイートを検索します。
TWEET_SERACH_ENDPOINT = "https://api.twitter.com/1.1/search/tweets.json"
TWEET_SEARCH_ONCE_MAX_COUNT = 100
ENDPOINT_CALL_NUM = math.ceil((TWEET_SEARCH_MAX_COUNT) / TWEET_SEARCH_ONCE_MAX_COUNT)
max_tweet_id = None
searched_tweets = []
for i in range(ENDPOINT_CALL_NUM):
response = session.get(
TWEET_SERACH_ENDPOINT,
params={
"count": TWEET_SEARCH_ONCE_MAX_COUNT,
"q": TWEET_SERACH_QUERY,
"max_id": max_tweet_id,
},
)
if not is_response_ok(response):
raise_api_exception(response)
results = response.json()
tweets = results.get("statuses")
if not tweets:
break
print(f"取得結果: {len(tweets)}")
for t in tweets:
searched_tweets.append(
{
"id": t["id"],
"like_count": t["favorite_count"],
}
)
max_tweet_id = tweets[-1]["id"] - 1
print(f"ツイート合計: {len(searched_tweets)}")
print("done!")
このソースコードのポイントは以下
- Twitter API v1.1の「search/tweets.json」でツイートを検索
- 検索APIで100件ずつツイートを取得
- 指定したツイート件数に達する or ツイートが取得できなくなったらAPI呼び出しを終了
- ツイートのIDといいね数のリストを生成する
👍 いいねしたユーザーを取得
取得したツイートを元に、いいねしたユーザーを取得する。
TWEET_LIKING_USER_ENDPOINT = "https://api.twitter.com/2/tweets/{id}/liking_users"
LIKING_USER_ENDPOINT_LIMIT = 75
USER_FIELDS = ",".join(
[
"id",
"username",
"name",
"public_metrics",
]
)
# いいね数が多いツイートから探したいので並び替え
searched_tweets.sort(key=lambda x: x["like_count"], reverse=True)
liking_users = {}
liking_user_ids = []
for t in searched_tweets[:LIKING_USER_ENDPOINT_LIMIT]:
response = session.get(
TWEET_LIKING_USER_ENDPOINT.format(id=t["id"]),
params={"user.fields": USER_FIELDS},
)
if not is_response_ok(response):
raise_api_exception(response)
results = response.json()
users = results.get("data")
if users:
print(f"liking_users_count: {len(users)}")
for u in users:
user_id = u["id"]
liking_user_ids.append(user_id)
liking_users[user_id] = u
print("done!")
このソースコードのポイントは以下
- 検索したツイートの中からいいね数が多い75件に絞り込み
- Twitter API v2の「liking_users」でツイートにいいねしたユーザーを取得する
- ランキングに表示したユーザー情報を指定する
liking_usersでは、15分間に75回までしかAPIを呼び出せません。
なので、「多くいいねされているツイート」を選ぶように実装しました。
ランキングに表示するユーザー情報を増やしたい方は、USER_FIELDSに追加してください。
私は、id、username、name、public_metrics(フォロー数などの情報)を設定しました。
ユーザー情報を増やしてみたい方は、liking_usersの公式リファレンスを覗いてみてください。
\\ liking_usersのDocumentationを開く//
👥 ユーザーランキング表示
いいね周りをしているユーザーのランキングを表示します。
ランキングには20位まで表示しています。
もっと増やしたい方は、「RANKING_MAX_NUM」の数を増やしてください。
RANKING_MAX_NUM = 20
RANKING_FORMAT = """## Rank {rank}
name: {name}
like_count: {like_count}
like_rate: {like_rate}
FF_rate: {ff_rate}
followers_count: {followers_count}
following_count: {following_count}
tweet_count: {tweet_count}
listed_count: {listed_count}
profile_url: https://twitter.com/{username}/
"""
counter = collections.Counter(liking_user_ids)
for i, row in enumerate(counter.most_common()[:RANKING_MAX_NUM]):
user_id = row[0]
like_count = row[1]
user = liking_users[user_id]
followers_count = user["public_metrics"]["followers_count"]
following_count = user["public_metrics"]["following_count"]
print(
RANKING_FORMAT.format(
rank=i + 1,
name=user["name"],
like_count=like_count,
like_rate=round(like_count / LIKING_USER_ENDPOINT_LIMIT, 2),
ff_rate=round(followers_count / (following_count or 1), 2),
followers_count=followers_count,
following_count=following_count,
tweet_count=user["public_metrics"]["tweet_count"],
listed_count=user["public_metrics"]["listed_count"],
username=user["username"],
)
)
また、前の章で「USER_FIELDS」にパラメータを追加した場合は、ソースコードを参考に、「RANKING_FORMAT」と、23行目〜33行目のように値をセットする処理の追加もお忘れずに。
いいね周りユーザー集計プログラムをColabで実行
いいねユーザー集計プログラムをGoogle Colab上で実行してみましょう。
以下のボタンをクリックし、Google Colab でノートブックを開きます。
\\ いいね周りユーザー集計プログラムを開く//
Google Colaboratory でノートブックを実行するには、Googleアカウントへのログインが必要です。
ログインしてから次のSTEPに進んでください。
Googleアカウントを持っていない方は無料で作れます!
この機会にぜひ作成してみてください。
画面上部のメニューから、【ランタイム – すべてのセルを実行】を選択します。
すると、警告が表示されます。
Google Colaboratoryでは、ノートブックからGoogleドライブに保存されたファイルにアクセスも可能なので、警告してくれているようですね。
このノートブックでも、.envファイルへのアクセスは行いますが、TwitterAPIの認証にしか使っていません。
心配な方は、再度プログラムを全て確認しましょう!
【このまま実行】をクリックし、次に進みます。
実行するとGoogleドライブの認証を求められます。
以下の手順で認証をしてください。
リンクをクリックすると、Googleアカウントの一覧が表示されます。
Googleドライブに.envファイルを作成したアカウントを選択。
次に、Google Colabとの連携許可を求められます。
「許可」をクリック。
許可すると、認証コードが表示されます。
これをコピーし、タブを閉じましょう。
コピーした認証コードを貼り付けます。
Googleドライブとの連携に成功しました!
一番下にこのような結果が表示されていればOK🙆♂️
表示している内容は以下
- ユーザー名
- いいね数
- いいね数率(75件中いいねを押している割合)
- FF比(人気アカウント指数、フォロワー数 / フォロー中の人数)
- フォロワー数
- フォロー中の人数
- 総ツイート数
- 作成リスト数
- プロフィールURL
以上です、お疲れ様でした^^
おわりに
今回の「いいね周りユーザー集計プログラム」の実行結果を見て分かったことをあげてみます。
- FF比(人気者指数)が高めのユーザが多い
- いいね周りしているユーザーは発信にも力を入れている
いいね周りと発信、疎かにしてはいけませんね。
私も頑張りますw
他にもliking_usersのアイディアはあるので、これはまた別記事に。
それでは効率の良いTwitterライフを!