Slack->Notion 서비스를 만들어 보았습니다.

24955 단어 LaravelPHPtech

개요


https://peer-quest.connpass.com/event/241196/
https://docs.google.com/presentation/d/1jQAVqMSoIRhWCdbuXKOb62Od5qH1tEaElOYKt_RsCR0/edit?usp=sharing
상술한 활동에 관하여 슬라이드에서 말한 일은 상세한 설명이 없다고 생각합니다. 제가 설명해 드리겠습니다.

만든 물건의 데모


demo

Slack Interactive Components 이야기


도대체 무엇을 해야 하는지, 문자에 단축키를 추가하면 바로 조작할 수 있다!
다음과 같이 설정할 수 있습니다:!
slack-interactive-componentsの設定画面
slack-interactive-componentsの詳細の設定画面
slack-interactive-componentsの導入後の画面の変更点

Slack에서 자체 제작한 API에서 POST에 대한 내용


샘플은 아래와 같다.
slack-interactive-componentsの元となるメッセージ
↑ 이쪽 내용을 보내면 ↓ 같은 값을 보낸다.
{
	"team": {
		"id": "Tから始まるワークスペースのID",
		"domain": "domainの設定が入ってくる"
	},
	"type": "message_action",
	"user": {
		"id": "UからはじまるユーザーのID",
		"name": "ohki_suguru",
		"team_id": "Tから始まるワークスペースのID",
		"username": "ohki_suguru"
	},
	"token": "tokenが入ります",
	"channel": {
		"id": "Cから始まるチャンネルID",
		"name": "times-ohki"
	},
	"message": {
		"ts": "1650451183.630089",
		"text": "Notion General Managerさん!!!(ガクブルガクブル)",
		"type": "message",
		"user": "UからはじまるユーザーのID",
		"files": [
			{
				"id": "F03C66ARCP5",
				"mode": "hosted",
				"name": "スクリーンショット 2022-04-20 19.36.14.png",
				"size": 14957,
				"user": "Uから始まるユーザーID",
				"title": "スクリーンショット 2022-04-20 19.36.14.png",
				"created": 1650451165,
				"editable": false,
				"filetype": "png",
				"mimetype": "image/png",
				"thumb_64": "https://files.slack.com/files-tmb/T02DLS9291T-F03C66ARCP5-2c0973562a/____________________________2022-04-20_19.36.14_64.png",
				"thumb_80": "https://files.slack.com/files-tmb/T02DLS9291T-F03C66ARCP5-2c0973562a/____________________________2022-04-20_19.36.14_80.png",
				"username": "",
				"is_public": true,
				"permalink": "https://[ドメイン].slack.com/files/U02EDFNLYCQ/F03C66ARCP5/____________________________2022-04-20_19.36.14.png",
				"thumb_160": "https://files.slack.com/files-tmb/T02DLS9291T-F03C66ARCP5-2c0973562a/____________________________2022-04-20_19.36.14_160.png",
				"thumb_360": "https://files.slack.com/files-tmb/T02DLS9291T-F03C66ARCP5-2c0973562a/____________________________2022-04-20_19.36.14_360.png",
				"thumb_480": "https://files.slack.com/files-tmb/T02DLS9291T-F03C66ARCP5-2c0973562a/____________________________2022-04-20_19.36.14_480.png",
				"timestamp": 1650451165,
				"is_starred": false,
				"original_h": 92,
				"original_w": 572,
				"thumb_tiny": "AwAHADChGyg/MqnjHOabtX++PyNNooAdtH98fkaNo/vj8jTaKAFwP71GBj71JRQB/9k=",
				"is_external": false,
				"pretty_type": "PNG",
				"thumb_360_h": 58,
				"thumb_360_w": 360,
				"thumb_480_h": 77,
				"thumb_480_w": 480,
				"url_private": "https://files.slack.com/files-pri/T02DLS9291T-F03C66ARCP5/____________________________2022-04-20_19.36.14.png",
				"external_type": "",
				"display_as_bot": false,
				"has_rich_preview": false,
				"permalink_public": "https://slack-files.com/T02DLS9291T-F03C66ARCP5-fe91137596",
				"public_url_shared": false,
				"media_display_type": "unknown",
				"url_private_download": "https://files.slack.com/files-pri/T02DLS9291T-F03C66ARCP5/download/____________________________2022-04-20_19.36.14.png"
			}
		],
		"blocks": [
			{
				"type": "rich_text",
				"block_id": "SLEP",
				"elements": [
					{
						"type": "rich_text_section",
						"elements": [
							{
								"text": "Notion General Managerさん!!!(ガクブルガクブル)",
								"type": "text"
							}
						]
					}
				]
			}
		],
		"upload": false,
		"client_msg_id": "c4c704cd-6de9-49b9-bab5-a44aa554aaf7",
		"display_as_bot": false
	},
	"action_ts": "1650453439.118171",
	"enterprise": null,
	"message_ts": "1650451183.630089",
	"trigger_id": "3414357278642.2462893077061.a63cf586f5807cd022be2e7be9d238e2",
	"callback_id": "add_notion_task",
	"response_url": "https://hooks.slack.com/app/[チームのID]/3426975843201/adqZATalle4XYMtVYhHiVkGE",
	"is_enterprise_install": false
}
response_url에 POST를 보내면 결과가 잘 나오는지 메시지를 보낼 수 있습니다!
↓ 그렇지!
slack-interactive-componentsの元となるメッセージ

