よしまさのウェブサイト

LINEで自動投稿BOTを作る

ブログカテゴリー
システムやプログラムのメモ・雑感
投稿日時

急な事情で自習室をお休みにする場合の連絡手段ということで、LINEのAPI BOTに手を出してみた。
LINEで自習室連絡用のグループを作っておき、お休みの際は自動で通知されるという仕組みにする。
仕組み的には、ウェブでお休み通知を作成する⇒自動で同じ文面がLINEグループで送信される、という形。
「別にLINEで直接送ればいいじゃん」という突っ込みもありそうだけど、ウェブとLINEで両方通知するのは面倒だし、ウェブ主導だとLINEの他に先日作成したFacebook APIのグループ通知も使えるし、いまは使ってないTwitterにも通知できるなど、汎用性が高い。

ここまでは前置き。

まぁ作ってみたのはいいけど、なんだか分かりやすい説明が見つからなくて、何だかんだで2時間くらいかかった。
なので、せっかくだからここで手順を整理する。

  • 準備 - LINE Developerで設定
    1. (前提)LINEのアカウントを持っていること、LINEのグループを作成していること。
    2. LINE Developerにログイン
      https://account.line.biz/login?scope=line&redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Flogin%3Fbox%3D%2Fconsole%2F
      ※ 「LINEアカウントでログイン」と「ビジネスアカウントでログイン」の2種類があるが、どちらでもOK。
    3. プロバイダーを作成
    4. 「新規チャネルを作成」に進み、「Messaging APIでチャネル作成する」。
      ※ アプリ名などの色々な入力項目があるので、必要な情報は埋めておく。
    5. チャネルに登録されると以下のようになる。
      LINE プロバイダー設定
    6. 新しく作成したチャネルを選択し、「チャネル基本設定」で以下の設定を行う。
      1. 「アクセストークン」の取得
      2. 「Webhook送信」を「利用する」に設定
      3. 「Webhook URL」を設定
        ※ 自動送信を行うGroup IDを取得するだけなので一時的なURLでOK。ここでは"https://eample.com/webhook.php"とする。
      4. 「Botのグループトーク参加」を「利用する」に設定
        チャネル基本設定
  • コードを書く① - Group IDの取得
    1. LINEはGroup IDを取得するためにWebhookを使うらしい。
      上記6-2で作成したhttps://eample.com/webhook.phpにアクセスするようにプログラムを作成。
    2. webhook.phpに以下のように記述して、webhook.txtにPOSTが保存されるようにする。
      ※ permissionの設定は忘れないように。
      $val = file_get_contents('php://input');
      file_put_contents('./webhook.txt', $val);
      ?>
    3. スマホでLINEを開き、友達としてBOTを登録する(検索すれば出る)。
    4. BOTをグループに登録する。
    5. グループで適当な文字列を送信。
      そうすると、BOTが自動で返信をしてくるはず。
      自動返信
    6. webhook.txtを開くと以下のような形で保存されている。
      {"events":[{"type":"message","replyToken":"d47b865568624528819aaea1ba843fbc","source":{"userId":"xxxxxxxxxxxxxxx","groupId":"yyyyyyyyyyyyyyy","type":"group"},"timestamp":1574502882728,"message":{"type":"text","id":"10966442340315","text":"test"}}],"destination":"U62e619ded53fb854c6716804a41e59df"}
    7. 太字にしたgroupId(ここでは「yyyyyyyyyyyyyyy」にしている)を取得完了。
  • コードを書く② - チャットを送信する。
    1. 実行するプログラムファイルを作成。
    2. 以下の形でソースを作る。
      $access_token = '[準備段階の6-1で取得したアクセストークン]';
      $group_id = '[webhook.txtから取得したgroupId]';
      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/v2/bot/message/push');
      curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Bearer ' .$access_token]);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
      curl_setopt($ch, CURLOPT_POST, TRUE);
      curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['to' => $group_id, 'messages' => [['type' => 'text', 'text' => 'hello world!']]]));
      curl_exec($ch);
      curl_close($ch);
      ?>
    3. 以上で完了。

後はこのソースを使って必要に応じてtextの部分に変数を代入するだけです。
Group IDを取得したことでwebhookは不要になるので、そのあたりは基本設定を書き直してもいいかもしれない。
あと、アクセストークンは時間制限があるので、これは自動延長するAPIを作った方がいいと思う。
まぁ、これについてはまた別の機会に書きます。