GoogleAppsScriptでTelegram BOTを作る ～第1回 はじめてのTelegram BOT

TelegramのちょっとしたBOTを作りたいな～
でもサーバー用意したりとかメンテしたりとかめんどくさいんだよな～

なんか手軽なPaaS的環境ないかな～
Googleアカウントがあれば使えるような手軽なやつないかな～

せや！GASがあるやんけ！

ちょっと前からこんな感じのモチベーションでGASをゴリゴリ書いてたらなんとなくノウハウが溜まってきたので小分けにして投下していこうかと思います。
まず初回はBOTアカウントを登録してからGASからシンプルなメッセージを投稿するまでをまとめました。


## BOTアカウントの登録
まずはBOTアカウントを登録する必要があります。
BOTアカウントは通常のアカウントのように電話番号認証をするのではなく、Telegram上の@BotFatherというアカウントを通して登録し、APIを通して登録したBOTにアクセスします。

### 新しいBOTを作る
BOTの登録は@BotFatherというBOTとの個別チャットで対話的に行います。
@BotFatherに`/newbot`と送ることでBOTの登録が開始されます。

<img width="200" alt="BOTの登録開始" src="https://qiita-image-store.s3.amazonaws.com/0/56640/cb743831-1056-9d4a-ca64-7552d956cb50.png">

BOTの名前とユーザー名(@username)を聞かれるので入力してください。
ユーザー名は末尾がbotで終わる必要があり、後から変更できないものなので注意してください。

### BOTのAPIトークン
BOTの登録が終わるとAPIトークンが表示されます。
このAPIトークンを通してBOTにアクセスすることになります。
<img width="200" alt="APIトークン" src="https://qiita-image-store.s3.amazonaws.com/0/56640/8562c313-826c-c5fd-719b-66a73baa7f1e.png">

### BOTのアイコン設定
`/setuserpic`と送るとBOTのアイコンが設定できます。
<img width="200" alt="アイコンの設定" src="https://qiita-image-store.s3.amazonaws.com/0/56640/6ad8b4ed-a4a3-b5fd-7af8-d0a9309e2ca4.png">

ユーザー名以外の設定は@BotFatherとの会話で後から変更することが可能です。

### BOTのプライバシー設定
BOTはデフォルトでは`/`から始まるメッセージ以外にアクセスすることはできないように設定されています。
この設定は`/setprivacy`で無効化できるので適宜設定してください。
<img width="200" alt="IMG_0493.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/56640/21f454d3-3878-7894-c7fc-76d01eb6ef81.png">


## BOTプログラムの用意(GoogleAppsScript)
###GoogleAppsScript(GAS)ってなに？
GoogleAppsScript(GAS)とは、GmailやGoogleDrive、GoogleカレンダーなどのGoogle製のサービスをプログラミングにより操作できるJavaScriptベースの開発環境です。

ちょうどMicrosoftOfficeなんかで使うVBAに近いものではありますが、ひとつの大きな違いとして、サーバーサイドのスクリプト言語であるということが挙げられます。
つまり、Googleのサーバー上で動作するのでPCを立ち上げていなくても特定の時間に実行したり、スプレッドシートが更新されたことをトリガーにしてスクリプトを実行することが可能です。
GAS上の関数を実行できるWebアプリケーションを作成することも可能です。

### メッセージを送信するスクリプトの作成
GASの新規作成に関してはこちらの記事を参照してください。
https://qiita.com/takanakahiko/items/0da4502f3d8e321e17c0

まずは簡単に指定のチャットにメッセージを送信するスクリプトを書いていきます。

```javascript:コード.gs
function sendMessage() {
  // 以下2行は自分の環境に合わせて設定してください
  var chatId = NNNNNNNNNN;
  var token = XXXX:YYYY;
  
  sendTelegram(chatId, 'Hello World!', token);
  
}

function sendTelegram(chatId, text, token) {
  var payload = {
    'method': 'sendMessage',
    'chat_id': chatId,
    'text': text,
    'parse_mode': 'HTML'
  }
  
  var data = {
    'method': 'post',
    'payload': payload
  }
  
  UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data);
  
}
```
4行目のtokenには上で書いた方法で取得したBOTのAPI Tokenを設定してください。
3行目のchatIdはメッセージを送信するchatのIDですが、これは後述します。

sendTelegram関数ではBot APIに送信するデータを生成しています。
どのチャットに対して、どのようなメソッドで、どのような文字列を、どのような書式で送信するかをpayloadデータとしてまとめます。

このpayloadデータをPOSTメソッドでBot APIに送信しているのがsendTelegram関数の末尾の部分です。

`UrlFetchApp.fetch('https://api.telegram.org/bot' + token + '/', data);`
この部分でBot APIを叩いてメッセージを送信しています。

GASではこの[UrlFetchAppクラス](https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app)を使って外部のサイトやWebAPIなどアクセスしてサーバーサイドで情報を取得したりすることができます。
非常に便利な関数ですが1日の使用上限があるので注意してください(Googleの無料アカウントで20,000回/日だったか)。


### Chat IDの取得
メッセージを送信したいグループのChat IDの取得についてですが、まずBOTをグループに招待してtestとか適当なメッセージを送信してください。
続いて以下のURLにアクセスしてUpdateをJSON形式で取得します。
https://api.telegram.org/botXXXX:YYYY/getUpdates/
`XXXX:YYYY`の部分はBOTのAPI Tokenになります。
するとこのようなJSONが取得できます。

```
{
    "ok": true,
    "result": [
        {
            "update_id": 503750892,
            "message": {
                "message_id": 147,
                "from": {
                    "id": 187814189,
                    "is_bot": false,
                    "first_name": "\ud83d\udc15\u3044\u307e\u3069\u3093",
                    "last_name": "(nowdon) @Osaka\ud83e\udd80",
                    "username": "nowdon",
                    "language_code": "ja-US"
                },
                "chat": {
                    "id": "NNNNNNNNNN",
                    "title": "\u7b2c1 Bot\u958b\u767a\u5ba4",
                    "type": "supergroup"
                },
                "date": 1533606908,
                "text": "test"
            }
        }
    ]
}
```
この`"chat": {"id": NNNNNNNNNN`の部分がChat IDになります。

### 関数の実行
プログラム側が用意できたらBOTにメッセージを送信する関数を実行してみます。
GASのメニューから[実行]→[関数を実行]→[sendMessage]を実行します。
<img width="200" alt="実行結果" src="https://qiita-image-store.s3.amazonaws.com/0/56640/2eb97126-e055-8c2f-8e84-6fa01870d12a.png">

## まとめ
今回はTelegramのBOTアカウントを登録し、GASからメッセージを送信する方法を書きました。
次回はWebHookを使ったメッセージの受信について書こうと思います。

質問とか間違いの指摘なんかはコメントかもしくはTelegramの私のアカウント(@nowdon )宛にお願いします。