Androidのメモとか

ポキオの日記です。今日も遅延してない。

Google Apps ScriptでブログのRSSを監視して新しい投稿があったらIFTTTのトリガーを発火させる(2)

無理やり。

前回はGASでRSS監視をしました

relativelayout.hatenablog.com

折角なので、Open Graph Protocolの画像をHTMLソースから引っこ抜いてみるメソッドを追加しました。いわゆるサムネです。

function getOgImage(url) {
  var html = UrlFetchApp.fetch(url).getContentText();
  var textArray = html.split(/\r\n|\r|\n/);
  var ogImageCandidate = [];
  
  for(var i = 0; i < textArray.length; i++){
    if(textArray[i].indexOf('og:image') > 0){
      if(textArray[i].indexOf('\'') > 0){
        ogImageCandidate = textArray[i].split('\'');
      } else if(textArray[i].indexOf('\"') > 0){
        ogImageCandidate = textArray[i].split('\"');
      }       
    }
    
    for(var j = 0; j < ogImageCandidate.length; j++){
      if(ogImageCandidate[j].indexOf('http') >= 0){
        return ogImageCandidate[j];
      }
    }
  }
}

テストがてら、投稿。 さて寝よう。

Google Apps ScriptでブログのRSSを監視して新しい投稿があったらIFTTTのトリガーを発火させる

すごいどうでもいいんですが。

はてなブログってIFTTTに対応してないんですよね

自動化したいけど、IFTTT未対応。それならGASでスクリプトを書けば良いのでは。そう思い立ってスクリプトを書いてみました。

相変わらずのクソコードをお許し下さい。

var rssHatena = "http://relativelayout.hatenablog.com/rss";
var sheetId = "(Google SpreadsheetのID)";
var iftttUrl = "(IFTTTのURL)";


function checkHatena() {
  var lastPost = getLastPost(rssHatena);
  var lastPostGuid = getGuid(lastPost);
  var savedPostGuid = getGuidOnSheet('hatena');
  
  if(lastPostGuid == savedPostGuid){
    return;
  }
  
  triggerIfttt(getTitle(lastPost), getLink(lastPost));
  setGuidOnSheet('hatena', lastPostGuid);
}

function getLastPost(url){
  var xml = XmlService.parse(UrlFetchApp.fetch(url).getContentText());
  var root = xml.getRootElement();
  var channel = root.getChildren('channel');
  var items = channel[0].getChildren('item');
  return items[0];
}

function getGuid(post){
  return post.getChildren('guid')[0].getValue();
}

function getLink(post){
  return post.getChildren('link')[0].getValue();
}

function getTitle(post){
  return post.getChildren('title')[0].getValue();
}

