質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.78%

[LINE Message API]PUSHメッセージが送信できない。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,297

hasshy

score 94

ボットからPUSHメッセージを行いたいのですが、メッセージを送信することができません。
必要なトークンやIDは間違い無さそうです。
何か原因になる処理はあるのでしょうか?

エラー内容

curlで送信した結果を出力すると次の様な返答がありました。  
request_bodyが読めないというエラーの様です。

string(462) "HTTP/1.1 400 Bad Request Server: nginx Date: Sat, 04 May 2019 09:59:06 GMT Content-Type: application/json;charset=UTF-8 Transfer-Encoding: chunked Connection: keep-alive x-line-request-id: *** x-content-type-options: nosniff x-xss-protection: 1; mode=block cache-control: no-cache, no-store, max-age=0, must-revalidate pragma: no-cache expires: 0 x-frame-options: DENY {"message":"Could not read the request body"}"

ソース

<?php

  require_once "vendor/autoload.php";

  const LINEACCESSTOKEN = 'LINEのアクセストークン';
  const LINESECRETTOKEN = 'LINEのシークレットトークン';

  const SINGLEMESSAGEURL = 'https://api.line.me/v2/bot/message/push';
  const MULTIMESSAGEURL = 'https://api.line.me/v2/bot/message/multicast';
  const SAMPLEUSERID = '送信するユーザーID';

  // コール
  // ポスト値を取得
  $postTo = SAMPLEUSERID;
  $message = "test";

  pushLineMessage($message, $postTo);

  // LINEでメッセージを送信する
  function pushLineMessage($pushMessage, $to) {
    $headers = [
      'Content-Type: application/json; charset=utf-8',
      'Authorization: Bearer ' . LINEACCESSTOKEN
    ];

    $messages = [
      'type' => 'text',
      'text' => $pushMessage
    ];

    $body = [
      [
        'to' => $to,
        'messages' => [
          $messages
        ]
      ]
    ];
    $body = json_encode($body);

    // メッセージ送信
    $curl = curl_init(SINGLEMESSAGEURL);
    curl_setopt_array($curl, [
      CURLOPT_CUSTOMREQUEST => 'POST',
      CURLOPT_HTTPHEADER => $headers,
      CURLOPT_RETURNTRANSFER => true,
        CURLOPT_BINARYTRANSFER => true,
        CURLOPT_HEADER => true,
      CURLOPT_POSTFIELDS => $body
    ]);
    $rowData = curl_exec($curl);
    curl_close($curl);

    // 前項で記載したエラーが表示されます
    var_dump($rowData);

  }

 ?>

LINEが提供しているライブラリを使った場合

下記のライブラリを使って検証してみましたが、同じ様なエラーで動きませんでした。  
おそらく、根本的な部分に問題があるのだとは思います。

https://github.com/line/line-bot-sdk-php

エラー内容

object(LINE\LINEBot\Response)#6 (3) { ["httpStatus":"LINE\LINEBot\Response":private]=> int(415) ["body":"LINE\LINEBot\Response":private]=> string(56) "{"message":"The content type, 'null', is not supported"}" ["headers":"LINE\LINEBot\Response":private]=> array(13) { ["Server"]=> string(5) "nginx" ["Date"]=> string(29) "Sat, 04 May 2019 11:09:23 GMT" ["Content-Type"]=> string(30) "application/json;charset=UTF-8" ["Transfer-Encoding"]=> string(7) "chunked" ["Connection"]=> string(10) "keep-alive" ["x-line-request-id"]=> string(36) "***" ["x-content-type-options"]=> string(7) "nosniff" ["x-xss-protection"]=> string(13) "1; mode=block" ["cache-control"]=> string(46) "no-cache, no-store, max-age=0, must-revalidate" ["pragma"]=> string(8) "no-cache" ["expires"]=> string(1) "0" ["x-frame-options"]=> string(4) "DENY" ["accept"]=> string(16) "application/json" } }

ソース

