Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新(準備中)

Feb 9, 2021 - コメント - 日記

n8nのSlackノードへのプルリクエスト

n8n(Nodenamtion)でSlackを使ったアプリを作っていてどうしても欲しい機能があったので追加してのプルリクエストを投稿しました。

Add chat.getPermalink interface in Slack Nodes. #1366

現在は、マージされリリースされています。 このPRは、Slackのメッセージに対しパーマリンクを得るためのAPIchat.getPermalink を呼び出すためのものです。

変更したのは以下のファイルです

  • packages/nodes-base/nodes/Slack/MessageDescription.ts
  • packages/nodes-base/nodes/Slack/Slack.node.ts

順番に解説します

packages/nodes-base/nodes/Slack/MessageDescription.ts

SlackノードはたくさんのSlackAPIを既にサポートしており、リソースとして分類されています。 利用にあたってはまずこのリソースから一つ選択する必要があります。

今回、扱うリソースはMessageです。このメッセージについてn8nのノード設定画面にあらわれる項目を構成するファイルがMessageDescription.tsです。tsファイルの中身はmessageOperationsmessageFieldsのハッシュになっていてここに設定項目を定義していく感じです。

messageOperationsにはOperationメニューの項目を以下のように設定し

1
2
3
4
5
{
    name: 'GetPermalink',
    value: 'getPermalink',
    description: 'Get Permanent Link of a message',
},

このようになります。

messageFieldsには個別の設定内容を以下のように設定します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
	{
		displayName: 'Channel',
		name: 'channelId',
		type: 'options',
		typeOptions: {
			loadOptionsMethod: 'getChannels',
		},
		required: true,
		default: '',
		displayOptions: {
			show: {
				resource: [
					'message',
				],
				operation: [
					'getPermalink',
				],
			},
		},
		description: 'Channel containing the message to be updated.',
	},
	{
		displayName: 'TS',
		name: 'messageTs',
		type: 'string',
		required: true,
		default: '',
		displayOptions: {
			show: {
				resource: [
					'message',
				],
				operation: [
					'getPermalink',
				],
			},
		},
		description: `Timestamp of the message to get permanent link.`,
	},

Slack API chat.getPermalink が要求する、ChannelとTimeStamp(TS)の入力フォームが定義されます。以下のようになります。

ちょっと長いですが、内容は難しくないと思います。

packages/nodes-base/nodes/Slack/Slack.node.ts

次に実際の処理の部分をSlack.node.tsに書きます。SlackのAPIを呼び出す処理を以下のように実装しました。

1
2
3
4
5
6
if (operation === 'getPermalink') {
    const channel = this.getNodeParameter('channelId', i) as string;
    const ts = this.getNodeParameter('messageTs', i) as string;
    const qs = { channel: channel, message_ts: ts };
    responseData = await slackApiRequest.call(this, 'GET', '/chat.getPermalink', {}, qs);
}

これだけ書くとわかりにくい部分もあるのですが、前後の似たようなコードを探すと割と簡単に実装が完了します。こういった拡張が自分でできるのはn8nのメリットですね。