function getGuidOnSheet(sheetName){
  var spreadsheet = SpreadsheetApp.openById(sheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var data = sheet.getSheetValues(1, 1, 1, sheet.getLastColumn()); 
  return data[0][0];
}

function setGuidOnSheet(sheetName, guid){
  var spreadsheet = SpreadsheetApp.openById(sheetId);
  var sheet = spreadsheet.getSheetByName(sheetName);
  var array = [guid];
  sheet.clear();
  sheet.appendRow(array);
}

function triggerIfttt(title, link){
  var payload =
      {
        "value1" : title,
        "value2" : link
      };
  
  var options =
      {
        "method" : "post",
        "payload" : payload
      };
  
  UrlFetchApp.fetch(iftttUrl, options);
}

ざっくり言うと、RSSの最新投稿のGUIDをSpreadsheetに保存しておく。定期的にRSSの最新投稿のGUIDをチェックして、保存しているGUIDと違ったら新しい投稿があったと判断して、IFTTTにHTTP POSTをするというもの。こんなんで良いのかな・・・。

IoT縛りの勉強会! IoTLT vol.25 @freeeで登壇してきました

またお邪魔してきました。

iotlt.connpass.com

今回はfreeeさん

五反田にあるfreeeさん。eは3つです。

www.freee.co.jp

IoTLT vol 25 freee

すごいお洒落なオフィス・・・憧れます。会計ソフトなどを扱っているそうです。ほう。

IoTLT vol 25 freee

思わず記念撮影。ハックエブリシング!

今回は京急遅延チェッカーVer2を話してきました

relativelayout.hatenablog.com

本当にくだらない低レベルな内容でしたが、登壇させていただきました。ただ、ポキオといえば京急京急といえばポキオという感じが定着してきてよかったです。

気になった発表など

「擬似生体認証を独自実装してSSH認証をしてみた話」わんこ。@HAROiD inc.

「すごい」という言葉を、そんな簡単に連呼してはいけないですが、この発表は本当にすごい。すごいすごい。

IoTLT vol 25 freee

手にNFCタグを埋め込んでしまったという話。それを使って認証をしたりするわけですが、認証の部分の説明が全然頭に入ってこないくらい、NFCを埋め込んだという話のパンチ力がすごすぎました。本当にすごい。

「スマート冷蔵庫カメラを作ってみた」ymd @Cookpad

冷蔵庫ハック。

IoTLT vol 25 freee

冷蔵庫の中を外出先からも見られるようにするという話。これ、地味にうれしいですよね。既製品もあるそうですが、安価に自作してみたいところです。ただ、バッテリーどうするんだ問題など色々あって、実際使うとなると色々課題もありそうです。冷蔵庫の扉の開閉で発電できたら良いんですけどね。

「Waffleのクラウドファンディング報告をします」のびすけ at dotstudio

Androidスマートフォンに直挿しできるArduino

IoTLT vol 25 freee

とりあえず1つ欲しいなぁ。何に使うかはNo Ideaですが、確実に夢が広がるガジェットでしょう。そしてGroveシステム対応なので、はんだ付けなしで実装できてしまいます。オフィスなど、はんだごてが準備できないような時に、ささーっとプロトタイピングできてしまうのもいいですね。

懇親会

いいですね、🍺。

IoTLT vol 25 freee

いま、非常にHOTなESP32開発ボードを使ったガジェットもありました。

IoTLT vol 25 freee

流石に出たてホヤホヤなので、ネット上に情報がなかったり、BLEが動かなかったり、色々あるそうです。とはいえ、安価でコンボチップな開発ができるのは本当に嬉しいものです。

IoTLT vol 25 freee

フリスクサイズの開発ボードのNefly。なんと、ディスプレイが搭載されるようで、実物を見せてもらいました。フリスクサイズはキープしながら、小さいディスプレイを内蔵していて、ちょっと胸熱ですね。デバッグ用に使ってもよし、簡易なUIとして使うのもあり。使い方が広がります。

IoTLT vol 25 freee

Sigfoxを使ったIoTセンサーのデモ。LoRaWANとともに、ちょっと気になっている技術。Wi-Fiゲートウェイを準備しなくても、安価にネットと通信できる環境が整うと、IoT界隈も本当に活性化されると思うんですよね。今後に期待したいところです。

二次会

やっぱり🍺。

飲んでばっかりですね。ちなみに、京急遅延チェッカーver2(ダァ2号)は、無事にオフィスに設置されました。わかりづらいですが、ディスプレイの上に、メンディングテープで雑に固定されています(笑)

IoTLT vol 25 freee

よーし、ESP32で何か作るぞー!

ESP8266を使った京急の運行状況を監視するガジェットを進化させた

前回までの話。

relativelayout.hatenablog.com

京急が遅延や運転見合わせをすると、光るガジェットを作りました。わりとポジティブなフィードバックが多かったし、刺さる人にはかなり刺さってた気がします。IoTLTでも発表させていただいたし、人生初のデブサミ出展も果たせました。ただ、課題も見つかりました。

ガジェットに足りなかったもの

ガジェットはできたものの、いまいちパンチが弱かった気がした。やっぱりガジェットは光ってなんぼ。光ってこそモテるわけです。

ギャル電さん並に光ってみたいものの、流石に急に光るとちょっとアレかなと思い、まずはRGBフルカラーLEDを買って様子見ようと思った。

RGBフルカラーLED

輝くと決めたら、あとは作るだけ

輝くガジェット。でも京急への愛は捨てられない。取り敢えず、京急を輝かせようと思ったわけです。前回はガチャガチャで引き当てた京急を使いましたが、先頭車両が出てくるまで、それなりのコストがかかったので、今回はBトレインショーティーというプラモデルを潔く購入しました。

Bトレインショーティー 京急

Bトレインショーティー 京急

プラモデルの中に、先程のLEDを詰めるわけですが。世の中には便利なものがあって、ハサミで切れるユニバーサル基板のようなものがあるのを見つけてしまい、今回はこれを使ってみました。

サンハヤト 薄型ユニバーサル基板 UB-THN01

サンハヤト 薄型ユニバーサル基板 UB-THN01

プラモデルとはいえ、かなり小さいわけです。それにピッタリ入るような基盤をハサミで簡単に作れるのは本当に素晴らしいです・・・。そんなこんなでプラモデルの中にLEDを埋め込むことができました。

LEDの制御や情報の取得はESP8266

やっぱり安心と信頼のESP8266です。

ESPr Developer(ESP-WROOM-02開発ボード)

ESPr Developer(ESP-WROOM-02開発ボード)

ESP8266

ESP8266

基本的なシーケンスは既存のガジェットと変わりませんが、運行状況によって光り方を変えるようにしています。

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <Adafruit_NeoPixel.h>

char ssid[] = "xxx";
char password[] = "yyy";

char unkopage[] = "unkou.keikyu.co.jp";
int intervalSec = 10 * 60;

#define PIN 4
#define NUMLED 4

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_RGB + NEO_KHZ800);


