スマートフォンへの着信をSkypeに通知

**当記事の内容は2019年10月30日までしか使えない可能性が高いです。**

**記事が陳腐化する前に本記事が完成しない可能性があるため、作成途中での公開です。**

　職場に個人携帯（スマートフォン）を持ち込めない場合、家族や友人等からのプライベートな電話には一切気づけない。これでは急な合コンのお誘いがあっても機会損失となってしまうリアルの生活が充実している方々もいるかと思う。短期な作業場所だといちいち外線番号も教えてられない。でもなぜか業務でSkypeを使っている。
　そんな環境で個人携帯に着信があったことを知る手段を構築する。
　当初、IFTTTでサクッと作るナリなんて思っていたら、IFTTTでSkypeが使えなくなっていて（2019年10月現在）苦労するハメになった。

# 材料
- IFTTT（https://ifttt.com/）
- IFTTT アプリ
- Integromat（https://www.integromat.com/）
- Microsoft Azure（https://portal.azure.com/）
- 他の電話（動作確認用）

それぞれのサービスへの登録については割愛する。
Azureで使用するMicrosoftアカウントとSkypeのアカウントは同じになるため、通知したいSkypeアカウントが別の場合は、Azure用アカウントと通知してくれるBOTと通知したいアカウントをグループチャットに参加させる形となる。
今回のために無料期間が切れて放置していたAzureのアカウントを従量課金プランにアップグレードした。ただし課金はされないはず。（自己責任）


# 作り方
## Integromat（その１）
IFTTTではできないことをやってのける素晴らしいサービス。
日本語対応して頂きたい。

ここではMicrosoft Azureに登録するBOTにあたるWebhookを作成する。

### シナリオ作成
左メニューの [Scenarios] を選択して右上の [+Create a new scenario] をクリック。
次に表示される検索画面は使ってもいいが使わなくてもあまり変わらないので [Skip] をクリック。
表示されている大きい「？」アイコンをクリックすると大量のアイテムが表示される。検索エリアにカーソルがあるのでそのまま"webhooks"と入力して絞り込む。
絞り込まれて表示されている [Webhooks] を選択すると、さらにいくつかアイテムが表示されるため、[Custom webhook] を選択する。
表示されるダイアログの [Add] をクリックし、さらに表示されたダイアログでwebhookの名前を決める。こだわりがない場合はそのまま [Save] する。
※ここで決めた名前は、本件とは別のシナリオでwebhookを作成する際に選択肢として表示されるため、何用のwebhookかが分かる名前にしておくといい。
[Save] すると決定したwebhook名が入力された状態となり、その下に青い文字でURLが表示されるとともにアクセス待ち状態となる。[Copy address to clipboard] をクリックしてクリップボードにコピーし、webhookの宛先として使用するためテキストファイル等に大事に保存する。
そしてそのままブラウザの別のタブ等でアドレスに貼り付けてアクセスしておく。そうするとシナリオ作成画面ではアクセス待ち状態が解除される。
[OK] を押し、この状態でシナリオを保存する。左上にデフォルトのシナリオ名が表示されているので用途にあった"Incoming call notification"とにでも変更し、下のセーブアイコンで保存する。

## IFTTT
IFTTTサイトへのサービス登録は終わっている前提で、アプリをインストールしておく。
### アプレット作成
PCのブラウザ操作で作業を進める。
アプレット（"レシピ"から呼び名が変わった？）の作り方がわかりにくくなってて少し躓いた。
画面上部にあるSearchから"Android"を検索。遷移した検索結果画面で [Services] を選択し、検索結果から「Android Phone Call」を選択する。遷移した画面で [Connect] をクリックする。

画面右上の [Explore] をクリックし、表示された画面の検索ボックス下の「Make your own Applets from scratch.」右の [+] をクリック。
遷移した画面の "+This" 部分をクリックし、表示された「1 of 6」画面から [Android Phone Call] を選択する。
次の「2 of 6」画面で [Any phone call missed] を選択。
次画面の "+That" 部分をクリックし、表示された「3 of 6」画面から [Webhooks] を選択する。
次の「4 of 6」画面で表示された [Make a web request] を選択。
次の「5 of 6」画面で以下のように入力/選択する。
・URL：Integromatで作成したwebhookのアドレス
・Method：POST
・Content Type：application/json
・Body：{"from_number":"{{FromNumber}}","contact_name":"{{ContactName}}","time":"{{OccurredAt}}"}
　※"from_number"、"contact_name"、"time"は任意の名前でよい。最後にSkypeに渡す部分で名前を合わせれば問題ない。
入力が終わったら [Create Action] をクリック。
次の「6 of 6」画面で [Finish] をクリック。
※通知するかを訪ねる [Receive notifications from this Applet runs] はOFFにしておいたほうがいいかも。

## Integromat（その２）
再びIntegromatに戻り、動作確認を行う。

まずは家の電話なり他の人の携帯なりを拝借してくる。
作成していたシナリオを開き、適当に画面内を一度クリックする。
すると [Run once] ボタンが表示されるのでクリックすると待ち状態となる。

