業務で、とあるwebページから申し込みがあった場合、LINE WORKSでbotから
ユーザーに対して、通知メッセージを送ることになりました。
その際、PHP(Laravel)で送ることになったので、その方法を残すことにしました。
環境
今回の環境
- PHP 7.4.9
- Laravel 6
- guzzlehttp/guzzle ^7.5
前提
本来であれば、以下のことをする必要がありますが、調べれば出てくるので、割愛します。
- LINE WORKS Developer consoleでアプリとbotの作成
- LINE WORKS Admin (管理画面)から、botをサービス中にする
LINE WORKS Developer console
LINE WORKS Admin (管理画面)
アクセストークンを取得するAPIを叩く
まずは公式を参考にしながら、アクセストークンを取得していきます。
developers.worksmobile.com
Service Account認証(JWT) - Using APIs - LINE WORKS ...
/**
* アクセストークン取得
*/
public function get_access_token()
{
// LINE WORKS Developer consoleで作成した、アプリのPrivate Keyを任意の場所に置いて、取得する
$private_key = openssl_pkey_get_private('file:///user/local/test/private_xxxxxxxxxxxxx.key');
// header情報をエンコードする
$header = $this->base64UrlEncode(json_encode([
'alg' => 'RS256',
"typ"=> "JWT"
]));
// ペイロードをエンコードする
$payload = $this->base64UrlEncode(json_encode([
// LINE WORKS Developer consoleで作成した、アプリのClient ID
"iss" => "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
// LINE WORKS Developer consoleで作成した、アプリのService Account ID
"sub" => "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
// JWT生成日時
"iat" => strtotime("now"),
// JWT満了日時 (60分以内)
"exp" => strtotime('now' . "+1 hour");
]));
$signature = null;
// 署名を生成する
openssl_sign($header . '.' . $payload, $signature, $private_key, OPENSSL_ALGO_SHA256);
$signature = $this->base64UrlEncode($signature);
$jwt = $header . '.' . $payload . '.' . $signature;
$url = 'https://auth.worksmobile.com/oauth2/v2.0/token'; // Access Token取得api
$client = new \GuzzleHttp\Client();
// api実行
$response = $client->request(
'POST',
$url,
['form_params' =>
[
'grant_type' => 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'assertion' => $jwt,
// LINE WORKS Developer consoleで作成した、アプリのClient ID
'client_id' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
// LINE WORKS Developer consoleで作成した、アプリのClient Secret
'client_secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxx',
'scope' => 'bot',
]
]
);
$contents = $response->getBody()->getContents();
// jsonからデコード
$contents_decode = json_decode($contents, true);
return $contents_decode["access_token"]
}
/**
* base64でデータをエンコードする
*/
public function base64UrlEncode($data)
{
return str_replace('=', '', strtr(base64_encode($data), '+/', '-_'));
}
Botによるメッセージ送信APIを叩く
次に、上記で取得したアクセストークンを使って、メッセージをユーザーに送信するapiを叩きます
public function send_bot_message($access_token)
{
// LINE WORKS Developer consoleで作成した、botのid
$bot_id = "00000000";
// 送信したいユーザーid(LINE WORKSログイン時のメールアドレスでも可)
$user_id = "xxxxxxxxxxxxxxxxx";
// メッセージ送信(ユーザー指定)api
$url = "https://www.worksapis.com/v1.0/bots/${bot_id}/users/${user_id}/messages";
$client = new \GuzzleHttp\Client();
// api実行
$response = $client->request(
"POST",
$url,
[
'headers' => [
'Authorization' => 'Bearer ' . $access_token,
'Content-Type' => 'application/json',
],
'json' => [
"content" => [
"type" => "text",
"text" => "メッセージ送信"
]
]
]
);
}
上記はユーザーを指定して、メッセージを送信していますが、以下のapiを使えば、トークルームを指定してメッセージを送信できます。
最後に
PHPで、LINE WORKS APIを使って、LINE WORKSにメッセージを送信してみました。
本来であれば、APIを叩くときに、エラー処理を入れる必要がありますが、今回は省略しています。
参考になれば幸いです。