LINE Botを作りたい！　～アカウントの作成とボットの設定から、おうむ返しボットを動かすまで～

　LINEボット、面白そうだなあと思って、取りあえずお試し。
　または、ちょこっとお試しするならGoogle Colabが便利って話し。
　あるいは、なでしこさんでLINEボット作れるようにしたいなっていう抱負。

# 準備

　とりあえず、アカウントがないと始まらないですね。日本語だから大丈夫～・・なハズが、まあまあな大騒ぎでした；
　ボットの設定は、項目があちこち飛んでいて分かりずらかったり、後から変更出来るできないがあったので、メモ。

## LINEアカウント
　・・・は、さすがのワタシも持っているので割愛。
　まあ、二週間ほども既読すら付かなくて、「お元気ですか？」と母から葉書が来ちゃったワタシですがΣヽ(ﾟДﾟ; )ﾉ

## ボット用アカウント
　普通のLINEアカウントとは別に必要です。
　だいたいここのとうりに作っていきますです。

https://developers.line.biz/ja/docs/messaging-api/getting-started/

### [LINE Developers](https://developers.line.biz/ja/)コンソールにログインする
　手元にスマホを用意して（重要）普通のLINEアカウントへのログインに利用しているメールアドレスとパスワードでログイン。
　初回は本人確認で4桁の数字が現れるので、スマホのLINEアプリに3分以内に入力して認証する必要があるのですが、これがまた大変よ。
　えっ、スマホどこー？　だの、どこに入れるの？？　だのと大騒ぎ。うっかり普通にメッセージとして送っちゃったりで、一回タイムアウトで失敗したりしながらログイン完了。
　どうも、後から慌ててLINE開いたりしても、なんかPINコードの入力画面が出てないコトがあるっぽくて（？）まごまごしてるうち三分なんて経っちゃう；；；
　あらかじめLINE開いとくくらいの勢いで始めるのが良さげ（ほんとかよ；）

### 開発者として登録する
　名前とメールアドレスを入力して開発者アカウントを作成します。（初回ログイン時のみ）
※後から変更出来ると書いてあるので深く考えず普通に入力する。

### 新規プロバイダーを作成する
　「プロバイダーとは、アプリを提供する組織のことです。ご自分の名前や企業名を入力してください」・・・とゆうことで、bot自体の名前じゃないので深く考えず何かそのように。
※「プロバイダー設定」で後から変更出来ます。
※プロバイダーの削除はチャネルが1個も無い時だけしか出来ません。

## ボットの作成と設定
### チャネルを作成する
　「新規チャネル作成」で、「Messaging API」を選択。
　どうやらチャネルとゆうのがbotのコトで、チャネル名がbotの名前となるもよう。
※「LINE」またはそれに類する文字列をチャネル名に含めることはできません。ラシイ。

#### とりま、必須の項目だけを埋めていく。

- **アプリ名**（botの名前）
- **チャネルの説明**（後で変えられるので適当に）
- **大業種**（選択する）
- **小業種**（選択する）
- **メールアドレス**（普段のメアド。ログイン時のでなくてOK。後で変えられるけど、ちゃんと書く）

