Line works API 1.0の廃止が2023年4月30日ということで、余裕を持って2.0に移行しておこうと思ったものの1.0と色々と違っていて手間取ったのと、PHPでの例がまだあまり見当たらなかったので書き留めておくことにしました。
やりたいことはBotから指定ユーザーにメッセージ送信することです。
今回の利用目的に合うのはService Account認証 (JWT)なのでJWTを使用します。
コードはLaravelを使ったものです。
事前準備
- Line works Developer consoleでAPI 2.0のアプリを作成する
- アプリのOAuth Scopesは"bot"と"bot:read"を選択
- Botを作成する
- BotのAPI InterfaceでAPI 2.0を選択する
- Botをサービス中にする
Botを作成するとそのBotは「準備中」と表示されます。
5番の作業でLINE WORKS Admin(管理者画面)のメニュー内のサービス→Botから今作成したBotを追加・設定する必要があります。私はここでBotが準備中のままであることを忘れていて暫く"Access is denied for bot"というエラーで悩まされたので忘れずに。
Botの詳しい追加方法についてはググればすぐに出てくるのでここでは割愛します。(LINE WORKS(API2.0) 設定方法辺りを参考にしてみてください)
PHP-JWTインストール
composer require firebase/php-jwt
アクセストークン取得
まずはアクセストークンを取得する箇所です。必要なIDやキーなどはDeveloper consoleから取得しておきます。
use Firebase\JWT\JWT;
private function lw_get_accesstoken($client_id, $client_secret, $service_account_id, $private_key)
{
$lw_auth_url = "https://auth.worksmobile.com/oauth2/v2.0/token";
$token = $this->jwt_encode($client_id, $service_account_id, $private_key);
$headers = ['Content-Type' => 'application/x-www-form-urlencoded'];
$params = array(
'assertion' => $token,
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'client_id' => $client_id,
'client_secret' => $client_secret,
'scope' => 'bot',
);
try {
$client = new \GuzzleHttp\Client; // ここはLaravelのラッパーを使いたかったけどなぜかエラーでうまくいかないため断念
$response = $client->post($lw_auth_url, [$headers, 'form_params' => $params]);
$status_code = $response->getStatusCode();
if($status_code == 200) {
return json_decode($response->getBody());
}
else {
// エラー処理
return false;
}
}
catch (Exception $e) {
// エラー処理
return false;
}
}
private function jwt_encode($client_id, $service_account_id, $private_key)
{
$payload = array(
'iss' => $client_id,
'sub' => $service_account_id,
'iat' => time(),
'exp' => time() + 3600
);
return JWT::encode($payload, $private_key, 'RS256');
}
メッセージ送信
取得したトークンを使用してメッセージを送信します。
$token = $this->lw_get_accesstoken($client_id, $client_secret, $service_account_id, $private_key);
if(!$token) {
// エラー処理
}
$user_message_api = 'https://www.worksapis.com/v1.0/bots/'.$bot_id.'/users/'.urlencode($user_id).'/messages';
$headers = ['Content-Type' => 'application/json; charset=UTF-8',
'Authorization' => 'Bearer '.$token->access_token];
$payload = [
"content"=> [
"type"=> "text",
"text"=> "test message"
]
];
try {
$response = Http::withHeaders($headers)->post($user_message_api, $payload);
if($response->successful()) {
// 送信成功
}
else {
// エラー処理
}
}
catch (Exception $e) {
// エラー処理
}