void setup() {
  Serial.begin(115200);
  Serial.println("");

  pixels.begin();
  pixels.setBrightness(60);
}

void loop() {
  connectWifi();
  String result = getPageSource();
  Serial.println(result);
  disconnectWifi();

  if (result.indexOf("平常") > 0) {
    Serial.println("平常通り運転!");
    delay(intervalSec * 1000);
    return;
  }

  if (result.indexOf("受託") > 0) {
    Serial.println("振替輸送受託!");
    ledExtreme(intervalSec);
    return;
  }

  if (result.indexOf("見合わせ") > 0) {
    Serial.println("運転見合わせ!");
    ledStopped(intervalSec);
    return;
  }

  if (result.indexOf("遅れ") > 0 || result.indexOf("乱れ") > 0 {
    Serial.println("遅延!");
    ledDelayed(intervalSec);
    return;
  }

  Serial.println("もう一度取得します!");
  ledConnecting(3);
}

void connectWifi() {
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    ledConnecting(3);
  }

  Serial.println("connected!");
}

void disconnectWifi() {
  WiFi.disconnect();
  Serial.println("disconnected!");
}

String getPageSource() {
  WiFiClient client;

  if ( !client.connect(unkopage, 80) ) {
    return String("");
  }

  client.print(String("GET ") + "/" + " HTTP/1.1\r\n" +
               "Host: " + unkopage + "\r\n" +
               "Range: bytes=8000-9000\r\n" +
               "Connection: close\r\n\r\n");
  client.println();

  delay(1000);

  String body = "";
  String unko = "<!-- ======================== 運行情報 =================================== -->";

  while (client.available()) {
    body += client.readStringUntil('\r');
  }

  body = body.substring(body.indexOf(unko) + unko.length());
  body = body.substring(0, body.indexOf(unko));

  return body;
}

// 白い点滅
void ledConnecting(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, i, i);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, i, i);
    }

    count++;
  }
}

// 黄色い点滅
void ledDelayed(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, i, 0);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, i, 0);
    }

    count++;
  }
}

