RaspberryPiでIFTTTのMaker Channelにトリガーを投げてみる
今回のエントリーは自分があまりPythonについて知らないので勉強も兼ねて実験をしてみます。 みんな大好きなJSONをpythonから投げてみます。これで、センサーからGPIOやI2Cなどを使用して値を取得してIFTTT経由で他のWebサービスとの連携ができるかなと思ってます。
以下のエントリーを参考にさせていただいています。
これを読むと、pythonにはurllib2というライブラリがあったが、ナウくないのでRequestsというライブラリを使用したほうがいいとのこと。
Requests: HTTP for Humans — Requests 2.10.0 documentation
Requests is an Apache2 Licensed HTTP library, written in Python, for human beings.
ライブラリの説明に「人類」という言葉が入るなんて胸熱と思ったら、現在の紹介は
Requests is the only Non-GMO HTTP library for Python, safe for human consumption.
となっている。壮大なイメージ…使えるか不安を感じてきている…
Requestsのインストール
$ pip install requests
pip
だけなのでかなりありがたい。easy_install
も使える模様なのですが公式には「使うな」とのことです。ただ、Raspbian(Jessie)には既にrequests (2.4.3)がインストールされていますのでそのまま使用することにします。
使い方
クイックスタート — requests-docs-ja 1.0.4 documentation
基本的にはクイックスタートを日本語で読めば終わります。
ライブラリのインポート
>>> import requests
これでOK
リクエストを送信する
各種 HTTP メソッドに一対一対応するメソッドが用意されている.
>>> # GET >>> requests.get('URL') >>> # POST >>> requests.post('URL') >>> # PUT >>> requests.put('URL') >>> # DELETE >>> requests.delete('URL') >>> # header の取得 >>> requests.head('URL')
これに習ってライブドアのお天気サービスにアクセスするなら次のようになります。
お天気Webサービス仕様:
>>> requests.get('http://weather.livedoor.com/forecast/webservice/json/v1?city=400040') <Response [200]>
となります。
パラメータの付与
当然ながらRequestsではURLのクエリ文字列として、あるデータを追加して送信する機能もあります。
上記の例ではURLにクエリ文字列を記載した形式で送信していますが、
>>> payload = {'city': '400040'} >>> r = requests.get("http://weather.livedoor.com/forecast/webservice/json/v1", params=payload)
とすることもできます。以下でリクエストのURLの確認することが出来ます。
>>> r.url
u'http://weather.livedoor.com/forecast/webservice/json/v1?city=400040'
レスポンスの取得方法
返ってきたレスポンスの内容を
- テキスト形式で取得には以下のように処理します。(リクエストは自動的に unicode にデコードされているらしいけど)
>>> r = requests.get('http://github.com') >>> r.text u'\n\n\n<!DOCTYPE html>\n<html lang="en" class="">\n <head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# object: http://ogp.me/ns/object# article: http://ogp.me/ns/article# profile: http://ogp.me/ns/profile#">\n <meta charset=\'utf-8\'>\n\n <link crossorigin="anonymous" href="https://assets-cdn.github.com/assets/frameworks-3514e6d8825ab9f55728f0030acba498e5da5b85ebc8abc35f0f466ac9d2bdda.css" media="all" rel="stylesheet" /> (略)
- JSONデータで受信する場合には以下のように処理します。
>>> payload = {'city': '400040'} >>> r = requests.get("http://weather.livedoor.com/forecast/webservice/json/v1",params=payload).json()>>> r {u'pinpointLocations': [{u'link': u'http://weather.livedoor.com/area/forecast/4020200', u'name': u'\u5927\u725f\u7530\u5e02'}, {u'link': u'http://weather.livedoor.com/area/forecast/4020300', u'name': u'\u4e45\u7559\u7c73\u5e02'}, (略)
お天気Webサービスから最高気温を取得するサンプル
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests q = {'city': '400040'} r = requests.get('http://weather.livedoor.com/forecast/webservice/json/v1', params=q) print(r.json()['forecasts'][1]['temperature']['max']['celsius'])
PythonからRequests経由でIFTTTを使用する
http経由でJSONデータを送る方法がわかったのであとはIFTTTのMaker Channelにあった形でリクエストすればゴールになります。
IFTTTのMaker Channelサンプル
#!/usr/bin/env python # -*- coding: utf-8 -*- import requests payload = {"key1": "Hello", "key2": "world."} requests.post("https://maker.ifttt.com/trigger/{event}/with/key/{key}", json=payload)
URLに含まれる {event}と{key}に関して作成したレシピのものと置き換えてください。
(以下の過去の記事を参考)
送信するJSONにセンサーの値などをいれれば他のWebサービスと連携をすること(例えばTwitterへのTweetやAndroidへのPUSH通知など)ができるようになります。