前提
社内の数名で米を炊いて中食をしています。
炊飯や後片付けを忘れないようにチャットワークのタスクで管理・共有しています。
ただ、次の人のタスクを追加するという作業が毎回面倒なので、自動化できないかAPI仕様を探って実現しました。
実現方法
社内イントラ内にウェブページとして設置。
各メンバーはチャットワークのAPIトークンを取得したら、それをウェブページから入力した上で、タスクを追加する対象の人を選択してボタンを押す(それって結局手動ではないのか?という議論もあると思いますが、自分の当日のタスクを終えてから次の人にバトンを渡す行為を重視しています)。
ソース
okome.php
<?php
/*
お米班ツール
チャットワークでタスクを追加するページ
*/
// チャットルーム設定
$room_id = '21232196';
// 一度入力したAPIトークンは30日間有効にする
if (!empty($_COOKIE['okome'])) {
session_id($_COOKIE['okome']);
}
session_start();
if ($_POST['submit_token']) {
$_SESSION['chatwork_token'] = $_POST['token'];
session_regenerate_id();
setcookie('okome', session_id(), strtotime( '+30 days' ));
}
if (empty($_SESSION['chatwork_token'])) {
$login = false;
} else {
// APIトークンを元に自分の情報を取得
$header = array(
"Content-Type: application/x-www-form-urlencoded",
"X-ChatWorkToken: " . $_SESSION['chatwork_token'],
);
$context = array(
"http" => array(
"method" => "GET",
"header" => implode("\r\n", $header),
)
);
$json = file_get_contents('https://api.chatwork.com/v1/me', false, stream_context_create($context));
if (empty($json)) {
$login = false;
} else {
$mydata = json_decode($json, true);
if (!empty($mydata) && !empty($mydata['name'])) {
$login = true;
// member一覧を取得
$room_json = file_get_contents('https://api.chatwork.com/v1/rooms/'. $room_id .'/members', false, stream_context_create($context));
$members_data = json_decode($room_json, true);
} else {
$login = false;
}
}
}
if (!$login) {
// APIトークン入力がない or 自分自身の情報を取得できない場合はログイン画面を表示して終了
?>
<html><body>
APIトークンを入力してください。<br />
<form method="POST" action="okome.php">
<input name="token" type="text" /> <input type="submit" name="submit_token" value="送信" />
</form>
</body></html>
<?php
exit;
}
if ($_POST['submit']) {
// タスク追加実行ボタンが押されたらリクエストする
add_chatwork_task($_POST['date'], $_POST['to_id'], $room_id, $_SESSION['chatwork_token']);
}
?>
<html>
<head>
<link rel="stylesheet" href="//code.jquery.com/ui/1.11.2/themes/smoothness/jquery-ui.css">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.11.2/jquery-ui.min.js"></script>
<script type="text/javascript">//<![CDATA[
$(window).load(function(){
jQuery(function($) {
$(".datepicker").datepicker({ dateFormat: 'yy-mm-dd', minDate: new Date() });
});
});//]]>
</script>
</head>
<body>
<h1>お米班 タスク追加</h1>
<h2><?php echo $mydata['name']; ?>さん</h2>
<form method="POST" action="okome.php">
<dl>
<dt>日付:</dt>
<dd>
<input class="datepicker" type="text" name="date" /> (未入力の場合は翌平日)
</dd>
<dt>メンバー:</dt>
<dd>
<select name="to_id">
<?php foreach($members_data as $members): ?>
<option value="<?php echo $members['account_id']; ?>"><?php echo $members['name']; ?></option>
<?php endforeach; ?>
</select>
</dd>
</dl>
<input type="submit" name="submit" value="追加する" />
</form>
<?php
if ($_POST['submit']) {
echo '<p>タスク追加のリクエストを行いました。</p>';
}
?>
</body>
</html>
<?php // 以降、関数のみ
/*
規定のタスクを、入力されたroom_id で to_id の人に対して作成する。
*/
function add_chatwork_task($date = NULL, $to_id = 1111111, $room_id = 9999999999, $api_token = "abababababa")
{
$url = 'https://api.chatwork.com/v1/rooms/' . $room_id . '/tasks';
if (empty($date)) {
$time = strtotime("next weekday");
} else {
$time = strtotime($date);
}
// POSTデータ
$data_set = array(
array(
"body" => "11時までに炊飯セット",
"limit" => $time,
"to_ids" => $to_id,
),
array(
"body" => "14時以降、余りの飯を何とかして釜を洗う",
"limit" => $time,
"to_ids" => $to_id,
),
array(
"body" => "次の人のタスクを追加",
"limit" => $time,
"to_ids" => $to_id,
),
);
foreach ($data_set as $data) {
$data = http_build_query($data, "", "&");
// header
$header = array(
"Content-Type: application/x-www-form-urlencoded",
"Content-Length: ".strlen($data),
"X-ChatWorkToken: " . $api_token,
);
$context = array(
"http" => array(
"method" => "POST",
"header" => implode("\r\n", $header),
"content" => $data
)
);
$result = file_get_contents($url, false, stream_context_create($context));
}
return $result; // 特に戻す意味無いけど
}
課題
メンバー一覧がHTML内にベタ書きなので、これもAPIから一覧を取得する。 veryblue様に修正していただきました。