さあようやく完成に近づいてきました。
最後に取得した気温・湿度と画像をTwitterに流します。
まずはアカウントを作成します。
Pythonからつぶやくので、APIを利用するために
アプリケーションとアカウントを連携させなければなりません。
その際、電話番号認証が必須になるので
アカウント作成時に認証しておいた方がいいでしょう。
詳しい手順はこの辺を参考にしました。
www.statsbeginner.net
アプリケーションの認証用ページは
普通に検索してもなかなかたどり着けないので
メモ代わりにリンクを残しておきます。
apps.twitter.com
で、こちらで登録が完了すると、
コンシューマキーとアクセストークンというものが発行されます。
知られるとアカウント乗っ取られちゃうので消してありますが、
オレンジの辺りに表示されているランダムっぽい文字の羅列です。
Seacretと書いてある行と両方必要なので、それぞれコピーしておきます。
これが自分が作るアプリとTwitterの間の認証情報という奴になります。
アプリから渡されるこれらの値が正しければ、
このTwitterアカウントに対して操作ができるというわけです。
ここまで準備ができたらPythonでプログラミングです。
今回はTwythonというライブラリを使います。
ライブラリはあらかじめpipでインストールしておきましょう。
$ sudo pip install twython
とりあえずTwythonにさせたい処理は
画像とテキストを渡してツイートしてもらうことです。
ですがこれだけでも結構長くなるので、
簡単に呼び出せるようにライブラリ化しておきましょう。
import os
import io
from twython import Twython
from PIL import Image
class TwitterAccess:
CONSUMER_KEY = ''
CONSUMER_SECRET = ''
ACCESS_TOKEN = ''
ACCESS_SECRET = ''
def __init__(self):
print('initialized')
def tweet(self,text):
apiInst = Twython(TwitterAccess.CONSUMER_KEY,TwitterAccess.CONSUMER_SECRET,TwitterAccess.ACCESS_TOKEN,TwitterAccess.ACCESS_SECRET)
apiInst.update_status(status=text)
def tweetImage(self,text,imgFileNm):
apiInst = Twython(TwitterAccess.CONSUMER_KEY,TwitterAccess.CONSUMER_SECRET,TwitterAccess.ACCESS_TOKEN,TwitterAccess.ACCESS_SECRET)
photo = Image.open(imgFileNm);
image_io = io.BytesIO()
photo.save(image_io, format='JPEG')
image_io.seek(0)
image_ids = apiInst.upload_media(media=image_io)
apiInst.update_status(status=text, media_ids=[image_ids['media_id']])
最初にCONSUMER_KEY~ACCESS_SECRETまで4つの定数を定義していますが、
ここに先ほどTwitterのアプリ認証画面で発行された
コンシューマキーやアクセストークンを記入します。
あとはメインの処理からtweetImageを呼び出せば、
画像付きのツイートが送信できるはずです。
というわけで、テスト用にこんな感じの処理を書きました。
import RPi.GPIO as GPIO
import dht11
import time
import datetime
from twython import Twython
import TwitterAccess
import ImageCapture
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.cleanup()
dht11Inst = dht11.DHT11(pin=4)
dateTimeFormat = "%Y/%m/%d %H:%M:%S"
filePath = '/usr/app/niwashi/img/capture.jpg'
twitter = TwitterAccess.TwitterAccess()
capt = ImageCapture.ImageCapture()
loopContinue = True
while loopContinue:
sleepTime = 60
current_time = datetime.datetime.now().strftime(dateTimeFormat)
loopRead = True
while loopRead:
dht11Read = dht11Inst.read()
if dht11Read.is_valid():
textTweet = 'ゲンザイノ ニチジハ ' + current_time + ' キオン ' + str(dht11Read.temperature) + '℃ ' + 'シツド ' + str(dht11Read.humidity) + '% デス.'
if capt.putImage(filePath):
twitter.tweetImage(textTweet, filePath)
else:
twitter.tweet(textTweet)
print('success tweeted.')
loopRead = False
else:
print('dht11 error')
time.sleep(1)
time.sleep(sleepTime)
60秒間隔で気温・湿度を取得、画像を撮影し
Twitterに投稿するプログラムです。
気温・湿度の読み取りに失敗した場合は1秒待って再度読み取り
画像の取得に失敗した場合はテキストだけツイートします。
画像の取得もライブラリ化してますが、
やっていることは前々回の記事の通りです。
うまくいっていれば、このようにツイートできているはずです。
これはあくまでテストですが、
実際のプログラムはエラーが続いた場合に停止する処理や
1日に時間を決めて何回かだけツイートするようにしています。
(長いのでコードは後程GitHubにでも挙げるかもしれません)
なにはともあれひとまずこれで完成です!
Twitterアカウントは公開しているので、
興味のある人はフォローしてみてください。
twitter.com