@sandoraki (John)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

GASでLINE応答Botを作っていて

解決したいこと

LINEBotを作りたい

LINEBotを作りたいと思いとりあえずと思って
https://first-contact.jp/blog/article/linebot/
上記のサイトを見ながら進めていました。
アカウントも作成し、Webhookも成功していたのですが、
いざLINEで何かメッセージを送ってみても応答せず、
GASの方でもエラーを吐きました。

解決法が分からないので質問を投げました。
分かる方いましたら、教えていただけると幸いです。

発生している問題・エラー

TypeError: Cannot read property 'postData' of undefined
doPost	@ コード.gs:2

全体のコード)
※チャンネルのアクセストークンは伏せてます。

function doPost(e) {
  var replyToken= JSON.parse(e.postData.getDataAsString()).events[0].replyToken;
  if (typeof replyToken === 'undefined') {
    return;
  }

  var url = 'https://api.line.me/v2/bot/message/reply';
  var channelToken = '---------------------------------';

  var messages = [{
    'type': 'text',
    'text': 'おはようございます',
  }];

  UrlFetchApp.fetch(url, {
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + channelToken,
    },
    'method': 'post',
    'payload': JSON.stringify({
      'replyToken': replyToken,
      'messages': messages,
    }),
  });
  return ContentService.createTextOutput(JSON.stringify({'content': 'post ok'})).setMimeType(ContentService.MimeType.JSON);
}

自分で試したこと

・Qiitaにてオウム返しBotを作ろうとしている方が、同じような問題にあたっていたのでその回答にあった方法を試してみたところ、それでも何も変わりませんでした。
※変えたのは2行目の

var replyToken= JSON.parse(e.postData.getDataAsString()).events[0].replyToken;

の部分で、元のコードは

var replyToken= JSON.parse(e.postData.contents).events[0].replyToken;

となっていました。

0 likes

2Answer

doPost(e)の引数であるeに正しい入力がされていないときに起こるエラーなので、多分webhookがオンになっていないなど、
https://first-contact.jp/blog/article/linebot/
こちらのグーグル側の設定かラインの認証をちゃんとしていないかあたりのもんだいかと思われます

追記
それらの問題を解決した上で

var replyToken= JSON.parse(e.postData.contents).events[0].replyToken

に替えてもう一度トライしてみてください

2Like

