【LINE】Messaging APIで天気予報を教えてくれるbotを作ってみた【案外簡単】(途中)

プログラミング

えんつかです!
勉強を兼ねて、APIを使って簡単なアプリ作成してみました。
作ってみたものは、天気予報のデータをLINEに通知するアプリです。
ただし、作成途中で終了としました。時間制限を設けてサクサク色々作成してみたいと思ったからです。

せっかくなので、作成方法をざっくり残して、これから作成してみたい方の参考になればです!
では、どうぞ!

【LINE】Messaging API で天気予報を教えてくれるbotを作ってみた【案外簡単】

全体像ですが、以下のAPIとPHPを利用して、作成してみました。

天気予報のデータを「Open Weather Map」から取得して、それをPHPでプッシュ通知する様にデータを加工して、「LINE Messaging API」を利用してプッシュ送信する仕組みです。

Open Weather Mapのデータ取得

まずOpen Weather Mapからです。

  1. アカウントを準備
  2. 料金プランのBasicで無料プランを登録
  3. 「GET 5day / 3hour forecast data」を選択(無料)
  4. 通信テストでCHECK☆
  5. コードスニペットPHP(cURL)が利用可能
  6. 得られるデータはその下のJSON形式

以上!笑…は流石にちょちょちょとなるので、
参考に天気予報API取得したコード貼っときますね。
と言っても、ほぼそのままなんですけどね。

JSONで返ってくるのでPHPで取り扱う為にデコードしてあげました。


<?php

        // 天気予報API取得
        $curl_weather = curl_init();
        curl_setopt_array($curl_weather, array(
            CURLOPT_URL => "https://community-open-weather-map.p.rapidapi.com/forecast?q=お好みの地域,jp&units=metric&lang=jp&cnt=8",
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_ENCODING => "",
            CURLOPT_MAXREDIRS => 10,
            CURLOPT_TIMEOUT => 30,
            CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
            CURLOPT_CUSTOMREQUEST => "GET",
            CURLOPT_HTTPHEADER => array(
                "x-rapidapi-host: community-open-weather-map.p.rapidapi.com",
                "x-rapidapi-key: こちらは各個人それぞれ"
            ),
        ));

        $response = curl_exec($curl_weather);
        $err = curl_error($curl_weather);
        curl_close($curl_weather);

        if ($err) {
            echo "cURL Error #:" . $err;
        } else {
            echo 'Success';
            $decoded = json_decode($response, true);
        }

?>

続いてはこちら

LINE Messaging APIの設定

こんな感じ

  1. LINE Developersにログイン
  2. ProvidersでCreate
  3. 作成したProviderの各種設定
  4. 設定完了後、ChannelのBasic settings から Your user ID と Messaging API からChannel access token (long-lived)を取得
  5. コードに埋め込み
  6. channel の LINEアカウントをQRから登録

以上!笑

コードは以下の感じ


<?php

            // LINE Message API取得・Push送信
            $LINE_PUSH_URL = 'https://api.line.me/v2/bot/message/push';
            $LINE_CHANNEL_ACCESS_TOKEN = 'あなたのアクセストークン';
            $LINE_USER_ID = 'あなたのYour user ID(LINEアカウントのuserIDではなく、basic settingの下にあるものです)';
    
            $header = [
                'Content-Type: application/json',
                'Authorization: Bearer ' . $LINE_CHANNEL_ACCESS_TOKEN
            ];
            
            $post_data[] = ['type' => 'text', 'text' => 'メッセージ'];
            $post = [
                'to' => $LINE_USER_ID,
                'messages' => $post_data
            ];

            $file = './debug.txt';
            file_put_contents($file, json_encode($post, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE), FILE_APPEND);
            file_put_contents($file, PHP_EOL.PHP_EOL, FILE_APPEND);
    
            $exec_mode = false;
    
            if ($exec_mode) {
                $curl_line = curl_init(); //cURLセッション初期化
                curl_setopt_array($curl_line, array( //オプション設定
                    CURLOPT_HTTPHEADER => $header, //HTTPヘッダフィールド
                    CURLOPT_URL => $LINE_PUSH_URL, //取得するURL
                    CURLOPT_CUSTOMREQUEST => 'POST', //HTTPリクエスト
                    CURLOPT_POST => true, //trueでHTTP POSTを行う
                    CURLOPT_RETURNTRANSFER => true, //trueでcurl_exec()の返り値を文字列で返す
                    CURLOPT_POSTFIELDS => json_encode($post), //HTTP POSTで送信する全てのデータ
                ));
                $result = curl_exec($curl_line); //転送実行
                curl_close($curl_line); //セッション終了
            } else {
                $post_content = stream_context_create(array(
                    'http' => array(
                        'method' => 'POST',
                        'header' => implode("\r\n", $header),
                        'context' => json_encode($post),
                        'ignore_erors' => true
                    )
                ));
            }
            
            $file = './result.txt';
            file_put_contents($file, $result, FILE_APPEND);
            file_put_contents($file, PHP_EOL.PHP_EOL, FILE_APPEND); 

?>

debug.txt と result.txt は API通信のデバッグ様にあります。エラーや出力がこちらで確認できます。

以上!

これで、作成したページを読み込むと、「メッセージ」の部分がLINEアカウントから送信されます!

Open Weather Mapから受け取ったJSONをいい感じに調理して、それをLINEのメッセージ部分に代入できる様にしてあげればできます!

なお、私が試した限りでは、LINEアカウントからPUSH送信できるメッセージ量もに限りがある様に感じたので、その部分は試したり調べたりしてお好み合わせてご利用ください!

また、今回はここで終了としましたが、欲を言えばHerokuを用いてウェブページを無料でホスティングして、そのURLをLINE developersに登録できる様なので、登録して、自動で読み込んで定期的に天気予報を教えてくれる様にしても良かったかもです!

今度は簡単なゲーム作ってみようと思ってます!
MDNが言うにはJavaScript初級〜中級位のレベル感とか。
公式が言うなら素直に信じてやてみよぉっと!

以上!