API 공동 작업 정보

  • Slack의 Interactive Components에서 실현된 API로 발송
  • API를 통해 값을 받은 후 전송된 JSON 지우기
  • 사전 등록된 Notion 데이터 베이스에 POST https://api.notion.com/v1/pages 2 값 보내기
  • 이번과 관련해 라벨로 실시됐지만, 정식 SDK는 없었다.
    따라서 3에 대해서는 공식 문서에 따라 다음과 같이 발송하였다.
    대상 열과 일치하는 열 이름 '작업 이름' 의 이름을 지정하거나, 보낼 때 다른 열의 값을 더 지정하려면 지정하십시오!
    Notion용 POST
        private function savingNotionTask(string $channelId, string $message, string $databaseId)
        {
            $client = new \GuzzleHttp\Client();
            $NOTION_API_KEY = env('NOTION_SECRET'); // NotionのAPIのキーを環境変数で入れています
            $body = '{
                "parent": { "database_id": "'.$databaseId.'" },
                "properties": {
                    "タスク名": { // ←ここがカラムのタイトルに当たります。
                        "title": [
                            {
                                "text": {
                                    "content": "'.$channelId.'-'.mb_substr(($message), 0, 30).'"
                                }
                            }
                        ]
                    }
                },
                "children": [ // このchildrenというのがデータベースのテーブルにおけるタイトルのページの中身になります!
                    {
                        "object": "block",
                        "type": "heading_2",
                        "heading_2": {
                            "rich_text": [{ "type": "text", "text": { "content": "Slackから追加されたタスク" } }]
                        }
                    },
                    {
                        "object": "block",
                        "type": "paragraph",
                        "paragraph": {
                            "rich_text": [
                                {
                                    "type": "text",
                                    "text": {
                                        "content": "'.str_replace("\n", "\\n", $message).'"
                                    }
                                }
                            ]
                        }
                    }
                ]
            }';
            $response = $client->request(
                'POST',
                'https://api.notion.com/v1/pages',
                [
                    'body' => $body,
                    'headers' => [
                      'Accept' => 'application/json',
                      'Authorization' => 'Bearer '.$NOTION_API_KEY,
                      'Content-Type' => 'application/json',
                      'Notion-Version' => '2022-02-22', // ここについては古いバージョンになっているとエラーとなって動作しません。非公式SDKがこの仕様の餌食となっていることがあります
                    ],
              ]
            );
        }
    
    목적지를 보내는 페이지는 아래와 같다!
    送信先となるNotionのデータベース
    그리고 보낸 칠드렌의 내용도 이렇게 저장됩니다!
    送信先となるNotionのデータベースのchildren

    좋은 웹페이지 즐겨찾기