backlog API サンプル PHP版
backlog API PHPを使ったサンプル
backlogをフロントエンドツールとして利用して、apiでバックエンド処理をする場合に、
よく使うものについて、PHPのサンプルコードと、APIの結果と、ちょっとしたメモです。
APIを試しに使うだけなら難しくありません。そこもまたいいところです。
ただ、業務と使うとなると、それなりの開発が必要かと思われます。
backlogのAPIの種類は、たくさんありますが、更新系や開発系gitなどは省略しています。
また、Webhookなど便利そうなものについても今回は省略します。
backlogを大規模ユーザ運用するのであれば、データ更新系もかなり便利だと思われますが、省略します。
ちなみに、個人的には、データ更新系は、特別な理由がない限りは、backlogのUIがいいので、画面からの操作の方が安全かつ充分だと思っています。
ここでは、backlogのAPIの中から、backlogに保存されているデータを参照するところメインにしています。
また、以下について理解していると、より簡単にAPIのコードで書くことができると思います。
- api_key(APIを利用するために、backlogに認証してもらうためのキー)
- apiのurl(apiを利用するためのurlで、APIごとに決まっている)
- urlパラメータ(apiの中には、urlの一部にリクエストパラメータを組み込んで利用するものがある)
- リクエストパラメータ(リクエストデータをjson形式にしてAPIにリクエストを投げる)
- レスポンスボディー(APIが戻してくるbacklogのデータで、json形式になっている)
- file_get_contents(apiを呼び出すためのphpの関数)
- curl(apiを呼び出すためのphpの関数)
- json_decode(json形式のデータを連想配列に変換する関数)
backlog api PHPサンプル
このサンプルphpは、とりあえず、backlogのAPIを順番に、実行して、APIの結果を連想配列に入れて、その結果をprint_r()するだけになっています。
連想配列に入ったデータは、DBに保存するなり、さらに加工するなり、いろいろな用途に使用できます。
<?php
ini_set('display_errors', 1);
date_default_timezone_set('Asia/Tokyo');
/**
* xxxのところは、ユーザの環境によって書き換えてください
*/
// APIのURLのベースは、backlogのログインURLと同じ
$backlog_url = "https://XXX.backlog.jp";
// APIkeyはbacklogの個人設定画面から、ユーザ別に作成し、取得することができる
$api_key = "XXX";
// urlパラメータの値(以下のidは、APIからすべて取得できますが、サンプルを動かすために値を設定)
// projectIdはbacklog画面のプロジェクト設定を開くと、URLにも表示されます
// projectkeyはbacklog画面のプロジェクトを開くと、URLにも表示されます
// projectIdOrKeyはidでも、keyでも、どちらでも可ということです
$projectIdOrKey = "XXX";
// useridは、APIでないと取れないかも?
$userId = "XXX";
// issueKeyはbacklog画面の課題を開くと、URLにも表示されます
// issueidは、APIでないと取れないかも?
$issueIdOrKey = "XXX";
$api_urls = [];
// backlog全体で利用するAPI
$api_urls[] = "/api/v2/projects";
$api_urls[] = "/api/v2/users";
$api_urls[] = "/api/v2/space";
$api_urls[] = "/api/v2/issues";
$api_urls[] = "/api/v2/notifications";
$api_urls[] = "/api/v2/space/activities";
$api_urls[] = "/api/v2/space/diskUsage";
$api_urls[] = "/api/v2/rateLimit";
// // プロジェクト別で利用するAPI
$api_urls[] = "/api/v2/projects/:projectIdOrKey/activities";
$api_urls[] = "/api/v2/projects/:projectIdOrKey/users";
$api_urls[] = "/api/v2/projects/:projectIdOrKey/files/metadata/";
$api_urls[] = "/api/v2/wikis"; // リクエストパラメータが必須(配列じゃない単体)
// 課題別に利用するAPI(プロジェクトの指定は要らない)
$api_urls[] = "/api/v2/issues/:issueIdOrKey/comments";
$api_urls[] = "/api/v2/issues/:issueIdOrKey/participants";
$api_urls[] = "/api/v2/issues/:issueIdOrKey/attachments";
$api_urls[] = "/api/v2/issues/:issueIdOrKey/sharedFiles";
// ユーザ別に利用するAPI
$api_urls[] = "/api/v2/users/:userId/activities";
$api_urls[] = "/api/v2/users/:userId/watchings";
// ヘッダーの作成
$opts = array(
'http' => array(
'method' => "GET",
'header' => "Accept-language: ja\r\n"
)
);
// ストリームコンテキストを作成する
// ストリームの挙動を変えたり、 拡張したりすることのできるパラメータ と ラッパー固有の オプション
// ストリームはクライアント−サーバー間を結ぶ仮想的なコネクションのようなもの
$context = stream_context_create($opts);
foreach ($api_urls as $api_url) {
// urlパラメータ部分を置換して、urlを生成する
$api_url = str_replace(":projectIdOrKey", $projectIdOrKey, $api_url);
$api_url = str_replace(":issueIdOrKey", $issueIdOrKey, $api_url);
$api_url = str_replace(":userId", $userId, $api_url);
// パラメータを設定(apikeyは必ず必要、APIに応じて追加していく)
$params = array(
'apiKey' => $api_key,
);
// リスエストパラメータの設定(追加)
if ($api_url == "/api/v2/wikis") {
$params['projectIdOrKey'] = $projectIdOrKey;
}
// APIのURLの生成、?形式になる
$url = $backlog_url . $api_url . "?" . http_build_query($params);
// file_get_contentsで取得する場合
$result = file_get_contents($url, false, $context);
// curlで取得する場合
// $result = curl_get($url);
// jsonをphpの配列に変換(引数trueで配列、falseでオブジェクト)
$arr = json_decode($result, true);
print_r($arr);
exit;
}
exit;
/**
* パラメータに配列を渡す場合
*/
$projectIds = [];
$projectIds[] = 1;
$projectIds[] = 2;
$params = array(
'apiKey' => $api_key,
'projectId' => $projectIds
);
/**
* 更新分の取得(idを使う、mixのidから100件取得)
* 処理済のidがわかっていれば、それ以降のidを取得する
*/
$params = array(
'apiKey' => $api_key,
'minId' => 1000,
'count' => 100,
'order' => 'asc'
);
/**
* 更新分の取得(日付のパラメータを使う)
*/
for ($d = new DateTime(); $d <= new DateTime(); $d->modify('+1 day')) {
$strdate = $d->format('Y-m-d');
$updatedSince = date("Y-m-d", strtotime($strdate));
$updatedUntil = date("Y-m-d", strtotime($strdate));
// パラメータをセット
$params = array(
'apiKey' => $api_key,
'projectId[0]' => $projectId,
'count' => 100,
'sort' => 'updated',
'order' => 'desc',
'updatedSince' => date("Y-m-d", strtotime($updatedSince)),
'updatedUntil' => date("Y-m-d", strtotime($updatedUntil)) //実際の期限日より+1日しないと取れない
);
}
exit;
/**
* curlで取得する場合
*/
function curl_get($url)
{
// getの場合は、生成したurlを受け取って、投げるだけ
$header = [
// "Content-Type: application/json",
// "Accept: application/json",
// "Authorization: Bearer HogeHoge"
];
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); // 証明書の検証を無効化
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE); // 証明書の検証を無効化
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 返り値を文字列に変更
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
$result = curl_exec($curl);
// エラーハンドリング用
$err = curl_errno($curl);
// コネクションを閉じる
curl_close($curl);
return $result;
}
/**
* file_get_contentsとPOSTで更新する場合
*/
function post_file_get_contents($id)
{
// backlogの更新(POSTで実行する)
$api_key = "XXX";
$api_url = "xxx";
$opts = array(
'http' => array(
'method' => "POST",
'header' => "Accept-language: ja\r\n"
)
);
$context = stream_context_create($opts);
$params = array(
'apiKey' => $api_key
);
// APIのURLを構築する
$url = $api_url . http_build_query($params);
// API実行
$result = file_get_contents($url, false, $context);
}