UiPath Developer Community 第10回ワークショップ 覚え書き。。OrchestratorのWebhook連携、ほか。

[UiPath Developer Community 第10回ワークショップ](https://www.uipath.com/ja/resources/knowledge-base/tag/japan-developer-community) で聞いてきた内容の覚え書き。。

さあ、第10回です。前回「次回からは広い場所で」との宣言どおり、今回はSPACESあらため、サンケイビルのホールです。。。会場が広いからか、なんだかUiPathの中のヒトたちも緊張しています。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/85cb8084-9ed7-8c15-e8de-63c2f52b453b.png)


今回のトピックは、OrchestratorのWebhook機能の紹介と、2019年のリリース計画、あとは字幕アクティビティです。

### OrchestratorのWebhook連携

https://orchestrator.uipath.com/lang-ja/docs/about-webhooks
コレです。

Orchestrator上のイベント(ロボの登録・更新・削除とか、ジョブのアベンドとか。。) をトリガーに、設定したWEB APIへのPOSTを行ってくれる機能。Orchestratorの画面では、POST先のURLの指定と、どのイベントに反応するか、あとは署名をするための共通鍵(キャプチャの「シークレット」)の設定を行うようになってます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/c0ee3700-a2d2-8936-cf2b-3ce1c3b6d483.png)


署名ってのは、OrchestratorのWebhookリクエストはHTTPリクエストのBody部を共通鍵で署名した値を x-uipath-signature ヘッダにつけて送ってくる仕様になっています。なので受ける側は、その共通鍵でHTTPのBody部をハッシュして署名と突合することで、正規のOrchestratorからのリクエストであることを判定することができます。


デモでは IFTTTみたいなサービスの [Zapier](https://zapier.com/) を使ってSlack連携してました。が、たぶんZapierやIFTTTだと署名の検証が出来ない気がするので、、、たとえばFirebase Functionsなどでやってみるとこんな感じになりそうです。

```typescript:index.ts

import * as functions from 'firebase-functions'
import * as request from 'request'
import { createHmac } from 'crypto'

const headerName = 'x-uipath-signature'

export const uipath_webhook = functions.https.onRequest((req, res) => {
  //   console.log(req.header(headerName))
  //   console.log(req.headers['content-type'])

  // console.log(req.header('X-Orchestrator-Signature'))
  // 署名検証メソッド。Orchestratorの画面で設定した「シークレット」(共通鍵) を使って、
  // HTTPリクエストのBody部を署名した情報が、ヘッダ x-uipath-signature で渡ってくる。
  // なのでその署名を検証すれば、送信元の正当性(Orchのシークレットをしっているヒト)を確認できる
  const isValidRequest = (_req, secret) => {
    const actualSignature = _req.header(headerName)
    return (
      actualSignature == null ||
      createHmac('sha256', secret)
        .update(_req.rawBody)
        .digest('base64') === actualSignature
    )
  }

  let message = {}
  let status = 200
  if (isValidRequest(req, 'abcde')) { // ← 画面で設定した共通鍵
    message = JSON.stringify(req.body) + req.header(headerName)
  } else {
    message =
      '不正なリクエスト。:' + JSON.stringify(req.body) + req.header(headerName)
    status = 401
    // 本来なら、Slack送信しない
  }

  const option = {
    url:
      'https://hooks.slack.com/services/xxxxx',
    method: 'POST',
    headers: {
      'content-type': 'application/json'
    },
    json: {
      text: message
    }
  }

  request(option, (error, response, body) => {
    res.status(status).send('ok')
  })
})
```


[Cloud Functions for Firebase をつかってみる。](https://qiita.com/masatomix/items/ee1d7d162c8f1c25df7a) でセットアップしたFunctions のindex.tsを上記に差し替えてデプロイすると、Firebase Functions上に、UiPath OrchestratorのWebhookをうけるサーバを構築できます。

あ、ライブラリは下記のようにインストールしてデプロイしてください。

```bash
$ cd functions
$ npm install --save request crypto
```

ちなみに上記のサイト https://orchestrator.uipath.com/lang-ja/docs/about-webhooks には ヘッダが X-Orchestrator-Signature だとかの記述があったりしますが、たぶん間違ってるのでご注意ください。

**-- 2019/07/03追記--**
今見たら、ヘッダの記述なおってますね。。
**-- 2019/07/03追記 以上 --**


### リリースの考え方

詳細は省略。

2018年は年末ギリギリに突如LTS版がリリースされてザワつきましたが、、今回は、ロードマップを公開します、と。
今年は 4/15,10/21 の2回で、2回目の10/21がLTSになるんだそうです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/588f8cdd-02ac-29fe-f4b0-072ab6551735.png)


### 字幕アクティビティ

お客様にデモする機会がちょくちょくありますが、字幕を表示できるとデモが何かと楽になりそうです。。[UiPath Go](https://go.uipath.com/component/subtitle-activity)からダウンロード出来るようです。。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/fce26bb6-4e92-50b0-6dea-6793a361f670.png)


### ノベルティ

今回のノベルティは、エナジードリンクとステッカーでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/73777/d3dd805b-d407-1c56-2589-a31d46299d9c.png)


おつかれさまでした。。


### 関連リンク

- [UiPath Developer Community 第10回ワークショップ 覚え書き。。OrchestratorのWebhook連携、ほか。](https://qiita.com/masatomix/items/90393bdbb7824c551106) 本記事
- [UiPath Developer Community 第9回ワークショップ 覚え書き「Error Handling」や「Floating Robot」。](https://qiita.com/masatomix/items/38adb155327d287e4248)
- [UiPath Developer Community 第8回ワークショップ 覚え書き「カスタムアクティビティの、デバッガによるデバッグ方法について」](https://qiita.com/masatomix/items/d38226f52cff23454db4)
- [UiPath Developer Community 第7回ワークショップ 覚え書き「カスタム入力アクティビティ」](https://qiita.com/masatomix/items/2d6ac698ce14dd1e3324)
- [UiPath Developer Community 第6回ワークショップ 覚え書き「出現するタイミングが不定のポップアップを処理する」](https://qiita.com/masatomix/items/72422148ea8353662eb1)