MENU

溶けかけてるうさぎ HP BLOG TOP RECENT ARTICLES POPULAR ARTICLES ABOUT THIS BLOG

CATEGORY

大学 (85) 航空宇宙 (55) 写真 (25) 旅行 (14) 飯・酒 (11) コンピュータ (88) その他 (13)

TAG

ARCHIVE

2018 (92) 2017 (80) 2016 (0)

RECENT

【駅メモ】4年目に突入して,ようやく3000駅突破 【WebRTC】Raspberry Pi搭載ロボットをWebRTCで遠隔操作しようとして失敗した 【航空宇宙】航空宇宙アドベントカレンダー 始まります! 【Perl】YAPC::Tokyo 2019 のチケットを確保しました! 【カメラ】Canonから富士フイルムに乗り換えました

【Twitter Bot】Pythonで自動定期ツイート

2017-08-04

毎日334を,そして平日は0655,2355をツイートしようと試みているのだが,いい加減面倒くさくなってきた.そこで自動化.

Pythonのライブラリが優秀だったので,簡単に自動化できた.

 

トップ画像の出典はこちら

1.動作環境

Ubuntu Server 16.04.2 LTS

Python 2.7.12

2.Twitter API keyの取得

携帯電話番号の登録

Twitter APIを使用するには,

設定とプライバシー > モバイル > 携帯の電話番号

より携帯電話番号を登録する必要がある.

 

ここではまったのだが,

+81 080********

だと登録できない.

+81 80********

とするといける.

国際電話のかけ方と同じだった....

認証キーの取得

Application Management (https://apps.twitter.com) にアクセス.
Create New Appを押す.
もろもろを入力.例えば下のよう.
Create an application
Application Details
Name *
[溶けかけてるうさぎ]
Your application name. This is used to attribute the source of a tweet and in user-facing authorization screens. 32 characters max.

Description *
[溶けかけてるうさぎ BOT]
Your application description, which will be shown in user-facing authorization screens. Between 10 and 200 characters max.

Website *
[http://hogehoge.hoge.jp]
Your application's publicly accessible home page, where users can go to download, make use of, or find out more information about your application. This fully-qualified URL is used in the source attribution for tweets created by your application and will be shown in user-facing authorization screens.
(If you don't have a URL yet, just put a placeholder here but remember to change it later.)

Callback URL
[  ]
Where should we return after successfully authenticating? OAuth 1.0a applications should explicitly specify their oauth_callback URL on the request token step, regardless of the value given here. To restrict your application from using callbacks, leave this field blank.

Developer Agreement
[check] Yes, I have read and agree to the Twitter Developer Agreement.
記入例.[]で囲んだものが入力.
Keys and Access Token > Your Access Token > Create Access Tokenより,
    Consumer Key (API Key)
    Consumer Secret (API Secret)
    Access Token
    Access Token Secret
が取得できる.

戦後処理

Twitterに携帯電話番号を登録するのもあれなので,API keyもゲットできたことだし,即刻削除.

3.Pythonの必要ライブラリをインストール

下のよう適当にインストールした.

# 入ってないならpipのインストール
$ sudo apt-get install python-pip

# 必要なライブラリをインストール
$ pip install requests requests_oauthlib
# sudo付けるの忘れた....
# これだと,インストールしたユーザーでしか使えない.インストールディレクトリが違うっぽい.
$ pip uninstall requests requests_oauthlib
$ sudo pip install requests requests_oauthlib

# 後述するPythonスクリプトを他ユーザーから実行すると,
# ImportError: No module named oauthlib.common
# のエラー.
# 必要か不明だが一応以下もインストール.
$ sudo pip install oauthlib

# Ubuntuを再起動したらエラーがとれた.

4.Pythonスクリプト

引数をツイートするPythonスクリプトを書いた.

改行に対応させ,エラーログを吐くことにした.

# coding: UTF-8
import sys
import os
from requests_oauthlib import OAuth1Session
import json

CONSUMER_KEY        = '*************************'
CONSUMER_SECRET     = '**************************************************'
ACCESS_TOKEN        = '**************************************************'
ACCESS_TOKEN_SECRET = '*********************************************'
LOG_FILE = '${path}/log.log'

def main(args):
    # 引数取得
    tweetStr = args[1]
    # 改行を生成
    tweetStr = tweetStr.replace('\\n', '\n')
    twitter = OAuth1Session(CONSUMER_KEY, CONSUMER_SECRET, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

    # ツイート
    params = {"status": tweetStr}
    req = twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)

    # エラーならエラーログ出力
    if (str(req) != "<Response [200]>"):
        # 追記モードで出力
        f = open(LOG_FILE, "a")
        try:
            f.write(GetStringTime()+"\t"+str(req)+"\n")
        finally:
            f.close()

    # 一応コンソールにも出力
    ps(tweetStr)
    ps("\n")
    ps(req)
    ps("\n")
    ps("\n")


def ps(output):
    sys.stdout.write(str(output))
    sys.stdout.flush()


def GetStringTime():
    import datetime
    import locale

    d = datetime.datetime.today()
    stringTime = str(d.year)
    stringTime += '.'
    stringTime += '{0:02d}'.format(d.month)
    stringTime += '.'
    stringTime += '{0:02d}'.format(d.day)
    stringTime += '-'
    stringTime += '{0:02d}'.format(d.hour)
    stringTime += '.'
    stringTime += '{0:02d}'.format(d.minute)
    stringTime += '.'
    stringTime += '{0:02d}'.format(d.second)
    stringTime += '.'
    stringTime += '{0:02d}'.format(d.microsecond / 10000)
    return stringTime


if __name__ == '__main__':
    main(sys.argv)
tweet.py

今回は訳あってソースコード編集ユーザーと実行ユーザーが違ったので,適当にパーミッションを変更.

$ sudo chmod 767 tweet.py

実行例を次に示す.

引数に \\n を挟むと改行される.

$ python ${path}/tweet.py "一行目\\n二行目"
実行例

5.cronに定期実行の登録

まあ,適当に.

# バックアップは重要
$ crontab -l > ~/crontab.backup

$ crontab -e

# 以下を追記
34 3 * * * python ${path}/tweet.py "334\\n[bot]" > /dev/null 2>&1
55 23 * * 1,2,3,4,5 python ${path}/tweet.py "2355\\n[bot]" > /dev/null 2>&1
55 06 * * 1,2,3,4,5 python ${path}/tweet.py "0655\\n[bot]" > /dev/null 2>&1

6.未実装機能

この方法でTL取得できるので,暇になったら自動ツイ消しツイート収集Botでも作りたい(って3年前から言ってる.)

7.API key取得時のWebsiteについて [2017.08.06 追記]

」で登録したWebsiteは一般には公開されないと思っていた.

しかしながら,TweetDeckを使っている場合,そのviaがここで登録したWebsiteへのリンクとなっていた.

適当なURLを入力する際は注意が必要そうだ.

8.関連記事

9.参考サイト

Qiita. PythonでTwitterしてみた. Retrieved August 3, 2017, from http://qiita.com/konojunya/items/59a68d35e44db8b87186
GitHub. requests/requests-oauthlib. Retrieved August 3, 2017, from https://github.com/requests/requests-oauthlib
Twitter Developer Documentation. POST statuses/update. Retrieved August 3, 2017, from https://dev.twitter.com/rest/reference/post/statuses/update

コメントを投稿

名前

Email (※公開されることはありません)

コメント