やってみた理由

なんか正月ヒマだったのでかきぞめとしてプログラムを作りたかった。
あとAzure Functionsも使ってみたかった。

作るもの

毎朝決まった時間にYahoo占いのサイトにアクセスして、自分の星座の占い結果をメール通知してくれるシステム

構成

全体的な制御 -> Integromatで作る
htmlをパースするAPI -> Azure Functionsで実装

Integromatって何よ?って人はこちらを参考いただければ

作ったもの(Azure Functions側)

下記のようにhtmlとxpathの配列を受け取って、xpathに対応する値の取得結果を返すwebAPIを作った。
自分しか使わないのでエラー処理とかはなし。

リクエストのjsonデータサンプル
{
   "html": "<html><body><div id=\"a\">val</div></body></html>",
   "xpathes": 
    [
        "//*[@id=\"a\"]",
        "//*[@id=\"lnk02\"]/div/div/div/div/div/div[1]/div/div/p"
    ]
}
レスポンスのjsonデータサンプル
{
    "Values":["val"]
}

実装コードは以下。HtmlAgilityPackというパッケージを使用。
Azure FunctionsでNuGetパッケージを使用するやり方はここを参考にした。

run.csx
using System.Net;
using System.Xml;
using HtmlAgilityPack;

public class XPathResponse
{
    public string[] Values;
}

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log)
{
    dynamic data = await req.Content.ReadAsAsync<object>();
    string html = data.html;
    var xpathes = data.xpathes;

    var htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(html);
    List<string> list = new List<string>();

    foreach(string xpath in xpathes)
    {
        var doc = htmlDoc.DocumentNode.SelectSingleNode(xpath);
        if(doc != null)
        {
           list.Add(doc.InnerHtml);
        }
        log.Info(xpath);
    }
    XPathResponse resp = new XPathResponse();
    resp.Values = list.ToArray();

    return req.CreateResponse(HttpStatusCode.OK, resp);
}

作ったもの(Integromat側)

簡単なシナリオを作成。
スクリーンショット 2018-01-01 21.32.36.png

シナリオのスクショだけ貼ってもわけわからんのでざっと説明すると

毎朝特定の時間になったら発火して、Yahoo占いのサイトにアクセスして、その日の占いのhtmlページを取得。

取得したhtmlデータと、解析用XPathでjsonデータを作って、先程のAzure Functionsで作ったAPIに投げる。

APIからのレスポンスデータを本文とタイトルにして、Gmailでメール送信。

これだけ。
本当はGoogle Homeに喋らせようと思ったけどデフォルトで占い機能がついてた(「今日の運勢は?」って聞いたら答えてくれた)のでやめた。

感想

サーバーやら何やら考えずにAPI作れるAzure Functionsは偉大。
全体制御はIntegromatでやって、コード書かなきゃいけない所はAzure Functionsでやるっていう構成でいけば柔軟に対応できる。
Logic AppとAzure Functionsの組み合わせがMicrosoft的には王道なんだろうけどLogic Appはまだ使ったことないから今度触ってみたいと思う。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.