// 赤い点滅
void ledStopped(int sec) {
  int count = 0;

  while (count < sec) {
    for (int i = 0; i < 256; i += 5) {
      setColor( i, 0, 0);
    }

    for (int i = 255; i >= 0; i -= 5) {
      setColor( i, 0, 0);
    }

    count++;
  }
}

// パリピ
void ledExtreme(int sec) {
  int count = 0;

  while (count < sec) {

    for (int i = 0; i < 20; i++) {
      setRandomColor();
      delay(50);
    }

    count++;
  }
}

void setColor(int r, int g, int b) {
  for (int i = 0 ; i < NUMLED; i++) {
    pixels.setPixelColor(i, pixels.Color(r, g, b));
    pixels.show();
  }
  delay(10);
}

void setRandomColor() {
  for (int i = 0 ; i < NUMLED; i++) {
    pixels.setPixelColor(i, pixels.Color(64 * random(1, 5) - 1 , 64 * random(1, 5) - 1 , 64 * random(1, 5) - 1 ));
    pixels.show();
  }
  delay(10);
}

相変わらずのクソコードですが、京急の運行状況ページをパースして、現在の状況を判断しています。とはいえ、なかなか遅延しないため、動作確認ができていないパターンがあり、正しく動作しないかもしれません・・・。

改めて見るとif文がキモいですね・・・。setup()loop()は極力汚さないコーディングを目指します。(きっといつかは)

デモ

こんな感じで光ります。(デモ用のコードで動作させています)

#keikyu #esp8266

A post shared by pokio (@pokipokio) on

ESPr Developerでハマった事のメモ

久しぶりのESPr。

ESPr Developer ESP8266

ESP-WROOM-02開発ボード

ESP-WROOM-02開発ボード

  • スイッチサイエンス(Switch Science)
Amazon

ハマったこと①:Macからバイナリを流し込めなかった話

以前、MacからESPr Developerにコードを書き込もうとした事がありましたが、何故か書き込むことができず、それ以来ESPr Developerは放置して他の野良なESP8266ボードで開発していました。

relativelayout.hatenablog.com

ATコマンドは打てるので、MacからESPr Developerを認識できていると思うのですが、いざコードを流し込もうとすると、

warning: espcomm_send_command: cant receive slip payload data

みたいなエラーが発生して、書き込めません。そんな時はESPTOOLを使うと上手く書き込めるそうです。

結局、そのときはESPTOOLも有効な解決策になりませんでした。で、スイッチサイエンスさんのサイトを眺めていたら・・・

ESPr® Developer(ESP-WROOM-02開発ボード)www.switch-science.com

モード切替ボタンはIO0番ピンにつながっています。ボタンを押すとIO0がLOW、放すとIO0がHIGHになります。IO0がHIGHの状態でリセットされるとファームウェアの実行モードで起動しますが、IO0がLOWの状態でリセットされるとファームウェアの書き込みモードで起動します。

ファームウェア書き込みモードは電気信号的になされるものだと思ってましたが、ボタン操作によって書き込みモードにできるんですね・・・。ということは、Arduino IDEから書き込む前に、ボタン操作で書き込みモードにしてあげれば良いんじゃね?と思い試してみました。結果はOK、モード切替ボタンを押してからリセットボタンを押して、コードを流し込むと、問題なく書き込むことができました。今までの苦労は何だったんでしょうか。まぁ、いいや。これからはESPr Developerを可愛がっていこうと思います。

ハマったこと②:ESP8266でマイコン内蔵LEDが光らせることができなかった話

akizukidenshi.com

このあたりのLEDを扱う時に便利なのがAdafruitのNeoPixels ライブラリになるわけですが、どうもESP8266からは上手く動作せず、Arduinoからは動作できていました。もしかして、3.3V駆動が原因で動かなかったのかなと思い、レベル変換モジュールを秋月で買って色々やってみたものの、上手く行かず途方にくれていました。

