📱

Twitter APIで旧アカのフォローを新アカに引き継ぐ方法

2022/05/08に公開

はじめに

こんにちは、Tuttiです。GWは勉強が捗りますね!
今回はTwitterアカウントの引継ぎをTwitter APIで自動化した話です。

エンジニアアカウント開設に伴って、旧アカウントのフォローを新アカウントに引き継ぐ作業が必要になりました。

旧アカウントでフォローしている人のスクリーンネーム[1]をいちいち確認してマニュアル作業で引き継ぐこともできますが、「新アカウントに手入力するという苦行は絶対にしたくない」&「エンジニアとしてのプライドが許さない」 ということで、Twitter APIで引継ぎ作業を半自動化しました。

"半" 自動化である理由は、旧アカウントでフォローしていたアカウントのうち、いくつかは新アカウントに引き継がないというジャッジを途中で行う必要があるためです。

ジャッジに規則性やルールがある場合は完全自動化できますが、今回はそのようなものは無かったため、各ユーザーに0/1の情報を付加し、1のユーザーのみフォローするという方針を取りました。

それでは手順をまとめていきたいと思います。

目次

開発環境

使用言語 : Python 3.10.1
使用ライブラリ : json 2.0.9 / pandas 1.4.2 / tweepy 4.8.0

  • jsonは標準ライブラリなのでインストール不要です。pandasとtweepyはインストールが必要です。
  • jsonは次章「事前準備」で出てくるAPIキーとアクセストークンを秘匿化するために使用しています。
  • Pythonおよびライブラリのバージョンによっては、プログラムがうまく動作しない可能性があります。その際はエラーコードを見て自己解決するか、バージョンを合わせて動作確認お願いします。
  • ご自身のバージョンは、"python -V", "<ライブラリ名>.__version__"で確認できます。

事前準備

  1. Twitter APIの利用申請
    Twitter APIを利用する場合、利用申請が必要です。
    申請方法については、ググると丁寧に説明してくれている記事がいくつも出てくるので、ここでは割愛します。

  2. 複数アカウントのアクセストークン取得
    続いて今回は2つのアカウントを使用するため、各アカウントのアクセストークンを取得する必要があります。

    APIキーとアクセストークンの関係については、こちらの記事で非常にわかりやすく説明されています。
    さらに1つのAPIキーで複数アカウントを利用するのは規約上OKかということも、同ブログ内の別記事でまとめてくれています。
    個人的に使用する分には問題がなさそうなので、この方針のまま続けます。

    具体的に複数アカウントのアクセストークンを取得する方法ですが、こちらの記事で便利なコードが提供されていましたので、ありがたく使用させて頂きました。
    新旧アカウントでそれぞれログイン状態にしておき、ここで提供されているコードを実行することで各アカウントでのアクセストークンを取得することが出来ます。
    なお、こちらのコードを利用する場合、「開発環境」で記述した使用ライブラリに追加して、oauth2のインストールが別途必要です。

以上で準備完了です。

ソースコードと説明

ソースコードの全体像はこのようになっています。

1. ライブラリのインポート

import json
import pandas as pd
import tweepy

2. jsonファイルからAPIキーとアクセストークンの読込み

# 旧アカウントの読み込み
with open('twitterOldAccount.json') as f_old:
    oldKeys = json.load(f_old)

# 新アカウントの読み込み
with open('twitterNewAccount.json') as f_new:
    newKeys = json.load(f_new)

3. jsonからの読込みを各変数に受け渡し

# 旧アカウントの読込み受け渡し
old_consumer_key = oldKeys['API_KEY']
old_consumer_secret = oldKeys['API_SECRET_KEY']
old_access_token = oldKeys['ACCESS_TOKEN']
old_access_token_secret = oldKeys['ACCESS_TOKEN_SECRET']

# 新アカウントの読込み受け渡し
new_consumer_key = newKeys['API_KEY']
new_consumer_secret = newKeys['API_SECRET_KEY']
new_access_token = newKeys['ACCESS_TOKEN']
new_access_token_secret = newKeys['ACCESS_TOKEN_SECRET']

jsonファイルの形式は以下を想定しています。

key.json
{
  "API_KEY": "aaaa",
  "API_SECRET_KEY": "bbbb",
  "ACCESS_TOKEN": "cccc",
  "ACCESS_TOKEN_SECRET": "dddd"
}
  • "aaaa"~"dddd"はご自身で取得したAPIキーとアクセストークンを入力してください。