準備していた他の電話から自分のスマホに電話する。
初回はスマホのIFTTTがアクセス許可を求めてくるため許可をする。（電話帳へのアクセス許可は一瞬躊躇する）
電話に出ないまま数回コール後に切断する。
うまくいけばIntegromatの画面が反応する。Webhooksアイコンの右上あたりに「1」が表示され、IFTTTから受け取った情報の内容が確認できる。
手順通りだと電話番号、電話帳の発信者名、時刻が取得できているはず。
IFTTTが反応してくれない場合があり、その場合は何度かやってみる。URLさえ合っていればエラーなりなんなり反応するはず。
※実運用でも特に変わりはないのでIFTTTの動作には不安があるかも知れない。

## Microsoft Azure
Integromatで作成したWebhooksをBOTとして登録する。

portalの [すべてのサービス] メニューを選択し、上部の検索ボックスで "bot" を検索する。
表示された [Bot Service] を選択し、次画面上部の [+追加] をクリックして表示される [Bot Channels Registration] を選択する。
[作成] をクリックし、表示されるボットチャンネル登録画面に下記のように入力/選択する。
・ボット ハンドル：誰とも重複しないユニークな名前
・サブスクリプション：契約中のもの
・リソース グループ：既存もしくは適当なものを新規作成
・場所：住んでいる場所に近いリージョン
・価格レベル：F0（大事！）
・メッセージング エンドポイント：Integromatで作成したwebhookのアドレス
・Application Insights：オフ
入力が終わったら [作成] をクリック。

作成完了後に表示される [リソースに移動] をクリックするか自分で、作成したリソースの画面に移動する。
リソースの [設定] 画面に移動し、「Microsoft App ID」横の [管理] をクリックする。
※表示されている文字列がIDだが選択できないためコピーが容易ではないので後回しにする。
表示された「証明書とシークレット」画面で [+新しいクライアント シークレット] をクリックする。
説明を記入（任意）し、有効期限（とりあえず１年とか）を選択して、[追加] をクリック。
資格情報の更新が実行された後、「クライアント シークレット」に新しい行が追加される。
値の右にあるコピーアイコンで内容をコピーし、テキストファイル等にパスワードとして保存する。
[概要] 画面（[管理] 画面の [概要]）に移動し、「アプリケーション (クライアント) ID」部分に表示されている文字列の右のコピーアイコンで内容をコピーし、テキストファイル等にIDとして保存する。

ボット管理の [チャンネル] 画面に移動し、Skypeアイコンをクリックする。
[Skype を構成] 画面に遷移するので、各設定をする。

・Web Control
　変更なし
・メッセージング
　変更なし
・通話
　変更なし
・グループ
　[グループへの追加を有効にする] に変更
・公開
　変更なし

[保存] をクリックし、サービス条件の同意ダイアログが表示されるのでチェックして [Agree] をクリック。
保存後、チャンネル画面に戻り、一覧に追加された [Skype] の文字をクリック。
SkypeへのBOT追加画面が表示されるので [Add to Contacts] をクリック。Skypeの連絡先にBOTが追加される。

## Skype
追加されたBOTを入れたグループを作成する。
Integromatへの登録時に使用するConversations Idを確認するための準備として、作成したグループに適当でわかりやすいメッセージを送る。
Skypeのサイト（https://secure.skype.com/ja/data-export）からチャット履歴のエクスポートを行う。
少し経つとSkypeにエクスポートが完了した旨の通知が来るので、先のSkypeサイトからダウンロードを行う。
ダウンロードしたzipファイルを解凍し、中のjsonファイルをエディタで開く。
改行のない見づらいデータであるため、カンマを改行に置換して見やすい形にする。
先にグループに送った適当でわかりやすいメッセージを見つけ、付近にある "conversationid":"～@thread.skype" 部分を見つける。"～@thread.skype" 部分をConversation Idとしてテキストファイルにでも保存しておく。

## Integromat（その３）
再びIntegromatに戻り、Skypeへの投稿部分を追加する。

作成していたシナリオを開き、適当に画面内を一度クリックする。
作成したwebhookの右側の [+] をクリックし、skypeを検索するなどして [Skype] を選択する。
さらに [Send a message] が表示されるので選択する。
[Add] ボタンをクリックし、表示されるダイアログの [Connection name] をそのまま/修正し、[Microsoft App ID]、[Password] にAzure設定時に保存していたID/Passwordを入力する。
[Conversation Id] に先ほどのSkypeのチャット履歴から割り出したIDを入力する。
[Text] には、通知内容の固定文言をつけたければ "携帯電話に着信がありました." 等を入力し、その後に隣の吹き出し内にあるIFTTTから連携された項目をドラッグして並べる。
※吹き出し内に [from_number] 等の青い文字が見当たらない場合は、キャンセルで閉じた後にWebhooksアイコンを右クリックして [Run this module only] で再度IFTTTからメッセージを受け取ればSkype追加時に吹き出しに青いアイテムが表示される（はず）。
[Text format] には [Plain text] を選択する。
設定が終わったら [OK] をクリックして編集を終える。
[Run once] を実行し、他の電話から電話をかけて動作確認をする。無事Skypeのグループチャットにメッセージが飛んできたら完成。
下方の [Save] ボタンでセーブしてシナリオ一覧を表示し、雷マークの隣のスイッチがONとなっていることを確認すれば全て完了となる。

# その他
- 着信イベントがIntegromatまで届かない場合があった。自分のスマホが悪いのかIFTTTが悪いのか。巷ではIFTTTが取りこぼすことがある記事もいくつか見かける。
- 冒頭にも書いたが、Azureのチャンネル構成でSkypeへの新しいボット登録が2019年10月31日以降はできなくなるため、本記事の内容は使い物にならなくなる可能性が高い。