LoginSignup
4
0

More than 5 years have passed since last update.

Backlogの更新通知をPharoで受けてChatWorkに整形して流す

Last updated at Posted at 2016-12-25

Backlogの更新通知をChatWorkに流します。

BacklogのWebhookに関する説明です。URLを指定すると、更新時、そこにJSONをPostしてくれます。
http://www.backlog.jp/help/adminsguide/webhook-setting/userguide2493.html

ここではこの通知をPharoで受けて、ChatWorkに投稿します。
Web系のサービスの連携をサポートするサービスや事例はいろいろありますが、まぁ自前でやります。

参考する過去記事

Pharoの準備

この辺から環境に応じてPharoを入手、インストールしてください。
http://pharo.org/download

Pharoへの使用するライブラリ導入

以下のスクリプトをPharoのWorkspace等でdoItして必要なライブラリを導入します。
Pharo5であれば、HTTPサーバはデフォルト導入済みです。

"テンプレートエンジン Mustache"
Gofer new
    smalltalkhubUser: 'NorbertHartl' project: 'Mustache';
    configuration;
    loadStable.

"JSON操作ライブラリ Neo-JSON"
Gofer new
 url: 'http://mc.stfx.eu/Neo';
package: 'Neo-JSON-Core';
load.

"マイクロウェブフレームワーク Teapot"
Gofer it
    smalltalkhubUser: 'zeroflag' project: 'Teapot';
    configuration;
    loadStable.

"ChatWorkAPIクライアント ChatWork4S"
Gofer new smalltalkhubUser: 'kaminami'
    project: 'ChatWork4S';
    package: 'ChatWork4S';
    load.

BacklogでWebhookをテスト実行した際に送信されるJSON

実際はもう少し値が埋まって来ます。
必要な部分だけ抜き出して使用します。


{
    "id": 3153,
    "project": {
        "id": 92,
        "projectKey": "SUB",
        "name": "SUBTASK",
        "chartEnabled": true,
        "subtaskingEnabled": true,
        "projectLeaderCanEditProjectLeader": false,
        "textFormattingRule": null,
        "archived": false,
        "displayOrder": 0
    },
    "type": 2,
    "content": {
        "id": 4809,
        "key_id": 121,
        "summary": "COMMENT",
        "description": "",
        "comment": {
            "id": 7237,
            "content": ""
        },
        "changes": [
            {
                "field": "milestone",
                "new_value": "R2014-07-23",
                "old_value": "",
                "type": "standard"
            },
            {
                "field": "status",
                "new_value": "4",
                "old_value": "1",
                "type": "standard"
            }
        ]
    },
    "notifications": [
        {
            "id": 25,
            "alreadyRead": false,
            "reason": 2,
            "user": {
                "id": 5686,
                "userId": "takada",
                "name": "takada",
                "roleType": 2,
                "lang": "ja",
                "mailAddress": "takada@nulab.example"
            }
            "resourceAlreadyRead":false
        },
    ],
    "createdUser": {
        "id": 1,
        "userId": "admin",
        "name": "admin",
        "roleType": 1,
        "lang": "ja",
        "mailAddress": "eguchi@nulab.example"
    },
    "created": "2013-12-27T07:50:44Z"
}

Backlogから受けた通知をChatWorkへ整形して送信

以下、最小限の実装です。
本当に運用する場合はもう少しクラスを分けて、テンプレートはファイルに分けて、Teapotインスタンスもクラスインスタンス変数かシングルトンにバインドしましょう。

WorkspaceでdoItした状態でImageを保存しておくと、他所の環境でPharoを起動させた際、サービスが起動した状態で起ち上がります。
手抜きしたい場合には便利です。

| teapot templateSrc template |

templateSrc := '
Backlogが更新されました
https://YOUR_PROJECT.backlog.jp/view/{{projectKey}}-{{contentKeyId}}

[info][title]{{projectName}}: {{summary}}[/title]
{{description}}
[/info]
'.

template := MustacheTemplate on: templateSrc.


Teapot stopAll.
teapot := Teapot configure: {
    #port -> 8888.
}.

teapot
    POST: '/webhook/backlog' -> [:req | 
        | json client message |
        json := NeoJSONObject fromString: req contents.

        message := template value: { 
            'projectKey' -> json project projectKey.
            'projectName' -> json project name.
            'contentKeyId' -> json content key_id.
            'summary' -> json content summary.
            'description' -> json content description.
        } asDictionary.


        client := CWClient token: 'YOUR_CHATWORK_TOKEN'.
        client 
            sendMessage: message
            to: 'YOUR_CHATWORK_ROOM_ID'.


        TeaResponse ok];
    start.

teapot inspect.

おわりに

BacklogでWebhookをテスト実行したり、実際に課題を更新したりすると、ChatWorkに枠付きメッセージが投稿される、はずです。
ChatWorkはユーザ名のなりすましができないので、更新通知だけに使用するアカウントをとって運用したほうがよいですね。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0