Azure Functions と Twilio で マイニンテンドーストアに Nintendo Switch が入荷したら電話がかかってくるようにする。

  • 21
    Like
  • 0
    Comment

概要

マイニンテンドーストア に Nintendo Switch が入荷したら、電話がかかってきてそれを教えてくれる。
というものを作ってみたいと思います(`・ω・´)

Azure Functions と Twilio を使って、サーバレスでさくっと作ってみます。

使用するサービス

使用するソフトウェア

  • Visual Studio 2017 Preview 4.0
  • Azure Function Tools for Visual Studio 2017

流れ

  1. 準備
  2. プロジェクトの作成とNuGetパッケージの追加
  3. コードを書く
  4. Azure Functions へのデプロイと確認
  5. 入荷したら電話が来る!たぶん。

1. 準備

Azure Function Tools for Visual Studio 2017 を使用しますが、
まだ、Preview版のVisual Studio 2017にしか対応していません。

ということで、Visual Studio 2017 Preview 4.0をインストールし、
Azure Function Tools for Visual Studio 2017 をインストールします。
※Preview は Release と共存できます。

また、Azure や Twilio を使えるようにアカウントを取得します。
(ここでは省略します)

また、電話の発信内容を定義した TwiML をどこか適当なサーバに置いておきます。
今回は下記に置きました。
https://www.noraneko.co.jp/voice.xml

2. プロジェクトの作成とNuGetパッケージの追加

1.PNG
プロジェクトの新規作成から、Azure Functions 選択して、新しいプロジェクトを作ります。

2.PNG
NuGet パッケージマネージャーから Twilio を追加し、ついでにデフォルトのパッケージを最新版にします。

3.PNG
プロジェクトに新しい項目として Azure Function を追加します。

4.PNG
どんな Function を作るか確認されるので、TimerTrigger を選択します。
Schedule はデフォルト(5分ごとに実行)のままにしておきます。

これで準備が整いました。

3. コードを書く

ということで、コードを書きます。

using System;
using System.Net;
using System.Text;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Twilio;
using Twilio.Rest.Api.V2010.Account;
using Twilio.Types;

namespace GiveMeSwitch
{
    public static class Function
    {
        [FunctionName("TimerTriggerCSharp")]
        public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, TraceWriter log)
        {
            string htmlData;

            try
            {
                var webClient = new WebClient {Encoding = Encoding.UTF8};
                //マイニンテンドーストアの Switch 販売ページを取得
                htmlData = webClient.DownloadString("https://store.nintendo.co.jp/customize.html");
                webClient.Dispose();
            }
            catch (WebException ecWebException)
            {
                htmlData = "";
                log.Info($"データ取得に失敗しました。{DateTime.UtcNow.AddHours(9)}");
                log.Info(ecWebException.ToString());
            }

            //注文ボタンが無効になっているか確認(SOLD OUTになっているか確認)
            if (htmlData.Contains("btn btn__primary_soldout to_cart") || string.IsNullOrEmpty(htmlData))
            {
                log.Info($"売り切れかエラーでした。{DateTime.UtcNow.AddHours(9)}");
            }
            else
            {
                //Twilioの管理画面で、アカウントSIDと認証トークンを確認可能。
                const string accountSid = "アカウントSID";
                const string authToken = "SIDと認証トークン";

                TwilioClient.Init(accountSid, authToken);

                //発信先の電話番号(自分の電話番号)
                var to = new PhoneNumber("+8190xxxxxxxx");

                //Twilioで購入/設定した電話番号を設定
                var from = new PhoneNumber("+8150xxxxxxxx");

                //電話をかける
                var call = CallResource.Create(
                    to,
                    from,
                    //適当な場所に置いたTwiMLのURL
                    url: new Uri("https://www.noraneko.co.jp/voice.xml"));

                log.Info($"電話をしました!{DateTime.UtcNow.AddHours(9)}");
                log.Info(call.Sid);
            }
        }
    }
}

4. Azure Functions へのデプロイと確認

5.PNG
プロジェクト名を右クリックして 発行 から、Azure Functions へ直接デプロイできます。

6.PNG
App Service を作成します。
作成ボタンを押すと、デプロイまで自動で行われます。

8.PNG
Azure Portal を開くと、先ほどデプロイした Function が追加されています。

9.PNG
有効無効の切り替えや、

10.PNG
設定やテストが可能です。
実際に実行すると、ログに結果が表示されます。

5. 入荷したら電話が来る!たぶん。

11.PNG
入荷されているとき(SOLD OUTではないとき)には、電話がかかってくるハズです(∩´∀`)∩

おわりに

Nintendo Switch が入荷されたら、というか SOLD OUT でなくなったら、電話がかかってくる。
という仕組みが超簡単に作れましたー(∩´∀`)∩わーい

※ここでは5分ごとの確認としてみましたが、あんまり短時間で確認するのはよろしくないと思うので、気を付けてください。