ESP8266 NEOPIXELS

これもしょーもない理由が原因だったんですが、ローカルにあったライブラリのバージョンが古く、Arduino IDEのライブラリマネージャーで最新のライブラリを取得してコンパイルしてESP8266に流し込んだところ、フツーにピカピカできました。しかも3.3Vのままでも動作しちゃってます。本当はアレだと思うんですが、動いてるのでこのまま開発しようと思います・・・(笑)

というわけで

くだらないトラブルに相当な工数を割いてしまいましたが、これでようやくESPr Developerで開発できそうです。

iotlt.connpass.com

3月末のIoTLTさんで登壇させていただけそうなので、当面はそれに向けてガジェットを作成しようと思います。乞うご期待。

www.instagram.com

チカチカー。

いまさら聞けないIoTの基礎とビーコン規格 に行ってきました

メモ書き。

japan-android-group.connpass.com

いまさら聞けないIoTの基礎とビーコン規格

いまさら聞けないIoTの基礎とビーコン規格

会場:川崎市産業振興会館(9階第3研修室)

  • 京急川崎駅から歩いて5分くらい
  • いわゆる地区の建物と言った感じ、すこしお硬いイメージ
  • プロジェクターで投影している画面が小さくて辛い
  • 年齢層高め、スーツ率高い
  • 某弊社社員も数名
  • 19時スタートだったが、結構ガラガラ

講師の鈴木さん

http://www.houwa-js.co.jp/index.php/ja/www.houwa-js.co.jp

  • 株式会社芳和システムデザイン
  • バイスからクラウドまでやっている会社
  • セミナーを多数やっているらしい

IoTとBLE

  • 2013年にAppleがiBeaconをリリース

    • オライリーが従来提唱してきたIoTと言うのは、パソコンがインターネット経由でマイコンを制御することだった
  • 2014年ころは実証実験が多かった、2015年後半から一般利用されるように

    • JRや江ノ電などで、O2O目的で使われている
    • その場合は、各々公式アプリで楽しめる
    • M2M(工場などでの活用)用途でも使われ始めている
    • 在庫管理、安全管理
  • 農業でも使われ始めている

    • バイスが畑に落ちても大丈夫なようにするのが難しい
    • 温度・照度・湿度は普段からわかっている
    • すべてをオートメーション化したり、室内生産するユースケースでは有用と見られている
    • むしろ、いつ収穫すればいいのか、いつなら高く売れるかのほうが農家は欲しがっている
  • なぜBluetoothなのか

    • スマホにもBluetoothが普及、キーボードやマウスでも多く使われている
    • Wi-Fiはインターネット回線として使うため、BluetoothがIoT向けに使われることが多い
    • BLEビーコンは安価である(1800円〜、Wi-Fiに比べても安い)
    • ビーコンとゲートウェイから構成される

Bluetoothのバージョン

  • バージョン

    • 3.0からHigh Speedが登場したが、ほとんど使われていない
    • 4.0からBLEが登場、低消費電力(いまはこれがメジャー)
  • BLE(Bluetooth Low Energy)

    • Nokia発祥の規格、後にBluetooth SIGが採用
    • BLEとLegacyは互換性がない
    • LegacyはMPUとICが別だった、BLEはワンチップで実装されている
  • 用語

    • BLEではCentralとPeripheralという2つの役回りがある
    • Peripheralがビーコン、スマホは基本的にCentral
    • 定期的にPeripheralが発信する信号をアドバタイジングと呼ぶ
    • Centralにはロガーやゲートウェイも含まれる
    • ペアリングは1対1
    • ペアリング後にアドバタイズを吹き続けることも実装次第ではできる
  • Bluetooth SIG(Special Interest Group)の方針はころころ変わる

    • エンドプロダクト登録料の有料化
    • もともとBLEはBluetooth Smart、両対応のものはBluetooth Smart Readyと謳っていたが、現在ではSmartという表記は廃止されている
  • 実環境での話

    • BLEとWi-Fiは干渉する(BLEがWi-Fiの周波数帯を避けている)
    • BLEは電子レンジとも干渉する(業務用だと干渉することもあるが、そこまで大したことない)
    • 900人が同時に同じアドバタイズを受信できた実績があある
    • 30〜60mくらい届く

