[Python] Tweepyモジュールで、Tweeterのツイートを自動でretweetするBOTを超簡単に作成する方法

Tweeterで、自動リツイートするBOTを作る方法です。
（今後、徐々に肉付けしていきます。多分。。。とりあえず、R1と言う事で。）
皆様のお役に立てると嬉しいです！

＜はじめに＞
自分はPython使いなので、コードに関して詳しく説明しようと思ったのですが、書いている途中で、「pythonのコードを全く知らない人」でも、見よう見まねでBOTが作れる様な記事にしようと思い直し、大幅に書き直しました。
プログラムの事を知らなくても、PCヘビーユーザー以上なら設定可能と思います。
（勿論、Python学習者に人にも少しは役に立つと願いたいです。）

＜全体のイメージ／状況＞
私自身は、TweeterではアカウントAとBを保有しております。
Aの方が本アカウントで、現在、フォローワー１万人を目指し、活動中です。（笑）
そこで、Bの方をBOTアカウントとして、本アカのツイートをひたすらリツイートさせようと思っております。(Bは、サブアカウントです。）
イメージとしては、こんな感じです。
![全体イメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/5c2a5c72-a385-9f03-cc80-3479e0ca2e48.jpeg)

＜必要な設定＞
１．まず、自分のPCにPythonをインストールして、環境設定しましょう！
Pythonと言うか、プログラミングをやった事がない人には、ここが最大の難関だと思いますが、ここを乗り越えましょう。
このProgateのサイトが、非常に丁寧です。
https://prog-8.com/docs/python-env-win

２．Twitter APIを利用しよう！（Twitter Developerを利用しよう。）
TwitterのAPIを利用して、外部プログラムから、Twitterを操作する必要があります。
外部プログラムから、Twitterを操作する為には、Twitter Developerにユーザー登録した上で、ログインして、下記を入手しないといけません。
1)Consumer Key
2)Consumer Secret Key
3)Access Token
4)Access Token secret
ここの手順は、下記サイトに詳細されております。
http://mojitoba.com/2018/10/19/lets_start_twitter_api/

３．Pythonのコードを、自分のWindows PCで走らせましょう。
コードは下記サイトに書いてある通りですが、一部、ミスを発見したので、下記に改訂コードを載せますね。
http://mojitoba.com/2018/11/06/automate_retweet_with_python/

改訂した部分は下記。（全体コードの中段です。下記コードがあります。）

1）
上記のサイトにはこういうコードがあります。

```.py
# リツイートしたいIDのリスト
tweetIds = [1059129340602941440,
            1055873349899800576,
            1052058774796558336,
            1053223930591240192,
            1054020815421767681]

# リツイートしたいIDのリスト
tweetIds = [line.strip() for line in open('../data/retweetList.txt',encoding='utf-8')]
```

tweetIdsの定義ですが、「上の記載」or 「下の記載」と言う意味の筈です。
両方書くと、多分動かない筈。。。
私は、下の記載を取ったので、上の記載を消しました。
また、'../data/retweetList.txt' の部分は、勿論、これでも良いけど、単純に
retweetList.txtとしました。（そっちの方が分かり易いですよね？）
これなら、同じフォルダーに置けばよいです。
つまり、こうしました。

```
# リツイートしたいIDのリスト
tweetIds = [line.strip() for line in open('retweetList.txt',encoding='utf-8')]
```
2) 
全体コードの上部に下記の関数(def)が定義されております。

```
def retweet(tweetId):
    url = "https://api.twitter.com/1.1/statuses/retweet/%d.json"%tweetId
    res = twitter.post(url) # retweet実行
    return res

def unretweet(tweetId):
    url = "https://api.twitter.com/1.1/statuses/unretweet/%d.json"%tweetId
    res = twitter.post(url) # unretweet実行
    return res
```
ただ、この定義では、”TypeError: %d format: a number is required, not str”と言うエラーが、環境によっては出ます。
プレースホルダ―と言う概念になるのですが、エラーを起こさない為には、"%d"ではなく、"%s"にする必要があります。
つまり、こうです。

```
def retweet(tweetId):
    url = "https://api.twitter.com/1.1/statuses/retweet/%s.json"%tweetId
    res = twitter.post(url) # retweet実行
    return res

def unretweet(tweetId):
    url = "https://api.twitter.com/1.1/statuses/unretweet/%s.json"%tweetId
    res = twitter.post(url) # unretweet実行
    return res
```
プレースホルダ―に興味のある人は、こちらが良いと思います。
→　https://create.anigameinfo.com/2019/10/16/post-1911/

との事なので、修正後の最終コードは下記です。

```
import tweepy
import time
from requests_oauthlib import OAuth1Session

CK = "Your Consumer Key"
CS = "Your Consumer Secret Key"
AT = "Your Access Token"
ATS = "Your Access Token secret"
twitter = OAuth1Session(CK, CS, AT, ATS)

def retweet(tweetId):
    url = "https://api.twitter.com/1.1/statuses/retweet/%s.json"%tweetId
    res = twitter.post(url) # retweet実行
    return res

def unretweet(tweetId):
    url = "https://api.twitter.com/1.1/statuses/unretweet/%s.json"%tweetId
    res = twitter.post(url) # unretweet実行
    return res

# リツイートしたいIDのリスト
#tweetIds = [line.strip() for line in open('retweetList.txt',encoding='utf-8')]

# リツイート履歴を保存する準備
retHist = {}

from time import time
def retweetProcess():
    ### 最後にリツイートした時間が最も遠いものを選ぶ ###
    # IDと時刻のペアをリスト化
    idTimes = [(tid,retHist[tid] if tid in retHist else 0) for tid in tweetIds]

    # 最後にリツイートした時刻でソート
    idTimes = [idt for idt in sorted(idTimes, key=lambda x:x[1])]

    # 最後にリツイートした時刻が最も古いツイートを選択
    tweetId = idTimes[0][0]

    # 一度解除してからretweet
    resUnrt = unretweet(tweetId)
    resRt = retweet(tweetId)
    
    # 処理内容を表示
    print(tweetId, resUnrt, resRt)

    # 現在の時刻で辞書の値を更新
    retHist[tweetId] = time()

from time import sleep
while True:
    sleep(60*15)  # これは15分毎にリツイートです。
    retweetProcess()
```

最後に、retweetList.txtですが、こんな感じでひたすら、Twitter IDを上から並べましょう！

![リスト1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665829/0a1f8a82-3a8e-8adf-e8f3-0642c3be37d1.jpeg)