【Twitter API】自己リツイートの自動化でフォロワー増【Python】

thumbnail for this post

ツイッターでのつぶやきは1ヶ月もすると誰も覚えていないし思い出してもくれません。

せっかくつぶやいた「有益な情報」が埋もれてしまうのは勿体ない

その有益情報ってどこ?見当たらないよ?

しかも、有益な情報をつぶやくことはフォロワー増には欠かせません。
今回はTwitter APIを使って、過去の自分のつぶやきを定期的にリツイート(RT)させてみましょう。

以前の2つの記事も参照してもらえればと思います。

og_title
【Twitter API】Twitterの予約投稿を作る【Python】 | enjoyall


og_title
【Twitter API】Twitter 情報取得・返信・リツイート【Python】 | enjoyall

自分のRT(リツイート)候補を探す

まずは、リツイート対象となる「自分の有益なツイート」を探してみましょう。 最初のTwitter API利用の認証部分は同じなのでここに載せておきます。詳しくは以前の記事を参照して下さい。

Tweepy利用の固定部分

import tweepy
# ここに取得したキーを書く
CONSUMER_KEY = 'xxxxxxxxxxx'
CONSUMER_TOKEN = 'xxxxxxxxxxx'
ACCESS_KEY = 'xxxxxxxxxxxx'
ACCESS_TOKEN = 'xxxxxxxxxx'
auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_TOKEN)
auth.set_access_token(ACCESS_KEY, ACCESS_TOKEN)
api = tweepy.API(auth)
# ここからAPIを使った好きな処理を書く

自分のオリジナルツイート取得

自分のオリジナルツイート(RTやメンションを除く)をリストアップします。

# ここからAPIを使った好きな処理を書く
for res in tweepy.Cursor(api.user_timeline, id="<あなたのID>").items():
    print("\n===={},id:{}  {}\n {}".format(res.created_at,res.id,res.author.name,res.text), flush=True) if not re.match('^@.*|^RT @.*',res.text) else next
先程の固定部分に2行追加するだけです。 使い方は
$ python3 xxxxxxx.py > my_tweet.txt
というようにコマンドの出力をテキストファイルに書き込みます。

結果ファイルの加工

結果ファイルから自己リツイート候補の「メッセージID」と「日付け」をjson形式にします。(手作業。。。)

Retweet Candidate file

元ファイル

jsonファイル:

[
  { "date" : "2020-04-01 04:15:40" , "id" : "1234567890123413760"},
  { "date" : "2020-03-25 10:41:17" , "id" : "1234567890123457888"},
  { "date" : "2020-03-23 08:04:00" , "id" : "1234567890123449474"},
  { "date" : "2020-03-23 05:01:59" , "id" : "1234567890123401088"},
  { "date" : "2020-03-21 11:40:02" , "id" : "1234567890123459077"},
  :
]

自動リツイートスクリプトとcron設定

自動リツイートスクリプトは以下のような流れです。

  • リツイート候補のjsonファイルを読み込み
  • 「一番古いもの」をリツイート
  • 以前リツイートしたことがある場合は前のリツイートを削除
  • リツイートしたツイート部分をリツイート日に書き換えてjson保存

このスクリプトをcronで定期的に動かします。
スクリプト起動のたびにjsonを読み込むので新しいリツイート候補の追加なども簡単にできます。

リツイートスクリプト

import tweepy
import json
from datetime import datetime

MYDATEFORMAT = "%Y-%m-%d %H:%M:%S"
def __from_json(dct):
    for k, v in dct.items():
        if(k=="date"):
            dct[k] = datetime.strptime(v, MYDATEFORMAT )
    return dct

def __to_json(x):
    if isinstance(x, datetime):
        return x.strftime(MYDATEFORMAT)
    return x

with open("<rt候補jsonファイル>", 'r') as f:
    rt_candidates = json.load(f, object_hook=__from_json)

rt_candidate = sorted(rt_candidates, key=lambda x: x['date'], reverse=False)[0]
print(rt_candidate)

if 'rt_id' in rt_candidate:
    api.destroy_status(rt_candidate['rt_id'])
rt_id = api.retweet(rt_candidate["id"]).id

rt_candidate['date'] = datetime.now()
rt_candidate['rt_id'] = rt_id
with open("<rt候補jsonファイル>", 'w') as f:
    json.dump(rt_candidates,f,indent=4,default=__to_json)

jsonでdatetimeを扱うために"object_hook"と"default"を利用しています。(ここの解説記事を作ったほうが良いかも。。)
一度RTしたツイートを再度RTすることができないのでRTしたときのIDを記録して、リツイート時に一旦まえのリツイートを消す処理を入れています。

cron設定

cron.confというファイルを作って読み込ませる方法で設定します。

cron.conf:

2 18 * * * python3 xxxxx.py
18時2分に動かす例

このファイルを

crontab cron.conf
として読み込ませます。

crontab -l # 確認
crontab -r # 削除
です。

自己リツイートはフォロワー数アップに貢献するか?

何日間か運用してみてフォロワー数増加具合を見てみようと思います。

まずはフォローしたくなるツイートしようね!

投げ銭していただける場合は、amazonで15円からできます。宛先はheisakuあっとcomichi.comで。

マイナスは入れられないの?

comments powered by Disqus