※アプリ名の変更は[LINE Official Account Manager](https://manager.line.biz/)で行う。（変更出来るけど、一回変更すると、それから七日間変更出来ない）
※大業種/小業種は業種と言うだけあって、どれ？？？　ってなったけど、「ウェブサービス」/「ウェブサービス(その他)」としておいた。その後「個人」という大業種を発見。
　しかし、これは後から変更は出来ないっぽい！
　変えたい時は、削除してチャネルを作り直すしか無いらしい。
　テストだから別にいいけど。個人でちょこっと何かする分にはさして重要じゃなさげだけど。


### 任意だけどユーザーに表示されるので入れた方が良い情報

- **チャネルアイコン**（任意）
- **プライバシーポリシーURL**（任意）
- **サービス利用規約URL**（任意）

　今はまだいい。
※チャネルアイコンの変更は[LINE Official Account Manager](https://manager.line.biz/)で行う。

### チャネルを確認する
　規約を読んでチェックを入れる（2つ）→「作成」
　出来た！

　[LINE Official Account Manager](https://manager.line.biz/)も確認。
　あった！

### 設定変更
　[LINE Official Account Manager](https://manager.line.biz/)の「応答設定」で

- **応答モード**　→　bot
- **あいさつメッセージ**　→　オフ
- **応答メッセージ**　→　オフ
- **Webhook**　→　オン

※[LINE Developers](https://developers.line.biz/ja/)側の「編集」を押すとジャンプします。
※Webhook重要。
※クイックスタートでは無効にせよとなっているが、挨拶メッセージは友達追加された時のメッセージなので、自前で作らないならオンでも良い。
　普通にメッセージを返すだけなら、「あいさつメッセージ設定」で設定するだけで十分っぽい。

### 秘密鍵
　[LINE Developers](https://developers.line.biz/ja/)で
#### チャネルシークレットメモる
　「チャネル基本設定」→チャネルシークレット（大分下の方にあります）
#### チャネルアクセストークンを発行して、メモる
　「MessagingAPI設定」→チャネルアクセストークン（大分下の方にあります）
　「発行」ボタンを押す。
※種類がありますが、とりあえず（長期）にしておく。
#### Webhookの利用 
　「MessagingAPI設定」→Webhookの利用（真ん中らへんにスイッチがある）
　オンにする（重要）


# おうむ返しのボットを作る（node.js）

　テストとしてとりあえず動く物を作る。
　ま、コードはコピペなんですが。とりあえずのお試しとゆうことで。

## [Google Colab](https://colab.research.google.com/)でやります
　えー、だって、自分とこに環境作るってなったら、構えちゃうじゃない～ｗ
　Googleアカウントがあればすぐ使えて、コマンドをセルにコピペでまるっと貼ってセルごと実行出来るし、ちょこっとお試しする分には超便利です。
　最大十二時間でシャットダウンしてしまいますが、コード自体はGoogleクラウドに記録されていて、次回もちゃんとそのコードを開けます。
　それに、なんと、なでしこさんがインストール出来るんですよ～☆

https://news.mynavi.jp/article/nadeshiko-62/

　ま、今回は、なでしこのナの字もありませんがね・・・

### インストール

　`package.json`を作成し、LINE Messaging APIの公式SDK`line-bot-sdk`と`Express`サーバのを同時にインストールして、トンネリングように`Cloudflared`をインストール。

```
!npm init -y 
!npm i @line/bot-sdk express
!wget https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb
!dpkg -i cloudflared-stable-linux-amd64.deb
```

　まるっとセルにコピーをして、まとめて実行出来ます。べんりー☆

### 名前をつけてコードをファイルに保存。

```Javascript
%%file index.js
"use strict";

const express = require("express");
const line = require("@line/bot-sdk");
const PORT = process.env.PORT || 5000;

const config = {
  channelSecret: "先ほどLINEBotのチャネルトークンを入れる(短い方)", 
  channelAccessToken: "先ほど発行したBOTのチャネルアクセストークンを入れる(長い方)"
};

const app = express();

app.post("/webhook", line.middleware(config), (req, res) => {
  res.status(200).end();//タイムアウトのエラー対策
  console.log(req.body.events);

  Promise.all(req.body.events.map(handleEvent)).then((result) =>
    res.json(result)
  );
});

const client = new line.Client(config);

async function handleEvent(event) {
  if (event.type !== "message" || event.message.type !== "text") {
    return Promise.resolve(null);
  };

  let mes = { type: "text", text: event.message.text };
  return client.replyMessage(event.replyToken, mes);
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);
```
　ご本家のexamplesにも同様のサンプルがありますが、このコードはこちらからお借りしています。

https://qiita.com/inoue2002/items/dcf40d5ebfe2454796fa

　同じような解説ページはいっぱいありましたが、ここは全体的にワタシのようなドシロウトにも分かりやすいです。


### 実行と同時にトンネル。

```
!node index.js & cloudflared tunnel --url localhost:5000
```

　コンソールにURLが出るので、コピーする。

### Webhook URLを設定する
　[LINE Developers](https://developers.line.biz/ja/)→「MessagingAPI設定」→Webhook URL
　「編集」を押して、`https://(さっきのURL)/webhook`として「更新」
　「検証」ボタンを押して、成功と出ればＯＫ。

#### エラーでる時

```
ボットサーバーから200以外のHTTPステータスコードが返されました。(404 Not Found)

LINEプラットフォームから送信されたHTTP POSTリクエストに対してボットサーバーがステータスコード200を返すことを確認してください。
詳しくは、Messaging APIリファレンスのレスポンスを参照してください。
```

　・・・なるエラーが出る時は、大体、チャネルシークレットかアクセストークンかWebhook URLが間違ってる。コピーするボタンとかがないので、コピペした時に文字が1個抜けたり、先頭や末尾に余計なスペースが入っていたりしがち。あと、うっかり再発行押して、変わっちゃってるとか。URLの「/」が二重になってたこともあった（もうとりあえず全部やらかしたよね＞＜）

```
Webhookイベントオブジェクト送信時にタイムアウトが発生しました
```
　は、`app.post`の最初に`res.status(200).end()`を入れたら直った。
　無くても出ない時もあるけど、出続けた時に、入れたら直って、消したら発生したので入れた方が良き？

### LINEからメッセージを送る

　「Messaging API設定」のQRコードを読んで友達登録をして、メッセージを送信。
　送ったのと同じ内容が返信されたら成功！

　検証では成功しているのに、なぜかなかなかうまくいかず、既読スルーされて泣いていたのは内緒；
　一回切って、再起動して、Webhook URL設定し直したらふつーにできたよ・・・わけわからん。

　とゆうわけで・・・画像の一つも無いけど・・・できました！　やったね！！！


# つづきます
　でもワタクシ、相変わらずナデシコさんじゃないとプログラムが出来ない人だから。
　なでしこさんでできるようにしたい（とゆう希望だけで、なでしこのナの字もない記事なのに、なでしこさんタグを付けていますｗ）
　プラグイン、作れるかなぁ？
　標準でExpressサーバのプラグインは用意されてるし、あとは基本、WebhookにPOSTされたら、その内容に応じて作成したline.Clientに対してあれこれするってだけだから、できそうな気がするんだよね。
　がんばる！