iBeacon

  • 2013年に登場
  • Apple独自のフォーマットでデータを送信するデバイス
  • OSがiBeaconの電波を受信する
  • 送信間隔が100msのため消費電力が大きい
  • 72時間後も同じデータを送信していることが規定されている
  • たまに送信間隔をのばしているものがあるが、いつBANされるかわからない

Linking

  • NTT docomoが主体で進めている規格
  • Linking対応デバイスと対応アプリをつなぐLinkingアプリが存在する
  • バイスに連動してアプリにデータを送ったりできる
  • アプリはAPI、デバイスメーカーは規格にそって作成すればいい
  • BLEでは種々のセンサー類との通信向けにプロファイルのようなものが予め規定されている
  • アドバタイズの送信間隔を決められるので低消費電力
  • アドバタイズもペアリングもできる

Eddystone

  • 2015年に登場
  • もとは2014年に登場したPhysical Web
  • 基本的にアドバタイズのみ

  • フレームタイプ

    • TLM:バッテリー情報の送信(IDがないので、UIDなどと組み合わせて使う)
    • UID:ユニークなIDの送信(iBeaconと同様)
    • URL:URLを送信(Chromeが対応、専用アプリ不要)
    • EID:暗号化されたデータを送信

HomeKit

  • 2014年にAppleが発表
  • 電気・鍵・暖房などをコントロール
  • 最初は暗号化がなかったので、他人のデバイスをコントロールできてしまった
  • その後、暗号化対応などが行われた(未だにゆるいそう…)

  • MFiに参加できた会社のみが仕様が見られる、参加しないとデバイスが作れない

  • PhilipsのHueはSDKを公開していたりしているので、Androidでもつかえる

  • アドバタイズはできるが、存在していることを伝えるだけ

Ucode

  • 国土地理院が主体で進めている
  • Beaconで緯度・経度・高度を伝える
  • 国土地理院に場所を申請すると、IDが振られてその場所の位置情報が送信できる
  • 申請できる企業は限られている
  • 送信間隔は柔軟に設定できる

ポイント

  • アドバタイズ送信間隔が短いと消費電力が多くなる、規格で決められていると変更できない
  • アドバタイズは誰でも受け取ることができる、セキュリティを気にするのであれば暗号化に対応している方式を選ぶこと
  • データの送受信を行うのであればペアリングができる方式に絞られる

その他の規格

  • LINE Beacon(2016年〜)
  • CSRmesh (2014年〜)

  • Bluetooth IPS Bluetooth 4.2/5.0

    • IPv6をサポートして、通信できるようにした
    • GW・Router・Nodeかななる
    • GWやRouterではRAMが大量に必要になる、消費電力も高くなる

実動作時の問題、ビジネスの話など

  • 電池駆動は低温に弱い(乾電池で0度以上、リチウムで-15度以上)

  • 赤字になることが多い

    • 駅に納品しても赤字(ビーコンひとつひとつは安価で、個数も出ないため)
    • 工場への納品の場合、ユースケースによっては社員一人一人にビーコンをもたせたりする上に、工場も何箇所かあると、ビーコンの納品数も上がり儲かりやすい
    • 従業員の移動のムダを発見すると、即生産性に直結するケースが多い
    • ただし、工場に納品しても、その企業のプレスリリースに乗るわけではないので宣伝にならない
    • 農業はあまり儲からない、露地栽培ではセンサーの必要性があまりないらしいのと、富◯通がやりつくしているらしい

実際のデバイス

様々なビーコン。

