

LINEdevelopersにて、 **Webhookの検証** を実行すると、
**ボットサーバーから200以外のHTTPステータスコードが返されました** というエラーになる問題で困っています。  
原因または解決策をご存知の方はいらっしゃいませんか。

## 私の行った手順は以下です。

  1. [LINEのBot開発 超入門（前編） ゼロから応答ができるまで](https://qiita.com/nkjm/items/38808bbc97d6927837cd#channel%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を参考に、Channelを作成する。
  2. [Google Apps ScriptでLINE BOTつくったら30分で動かせた件](https://qiita.com/hakshu/items/55c2584cf82718f47464#gas%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0)のコードをコピペ。
  3. 2と同じ記事の内容にしたがってGASでサービスの公開
  4. LINE developper でWebhookの設定まで行う、[検証](https://gyazo.com/aca1b3aeabfef86f4881354a206eaabb)を実行

すると、以下のような結果になりました。

**エラー**

ボットサーバーから200以外のHTTPステータスコードが返されました

![画像](https://gyazo.com/b7cf2600c0255b8938e18a15f870a658.png)

ちなみに、エラーのステータスコードは **401** でした。

![画像](https://gyazo.com/887dd240f4dc61bfdec0cc6b28797d77.png)

私は検証が上手くいくと思いました。  
なぜなら、『Google Apps ScriptでLINE BOTつくったら30分で動かせた件』の手順通りに行ってみたからです。

原因を確かめるため、以下のような手順を行ってみました

(a) [Messaging API
のドキュメント](https://developers.line.biz/ja/reference/messaging-api/#status-
codes)を確認

> **”有効なチャンネルアクセストークンが指定されていません”**

(b) LINE Devaloppers でチャネルアクセストークンを確認

> Messaging
> APIを呼び出すときに使用するチャネルアクセストークンです。このチャネルアクセストークンは期限切れになりません。新しいチャネルアクセストークンを発行したり、既存のチャネルアクセストークンを置き換える場合は、「発行」をクリックします。

上記の表記があるが、再発行をしてもう一度GASでWebhookの設定,  
更新→公開URLを LINE Devaloppers に貼り付け

結果に変化はありませんでした。

## 聞きたいこと

LINE側で他にするべき認証の手続きのようなものがあるのでしょうか？  
[https://developer.mozilla.org/](https://developer.mozilla.org/ja/docs/Web/HTTP/Status#Client_error_responses)

また、考えられる原因として

  * LINEdevelopersにおいて、何か設定をしていない
  * GASのコードに問題がある

などあると思いますが、 **401エラーがどこの部分ででいるのか** 知りたいです。

## GASのコード

（Google Apps ScriptでLINE BOTつくったら30分で動かせた件より）

[code]

    // LINE developersのメッセージ送受信設定に記載のアクセストークン
    var ACCESS_TOKEN = '----------------------------------------------------;
    
    function doPost(e) {
      // WebHookで受信した応答用Token
      var replyToken = JSON.parse(e.postData.contents).events[0].replyToken;
      // ユーザーのメッセージを取得
      var userMessage = JSON.parse(e.postData.contents).events[0].message.text;
      // 応答メッセージ用のAPI URL
      var url = 'https://api.line.me/v2/bot/message/reply';
    
      UrlFetchApp.fetch(url, {
        'headers': {
          'Content-Type': 'application/json; charset=UTF-8',
          'Authorization': 'Bearer ' + ACCESS_TOKEN,
        },
        'method': 'post',
        'payload': JSON.stringify({
          'replyToken': replyToken,
          'messages': [{
            'type': 'text',
            'text': userMessage + 'ンゴ',
          }],
        }),
      });
      return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
    }
    
    
[/code]

なお、私の環境は以下の通りです。  
macOS Mojave 10.14.5


CC BY-SA 4.0
2019-12-07T15:24:06.950
61226
2022-03-07T06:04:30.557
2019-12-07T15:44:57.973
32986
36971
question
api google-apps-script line
GASでLINE MessagingAPIを使った際に出る401エラーの対処法を知りたい


[Google Apps
Script側の設定でパブリックアクセス可能にする](https://teratail.com/questions/227966)必要があります。

* * *

これで問題は解消しますが、LINE以外からのメッセージも受信してしまうので、実際のbot実装ではLINEが送信したものかの判定が必要なります。

  * [署名を検証する](https://developers.line.biz/ja/reference/messaging-api/#signature-validation) \- Messaging APIリファレンス
  * 公式SDKの[`validate-signature.ts`](https://github.com/line/line-bot-sdk-nodejs/blob/v6.8.3/lib/validate-signature.ts)
  * (最近見かけた実例として)[こちらの質問文](https://ja.stackoverflow.com/q/42496/2808)中の `validate_signature` 関数


CC BY-SA 4.0
2019-12-09T03:31:52.517
61253
2019-12-09T03:31:52.517
2808
61226
answer