【PHP】Chatwork 通知用の Proxy API を作ってみる

こんにちは。
とある案件でお客様 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

投稿者: snk

保有資格 ・TOEIC 835 ・LPIC 304 ・AWS SAA/SAP ・GCP PCA ・IPA SC

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です