08 July 2018

IFTTT Webhooksにデータ送信する(Perl, Python, ESP8266 C)

IFTTTWebhooksにデータ送信するクライアント側のスクリプト集

20180708-ifttt-webhook.jpg
IFTTT Webhookの設定例

Arduino ESP8266 (ESP-WROOM-02) http 版

平文でIFTTTサーバにデータを送信するため、IFTTTのKEYが途中でキャプチャされて盗まれる可能性がある。 どうしてもhttpを使う必要がある場合を除き、後述の https 版を使うほうがよい

/*******************
   IFTTT Webhookにhttpでデータ送信
 ******************/
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
 
// ルーターのSSID
const char* ssid = "◯◯◯◯◯";
// ルーターのパスワード
const char* password = "▲▲▲▲▲";
 
// IFTTT
const char* IFTTT_EVENT = "googledrive-ifttt-test01";
const char* IFTTT_KEY = "chJAmeuHie28jUdiaHYYYKZiwl0msTm47Jl-jYsf4eY";
 
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  delay(500);  // 0.5秒待つ
 
  /******************
     Wifiに接続
   *****************/
  Serial.print(F("\n\nConnecting to "));
  Serial.println(ssid);
 
  int error_count = 0;
  WiFi.begin(ssid, password);
  // Wifi接続成功 待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
    // 0.5秒ごとに20回試行してWifiに接続できなかったら、スリープに入る
    if (++error_count > 20)
    {
      Serial.println(F("Wifi eror\ngoing deep sleep ..."));
      ESP.deepSleep(30 * 1000 * 1000);  // 単位 usec  : 30秒後にスリープから復帰する
      delay(1000);  // deepSleepに入るまでのダミー
    }
  }
  Serial.print(F("\nWiFi connected\n"));
  // Print the IP address
  Serial.println(WiFi.localIP());
 
  /******************
     IFTTT Webhookにデータを送信
   *****************/
  double val01 = 12.5;
  double val02 = -3.02;
  double val03 = 5500;
  char url[256];
  sprintf(url, "http://maker.ifttt.com/trigger/%s/with/key/%s?"
          "value1=%f&value2=%f&value3=%f",
          IFTTT_EVENT, IFTTT_KEY, val01, val02, val03);
  Serial.println(url);
  HTTPClient http;
  http.begin(url);
  int httpCode = http.GET();
  if (httpCode > 0) {
    if (httpCode == HTTP_CODE_OK) {
      // HTTP_CODE_OK = 200 の場合
      String payload = http.getString();
      Serial.println(payload);
    }
    else {
      Serial.printf("WARNING: http post, code = %d", httpCode);
    }
  }
  else {
    Serial.println(F("ERROR: http post"));
  }
  http.end();
 
  /******************
     Deep Sleepに入る
   *****************/
  Serial.println(F("going deep sleep ..."));
  // 1分(60秒)スリープ
  ESP.deepSleep( 60 * 1000 * 1000);  // 単位 usec
  delay(1000);  // deepSleepに入るまでのダミー
}
 
void loop() {
  // loop関数に入ることはないが、何らかの原因で呼びだされた場合のための処理
  delay(10 * 1000);
}

引数の送信を、上の例ではGET(URLパラメーター)で行っているが、POSTで行う場合は次のようにすればよい

  char url[256];
  char param[256];
  sprintf(url, "http://maker.ifttt.com/trigger/%s/with/key/%s",
          IFTTT_EVENT, IFTTT_KEY);
  sprintf(param, "value1=%f&value2=%f&value3=%f",
          val01, val02, val03);
  Serial.println(url);
  Serial.println(param);
  HTTPClient http;
  http.begin(url);
  int httpCode = http.POST(param);
  if (httpCode > 0) {

Arduino ESP8266 (ESP-WROOM-02) https 版

/*******************
   IFTTT Webhookにhttpsでデータ送信
 ******************/
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
 
// ルーターのSSID
const char* ssid = "◯◯◯◯◯";
// ルーターのパスワード
const char* password = "▲▲▲▲▲";
 
// IFTTT
const char* IFTTT_EVENT = "googledrive-ifttt-test01";
const char* IFTTT_KEY = "chJAmeuHie28jUdiaHYYYKZiwl0msTm47Jl-jYsf4eY";
 
void setup() {
  Serial.begin(115200);
  delay(500);  // 0.5秒待つ
 
  /******************
     Wifiに接続
   *****************/
  Serial.print(F("\n\nConnecting to "));
  Serial.println(ssid);
  int error_count = 0;
  WiFi.begin(ssid, password);
  // Wifi接続成功 待ち
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
    // 0.5秒ごとに20回試行してWifiに接続できなかったら、スリープに入る
    if (++error_count > 20)
    {
      Serial.println(F("Wifi eror\ngoing deep sleep ..."));
      ESP.deepSleep(30 * 1000 * 1000);  // 単位 usec  : 30秒後にスリープから復帰する
      delay(1000);  // deepSleepに入るまでのダミー
    }
  }
  Serial.print(F("\nWiFi connected\n"));
  // Print the IP address
  Serial.println(WiFi.localIP());
 
  /******************
     IFTTT Webhookにデータを送信
   *****************/
  double val01 = 12.5;
  double val02 = -3.02;
  double val03 = 5500;
  WiFiClientSecure https;
  if (!https.connect("maker.ifttt.com", 443))
  {
    Serial.println(F("ERROR: https connect"));
  }
  else
  {
    https.printf("GET /trigger/%s/with/key/%s?"
                 "value1=%f&value2=%f&value3=%f HTTP/1.1\r\n"
                 "Host: maker.ifttt.com\r\n"
                 "User-Agent: ESP8266\r\n"
                 "Connection: close\r\n\r\n"
                 , IFTTT_EVENT, IFTTT_KEY, val01, val02, val03);
    https.flush();
    while (https.connected())
    {
      while(https.available())
      {
        String line = https.readStringUntil('\n');
        Serial.println(line);
      }
    }
    https.stop();
  }
 
  /******************
     Deep Sleepに入る
   *****************/
  Serial.println(F("going deep sleep ..."));
  // 1分(60秒)スリープ
  ESP.deepSleep( 60 * 1000 * 1000);  // 単位 usec
  delay(1000);  // deepSleepに入るまでのダミー
}
  
