2017年11月20日 更新

RaspberryPiで物理ボタン押したらツイート

どうも、クラゲです。 今回はIFTTT(イフト)を使って、簡単にTwitterでつぶやきたいと思います。 ラズパイに接続されたボタンを押すとツイートが即座に反映されます。

ボタンではなく何かのセンサーにしたり、センシングしたデータを定期的にツイートするなど、様々な応用も可能です。

【 大まかな流れ 】

  • IFTTTの登録
  • IFTTTのTwitter設定
  • プログラム実行でツイート
  • 物理ボタンが押されたらツイート

IFTTTの登録

IFTTT(イフト)とは、スマホのアプリやインターネット上のサービスを連携させて、自動化するサービスです。 IFTTT は If This Then Thatのそれぞれの頭文字を意味します。例えば、「もし、明日の天気が、雨ならば、ツイッターでつぶやく」などのサービスをプログラムを書くことなく簡単に自動化できます。 このサービスとラズパイを組み合わせることにより、ボタン1発でTweetするサービスが簡単に作成できます。 では、早速 IFTTT で Sign up しましょう!

以下のURLへアクセスします https://ifttt.com/login

中央下の小さな"Sign up"ボタンをクリック もし既に登録済の場合は、Sign inボタンをクリックしてください

メールアドレスとパスワードを入力して"Sign up"をクリックします

こんな感じで右上にメールアドレスが表示されると思います。 これで登録完了です。簡単!

IFTTTのTwitter設定

RaspberryPiからいきなりIFTTTの"Tweet"送信アクションには繋がりません。アクションを起こすにはトリガーが必要です つまり、RaspberryPi送信 -> IFTTTトリガー -> IFTTTアクション の順です。 なお、RaspberryPiと接続できるIFTTTのトリガーは"Webhooks"というサービスのみです。ちなみに、2017年5月以前までは"Maker Channel"というサービス名でした。 詳細には RaspberryPI送信 -> IFTTTにてWebhooks受信 -> IFTTTからTweet送信 という流れになります。

トリガーのkeyを入手

Serchボタンを押して、検索バーで "webhook" と入力します。 そうすると"Webhooks"というサービスが現れると思います。 "Webhooks"をクリックします

Connectをクリックします

Documentationをクリックすると新たなタブが開きます

このときに表示されている太字がKeyです。後でPythonのプログラムで使います。

トリガーのEvent Nameを設定

先ほどのタブに戻って、この度は "My Applets" をクリックします。

右上の "New Applet" をクリックします

"this"をクリックします

検索バーに"web"と入力すると"Webhooks"が現れます これをクリック

"Receive a web request"をクリック

Event Nameは自由に決めて構いません。 入力したら"Create trigger"ボタンをクリック 今回イベント名は"twitter"にしました。後でPythonプログラムで使います。

アクションを設定

今度は"that"をクリックします

検索バーで "twitter" と入力します。 そうするとTwiterというサービスが現れると思います Twitterをクリックします

Twitterと連携するためにConnectボタンをクリックします

IFTTTとTwitter連携していない場合は、新しいウィンドウが開かれます 既存のアカウントと連携する場合はユーザー名/メールアドレスとパスワードを入力して"連携アプリを認証"をクリックします 新規でTwitterアカウントを作る場合は右上の"アカウント作成"をクリックしてください

IFTTTに戻って"Post a tweet"をクリックします

元々以下のような文字列が入っていると思いますが、現状のままだと毎回同じ文字列のツイートになってしまうので、{{Value1}} に変更します。

The event named "{{EventName}}" occurred on the Maker service

ポイントは Value1 ではなく、二重に括弧を付けて {{Value1}} と書くことです

正しく書けていれば、テキストボックス以外のところをマウスクリックしたときに、この画像のようにValue1の背景が白色になります。 ちなみに、ここは後で変更可能です。後で、"My Applet"から作ったサービスを選び歯車アイコンをクリックすることで編集可能になります。 "Create action"ボタンを押して次に進みます。

