Tweeterで、自動リツイートするBOTを作る方法です。
(今後、徐々に肉付けしていきます。多分。。。とりあえず、R1と言う事で。)
皆様のお役に立てると嬉しいです!
<はじめに>
自分はPython使いなので、コードに関して詳しく説明しようと思ったのですが、書いている途中で、「pythonのコードを全く知らない人」でも、見よう見まねでBOTが作れる様な記事にしようと思い直し、大幅に書き直しました。
プログラムの事を知らなくても、PCヘビーユーザー以上なら設定可能と思います。
(勿論、Python学習者に人にも少しは役に立つと願いたいです。)
<全体のイメージ/状況>
私自身は、TweeterではアカウントAとBを保有しております。
Aの方が本アカウントで、現在、フォローワー1万人を目指し、活動中です。(笑)
そこで、Bの方をBOTアカウントとして、本アカのツイートをひたすらリツイートさせようと思っております。(Bは、サブアカウントです。)
イメージとしては、こんな感じです。
<必要な設定>
1.まず、自分のPCにPythonをインストールして、環境設定しましょう!
Pythonと言うか、プログラミングをやった事がない人には、ここが最大の難関だと思いますが、ここを乗り越えましょう。
このProgateのサイトが、非常に丁寧です。
https://prog-8.com/docs/python-env-win
2.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/
3.Pythonのコードを、自分のWindows PCで走らせましょう。
コードは下記サイトに書いてある通りですが、一部、ミスを発見したので、下記に改訂コードを載せますね。
http://mojitoba.com/2018/11/06/automate_retweet_with_python/
改訂した部分は下記。(全体コードの中段です。下記コードがあります。)
1)
上記のサイトにはこういうコードがあります。
# リツイートしたい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')]
全体コードの上部に下記の関数(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を上から並べましょう!