みなさん、アドベント楽しんでますかー!?
どうもオッスンこと、井出です。「で」は手ではなく、出の井出です。
私も記事を書くのが初めてなので
内容があっちこっち行ってるかと思いますが
どうぞお手柔らかに。
記事を書くに辺り、2019年を振り返っていたのですが
ほぼ毎日LINEの事やってたなーって思ったので
題材にすることにしました。
ただ、基本的な仕様はLINEが提供してる仕様書(こちら)が分かりやすく
また、分かりやすい記事も色々あるので
自分は少しコアな部分を書こうかなって思います。
個人的にはこちらの記事で凄い詳しく書かれています。
記事内容
基本的な仕様を説明。その後
レスポンスデータの内容を踏まえて、さらに取得できるデータがあるよ!
という部分。これは解析に少し時間が掛かった部分なので
今後開発するエンジニアさんに少しでも役立てばと思います
まずはMessaging APIを使うための下準備!
1.developer環境に登録してAPIの使えるようにしよう!
https://developers.line.biz/ja/services/messaging-api/
2.SDKを入れてみよう!
https://developers.line.biz/ja/docs/messaging-api/line-bot-sdk/
・phpはこれね!
https://github.com/line/line-bot-sdk-php
APIのメッセージタイプは2つ
1)任意のタイミングでユーザーに送信するプッシュメッセージ(push)
https://developers.line.biz/ja/reference/messaging-api/#send-push-message
2)ユーザーからのメッセージに対して応答する応答メッセージ(reply)
https://developers.line.biz/ja/reference/messaging-api/#send-reply-message
各々で使用できるAPIが異なるのでドキュメントを確認しましょう!
受信データ
developer画面で設定するwebhookのURLをエンドポイントととして
ユーザが何らかのアクションを行うたびにデータ飛んできます。
「テスト送信」とbotに投げてみました
stdClass::__set_state(array(
'events' =>
array (
0 =>
stdClass::__set_state(array(
'type' => 'message',
'replyToken' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
'source' =>
stdClass::__set_state(array(
'userId' => 'Ub053xxxxxxxxxxxxxxxxxxxx691a5',
'type' => 'user',
)),
'timestamp' => 1576064088143,
'message' =>
stdClass::__set_state(array(
'type' => 'text',
'id' => '11067136483887', ← 1兆もデータあるよ!!
'text' => 'テスト送信',
)),
)),
),
'destination' => 'Uc8cd39ebxxxxxxxxxx7c12c1488',
))
さて、上記が生データになるのですが
これ$_POSTで取得しようとしても取れません。
PHPではjson のPOSTデータを$_POSTで取得する事ができない制約があります。
詳しくはこちらを。
https://qiita.com/hidepy/items/42220523cb2b3eb2c451
ということで、こうやって取得しました。
$data = json_decode(file_get_contents('php://input'), true);
さて、本題ですが
このデータを活用して、できることを書いていこうと思います。
messageオブジェクトにあるidというデータはメッセージIDでユニークです。
このIDをキーに取得できるデータがあります。
それはコンテンツ系(画像、動画、音声、ファイル)のデータになります。
実はコンテンツ系は、リクエストデータとして飛んできません。
バイナリデータを毎回飛ばされても、コストも掛かるし
不必要なデータとなるのが大半なのでごもっともな仕様。
それらのデータを取得する時に必要な大事なキーが、先ほどのメッセージIDになります。
仕様書(https://developers.line.biz/ja/reference/messaging-api/#get-content)
のコードはこれです。分かりやすいですね。そう、この通りなのです。
$httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient('<channel access token>');
$bot = new \LINE\LINEBot($httpClient, ['channelSecret' => '<channel secret>']);
$response = $bot->getMessageContent('<messageId>');
if ($response->isSucceeded()) {
$tempfile = tmpfile();
fwrite($tempfile, $response->getRawBody());
} else {
error_log($response->getHTTPStatus() . ' ' . $response->getRawBody());
}
注意事項として、有効期間があるみたいで
仕様書にこのような記載されています。
コンテンツ系が必要な場合は、直ぐ取得しておいた方が良さそうですね。
※メッセージが送信されてから一定期間後に、コンテンツは自動的に削除されます。コンテンツの保存期間は保証されません。
以下については、デベロップアカウント作成時に払出される値です。
<channel access token>
<channel secret>
上記のコードを応用して
S3に登録するのも容易にできます。
$result = $s3client->putObject(array(
'Bucket' => S3_BUCKET_NAME,
'Key' => $fileName,
'Body' => $response->getRawBody(),
'ContentType' => $mimeType,
'ACL' => 'public-read'
));
mimeTypeについてはmessageオブジェクトのidと同じ階層に存在する「type」の値を参照し
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U4af4980629..."
},
"message": {
"id": "325708",
"type": "file",
"fileName": "file.txt",
"fileSize": 2138
}
}
以下の内容で拡張子を取得してくださいまし
- 画像:image(拡張子:jpg)
- 動画:video(拡張子:mp4)
- 音声ファイル:audio(拡張子:m4a)
- ファイル:file(上記の「fileName」の拡張子を取得)
送信されたファイル名については、typeがfileの時だけデータとして取得できますが
その他は取れないので、下記の内容を元に自分なりに解釈しました。
間違ってたらすみませんえん。
https://developers.line.biz/ja/reference/messaging-api/#image-message
ちなみに試して無いですが、仕様書を見ると
LIFFで送信した場合は各々ファイル名取れるみたいです。
LIFFの事はこちらを見てね
https://developers.line.biz/ja/reference/liff/
※その他、webhookのイベントは色々あるのでドキュメント見てね!
https://developers.line.biz/ja/reference/messaging-api/#webhook-event-objects
コンテンツ取得するところしか説明できてませんが
ご要望あれば、他の事もやろうかな。
今回はここまで!!
その他便利なツール
- Botデザインのシミュレータ ※ログインしてないと見れないよ
・HTML形式
https://developers.line.biz/console/fx/
・GUIバリバリ
https://developers.line.biz/console/fx-beta/
最後に
明日は。フロントからサーバ側まで幅広い知識を持たれてる近藤ayaaaaa!さんになります!
アニメーション系の記事とのことで、私も興味津々です!
乞うご期待!!
プラコレではエンジニア、デザイナーも幅広く募集しています!!
プラコレはプラコレWedding以外にもウェディングのメディアDressyやfarnyなども運営しています。ぜひ見ていってもらえると嬉しいです!
閲覧サンキュ!
参考記事
https://qiita.com/hidepy/items/42220523cb2b3eb2c451
https://qiita.com/kakakaori830/items/52e52d969800de61ce28