void loop() {
  // loop関数に入ることはないが、何らかの原因で呼びだされた場合のための処理
  delay(10 * 1000);
}

PC Linux, Raspberry Pi のPython

GET (URLパラメーター)でデータ送信する場合

import requests
 
# IFTTT
IFTTT_EVENT = 'googledrive-ifttt-test01'
IFTTT_KEY = 'chJAmeuHie28jUdiaHYYYKZiwl0msTm47Jl-jYsf4eY'
 
val01 = 12.5
val02 = -3.02
val03 = 5500
 
#URL
URL_STR = 'https://maker.ifttt.com/trigger/' + IFTTT_EVENT + '/with/key/' + \
        IFTTT_KEY + '?value1=' + str(val01) + '&value2=' + str(val02) + \
        '&value3=' + str(val03)
 
response = requests.get( URL_STR )
print( response.text )

POSTでデータ送信する場合

import requests
 
# IFTTT
IFTTT_EVENT = 'googledrive-ifttt-test01'
IFTTT_KEY = 'chJAmeuHie28jUdiaHYYYKZiwl0msTm47Jl-jYsf4eY'
 
val01 = 12.5
val02 = -3.02
val03 = 5500
 
hashparam = {
    'value1' : str(val01),
    'value2' : str(val02),
    'value3' : str(val03)
}
 
#URL
URL_STR = 'https://maker.ifttt.com/trigger/' + IFTTT_EVENT + '/with/key/' + IFTTT_KEY
 
response = requests.get( URL_STR, params=hashparam )
print( response.text )

PC Linux, Raspberry Pi のPerl

GET (URLパラメーター)でデータ送信する場合

#!/usr/bin/perl
 
use strict;
use warnings;
use LWP::UserAgent;
 
{
    my $val01 = 12.5;
    my $val02 = -3.02;
    my $val03 = 5500;
 
    # IFTTT
    my $IFTTT_EVENT = 'googledrive-ifttt-test01';
    my $IFTTT_KEY = 'chJAmeuHie28jUdiaHYYYKZiwl0msTm47Jl-jYsf4eY';
 
    my $ua = new LWP::UserAgent();
    my $response = $ua->post( "https://maker.ifttt.com/trigger/$IFTTT_EVENT/with/key/$IFTTT_KEY".
                        ."?value1=$val01&value2=$val02&value3=$val03" );
   
    print $response->as_string;
 
    exit;
}

POSTでデータ送信する場合

#!/usr/bin/perl
 
use strict;
use warnings;
use LWP::UserAgent;
 
{
    my $val01 = 12.5;
    my $val02 = -3.02;
    my $val03 = 5500;
 
    # IFTTT
    my $IFTTT_EVENT = 'googledrive-ifttt-test01';
    my $IFTTT_KEY = 'chJAmeuHie28jUdiaHYYYKZiwl0msTm47Jl-jYsf4eY';
 
    my %param = (
        "value1" => $val01,
        "value2" => $val02,
        "value3" => $val03,
    );
 
    my $ua = new LWP::UserAgent();
    my $response = $ua->post( "https://maker.ifttt.com/trigger/$IFTTT_EVENT/with/key/$IFTTT_KEY",
                        \%param );
     
    print $response->as_string;
 
    exit;
}