やってみた理由
なんか正月ヒマだったのでかきぞめとしてプログラムを作りたかった。
あとAzure Functionsも使ってみたかった。
作るもの
毎朝決まった時間にYahoo占いのサイトにアクセスして、自分の星座の占い結果をメール通知してくれるシステム
構成
全体的な制御 -> Integromatで作る
htmlをパースするAPI -> Azure Functionsで実装
Integromatって何よ?って人はこちらを参考いただければ
作ったもの(Azure Functions側)
下記のようにhtmlとxpathの配列を受け取って、xpathに対応する値の取得結果を返すwebAPIを作った。
自分しか使わないのでエラー処理とかはなし。
{
"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"
]
}
{
"Values":["val"]
}
実装コードは以下。HtmlAgilityPackというパッケージを使用。
Azure FunctionsでNuGetパッケージを使用するやり方はここを参考にした。
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側)
シナリオのスクショだけ貼ってもわけわからんのでざっと説明すると
①
毎朝特定の時間になったら発火して、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はまだ使ったことないから今度触ってみたいと思う。