ほぼPython

Not技術ブログBut勉強ブログ 内容には誤りがあることが多いです

ツイッターで特定ユーザーのツイートを監視して自動でパクツイするコードを書いた

はじめに

今回で二回目のPythonです。
前回は、Yahoo!ニュースのトップニュース一覧を自動で取得するプログラムを書きましたが、
今回はツイッターで特定ユーザーのツイートを監視して、パクツイするプログラムを書きました。あまり使用は推奨されませんが公開します。今回は3時間くらいかかりました。

ソース

from requests_oauthlib import OAuth1Session
import json
from urllib import request

keys = {
            "CK":'カスタマーキー',
            "CS":'カスタマーシークレット',
            "AT":'アクセストークン',
            "AS":'アクセストークンシークレット'
        }

sess = OAuth1Session(keys["CK"], keys["CS"], keys["AT"], keys["AS"])
TL = "https://api.twitter.com/1.1/statuses/user_timeline.json"
userID = "パクツイする人のID"

params1 = {
"screen_name":userID,
"count":1,
"include_entities" : True,
"exclude_replies" : True,
"include_rts" : False
          }

first = 0
while True:
    if first==0:
        req = sess.get(TL, params=params1)
        timeline = json.loads(req.text)
        twi = timeline[0]["text"]
        first+=1
    elif first==1:
        pos = "https://api.twitter.com/1.1/statuses/update.json"
        params2 = {"status":twi}
        req = sess.post(pos, params = params2)
        first+=1
    elif first==2:
        req = sess.get(TL, params=params1)
        timeline = json.loads(req.text)
        twi = timeline[0]["text"]
        tmp = twi
        first+=1
    elif first==3:
        req = sess.get(TL, params=params1)
        timeline = json.loads(req.text)
        twi = timeline[0]["text"]
        if(tmp != twi):
            pos = "https://api.twitter.com/1.1/statuses/update.json"
            params2 = {"status":twi}
            req = sess.post(pos, params = params2)
            first-=1

注意点など

・事前にrequests_oauthlibモジュールをインストールする必要があります。

・keysの部分にいろんなカタカナが出てきますが、ここには事前にツイッターデベロッパーサイトで取得したAPIキーとシークレットを入力してください。ツイッターOAuth認証をするのに必要です。

・なぜかたまに29行目でKeyError:0が出ます。理由がわかりません。

・whileループのところが微妙な書き方してると思いますが、今の僕にはこれが限界でした。

感想

今回も楽しかったです。しかし、常時アカウントを監視して更新されたらそのツイートを呟くという部分に結構苦労しました。そこに開発のほとんどの時間を費やしました。実現方法を簡単に書くと、

・初回に起動したときは、first==0の部分が動いて、ツイートを取得します。

・first==1に移って、そのツイートを呟きます。

・first==2に移って、再びツイートを取得してtmpにそのツイートを入れておきます。

・first==3に移って、ツイートを取得します。そのツイートとtmpが異なっていれば呟いてfirst==2に戻ります。

こんな感じに実装しました。今気づきましたが、first==1の部分はfirst==0の部分にまとめられますね…。
もっとスマートな方法でやりたいです。