Backlogの期限が切れる課題をSlackに通知する

こんにちは。おいかわです。
今回もBacklogです。Backlogには期限が切れる課題をメールで通知する機能がありますが、埋もれてしまい見なくなってしまいがちです。通知といえばSlackです!Slackならみんな見てくれるんです!今回はメンションも付けて名指ししてやります!

動作環境

前準備

  • BacklogアカウントとSlackアカウントは一致させておく必要があります。
  • BacklogAPIの使用に必要なAPIキーを取得しておきます。Backlogの個人設定→API→新しいAPIキーの発行 から取得できます。

f:id:h_oikawa2:20150915095308j:plain

スクリプトの実装

  
// slack通知クラス  
require "slack_util.php";
  
// 課題一覧の取得API
$base_url = "https://your-backlog-domain-name.backlog.jp/api/v2/issues?";  
$api_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  
$projectId = "1234";  
const STATUS_COMPLETE = 4;  


// パラメータをセット
$params = array(
    'apiKey' => $api_key,
    'projectId[0]' => $projectId,
    'dueDateSince' => date("Y-m-d"),
    'dueDateUntil' => date("Y-m-d", strtotime("+1 day")) //実際の期限日より+1日しないと取れない
    );

// APIのURLを構築する  
$url = $base_url.http_build_query($params);

// API実行  
$result = file_get_contents($url);

// 取得したJSONをデコード(オブジェクト形式)  
$issues = json_decode($result, false);

$slack = new SlackUtil();

$message = "下記の課題の期限が今日までですよ。完了させるか期限を延ばすか選ぶが良い。\n";

foreach($issues as $issue){
    if ($issue->{status}->{id} != STATUS_COMPLETE) {
    
        // 担当者が設定されていない場合は登録者へ通知する
        if (empty($issue->{assignee}->{userId})) {
            $message .= "<@".$issue->{createdUser}->{userId} . ">";
        } else {
            $message .= "<@".$issue->{assignee}->{userId} . ">";
        }
        $message .= ":bow:\n";
        $message .= $issue->{summary};

        $slack->send($message);
        $message = "";
    }
}

BacklogAPIを使って課題の検索、情報の取得を行っています。メンション付ける場合は<>で囲む必要がありますよ。

Slack通知クラスも公開します!(作ったのは弊社のおにぎりエンジニアです)

class SlackUtil {
    const CHANNLE_NAME = '#backlog-notify';
    const USER_NAME    = 'backlog-admin';
    const ICON         = ':golf:';
    const SLACK_TOKEN  = 'xxxxxxxxxxxxxxxxxx';

    public function send($message='', $channle=SELF::CHANNLE_NAME, $userName=SELF::USER_NAME, $icon=SELF::ICON, $token=SELF::SLACK_TOKEN) {
        $fields = array(
            'channel'   => $channle,
            'username'   => $userName,
            'icon_emoji' => $icon,
            'text'   => $message,
        );

        $payload = "payload=" . json_encode($fields);
        $url = 'https://your-slack-team.slack.com/services/hooks/incoming-webhook?token='.$token;
        $ch = curl_init();
        curl_setopt($ch,CURLOPT_URL, $url);
        curl_setopt($ch,CURLOPT_POST, count($fields));
        curl_setopt($ch,CURLOPT_POSTFIELDS, $payload);

        $result = curl_exec($ch);
        curl_close($ch);
    }
}

f:id:h_oikawa2:20150915091723p:plain
こんな感じで表示されます。

これでバーンダウンチャートも炎上しないで済みます!今回は期限を迎えた課題を1回だけお知らせするのですが、期限切れの課題を毎日通知し続けても良いかもしれませんね。