RaspberryPiでIFTTTのMaker Channelにトリガーを投げてみる

RaspberryPiでIFTTTのMaker Channelにトリガーを投げてみる

今回のエントリーは自分があまりPythonについて知らないので勉強も兼ねて実験をしてみます。 みんな大好きなJSONpythonから投げてみます。これで、センサーからGPIOやI2Cなどを使用して値を取得してIFTTT経由で他のWebサービスとの連携ができるかなと思ってます。

以下のエントリーを参考にさせていただいています。

qiita.com

これを読むと、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サービス仕様:

weather.livedoor.com

>>> 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}に関して作成したレシピのものと置き換えてください。

(以下の過去の記事を参考)

uepon.hatenadiary.com

送信するJSONにセンサーの値などをいれれば他のWebサービスと連携をすること(例えばTwitterへのTweetやAndroidへのPUSH通知など)ができるようになります。

/* -----codeの行番号----- */