こんにちは。
とある案件でお客様 Zabbix サーバから Chatwork にアラートを通知する必要がございました。
通常であれば、Chatwork の API を叩くスクリプトを用意すればよいのですが、お客様管理の Zabbix サーバですので、セキュリティ的な要因から Chatwork の APIトークンを使うことができません。
ついては、自社サーバに API トークンを配置した Proxy API を用意してみます。
コード
前回は cURL関数 を使ったので、今回は file_get_contents を使ってみます。
<?php /* $api_key = ""; $password = ""; */ include('../../.env'); // リクエストの body を取得 $json = file_get_contents("php://input"); $contents = json_decode($json, true); // POST されたデータが正しいか判定 if (isset($contents['cw_endpoint']) && is_numeric($contents['cw_endpoint']) && isset($contents['message']) && isset($contents['auth_id'])){ $cw_endpoint = $contents['cw_endpoint']; $message = $contents['message']; $auth_id = $contents['auth_id']; } else { echo "Bad Request.\n"; http_response_code(400); exit(); } // 認証情報が正しいか判定 if ($password !== $auth_id){ echo "Forbidden.\n"; http_response_code(403); exit(); } // HTTP ヘッダ $header = array( "Content-Type: application/x-www-form-urlencoded", "X-ChatWorkToken: $api_key", ); // HTTP リクエスト $context = array( "http" => array( "method" => "POST", "header" => implode("\r\n", $header), "content" => http_build_query(array( 'body' => $message, )), ) ); // ChatWork API にリクエスト送信 $scc = stream_context_create($context); $url = "https://api.chatwork.com/v1/rooms/$cw_endpoint/messages"; $res = file_get_contents($url, false, $scc); echo $res . "\n";
APIトークン と 認証情報は外部より参照できないように、ドキュメントルートより上位に配置しておきます。
<?php $api_key = ""; $password = ""; ?>
使用例
POSTメソッド で HTTPリクエストを投げれば OK です。
・パラメータ
cw_endpoint:通知するルームID
message:通知内容
auth_id:xxxxxx
・curl の例
curl -X POST -d '{"cw_endpoint":"xxxxxxx", "message":"これはテスト", "auth_id":"xxxxxxxxxxxxxx"}' https://xxx.xxx.xxx.xxx/api/proxy.php