<?php

  require_once "vendor/autoload.php";

  const LINEACCESSTOKEN = 'LINEのアクセストークン';
  const LINESECRETTOKEN = 'LINEのシークレットトークン';
  const SAMPLEUSERID = '送信するユーザーID';

  // コール
  // ポスト値を取得
  $postTo = SAMPLEUSERID;
  $message = "test";

  pushLineMessage($message, $postTo);

  // LINEでメッセージを送信する
  function pushLineMessage($pushMessage, $to)  {

    // botを作成
    $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(LINEACCESSTOKEN);
    $bot = new \LINE\LINEBot($httpClient, [
      'channelSecret' => LINESECRETTOKEN
    ]);

    // メッセージを作成
    $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($pushMessage);

    // メール送信
    $response = $bot->pushMessage($to, $textMessageBuilder);

    var_dump($response);
  }

 ?>

ターミナルから直接送信する

プログラムではなく、シェルで直接呼び出せるか確認しましたが、結果送信できませんでした。

$ curl -v -X POST https://api.line.me/v2/bot/message/push \
-H 'Content-Type:application/json' \
-H 'Authorization: Bearer <チャンネルのアクセストークン>' \
-d '{
    "to": "<送り先のユーザーID>",
    "messages":{
        {
            "type": "text",
            "text": "Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    }
}'

エラー内容

400版エラーで、Could not read the request bodyが返ってきており、
エラー文からは、本文が読み込めない形式になっているといった内容になっています。

< HTTP/1.1 400 Bad Request
< Server: nginx
< Date: Sun, 05 May 2019 08:03:56 GMT
< Content-Type: application/json;charset=UTF-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< x-line-request-id: xxx
< x-content-type-options: nosniff
< x-xss-protection: 1; mode=block
< cache-control: no-cache, no-store, max-age=0, must-revalidate
< pragma: no-cache
< expires: 0
< x-frame-options: DENY
<
* Connection #0 to host api.line.me left intact
{"message":"Could not read the request body"}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

lineのapiは使ったことがないのですが、
ググって見回ったサンプルのコード等と見比べて、気になったところを書いてみます。

少しでも参考になると良いですが、検討違いの内容でしたら、すみません^^;

① curlでpostしてるコードについて

データ送信している値を入れた変数ですが、1段階不要に入れ子しているような気が。。?

$body = [
      [ //★ここの入れ子がいらない??
        'to' => $to,
        'messages' => [
          $messages
        ]
      ] //★ここの入れ子がいらない??
    ];

② SDK 使っているコードについて

レスポンスのメッセージから、送信データのcontent typeが正しく指定できていない(nullになってるらしい)ことが原因なので、①とはまったく異なるエラーだと思います。

ライブラリに、content typeを指定するような箇所があるのか分からないのですが(サンプルコードを載せているサイトを何件か見たのですが特にそのあたりについて記述しているところはなかったので・・)、
もし自分でどこかに記述されたのであれば、その記述が合っているのかもう一度確認を・・・
心当たりがなければ、送信前にどのような設定になっているのか、$botあたりをdumpして中身を確認したら、何か分かるかもしれません。。。

③ shellで実行しているコードについて

質問記載時の打ちミスかも?とも思いましたが、、
公式のサンプルコードと比較してみたところ、渡しているデータ部分の記述が少しだけ違うようです。

下記はサンプルコードをはりつけたものです。。。

-d '{
    "to": "U4af4980629...",
    "messages":[ ★ここのカッコが違う
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ] ★ここのカッコが違う
}'

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/08 17:49

    ご返答いただきありがとうございます。
    ソースをご確認頂けただけでもありがたいです。

    ①curlでpostしてるコードについてですが、修正して試して見ましたが解決しませんでした。
    リファレンスを見ると3件までメッセージを送る事ができるので配列で入れてもよさそうです。

    ②SDK 使っているコードについては確認しています。

    ③shellで実行しているコードについて修正してみましたが、同じエラーで送信できませんでした。
    ご指摘ありがとうございます。
    エラー自体も同じでしたのでタブやスペースのような細かいところも関係しているのかもしれません。

    自分の環境ももう少し詳細に載せてみようと思います。
    ありがとうございました。

    キャンセル

+1

APIを利用したことはありませんが、以下でいかがでしょう?

-H 'Content-Type:application/json; charset=UTF-8'

...

-d '{
    "to": "U4af4980629...",
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る