backlog API サンプル PHP版

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);
            }