なか日記

一度きりの人生、楽しく生きよう。

C#とAzureでPVをつぶやくBotを作ってみよう -番外編1  Azure WebJobsを使う-

この前まで書いた一連の記事では、BotがつぶやくトリガーをWeb APIを使って実装していました。

今回は番外編ということで、Azure WebJobsを使った実装を紹介します*1

目次

第4回までは同じことをしますので、必要に応じて過去記事を参照して下さい。

はじめに
第1回 Google Analytics APIの利用準備
第2回 Google AnalyticsからPVを取得する
第3回 Twitter APIの利用準備
第4回 Twitterに投稿する
番外編1  Azure WebJobsを使う

Ⅰ.環境確認

Microsoft Azure SDK for .NET がインストールされている必要があります。

インストールされているかどうかは Web Platform Installer で確認できます。

f:id:nakaji999:20150710003822p:plain

Web Platform Installerをインストールしていない場合は下記サイトからダウンロードできます。

Ⅱ.Azure WebJobの作成

1.Azure WebJobプロジェクトの追加

まず最初にAzure WebJobプロジェクトを追加します。

f:id:nakaji999:20150710002736p:plain

2.参照の追加

TweetPVプロジェクトを参照に追加します。

3.P12キーファイルの配置

Google Analytics の P12キーファイルを、プロジェクトの直下にコピーします。

ファイルのプロパティにある「出力ディレクトリにコピー」にて、「新しい場合はコピーする」もしくは「常にコピー」に変更するのも忘れずに。

4.App.configの編集

第2回、第4回で app.config に設定した内容を web.config に追加します。

<configuration>
  <appSettings>
    <add key="analyticsKeyFile" value="xxxxx.p12"/>
    <add key="analyticsCredentialId" value="xxxxx@developer.gserviceaccount.com"/>
    <add key="analyticsViewId" value="99999999"/>

    <add key="consumerKey" value="xxxxxxxxxx"/>
    <add key="consumerSecret" value="xxxxxxxxxx"/>
    <add key="accessToken" value="xxxxxxxxxx-xxxxxxxxxx"/>
    <add key="accessTokenSecret" value="xxxxxxxxxx"/>

P12キーファイルの指定(analyticsKeyFile)ですが、実行ファイルと同じパスにデプロイされるのでファイル名のみ指定しています。

5.Program.csの編集

テンプレートから作成された Program.cs を編集します。

Program.cs を開くと、以下のように JobHost のインスタンスを生成して RunAndBlock() しています。

    static void Main()
    {
        var host = new JobHost();
        // The following code ensures that the WebJob will be running continuously
        host.RunAndBlock();
    }

このプログラムを常駐させておき、キューメッセージを受信したときに対応するメソッドを実行するといったことを行う為のもので、今回の用途では使用しなくていいのでばっさり削除します。

興味がある人は以下の情報とか見るといいと思います。

そんなこんなで以下のようなコードになります。

class Program
{
    static void Main()
    {
        var file = ConfigurationManager.AppSettings["analyticsKeyFile"];
        var helper = new AnalyticsHelper(file);

        var pv = helper.GetPvAsync().Result;
        var message = string.Format("昨日のなか日記のPVは{0}でしたyo https://nakaji.hatenablog.com/ ", pv);
        TwitterHelper.UpdateStatusAsync(message).Wait();
    }
}

Ⅲ.動作確認

Azureにデプロイする前に動作確認してみましょう。

実行するとコンソールが起動してプログラムが実行されます。コンソールアプリケーションと同じですね。

Ⅳ.Web Appの作成と設定

Azureへのデプロイを行う前に、Web Appの作成と設定を行っておきます。やることは C#とAzureでPVをつぶやくBotを作ってみよう -最終回 Azureへのデプロイ- - なか日記と全く同じです。

1.Azureポータルにログイン

新しいAzureポータルにログインします。

f:id:nakaji999:20150702034344p:plain

2.新しいWeb Appの作成と設定

画面左上の「新規」ボタンを押すと、作成する機能の一覧が表示されますので「Web + モバイル」-「Web App」を選択します。

f:id:nakaji999:20150702040027p:plain

Web Appの作成画面では適当にURLを指定します。

App Serviceプラン、リソースプランも適当に、価格レベルは一番安いB1 Basicを選択します。Google Analytics APIを使用する為にはB1以上である必要があります。

指定が終わったらWeb Appを作成しましょう。

作成が完了したら下のような画面になります。

f:id:nakaji999:20150702041624p:plain

3.Web アプリの設定

設定アイコンから、「アプリケーション設定」を選択し、「アプリ設定」に以下の値を追加します。Google Analytics APIを使用する(証明書を使用する)為に必要で、この設定が有効になるのは価格レベルがB1以上である必要があるということのようです*2

WEBSITE_LOAD_USER_PROFILE 1

f:id:nakaji999:20150703022729p:plain

Ⅳ.Azureへの発行

1.発行ウィザードの起動

Azureに発行するにはWeb Jobプロジェクトの右クリックメニューから、「Azure WebJobとして発行する」を選択します。

f:id:nakaji999:20150710020310p:plain

2.実行タイミングの指定

初回だけ、Azure上にWebJobを作成するための設定画面が出てきますので、ここで定期実行の設定を行いましょう。

後からAzureポータールで変更もできますので、大体でいいと思います。

f:id:nakaji999:20150710020321p:plain

3.発行ウィザードに従う

発行先は「Microsoft Azure Web Apps」にしましょう。

f:id:nakaji999:20150710020339p:plain

デプロイするWeb Appsを選択します。

f:id:nakaji999:20150710020503p:plain

発行に必要な設定は勝手にAzure上から取得してくれます。楽ちんですね。

f:id:nakaji999:20150710020508p:plain

発行が完了したら、「Web App was published successfully http://tweetpvsample.azurewebsites.net/」といったメッセージが出力されます。

f:id:nakaji999:20150710020513p:plain

Ⅴ.動作確認

あとは指定した時間になるのを待つのみです。が、ちゃんと実行できるか気になる人は手動でWeb Jobを実行してみましょう。

新ポータルから、デプロイしたWeb Appsを開きます。そこから、「設定」→「Web ジョブ」で表示されたWeb Jobを右クリックして下さい。「実行」というメニューが出てくるのでそれをポチッとします。

f:id:nakaji999:20150710022534p:plain

おまけ:スケジュールの変更方法

旧ポータルの方から変更出来ます。新ポータルにはまだ実装されてないように思いますが、詳しいことはしばやん先生に聞いてみて下さい。

スケジューラ」から「ジョブコレクション」を指定して、「ジョブ」タブを表示します。

f:id:nakaji999:20150710023400p:plain

f:id:nakaji999:20150710023551p:plain

ただ、この画面では30分単位でしか時刻指定できません。

もっと細かい時刻指定を行いたい場合は、PowerShellを使う必要がありますので、以下の記事を参考にしてみて下さい。

*1:「番外編1」としてますが、2以降があるかは不明

*2:詳しいことは「Azure Web サイトで証明書を使う簡単な方法と Web サイトにも Intel CPU が混ざってきた件 - しばやん雑記