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

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

新規登録して質問してみよう
ただいま回答率
85.48%
LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

7087閲覧

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

hasshy

総合スコア102

LINE Messaging API

LINE Messaging APIは、メッセージの送信・返信ができるAPIです。Web APIを経由しアプリケーションサーバとLINEのAPIでやり取りが可能。複数のメッセージタイプや分かりやすいAPIリファレンスを持ち、グループチャットにも対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

1グッド

2クリップ

投稿2019/05/04 10:08

編集2019/05/05 08:46

ボットから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

1<?php 2 3 require_once "vendor/autoload.php"; 4 5 const LINEACCESSTOKEN = 'LINEのアクセストークン'; 6 const LINESECRETTOKEN = 'LINEのシークレットトークン'; 7 8 const SINGLEMESSAGEURL = 'https://api.line.me/v2/bot/message/push'; 9 const MULTIMESSAGEURL = 'https://api.line.me/v2/bot/message/multicast'; 10 const SAMPLEUSERID = '送信するユーザーID'; 11 12 // コール 13 // ポスト値を取得 14 $postTo = SAMPLEUSERID; 15 $message = "test"; 16 17 pushLineMessage($message, $postTo); 18 19 // LINEでメッセージを送信する 20 function pushLineMessage($pushMessage, $to) { 21 $headers = [ 22 'Content-Type: application/json; charset=utf-8', 23 'Authorization: Bearer ' . LINEACCESSTOKEN 24 ]; 25 26 $messages = [ 27 'type' => 'text', 28 'text' => $pushMessage 29 ]; 30 31 $body = [ 32 [ 33 'to' => $to, 34 'messages' => [ 35 $messages 36 ] 37 ] 38 ]; 39 $body = json_encode($body); 40 41 // メッセージ送信 42 $curl = curl_init(SINGLEMESSAGEURL); 43 curl_setopt_array($curl, [ 44 CURLOPT_CUSTOMREQUEST => 'POST', 45 CURLOPT_HTTPHEADER => $headers, 46 CURLOPT_RETURNTRANSFER => true, 47 CURLOPT_BINARYTRANSFER => true, 48 CURLOPT_HEADER => true, 49 CURLOPT_POSTFIELDS => $body 50 ]); 51 $rowData = curl_exec($curl); 52 curl_close($curl); 53 54 // 前項で記載したエラーが表示されます 55 var_dump($rowData); 56 57 } 58 59 ?>

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

1<?php 2 3 require_once "vendor/autoload.php"; 4 5 const LINEACCESSTOKEN = 'LINEのアクセストークン'; 6 const LINESECRETTOKEN = 'LINEのシークレットトークン'; 7 const SAMPLEUSERID = '送信するユーザーID'; 8 9 // コール 10 // ポスト値を取得 11 $postTo = SAMPLEUSERID; 12 $message = "test"; 13 14 pushLineMessage($message, $postTo); 15 16 // LINEでメッセージを送信する 17 function pushLineMessage($pushMessage, $to) { 18 19 // botを作成 20 $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient(LINEACCESSTOKEN); 21 $bot = new \LINE\LINEBot($httpClient, [ 22 'channelSecret' => LINESECRETTOKEN 23 ]); 24 25 // メッセージを作成 26 $textMessageBuilder = new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($pushMessage); 27 28 // メール送信 29 $response = $bot->pushMessage($to, $textMessageBuilder); 30 31 var_dump($response); 32 } 33 34 ?>

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

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

$ 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"}
DrqYuto👍を押しています

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

php

1$body = [ 2 [ //★ここの入れ子がいらない?? 3 'to' => $to, 4 'messages' => [ 5 $messages 6 ] 7 ] //★ここの入れ子がいらない?? 8 ];

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

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

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

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

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

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

shell

1-d '{ 2 "to": "U4af4980629...", 3 "messages":[ ★ここのカッコが違う 4 { 5 "type":"text", 6 "text":"Hello, world1" 7 }, 8 { 9 "type":"text", 10 "text":"Hello, world2" 11 } 12 ] ★ここのカッコが違う 13}'

投稿2019/05/07 07:33

mix-peach

総合スコア1910

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hasshy

2019/05/08 08:49

ご返答いただきありがとうございます。 ソースをご確認頂けただけでもありがたいです。 ①curlでpostしてるコードについてですが、修正して試して見ましたが解決しませんでした。 リファレンスを見ると3件までメッセージを送る事ができるので配列で入れてもよさそうです。 ②SDK 使っているコードについては確認しています。 ③shellで実行しているコードについて修正してみましたが、同じエラーで送信できませんでした。 ご指摘ありがとうございます。 エラー自体も同じでしたのでタブやスペースのような細かいところも関係しているのかもしれません。 自分の環境ももう少し詳細に載せてみようと思います。 ありがとうございました。
guest

0

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

-H 'Content-Type:application/json; charset=UTF-8' ... -d '{ "to": "U4af4980629...", "messages":[ { "type":"text", "text":"Hello, world1" }, { "type":"text", "text":"Hello, world2" } ] }'

投稿2019/05/15 07:56

編集2019/05/15 07:57
moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問