見出し画像

C#で出●館インセンティブ情報を通知するbot作ってみた④

押忍!お久しぶりです

某youtuberの登場キャラでおなじみ残心ニキこと「鎖骨打ちのサトJ」です!

前の記事

の続きです。

ついに90キロ超えてしまいました、、

ついでに応用情報バックれましたw

バックれた理由の一つは勉強不足なんですがもう一つが試験会場が遠すぎたんですね

2022年の応用情報の申込時には試験会場選べなかったんですね。

自分東京よりの埼玉に住んでいるので、会場によっては都内のほうが近く、埼玉県だと大宮になるのかなと思ってたのですが大宮も若干遠いです。

しかし、自分が受ける会場は大宮の更に先で電車で約2時間近くかかるところでした

試験集合が朝の9時くらいなので7時前にはもう家でてないと行けない感じでした。

根っからの夜型にはきつすぎて会場見た瞬間受けるの辞めるの決めましたw

今日のテーマは前々回の記事のフローチャートのこの部分


の解説です

ネタが薄いんでまとめていっちゃいます

■取得した情報を加工し、通知メッセージを作成

ここは前回のスクレイピングして取得した情報を加工して文字列作成するだけです。

文字列作成にはStringbuilderを使います。

var stringBuilder = new StringBuilder();

別にstring変数使って+=で足してもいいですが自分は文字列生成はStringBuilderを使ってます。

理由としては

  • 速度向上

  • メモリ使用量の削減

です。

また、改行いれるときとかはAppendLine使えば勝手に入れてくれるんで楽です。

なお、取得したスクレイピングデータは以下のような形式で格納してます。

Dictionary<string, Dictionary<string, string>> map;
///{[市区町村],{[時間],[倍率]}}

このDictionaryをループさせて作成します。

var stringBuilder = new StringBuilder();
stringBuilder.AppendLine();
stringBuilder.AppendLine(targetDate.ToString("MM/dd") + "のインセンティブ情報");
stringBuilder.AppendLine();
foreach (var (address, incentive) in map)
{
    stringBuilder.AppendLine(address);
    foreach (var (time, magnification) in incentive)
    {
        //1.1倍以上の時間帯だけ抽出する
        if (double.TryParse(magnification, out double val) && val > 1.0)
        {
			stringBuilder.AppendLine($"{time}:{val}");
        }
    }
    stringBuilder.AppendLine();
}


■LineNotifyでLineに通知する。

上の項目で作った文章を自分のLineに通知します。

そもそもLineNotifyってなんぞやって方は以下のリンクで確認してください。

LINE Notify(ラインノティファイ)とは、LINEと外部のWebサービスやアプリを連携し、ユーザーがカスタマイズされた好みの情報を受け取ることができる機能。

https://lme.jp/media/system/notify/

この機能を使ってLineに通知するのですがちょっと設定が必要です。

設定手順は以下のリンクを参考にしてみてください

上記手順で発行したトークンを利用してLine通知します。

using var client = new HttpClient();
var content = new FormUrlEncodedContent(new Dictionary<string, string> { { "message", message } });
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AccessToken);
await client.PostAsync("https://notify-api.line.me/api/notify", content);

HttpClientを使ってPostリクエストを出す感じになります。

業務で使っている環境は少し古い.net frameworkなので HttpWebRequestを使っているのをよく見かけますが.net6では非推奨なようです。

またHttpClientを利用したHttp通信メソッドは非同期通信なんでasync awaitTaskを使う必要があります。

上記コードは関数化してるのですが、その場合呼び出し元でもawaitを書く必要があります。

awaitを書かないと実行されません。

くれぐれもTask.wait()で実行させないように

■終わりに

いかがだったでしょうか?

一応これでコード自体の説明は終わりになります。

次回はいよいよ最終回で有料記事で全コード載せたやつを出そうと思っていたのですが

その前に

インフラ、クラウドど素人がAWS EC2でバッチサーバを作ってみた

を番外編として書こうかなって思ってます。


この記事が気に入ったらサポートをしてみませんか?