Twitterの工ロ系フォローをpythonを使って別垢に移行する方法

#はじめに

普段から難なくTwitterを使用しているのですが、ふと工ロ画像とかのツイートを「いいね」していて
そういえばこの工〇チなのいいねしてるのバレてるよなと考えちゃったんですよね。
そこで工ロ関係のフォローを別垢に移行できないかと思いこれを考えました。
今回はフォローから相互フォロー分を抜いて登録しようと思います。

#作成環境

何で作るかですが流行りのpythonが無難かなと思いました。
PCはWINDOWS10、VScode環境を作りました。

#TwitterAPIキーの取得

プログラムでTwitterをあーやらこーやらするにはAPIキーたるものが必要ということで取得をしてみた。
英語全く無理なので以下を参照して取得。

参考記事
[【tweepy】TwitterAPIキーを取得してPythonでCLIからツイートできるようにする](https://qiita.com/shizuma/items/8616bbe3ebe8ab0b6ca1)


#フォロー、フォロワーの取得＆リスト化
tweepyはあらかじめインストールしておきます。

```
$ pip install tweepy
```


こちらもある程度作っている人のを参考に改造。
[https://note.com/j1ntube/n/n5a417a68178b](https://note.com/j1ntube/n/n5a417a68178b)

まずはフォロー情報を取得してCSVに出力。

```python:main1.py
import os
import sys
sys.path.append(os.path.dirname(__file__))#検索パス追加
import json, config #標準のjsonモジュールとconfig.pyの読み込み
import csv
listdesu1 = [] 

#APIキーなど　config.pyから取得
CONSUMER_KEY = config.CONSUMER_KEY
CONSUMER_SECRET = config.CONSUMER_SECRET
ACCESS_TOKEN = config.ACCESS_TOKEN
ACCESS_TOKEN_SECRET = config.ACCESS_TOKEN_SECRET

#Twitterから情報取得
import tweepy
cursor = -1
while cursor != 0:
   auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
   auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
   api = tweepy.API(auth, wait_on_rate_limit=True)
   itr = tweepy.Cursor(api.friends_ids, id='@移行元のユーザー名', cursor=cursor).pages()
   try:
       for friends_ids in itr.next():
           try:
               user = api.get_user(friends_ids)
               user_name = user.name
               user_info = user.screen_name
               description = user.description
               listdesu1.append(['https://twitter.com/' + user_info,user_name,description.replace('\n','')])
               #URLリンク、ID名、名前、ID番号、自己紹介の順で取得
           except tweepy.error.TweepError as e:
               print(e.reason)
   except ConnectionError as e:
       print(e.reason)

   #CSVに書き込む
   #print(listdesu1)
   f = open('out1.csv', 'w', encoding='cp932', errors='replace', newline='')
   #encoding='cp932', errors='replace'を入れないと動かなかった
   writer = csv.writer(f)
   writer.writerows(listdesu1)
   f.close()
   cursor = itr.next_cursor
```

```python:config.py
#取得したAPIキーを書く
CONSUMER_KEY = "ここに入力"
CONSUMER_SECRET = "ここに入力"
ACCESS_TOKEN = "ここに入力"
ACCESS_TOKEN_SECRET = "ここに入力"
```

フォロワー情報も取得してCSVに出力。

```python:main2.py
import os
import sys
sys.path.append(os.path.dirname(__file__))#検索パス追加
import json, config #標準のjsonモジュールとconfig.pyの読み込み
import csv
listdesu2 = [] 

#APIキーなど　config.pyから取得
CONSUMER_KEY = config.CONSUMER_KEY
CONSUMER_SECRET = config.CONSUMER_SECRET
ACCESS_TOKEN = config.ACCESS_TOKEN
ACCESS_TOKEN_SECRET = config.ACCESS_TOKEN_SECRET

#Twitterから情報取得
import tweepy
cursor = -1
while cursor != 0:
   auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
   auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
   api = tweepy.API(auth, wait_on_rate_limit=True)
   itr = tweepy.Cursor(api.followers_ids, id='@移行元のユーザー名', cursor=cursor).pages()#followersに変えるだけ
   try:
       for friends_ids in itr.next():
           try:
               user = api.get_user(friends_ids)
               user_name = user.name
               user_info = user.screen_name
               description = user.description
               listdesu2.append(['https://twitter.com/' + user_info,user_name,description.replace('\n','')])
               #URLリンク、ID名、名前、ID番号、自己紹介の順で取得
           except tweepy.error.TweepError as e:
               print(e.reason)
   except ConnectionError as e:
       print(e.reason)

   #CSVに書き込む
   #print(listdesu2)
   f = open('out2.csv', 'w', encoding='cp932', errors='replace', newline='')
   #encoding='cp932', errors='replace'を入れないと動かなかった
   writer = csv.writer(f)
   writer.writerows(listdesu2)
   f.close()
   cursor = itr.next_cursor
```
これでフォロー情報が入ったout1.csvとフォロワー情報がはいったout2.csvができました。

#相互フォローを抜く
さてここからout1.csvから相互フォローを抜いてout3.csvを作ろうと思います。

```python:main3.py
import os
import sys
sys.path.append(os.path.dirname(__file__))#検索パス追加
import csv
listdesu3=[]
listdesu4=[]

#ファイル読み込み
f = open('out1.csv', 'r', encoding='cp932', errors='replace', newline='')
reader = csv.reader(f)
listdesu1=[row for row in reader]
f.close()

f = open('out2.csv', 'r', encoding='cp932', errors='replace', newline='')
reader = csv.reader(f)
listdesu2=[row for row in reader]
f.close()

#二次元配列からID番号だけ取得　いいやり方がなかった・・・
for i in listdesu2:
    listdesu3.append(i[2])
print(listdesu3)

#相互フォローじゃないものを取得
for row in listdesu1:
    if not row[2] in listdesu3:
        listdesu4.append(row)

#ファイル書き込み
f = open('out3.csv', 'w', encoding='cp932', errors='replace', newline='')
writer = csv.writer(f)
writer.writerows(listdesu4)
f.close()
```

#選別
これはどうしても自動化は無理だと思いました。
CSVをエクセルかgoogleスプレッドシートで開いて一つ一つ確認して
移行用の垢でフォローを行いました。
選別だけして自動でフォローしてもよかったんだけどね。
![2021-06-26 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1690516/88e3afe3-2e93-22d2-d2a3-a4d474346fb8.png)


#移行元から選別分を抜く
そろそろ終盤です。
移行元のフォロー情報から移行先のフォロー情報を抜いていきます。
まずは移行先からフォロー情報を抜いたCSVを作ります。
移行先のフォロー情報（選別したフォロー）はmain1.pyを使い「@移行元のユーザー名」を「@移行先のユーザー名」に書き換えます。
出力したCSVはout4.csvにしておきます。

選別してから少しフォローを増やしたので移行元と移行先にある分のフォローだけを選別します。
ソースはmain3.pyを流用します。
「if not row[2] in listdesu3:」を「if row[2] in listdesu3:」に書き換えただけですね。

```python:main4.py
import os
import sys
sys.path.append(os.path.dirname(__file__))#検索パス追加
import csv
listdesu3=[]
listdesu4=[]

#ファイル読み込み
f = open('out3.csv', 'r', encoding='cp932', errors='replace', newline='')
reader = csv.reader(f)
listdesu1=[row for row in reader]
f.close()

f = open('out4.csv', 'r', encoding='cp932', errors='replace', newline='')
reader = csv.reader(f)
listdesu2=[row for row in reader]
f.close()

#二次元配列からID番号だけ取得
for i in listdesu2:
    listdesu3.append(i[2])
print(listdesu3)

#選別分を抜く
for row in listdesu1:
    if row[2] in listdesu3:
        listdesu4.append(row)

#ファイル書き込み
f = open('out5.csv', 'w', encoding='cp932', errors='replace', newline='')
writer = csv.writer(f)
writer.writerows(listdesu4)
f.close()
```

out5.csvが出来ました。
最後にCSVを元にフォローを解除します。

```python:main5.py
import os
import sys
sys.path.append(os.path.dirname(__file__))#検索パス追加
import json, config #標準のjsonモジュールとconfig.pyの読み込み
import csv
listdesu1 = []
listdesu2 = []

#ファイル読み込み
f = open('out5.csv', 'r', encoding='cp932', errors='replace', newline='')
reader = csv.reader(f)
listdesu1=[row for row in reader]
f.close()

#二次元配列からID番号だけ取得
for i in listdesu1:
    listdesu2.append(i[2])
print(listdesu2)

CONSUMER_KEY = config.CONSUMER_KEY
CONSUMER_SECRET = config.CONSUMER_SECRET
ACCESS_TOKEN = config.ACCESS_TOKEN
ACCESS_TOKEN_SECRET = config.ACCESS_TOKEN_SECRET

import tweepy
cursor = -1
while cursor != 0:
   auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
   auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
   api = tweepy.API(auth, wait_on_rate_limit=True)
   itr = tweepy.Cursor(api.friends_ids, id='@移行元のユーザー名', cursor=cursor).pages()
   try:
       for friends_ids in itr.next():
           try:
               user = api.get_user(friends_ids)
               user_name = user.name
               user_id = user.id
               user_info = user.screen_name
               if str(user_id) in listdesu2:
                   print('解除対象 ' + user_name + ' ' + str(user_id))
                   api.destroy_friendship(user_id)
           except tweepy.error.TweepError as e:
               print(e.reason)
   except ConnectionError as e:
       print(e.reason)

   cursor = itr.next_cursor
```

これで移行は完了です。

#補足
CSV出力した後は一度テキストエディタで確認をした方がいいです。
やはり崩れている部分が多々ありました。
自己紹介部分で””を使っている部分は崩れていました。

#まとめ
今回は思い付きと勢いで週末プログラムをやってみました。
今更こんなことしても性癖モロばれなんですけどね。

本当はラズパイとpythonで面白いことやりたかったんですけどラズパイにOpenCVがインストールできずに先にtweepyを触ったのが現状です。
OpenCVの問題が解消したらラズパイ遊びを再開したいと思います。