4. 新旧アカウントのAPIインスタンス作成

# 旧アカウントでAPIインスタンス作成
old_auth = tweepy.OAuth1UserHandler(old_consumer_key, old_consumer_secret, old_access_token, old_access_token_secret)
old_api = tweepy.API(old_auth, wait_on_rate_limit=True)

# 新アカウントでAPIインスタンス作成
new_auth = tweepy.OAuth1UserHandler(new_consumer_key, new_consumer_secret, new_access_token, new_access_token_secret)
new_api = tweepy.API(new_auth, wait_on_rate_limit=True)
  • wait_on_rate_limit=Trueにすることで、APIの利用制限に引っかかった時に、必要時間だけ待機してくれます。
  • 各メソッドのAPI利用制限回数に関しては、公式ドキュメントにまとめられています。

5. 旧アカウントでフォローしているアカウントのID、アカウント名、スクリーンネームの取得

idxList = ['id', 'name', 'screen_name'] # 取得したい属性のリスト
df_oldFollow = pd.DataFrame([], index=idxList) # 旧アカウントでフォローしているアカウントのメタデータ格納用データフレーム
follows = tweepy.Cursor(old_api.get_friends, cursor=-1).items()
for follow in follows:
    record = pd.Series([follow.id, follow.name, follow.screen_name], index=idxList)
    df_oldFollow = pd.concat([df_oldFollow, record], axis=1) # 各アカウントの情報を結合してデータフレーム更新
colNum = df_oldFollow.shape[1]
colList = [i for i in range(colNum)]
df_oldFollow.columns = colList # カラムを0始まりの連番に変更

tweepy.Cursor(old_api.get_friends, cursor=-1).items()について

詳細は、公式ドキュメント Cursor Tutorialをご確認ください。

  • Cursorはページ遷移を簡単に行うためのオブジェクトです。
  • Cursorの引数に実行したいメソッドを渡します。
  • cursor=-1で先頭ページから処理を開始します。
  • 戻り値はtweepy.cursor.ItemIteratorというイテレータ (follows) です。

以降の処理

詳細は、公式ドキュメント User objectをご確認ください。

  • イテレータ (follows) をfor-loopで回して、各ユーザーの情報が辞書型で定義されているUserオブジェクトを取得します。
  • Userオブジェクトの属性 (Attribute) を確認して、知りたい情報を指定します。

6. 旧アカウントでフォローしているアカウントの中から、新アカウントでフォローするアカウントの選択

# selector.txtで1/0 (1:フォロー、0:フォローしない) を別テキストファイルで定義
with open('selector.txt', 'r') as f:
    selectList = f.read().split("\n") # 1/0のリスト
selecter = pd.Series(selectList)
df_follow = pd.concat([df_oldFollow.T, selecter], axis=1) # データフレームの結合
df_follow.columns = ['id', 'name', 'screen_name', 'selector'] # 結合後のデータフレームのカラム名更新
# 新アカウントでdf_follow内のselectorが1のユーザーのみ抽出
mask = df_follow['selector'] == str(1)
df_follow = df_follow[mask]

7. 選択したアカウントを新アカウントでフォロー

follow_id = df_follow['id'] # 新アカウントでフォローすると選択したアカウントのID
currentFollows = tweepy.Cursor(new_api.get_friend_ids, cursor=-1).items() # 新アカウントで現在フォロー中のアカウントのIDを取得
id_notFollow = list(set(follow_id) ^ set(currentFollows)) # 選択されたアカウントの中で、まだフォローしていないアカウントのIDのみ取得
for id in id_notFollow:
    user = new_api.create_friendship(user_id=id)

user = new_api.create_friendship(user_id=id)について

  • API.create_friendshipでフォロー申請
  • フォロー申請するアカウントは、.create_friendshipメソッドの引数user_idにアカウントのIDを渡すことで指定

まとめ

たった数十行のコードで面倒な作業を自動化できました!
Twitter API以外にも様々なサービスでAPIが提供されているので、他にも自動化したい作業が出てきたらまた記事にしたいと思います。

参考文献

  1. tweepy 公式ドキュメント
  2. 【Python】Twitter APIで一方的にフォローしている人を洗い出して自動フォロー解除する

脚注
  1. 名前の下にある@以降の「英数字の組み合わせ部分」 ↩︎

Discussion