毎年同じ時期にやらなければならない仕事があって、

その仕事を忘れないようにしておきたい。


できれば、


chatwork_top

チャットワーク(ChatWork) | ビジネスが加速するクラウド会議室


チャットワークのタスクとして登録しておきたい

という相談があった。

PHPでチャットワークAPIを介してメッセージを投稿してみる


kintone_logo

kintone - サイボウズのビジネスアプリ作成プラットフォーム


相談者は既にcybozeのkintoneを利用していたので、

タスクの登録はkintoneで、

kintoneと連携して指定の日にチャットワークにタスクを登録する

という流れで対応することになった。

kintoneで指定の個所だけ印刷範囲にしてみる


今回の記事では上記の要望に対応した時の作業をメモとして残す。




kintone_app_config


最初にkintone内で新規のアプリを作成して、

上のキャプチャのようにラベル、月と日のカラムを用意した。


月と日のカラムがタスクの登録日の日の指定で、

チャットワークに登録するタスクの内容はラベルになる。


次にkintoneのアプリのカスタマイズで、

指定の時間にJavaScriptのコードが実行出来るか?探してみたけれども見つからず…


というわけで、

Go言語でkintoneのREST APIを利用しデータを取り出して、

Go言語のコードでチャットワークに投稿するという流れを採用した。

kintone REST API一覧 – cybozu developer network


最初に知るべきことは、

Go言語でkintoneのREST APIを介してデータを取得出来るなので

実際にコードを書いてデータを取得してみた。




コードを書く前にkintoneのアプリ内でトークンを発行しておく必要がある。


諸々端折るが、


kintone_app_api


作成したアプリの設定にAPIの発行に関するページがあるので、

その画面でAPIを発行する。


APIの発行後、コードを書いてみた。

実際のコードは下記の通り


package main

import (
	"encoding/base64"
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

const (
	appId = "{kintoneのアプリのID}"
	token = "{kintoneのアプリ内で発行したAPIキー"
	id    = "{kintoneにログインするためのIDで上のAPIキーを発行したアカウントのもの}"
	pw    = "{上で指定したアカウント用のパスワード}"
)

func main() {
	// APIキーを作成した時にURLが指定される
	url := "https://********.cybozu.com/k/v1/records.json?app=" + appId + "&limit=100"
	req, err := http.NewRequest("GET", url, nil)
	if err != nil {
		log.Fatal(err)
	}

	req.Header.Add("Cybozu-API-Token", token)

	// REST APIを利用する時はIDとパスワードを:で繋いでBASE64したものが必要になる
	hash := base64.StdEncoding.EncodeToString([]byte(id + ":" + pw))
	req.Header.Add("X-Cybozu-Authorization", hash)
	res, err := http.DefaultClient.Do(req)
	if err != nil {
		log.Fatal(err)
	}
	defer res.Body.Close()

	body, err := ioutil.ReadAll(res.Body)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(string(body))
}

上記のコードを実行すると、下記のようなJSONのデータが返ってくる。

※一部省略


{
	"records": [
		{
			"レコード番号": {
				"type": "RECORD_NUMBER",
				"value": "3"
			},
			"month": {
				"type": "NUMBER",
				"value": "8"
			},
			"label": {
				"type": "SINGLE_LINE_TEXT",
				"value": "hogeラベル"
			},
			"$revision": {
				"type": "__REVISION__",
				"value": "1"
			},
			"day": {
				"type": "NUMBER",
				"value": "10"
			},
			"$id": {
				"type": "__ID__",
				"value": "3"
			}
		}, {
			"レコード番号": {
				"type": "RECORD_NUMBER",
				"value": "2"
			},
			"month": {
				"type": "NUMBER",
				"value": "7"
			},
			"label": {
				"type": "SINGLE_LINE_TEXT",
				"value": "○○のタスクを追加"
			},
			"$revision": {
				"type": "__REVISION__",
				"value": "3"
			},
			"day": {
				"type": "NUMBER",
				"value": "18"
			},
			"$id": {
				"type": "__ID__",
				"value": "2"
			}
		}
	],
	"totalCount": null
}

今回はREST APIで返ってくるJSONのデータまで見たけれども、

Go言語でJSONのデータを扱う時は事前に構造体を設けておいて、その構造体にマッピングする必要がある。


これは次回に触れることにしよう。


- 続く -