Comments

  1. @sandoraki

    Questioner

    コメントありがとうございます。
    webhookはきちんとオンになっていました。(その他応答メッセージのオンオフなどもサイトの通りになっています。)
    Google側の設定に関しては、GASの方で実行をした際にもただただコマンドエラーを吐くだけで、以前にアカウントの安全性に関する設定は完了していたので恐らく問題はないと思います。
    あとはLINEの認証なのですが、LINEの認証とは例えば何のことを指すのでしょうか?
    分からず申し訳ないのですが、自分で色々見てもわからず立ち止まってしまっている状況なので、出来れば教えていただきたいです。
  2. このサイトの

    https://first-contact.jp/blog/article/linebot/

    サーバーを用意する
    の手順は完了していますでしょうか?
    特に
    連携情報をLINEアカウントに登録
    以降の
    > Webhook送信
    >「利用する」に変更

    > Webhook URL
    >コピーしておいたウェブアプリケーションのURLを貼り付けします( 先頭のhttps://は不要) 。
    >「接続確認」でウェブアプリケーションが有効かどうか調べられます。

    > 自動応答メッセージ
    > LINE Account Managerから「応答メッセージ>オフ」、「Webhook>オン」にしてください。

    のあたりがしっかりと完了しているかを確認してみてください。
  3. @sandoraki

    Questioner

    Webhook送信を「利用する」に変更するはできています。
    WebhookURLもデプロイしたものを貼り付け、確認したところ成功が確認できました。
    自動応答メッセージに関しても、オンオフはしっかりとサイト通りにできています。
    ただ一つ疑問なのが、WebhookURLの貼り付けの際に、(先頭のhttps://は不要)というので、実際にURLを貼り付ける時のhttps;//の部分だけを削除してやろうとすると、「有効なHTTPSURLを入力してください」の部分が×になりアップデートができませんでした。
    当たり前かと思い、(先頭のhttps://は不要)は変更の際にそこは同じだからそういう書かれ方なのかと思っていたのですが、本当はそこができない原因に関わっているのでしょうか?
  4. その可能性が高いですね多分仕様変更があったと考えられます

    https://pepami.com/manual/webhook/

    エラーは、入力 e が `postData`を持つオブジェクトになっていないといけないはずが、違う物になっているのが原因です。

    だとすると、この辺の設定がうまくいってなくて本来入力される物以外の物が入力されていると考えられます。
    ここじゃないとすると、あとはちょっとわかりませんね。
  5. @sandoraki

    Questioner

    そうなんですね...
    丁寧な対応ありがとうございました。
    教えていただいたことも念頭に置いて、もう少し考えてみたいと思います。
  6. もしかして、
    googleのデフォルトの
    ```
    function myfunction() {
    }
    ```
    の中に
    ```
    function myfunction() {
    function doPost(e) {...
    }
    ```
    みたいにしちゃってないですか?
    もししていたら
    ```
    function myfunction() {
    }
    ```
    を消してみてください
    それでだめなら、わからないです。
  7. あとは
    GASのデプロイの認証で
    Web appの下の実行者(Execute As)が私(e-mail adress)になっていて、
    アクセス権が(全員、匿名利用者も含めて)
    となっている事を確認してみてください。
  8. @sandoraki

    Questioner

    functionの方に関しては、最初の質問のところにコード全文も載せていますが、無いようでした。(一応現在のコードを自分でも目視で確認しました。)
    デプロイ認証に関しても最初からちゃんとユーザーは自分で全員に設定しています。
    どうしてなんでしょうね...
  9. あとはアクセストークンがちゃんとコピペされていないか("="記号や?記号が全角などになって文字化けていないか)、とかそのへんですかね。。。

    Message API設定の下のwebhook URLの検証はうまくいっていますか??

    TypeError: Cannot read property 'postData' of undefined
    doPost @ コード.gs:2

    このエラーって、GASのページで実行した時にでましたか?なら当然でますよ。入力がないので。
  10. @sandoraki

    Questioner

    はい、このエラーはGASの方で実行を行ったときに出たものです。
    Webhookの検証は成功しています。
    アクセストークンは見たところ=や?記号はなかったです。
    ただちゃんと半角にはなってました。
    入力というのはどうすればいいのでしょうか?

Webhookの検証は成功しています。
アクセストークンは見たところ=や?記号はなかったです。

と、言うことはやはりあなたがアクセストーケンだと思ってコピペしたものはアクセストーケンでない可能性があります。あれだけの長い文字列で一つも記号がないのはあまりありえないと思われます

ラインで例えば
ハロー
とチャットボットに送ったとすると
ハローというメッセージと送り主のIDなどの情報が入った箱(オブジェクト)が doPost という関数にeとして渡されます
もし箱が渡されていない状態で関数を実行すると、eもその中身もないので undefined、つまり、未定義というエラーが出ます。つまりGAS単体で実行した場合は、ラインアプリからの入力(箱)がないのでエラーが出ます

質問者さんの場合は
ラインアプリがメッセージと送信者などの情報が入った箱をGASへ送って、関数は箱を受け取って中身を見ました。そして、送るメッセージを決めて、宛名と、メッセージと、ラインアプリ側にこのメッセージがちゃんとした知り合いから送られたことを証明するための合言葉(アクセストーケン)を新しい箱に入れてラインアプリに送ったのです。しかしラインアプリは箱の中に入ってる合言葉をみてこんなんしらんといって投げ捨た。結果アプリ側はいつまで経っても返信を受け取れなかった。

そんなところでしょう。この過程の中でおかしくなりそうな点は、ソースコードは見たところ良さそうなので
1 そもそも箱はgasにつかなかった = webhook の検証が失敗
2. 箱はついたが展開できなかった、返信を入れる箱を用意できなかった = ソースコードが間違えている
3. 箱に入れたものがラインアプリに届かなかった = webhook の検証が失敗
4. ラインアプリは箱を受け取って中身を見たが、合言葉が違っていたので箱を捨てた (指定したアクセストーケンが間違えている)

のいずれかです。私が思うに一番可能性が高いのは4番です。

アクセストーケンは百文字程度の半角の文字列で、改行なしで枠外にはみ出たとしても一行に収めて '------' のアポストロフィ,('')は残してハイフンの部分のみを置換してコピペしないといけないです。

アクセストーケンの最新の場所は下記のサイトでチェックしてください

0Like

Comments

  1. @sandoraki

    Questioner

    4番の原因で間違いないと思います。
    言われてみると確かにアクセストークンがとても短いです。
    ただ再発行を押したりしても、キャンセルと問題(緑のボタン)が出てきて、アクセストークンはちゃんと都度都度変わってるのですが、何度やっても短いアクセストークンしか発行されないですね。
  2. @sandoraki

    Questioner

    解決できました!
    原因はやはりチャネルアクセストークンに問題があったようです。
    詳細に言うとLINEDevelopersの言語設定がEnglishになっていたことによるアクセストークンの文字化けでした。
    日本語に直すことでちゃんとしたアクセストークンが発行されました。
    ここまで一つずつ丁寧に教えていただき本当にありがとうございました。
  3. いえいえ、解決したようで何よりです!
    言語設定が原因の文字化けでしたら重要なバクなので、ライン株式会社さんに報告することを強くおすすめします。

    https://mag.app-liv.jp/archive/128410/

    ここの問い合わせでできます(多分)

    では良いエンジニアリングライフを!

Your answer might help someone💌