朝AM7:00に名古屋の降水確率を知らせるLine Bot

Bonjour!!

 

 

いつも妻が家を出る前に今日は傘がいるかどうかを聞いてきます。

いちいちそこで天気予報を見るのも面倒なので、Line Botを使って

その日に傘が必要かどうかを教えてくれるものを作ろうと思いました。

 

 

●Line Message APIの登録

調べるといろいろとやり方を記載しているサイトが出てくるので割愛します。

Line Developperのサイトが確実です。

https://www.microsoft.com/ja-jp/microsoft-365/microsoft-teams/free?rtc=1

 

 

 

 

●レンタルサーバーを用意する

僕はもともとこのサイトを作るにあたってスターサーバーを契約していたので、

これを利用することにしました。

世間的にはGoogle Apps Script(GAS)やherokuを使った開発をしているのが多い印象でした。

GASを使う場合はJavaScriptを使用します。

 

 

 

●PHPを書く

スターサーバーで動く言語はいくつかあるみたいですが、

サーバーサイドで動かすのはPHPが一般的なので、今回PHPで書いてみました。

ちなみにPHPは全くわからないといったレベルです。

 

 

Line Bot開発は対話形式(ユーザーの入力に対してオウム返しなど)は結構情報が出てくるんですけど、

今回のような一方的な通知はそこまで情報が多くないいんしょうでした。

今回参考にさせてもらったサイトはこちらです。

https://okinotori.net/archives/369

 

 

今回作るプログラムの流れは以下の通りです。

 

・気象庁のサイトから名古屋の降水確率の情報をとる

→phpQueryを利用して、気象庁の天気予報の名古屋のページからスクレイピングをして

降水確率を取得

 

 

・それぞれの時間帯から一番降水確率の高いものを判断する

→取得した降水確率は文字列なので、数値に変換し、ループで最高値を更新

最高値によって出力する文字列を条件分岐で変えていく

 

 

Line Botで情報を通知する

 

 

 

完成したコードはこちらです

  1. #!/usr/bin/php
  2. <?php
  3. require_once(‘phpQuery-onefile.php’);
  4. $channelToken = ‘ ’; //アクセストークン
  5. $headers = [
  6.     ‘Authorization: Bearer ‘ . $channelToken,
  7.     ‘Content-Type: application/json; charset=utf-8’,
  8. ];
  9. //気象庁愛知県の天気予報サイト
  10. $html = file_get_contents(“https://www.jma.go.jp/jp/yoho/329.html”);
  11. //降水確率の文字列を取得
  12. $rain_day[0] = phpQuery::newDocument($html)->find(“#base”)->find(“#main”)->find(“div”)->find(“#forecasttablefont”)->find(“td.rain:eq(0)”)->find(“div”)->find(“table”)->find(“td:eq(3)”)->text();
  13. $rain_day[1] = phpQuery::newDocument($html)->find(“#base”)->find(“#main”)->find(“div”)->find(“#forecasttablefont”)->find(“td.rain:eq(0)”)->find(“div”)->find(“table”)->find(“td:eq(5)”)->text();
  14. $rain_day[2] = phpQuery::newDocument($html)->find(“#base”)->find(“#main”)->find(“div”)->find(“#forecasttablefont”)->find(“td.rain:eq(0)”)->find(“div”)->find(“table”)->find(“td:eq(7)”)->text();
  15. //6-12
  16. //12-18
  17. //18-24
  18. //降水確率を数値に変換用変数
  19. $rain_int[0] = 0;
  20. $rain_int[1] = 0;
  21. $rain_int[2] = 0;
  22. //一日の最高降水確率用変数
  23. $highest_value = 0;
  24. //時間帯判別用変数
  25. $timeFlame = 0;
  26. $tx_time = “”;
  27. for($i = 0 ; $i < 3 ; $i++){
  28.     //文字列から%を取り除く
  29.     $word = rtrim($rain_day[0], “%”);
  30.     //文字列が–の場合0を代入
  31.     if(strcmp(“–” , $word ) == 1){
  32.         $rain_int[$i] = 0;
  33.     }else{
  34.     //$wordを数値に型変換して代入
  35.         $rain_int[$i] = intval($word);
  36.     }
  37.     //最高降水確率より高い場合は更新
  38.     if($highest_value < $rain_int[$i]){
  39.         $highest_value = $rain_int[$i];
  40.         $timeFlame = $i;
  41.     }
  42. }
  43. //時間帯の文字列を代入
  44. switch($timeFlame){
  45.     case 0;
  46.         $tx_time = “6時-12時”;
  47.         break;
  48.     case 1:
  49.         $tx_time = “12時-18時”;
  50.         break;
  51.     case 2:
  52.         $tx_time = “18時-24時”;
  53.         break;
  54.     default :
  55.         break;
  56. }
  57. //最高降水確率が0〜20%の場合
  58. //最高降水確率が30%〜60%の場合
  59. //最高降水確率が70%〜の場合
  60. if($highest_value >= 0 && $highest_value < 30){
  61.     $text = “今日は傘はいらないと思います!\n本日の最高降水確率は\n” . $tx_time . “ ” . $highest_value . “%”;
  62. }else if($highest_value >= 30 && $highest_value < 70){
  63.     $text = “今日は折り畳み傘があるといいかもしれません!\n本日の最高降水確率は\n” . $tx_time . “ ” . $highest_value . “%”;
  64. }else{
  65.     $text = “今日は傘を持っていきましょう!\n本日の最高降水確率は\n” . $tx_time . “ ” . $highest_value . “%”;
  66. }
  67. //$text = ‘test2’; //メッセージテキスト
  68. $post = [
  69.     ‘messages’ => [
  70.         [
  71.             ‘type’ => ‘text’,
  72.             ‘text’ => $text,
  73.         ],
  74.     ],
  75. ];
  76. $post = json_encode($post);
  77. $ch = curl_init(‘https://api.line.me/v2/bot/message/broadcast’); //一斉送信
  78. $options = [
  79.     CURLOPT_CUSTOMREQUEST => ‘POST’,
  80.     CURLOPT_HTTPHEADER => $headers,
  81.     CURLOPT_RETURNTRANSFER => true,
  82.     CURLOPT_BINARYTRANSFER => true,
  83.     CURLOPT_HEADER => true,
  84.     CURLOPT_POSTFIELDS => $post,
  85. ];
  86. curl_setopt_array($ch, $options);
  87. $result = curl_exec($ch);
  88. $errno = curl_errno($ch);
  89. if ($errno) {
  90.     return;
  91. }
  92. $info = curl_getinfo($ch);
  93. $httpStatus = $info[‘http_code’]; //200なら成功
  94. $responseHeaderSize = $info[‘header_size’];
  95. $body = substr($result, $responseHeaderSize); //エラーメッセージ等
  96. echo $httpStatus . ‘_’ . $body; //ログ出力
  97. ?>

 

このphpファイルをサーバーに置き、

Cron設定で毎AM7:00に実行する設定をします。

プログラム冒頭の「#!/usr/bin/php」をつけないとうまく動いてくれない

用なので、注意してください。

 

 

 

 

 

ちゃんとラインが来るようになりました。

 

 

 

ちなみに地域は名古屋だけですが、以下から友達になってもらうと

毎朝お知らせします。

https://lin.ee/7F3P6wC

 

 

 

 

やるかどうかはわからないですけど。

最初にユーザーと地域をデータベースに登録して、

ユーザーごとで天気予報の地域を変えるとかもできそうです。

 

 

それではAu revoir!!