今回はRaspberry Pi(以下、ラズパイ)から自動的に画像付きのツイートをTwitterへ行ってみようと思います。ツイートの内容は、このブログの最新記事のタイトルとURLとサムネイル画像とします。
主に以下のサイトを参考にさせていただきました。ありがとうございます。
http://qiita.com/konojunya/items/59a68d35e44db8b87186
http://www.cafe-gentle.jp/challenge/tips/python_tips_001.html
まずは、TwitterのWebサイトにてアプリケーションを有効にする必要があります。このあたりは上記サイトの一番上のサイトさまに詳しく書かれています。そこで取得したコンシューマーキーなどを、settings.pyなどのファイル名で以下のように記載します。
CONSUMER_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxx" CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ACCESS_TOKEN = "xxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" ACCESS_TOKEN_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
そして本体のコードです。上記のスクリプトファイルと同じディレクトリに保存してください。なお、21〜28行目あたりはこのブログサイト用に設定していますので、各自で書き換える必要があります。
#!/usr/bin/python #coding: UTF-8 import os import datetime import settings import lxml.html import requests from TwitterAPI import TwitterAPI #Move to script file directory. file_dir = os.path.abspath(os.path.dirname(__file__)) os.chdir(file_dir) #Print current date and time. d = datetime.datetime.today() print('Datetime:', d) #Read settings.py file. api = TwitterAPI(settings.CONSUMER_KEY, settings.CONSUMER_SECRET, settings.ACCESS_TOKEN, settings.ACCESS_TOKEN_SECRET) #Parse my blog site. Get the latest article's title and URLs. target_url = 'http://www.okahiro.info/gd/' target_html = requests.get(target_url).text root = lxml.html.fromstring(target_html) anchors = root.xpath('//a') msg = anchors[6].text + anchors[6].attrib['href'] images = root.xpath('//img') img_url = images[0].attrib['src'] #Download image. def download(url): global file_name file_name = url.split("/")[-1] res = requests.get(url, stream = True) if res.status_code == 200: with open(file_name, 'wb') as file: for chunk in res.iter_content(chunk_size = 1024): file.write(chunk) download(img_url) #Upload image. IMAGE_PATH = file_dir + "/" + file_name file = open(IMAGE_PATH, 'rb') data = file.read() r = api.request('media/upload', None, {'media' : data}) print('UPLOAD MEDIA SUCCESS' if r.status_code == 200 else 'UPLOAD MEDIA FAILURE') #Remove uploaded local image file. os.remove(IMAGE_PATH) #Post tweet with a reference to uploaded image. if r.status_code == 200: media_id = r.json()['media_id'] r = api.request('statuses/update', {'status':msg, 'media_ids':media_id}) print('UPDATE STATUS SUCCESS' if r.status_code == 200 else 'UPDATE STATUS FAILURE')
importしているモジュールが無い場合はpipやapt-getなどでインストールしてください。なおTwitterAPIについては一度インストールした後以下のようにアップグレードが必要だと思います。
pip install TwitterAPI --upgrade
このスクリプトを実行すると下の画像のように写真付きのツイートをラズパイがしてくれます。(3連投になっちゃってますが、これは3回スクリプトを走らせた結果です…。)
毎回手動でスクリプトを走らせるのも面倒なので、crontabで自動的に実行させましょう。
まずはインストール。
sudo apt-get install gnome-schedule
インストールは結構時間がかかりました。それで、
crontab -e
としてcronのファイルを設定します。以下のように行を追加して保存します。この設定ですと毎日午前0時0分に自動投稿されます。
0 0 * * * /usr/bin/python /home/pi/auto_tweet/auto_tweet.py >> log.txt 2>&1
なお、log.txtというファイルに標準出力を書き出して、ログファイルとしています。
スクリプトファイルの実行権限も変更することをお忘れなく。
sudo chmod 755 <ファイル名>
初めは写真付きは難しいかなと思っていたのですが、案外簡単に行けました。これも上記の数々のサイト様のおかげなのですが。
今日のところはこの辺で。☕️