"Finish"をクリックして完成です。 これで、Webhooksがtwitterという名前のイベントを受け取ったときに、連携したTwitterアカウントにツイートするというサービスが出来ました。その際、変数value1に文字列を割り当てることにより、その文字列がツイートされます。

プログラム実行でツイート

IFTTTのWebhooksにイベントを通知するPythonプログラムを書きます。 Requestsモジュールを使ってとても簡単に記述できます。 例えば "twitter.py"というファイル名でnanoエディタを使って新規作成します。

nano twitter.py

keyの * の部分はWebhooksサービスで得たkeyに書き換えてください。 なお、Event Nameを "twitter" 以外にしている場合は、eventに代入している文字列も変更してください。 ツイートする文字列として string に文字列を代入しています。ここは各自お好みで変えてください。

#!/usr/bin/python
# coding:utf-8
import requests
import datetime

#IFTTT設定と送信する文字列
event  = "twitter"
key    = "*******************************************"
string = "RaspberryPiからのつぶやき!"

try:
    print("Try...")

    #現在時刻取得
    t = datetime.datetime.now()
    time_string = " [" + str(t.hour) + ":" + str(t.minute) + ":" + str(t.second) +"]"

    #IFTTT経由でTwitterのツイート
    payload = {"value1" : string + time_string}
    url = "https://maker.ifttt.com/trigger/" + event +"/with/key/" + key
    requests.post(url, json = payload)

    print("Done!")

except:
    print("Error")

プログラムのポイントとして、ツイッターで全く同じ文字列を投稿する場合は1日くらい間を空けないと投稿できない規制があるようです。そこで、最後に時刻を追加することにより、同じ文字列でも連続で投稿できるように工夫しています。 nanoを保存(Ctrl + O, Enter)して終了(Ctrl + X)してpythonを実行します。

python twitter.py

すぐにツイートが反映されると思います。

物理ボタンが押されたらツイート

先ほどのままだとコマンド打ち込みが必要ですが、物理的なボタンを押したらツイートされるようにします。 簡単な回路とGPIO制御が必要となりますが、詳細解説はこちらの記事を参照してください。 ここでは作り方だけ紹介します。

部品

  • ブレッドボード x 1個
  • タクトスイッチ x 1個
  • オスーメスジャンパー x 2本

回路

左下から3番目のGroundと6番目のピン(18pin)にジャンパー線を繋ぎます。 タクトスイッチは向きがあるので注意してください。

プログラム

Pythonで作成しています。 先ほどと同じ手順でkey変更など行ってください。

#!/usr/bin/python
# coding:utf-8
import time
import requests
import datetime

#IFTTT設定と送信する文字列
event  = "twitter"
key    = "*******************************************"
string = "RaspberryPiからのつぶやき!"

#GPIOの初期設定
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

#GPIO18pin:入力モード、pull up設定
GPIO.setup(18,GPIO.IN,pull_up_down=GPIO.PUD_UP)

while True:
    print("スイッチを押すとTweetします")

    #立下りエッジを検出するまで待つ
    GPIO.wait_for_edge(18, GPIO.FALLING)

    try:
        print("Try...")

        #現在時刻取得
        t = datetime.datetime.now()
        time_string = " [" + str(t.hour) + ":" + str(t.minute) + ":" + str(t.second) +"]"

        #IFTTT経由でTweet送信
        payload = {"value1" : string + time_string}
        url = "https://maker.ifttt.com/trigger/" + event +"/with/key/" + key
        requests.post(url, json = payload)

        print("Done!")

    except:
        print("Error")

    #チャタリング対策
    time.sleep(0.3)

これで実行すると、ボタンを押す度にツイートされるようになりました。 無限ループなので、終了するときは Ctrl + Z で中断してください。

以上、RaspberryPiで物理ボタン押したらツイートでした!