いまさら聞けないIoTの基礎とビーコン規格

送信間隔が短い規格や、そういったビーコンは消費電力が大きくなるため、バッテリーを増やしたり大きくしないと、数年オーダーで動作することが難しくなる。

いまさら聞けないIoTの基礎とビーコン規格

ソーラーパネルでビーコンを動かすデバイス

いまさら聞けないIoTの基礎とビーコン規格

基本給電無しで動くが、照度が足りない際はボタン電池で駆動する。

Google Apps Scriptを使ってビットコインの価格を定期的にLINEに通知する

今更Google Apps Scriptに感動。

無料でスクリプトを定期的に走らせる

developers.google.com

スクリプトを定期的に実行したいと考えた時に、あるマシン上でCronとかスケジューラを使ってスクリプトを走らせるのも良いが、そのマシンの電源は切れなくなるし、かと言って有料のサーバーを借りるほどでもない。そんなときはGoogle Apps Scriptが便利っぽい。とりあえず、今回は最近マイブームのビットコインを絡めたスクリプトを書いてみる。

bitflyer.jp

ビットコインに関しては、bitFlyerが公開APIを無料で提供しているので、これを使ってみることにする。

1時間おきにビットコインの取引価格をLINEに通知する

ビットコインの価格は最近乱高下しているので、そのトレンドをいち早く知るために、スクリプトを書いてみる。ブロック図はこんな感じ。 IFTTTのMaker Channelのおかげで、簡単にLINEに通知を送ることができます。

Google Apps Script IFTTT Bitcoin bitFlyer

Google Apps Scriptはブラウザ上でコーディング・デバッグ・実行できます。言語はJavaScriptベースのようです。

Google Apps Script IFTTT Bitcoin bitFlyer

こんな感じで実装。

var iftttUrl = "https://maker.ifttt.com/trigger/xxx/with/key/yyy";

function myFunction() {
  if(!isNotifyAvailable()){
    Logger.log("notify not available...");
    return;
  }
  
  var message = "Bitcoin価格 : " + getCurrentPrice() + "JPY";
  sendLineNotify(message);
}

function getCurrentPrice(){
  var url = "https://api.bitflyer.jp/v1/ticker";
  var response = UrlFetchApp.fetch(url);
  var responseJson = JSON.parse(response.getContentText());  
  return responseJson.ltp;
}

function sendLineNotify(message){
   var payload =
   {
     "value1" : message
   };

   var options =
   {
     "method" : "post",
     "payload" : payload
   };

   UrlFetchApp.fetch(iftttUrl, options);
}

function isNotifyAvailable(){
  var date = new Date();
  var utcHours = date.getUTCHours();
  var ret = 21.0 <= utcHours || utcHours <= 14.0;
  return ret;
}

HTTPのGETやPOSTはXMLHttpRequestではなく、UrlFetchAppを使います。また、夜中に通知されるのは嫌なので、UTCで21時台〜14時台(JSTで6時台〜23時台)に限定しています。で、このスクリプトを定期実行するために、トリガーを設定します。

Google Apps Script IFTTT Bitcoin bitFlyer

とりあえず1時間おきに実行してみます。

いざ実行

いい感じ。

Google Apps Script IFTTT Bitcoin bitFlyer

こんな感じでLINEに通知が届きます。 Google Apps ScriptはGoogleのサービス(Gmail、Calendarなど)との親和性もかなり高いので、その観点でもかなりポテンシャルが高いです。

「Androidのメモとか」は、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、Amazonアソシエイト・プログラムの参加者です。

このブログは個人的なメモ書きであったり、考えを書く場所であります。執筆者の所属する団体や企業のコメントや意向とは無関係であります。また、このブログは必ずしも正しいことが書かれているとは限らず、誤字脱字や意図せず誤った情報を載せる場合がありえます。それが原因で読者が不利益を被ったとしても、執筆者はいかなる責任も負いません。ありがとうございます。