ニワとりの巣箱

面白いものが生まれたり生まれなかったり。

テラリウム管理装置を作る4

さあようやく完成に近づいてきました。

最後に取得した気温・湿度と画像をTwitterに流します。

 

まずはアカウントを作成します。

f:id:niwakxq:20171217190245p:plain

Pythonからつぶやくので、APIを利用するために

アプリケーションとアカウントを連携させなければなりません。

その際、電話番号認証が必須になるので

アカウント作成時に認証しておいた方がいいでしょう。

 

詳しい手順はこの辺を参考にしました。

www.statsbeginner.net

 

アプリケーションの認証用ページは

普通に検索してもなかなかたどり着けないので

メモ代わりにリンクを残しておきます。

apps.twitter.com

 

で、こちらで登録が完了すると、

コンシューマキーとアクセストークンというものが発行されます。

f:id:niwakxq:20171217203250p:plain

知られるとアカウント乗っ取られちゃうので消してありますが、

オレンジの辺りに表示されているランダムっぽい文字の羅列です。

Seacretと書いてある行と両方必要なので、それぞれコピーしておきます。

 

これが自分が作るアプリとTwitterの間の認証情報という奴になります。

アプリから渡されるこれらの値が正しければ、

このTwitterアカウントに対して操作ができるというわけです。

 

ここまで準備ができたらPythonでプログラミングです。

今回はTwythonというライブラリを使います。

ライブラリはあらかじめpipでインストールしておきましょう。

 

$ sudo pip install twython

 

とりあえずTwythonにさせたい処理は

画像とテキストを渡してツイートしてもらうことです。

ですがこれだけでも結構長くなるので、

簡単に呼び出せるようにライブラリ化しておきましょう。

#coding:utf-8

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を呼び出せば、

画像付きのツイートが送信できるはずです。

というわけで、テスト用にこんな感じの処理を書きました。

#coding:UTF-8

import RPi.GPIO as GPIO
import dht11
import time
import datetime
from twython import Twython

import TwitterAccess
import ImageCapture

# initialize GPIO
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秒待って再度読み取り

画像の取得に失敗した場合はテキストだけツイートします。

 

画像の取得もライブラリ化してますが、

やっていることは前々回の記事の通りです。

 

うまくいっていれば、このようにツイートできているはずです。

f:id:niwakxq:20171217212357p:plain

 

これはあくまでテストですが、

実際のプログラムはエラーが続いた場合に停止する処理や

1日に時間を決めて何回かだけツイートするようにしています。

(長いのでコードは後程GitHubにでも挙げるかもしれません)

 

なにはともあれひとまずこれで完成です!

Twitterアカウントは公開しているので、

興味のある人はフォローしてみてください。

twitter.com