Skip to content

Instantly share code, notes, and snippets.

@kawaz
Created February 6, 2019 02:59
Show Gist options
  • Save kawaz/462f79f6f2bb684e1fea91dd1ee92aaf to your computer and use it in GitHub Desktop.
Save kawaz/462f79f6f2bb684e1fea91dd1ee92aaf to your computer and use it in GitHub Desktop.
iPhoneを探す的なことをするTwilioFunctions
const FUNC_PATH = '/search-iphone';
const FROM = '+8150XXXXXXXX'; //Twilioで購入済みの電話番号
//電話番号リスト。冗長だけどとりあえずキーワード複数に同じ番号を定義しとく
const TO_NUMBERS = {
'お父さん': '+8190XXXXXXXX',
'父さん': '+8190XXXXXXXX',
'お母さん': '+8190YYYYYYYY',
'母さん': '+8190YYYYYYYY',
};
//電話に出たときに再生されるメッセージ(適当)
const messages = [
'今日のラッキーカラーはピンクです',
'見つけてくれてありがとうございます。またのご利用をお待ちしております',
'私リカちゃん。今グアムに居るの',
];
exports.handler = function(context, event, callback) {
console.log({event, context});
const client = context.getTwilioClient();
//電話に出たとき用のTwiMLを返す
if(event.say) {
const message = messages[Math.floor(Math.random() * messages.length)];
const twiml = new Twilio.twiml.VoiceResponse();
twiml.say({language: 'ja-JP'}, message);
return callback(null, twiml);
}
//電話番号が見つかったら電話を鳴らす
to = TO_NUMBERS[event.TextField];
if(to) {
client.calls.create({
url: `https://${context.DOMAIN_NAME}${FUNC_PATH}?say=1`, //電話に出たときに実行するTwiMlのURL
from: FROM,
to,
endTime: new Date(Date.now() + 60*1000).toGMTString(),
}, function(err, result) {
console.log(`New phone call started... from: ${FROM} to:${to}`);
console.log(result);
return callback(err, result);
});
} else {
//電話番号が見つからなかった
callback();
}
};
@kawaz
Copy link
Author

kawaz commented Feb 6, 2019

IFTTTで、↓こんなアプレットを作っておく。

If GoogleAssistant で「携帯を探す $」と「携帯 $」をキーワード登録して「$ の携帯を探します」なメッセージを喋らせる
then WebRequest https://xxxx-yyyy-zzzz.twil.io/search-iphone?TextField=<<<{{TextField}}>>>&CreatedAt=<<<{{CreatedAt}}>>>

  • xxxx-yyyy-zzzz.twil.io の部分は自分のアカウントに割り当てられたランダムなホスト名。
  • /search-iphone は作った関数名。コードからは自分の関数名は取れないっぽい?のでコード中に書いておく。

@kawaz
Copy link
Author

kawaz commented Feb 6, 2019

Twilio Functions の設定で Enable ACCOUNT_SID and AUTH_TOKEN にチェックを入れておくと context.getTwilioClient() でクレデンシャル設定済みの TwilioClient が取れるのでコード中には認証情報書く必要はないっぽい。

@kawaz
Copy link
Author

kawaz commented Feb 6, 2019

これで「OKグーグル、携帯を探す お父さん」と言うと「お父さんの携帯を探します」って反応したあとに、携帯に電話がかかってくる。着信に出ると一言メッセージが再生されたあとに勝手に切られる。
なお電話に出ずに拒否すると何度もかかってくる。この辺は endTime パラメータとかで調整する感じ。

@kawaz
Copy link
Author

kawaz commented Feb 6, 2019

電話にでるのを拒否すると何度もかかってくるやつ、拒否されたらリトライしないのがベストだが出来るのかな?要調査。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment