2019-10-11

PHP5.3, CakePHP2.x に LineWorks 導入あれこれ

昨日のエントリーの続編です。集合要請時にメールだけではなく2017年2月からはLineWorksでも通知できるようにしました。当時はWorksMobileという名前でしたが、今では社名はそのままでサービス名はLineWorksとなっています。使用するAPIは

https://developers.worksmobile.com/jp/document/3005001?lang=ja

です。2017年時点ではネット検索してもあまり解説が見つからなかったため、上記の公式ガイドなどを読み込んで実装した記憶があります。上記URLの最後に書いているように
HTTP リクエストでパラメータを渡すときは、application/json 方式を基本とします。Header と body すべて application/json 方式を遵守しなければなりません。パラメータの形式は、各 API の説明にて確認してください。
とのことです。application/json 方式を遵守(じゅんしゅ)ということなのでリクエストパラメータを次のように設定します。

\$request = array('header' => array('Content-Type' => 'application/json', 'ConsumerKey' => 'xxxx....xxxx', 'Authorization' => 'Bearer xxxxxxxxxxx...xxxxxxxxxxxx') );

ここでConsumerKey, Authorizationコードはこちらで解説されているもので、その発行は Developer Console で行います。登録に必要なURLは2017年2月時点では

\$url_reg = 'https://apis.worksmobile.com/{API ID}/message/registerBot';

でした。API IDは上記のDeveloper Consoleで最初に発行されるものです。その後、2017年の10月にはこのURLが

\$url_reg = 'https://apis.worksmobile.com/{API ID}/message/registerBot/v2';

と変更になり、今では

\$url_reg = 'https://apis.worksmobile.com/r/{API ID}/message/v1/bot';

になっています。こういうのはコロコロ変更してもらっては困りますね。登録時に渡すパラメータの設定も変更されています。以前は、

\$params_reg = array(
'name' => 'サービス名',
'photoUrl' => '画像ファイルのあるURL',
'url' => '',
'extras' => '',
'adminEmail' => '管理者メールアドレス',
'status' => '1'
);

という形式でOKでしたが、今ではこれではダメで

\$params_reg = array(
'name' => 'サービス名',
'photoUrl' => '画像ファイルのあるURL',
'description' => 'サービスの説明',
'managers' => array("管理者のLineWorksアカウント"),
);

と指定する必要があります。管理者のメールアドレスは必要なくなり、管理者のLineWorksアカウントを配列で指定する必要があります。ここではPHPの配列で書いていますが、json形式にエンコードするとこちらにあるような形

 "managers": ["manager@example.com", "manager2@example.com"]

になるはずです。CakePHPではHttpSocketという便利なツールがありHTTP post Methodとパラメータのjson形式変換をまとめて行うことができます。例えば、次のような関数

private function WMsendMessage (\$url=null,\$params=array(),\$request=array()){
App::uses('HttpSocket', 'Network/Http');
\$HttpSocket = new HttpSocket();
\$params = json_encode(\$params);
\$results = \$HttpSocket->post(\$url, \$params, \$request);
\$results = json_decode(\$results);
// debug(\$results);
}

を使うと、サービスbot登録の処理はこれまでのパラメータを用いて

self::WMsendMessage (\$url_reg,\$params_reg,\$request); 

とすればOKです。登録が上手くいけば登録番号 botNo が発行され、以降はこの番号をパラメータに含めて
  • トークbotのリスト照会
  • トークbotの詳細情報の照会
  • トークbotのドメイン登録
  • メッセージ送信
などの処理を行えばOKです。これらの処理は以前はすべてHTTP post Methodで行えたのですが、今はリスト照会、詳細情報の照会はHTTP get Methodでないとエラーになります。その場合は、上記 WMsendMessage 関数の中にある

\$results = \$HttpSocket->post(\$url, \$params, \$request);
\$results = \$HttpSocket->get(\$url, \$params, \$request);

と変更する必要があります。前回のtwilio導入の時にも感じましたがAPI周辺の開発は日進月歩なのでバージョンアップへの対応が煩わしいです。このようなサービスは通信系インフラとしてすでに社会的に重要なツールとなっているのでコロコロと設定変更するのではなく長期的な視野で開発を行って欲しいと(すでにオッサンと呼ばれる年齢の私は)強く思います。

最後になりましたが、今回紹介した話がLineWorksの導入事例として取り上げられています。


興味ある方はご一読ください。

0 件のコメント: