もじとばコム

pythonでリツイートを自動化しよう!

ブログ、動画、イラストなどを多くの人に見てもらうためには、Twitterでの宣伝が重要です。

しかし何度も自分のツイートをRTするのは大変ですよね。

この記事ではpythonを使ってあなたのRT作業を自動化する方法についてご紹介します。


前提

この記事では、以下の記事の内容を応用した方法をご紹介します。

まだご覧になっていない方はぜひ以下の記事を先にご覧ください。

関連:pythonからリツイートしてみよう

 

また、この記事ではTwitter APIを利用します。

APIの利用にはTwitterアプリを登録したうえで、アクセストークンとシークレットキーを取得する必要があります。

こちらの取得方法については以下の記事で説明していますので、実際に動かしてみたい方は先にこちらをご覧ください。

関連:Twitter APIへの登録方法を画像で解説!

 





リツイートの自動化

仕様

まず、今回作るプログラムの仕様について説明します。

今回作るプログラムで実現する課題は以下の三点です。

  1. 30分ごとにリツイートを実行する
  2. 既にリツイートされている場合は一度解除してからリツイートする
  3. 最後にリツイートした時刻が最も古いツイートをリツイートする

目標3.が前回からの違いで、これによって効率的な宣伝を可能にします。

 

TwitterAPI準備

from requests_oauthlib import OAuth1Session
CK = 'CONSUMER KEYを入力'
CS = 'CONSUMER SECRETを入力'
AT = 'ACCESS TOKENを入力'
ATS = 'ACCESS TOKEN_SECRETを入力'
twitter = OAuth1Session(CK, CS, AT, ATS)

順番に処理を説明していきます。

まずTwitter APIにアクセスする準備ですが、この部分は前回と変わりません。

ご自身のアプリが必要となりますので、前回の記事およびこちらを参考に設定をしてください。

 

リツイートと解除用メソッドを用意

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

 

メイン処理をきれいに書くために、前回紹介したリツイートとリツイート解除のプログラムをメソッド化します。

ここではツイートのIDを受け取り、各処理を実行するようになっています。

 

リツイートしたいツイートIDを用意

リツイートにはツイートのstatus IDを用います。

こちらでも解説していますが、status IDはツイートのURLから調べることができます。

例えばこのツイートの場合はURLより、「1054020815421767681」がstatus IDになります。

今回の例では、以下の5つのツイートをリツイートするプログラムを作成します。

1059129340602941440
1055873349899800576
1052058774796558336
1053223930591240192
1054020815421767681

これらを用いて、以下のようにリツイートするIDのリストを用意しましょう。

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

 

リツイートした時間を保存しておく辞書を作る

今回作る自動化プログラムでは、「最後にリツイートした時刻が最も古いツイートをリツイートする」という仕様です。

そのため、どのツイートをいつリツイートしたかを記憶しておく必要があります。

今回は辞書オブジェクトを用いてこれを管理します。

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

この辞書のキーはstatus ID、値は最後にリツイートした時間です。

 

リツイート処理

それではリツイート処理を行う部分を説明していきます。

メイン処理で呼び出すためにこちらもメソッド化します。

また、関数内で定義していないresHistとtweetIdsを参照していますが、関数外で定義したものを参照しているためエラーは出ません

もしファイルを分ける場合は引数でretHistとtweetIdsの二つを受け取れるようにしてください。

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
    unretweet(tweetId)
    retweet(tweetId)
    
    # 処理内容を表示
    print(tweetId, resUnrt, resRt)

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

 

コードの詳細はコメントに書いた通りです。

retHistに入っていないstatus IDの時刻を0で初期化していることに注意してください。
time()関数は現在時刻に対応した正の値を返しますので、一度もリツイートしていないツイートに0を与えることで、最も低い値が割り当てられます。

関連:あなたに最適なpython入門書を見つけよう!

 

メイン処理

from time import sleep
while True:
    sleep(60*30)
    retweetProcess()

最後に、上で用意した処理を五分ごとに実行する部分を実装します。

sleep関数は指定した秒数、pythonの処理をストップします。

今回は30分ごとにリツイートを実行するため、60*30=1800秒のストップが必要です。

このsleepの値を1など極端に小さくしたり、sleepのないコードを書くことは絶対にやめてください。

Twitter APIの自動化ルールにより、極端なリツイートのリクエストはアプリ凍結の対象となっています。

 

プログラムの全体

最後に、上で説明したプログラムの全体を掲載します。

これをそのまま用いることで、リツイートの自動化が可能です。

# Twitter APIの準備
from requests_oauthlib import OAuth1Session
CK = 'CONSUMER KEYを入力'
CS = 'CONSUMER SECRETを入力'
AT = 'ACCESS TOKENを入力'
ATS = 'ACCESS TOKEN_SECRETを入力'
twitter = OAuth1Session(CK, CS, AT, ATS)

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

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

# リツイートしたいIDのリスト
tweetIds = [line.strip() for line in open('../data/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*30)
    retweetProcess()

 

このプログラムが正しく実行された場合、以下のような出力が得られます。

1059129340602941440, <Response [200]>, <Response [200]>
1055873349899800576, <Response [403]>, <Response [200]>

左から順番に、リツイートを実行したツイートのID、リツイート解除の結果、リツイートの結果となっています。

403は失敗、200は成功です。

リツイート解除については、すでにリツイートされているツイートでないと403が表示されます。

一方でリツイートの結果は必ず200が表示されるはずです。

もしここが403や400となっている場合はコードの打ち間違えによるバグが考えられます。

 

まとめ

pythonを用いたリツイートの自動化方法についてご紹介しました。

今回のプログラムでは、説明のためにstatus IDをコード内に書いたり、リツイート履歴を保存できないといった仕様にしています。

status IDを外部から読み込んだり、リツイート履歴を保存できるように手を加えることで、より本格的な自動化システムを作ることができます。

今後もpythonを用いた自動化についてご紹介しますので、また是非ご覧ください!

 

掲載コードには気を付けていますが、もし不備等ありましたらお問い合わせよりご連絡いただけると助かります。