notion <-> Code 연결하기 (with golang)

Divan·2022년 10월 19일
2
post-custom-banner

우선 notion api키와 database id를 알아내는 찾는 방법을 확인하고,
notion database(table)의 payload를 parsing하는 하는 두가지 방식을 비교해 보겠습니다.
1. net/http 패키지만 사용하는 기본적인 방식.
2. go-notion을 이용한 좀 더 편리한 방식.


1.notion api key 생성하는 벙법.

https://developers.notion.com/로 접속 해주세요. view my integrations 선택

notion develop

새 api 통합 만들기 클릭
new

이름을 작성하고 워크스페이스를 선택해주세요.

시크릿 키를 확인 가능합니다.

secret_XXXXXX 형태로 생성 된다.


2.Database Id 가져오기

우선 페이지에 연결 추가를 하세요. 위에서 api key를 생성시에 입력했던 이름이 있습니다.

데이터테이블을 생성한 다음에 보기 링크 복사를 선택하세요.

복사하면 주소가 다음가 같이 보입니다. 여기서 "68ffe73727df4cb2a1940235495ef480"이 database id 입니다.

https://www.notion.so/68ffe73727df4cb2a1940235495ef480?v=XXXXXXXXXXX

3. 목표

아래의 Notion의 표(database)를 코드로 읽어보기


4.기본방식으로 Payload parsing

net/http만을 사용하는 방식은 가장 기본적인 방법으로 여타의 api를 사용하더라고 이와 비슷한 방식으로 사용할수 있습니다.

	apiKey := "<api_sceret_key>"
	databaseId := "<database_id>"

	payload := strings.NewReader(`{
		<<here for query>>
	}`)
	req, _ := http.NewRequest("POST", url, payload)
	req.Header.Add("accept", "application/json")
	req.Header.Add("Notion-Version", "2022-06-28")
	req.Header.Add("content-type", "application/json")
	req.Header.Add("authorization", fmt.Sprint("Bearer ", apiKey))

	res, _ := http.DefaultClient.Do(req)
	defer res.Body.Close()
	body, _ := ioutil.ReadAll(res.Body)
	var result map[string]interface{}
	json.Unmarshal(body, &result)
	if result["object"] == "error" {
		fmt.Printf("Returned Error [%v]: %s\n", result["status"], result["message"])
	}

	for _, entry := range result["results"].([]interface{}) {
		properties := entry.(map[string]interface{})["properties"].(map[string]interface{})
		name := parseNotionRichText(properties["name"].(map[string]interface{})["title"].([]interface{}))
		tag := properties["tag"].(map[string]interface{})["select"].(map[string]interface{})["name"].(string)

		fmt.Printf("(%s), %s\n", name, tag)

	}
func parseNotionRichText(richText []interface{}) string {
	var text string
	for _, entry := range richText {
		text += entry.(map[string]interface{})["plain_text"].(string)
	}
	return text
}

5. go-notion을 이용하여 parsing

go-notion패키지는 api를 호출하고 structure가 payload에 맞추어 형성되어 있어 parsing하는데 수월 하고 코드를 간결하게 작성 가능 합니다.

	apiKey := "<api_sceret_key>"
	databaseId := "<database_id>"

	client := notion.NewClient(apiKey)

	page, err := client.QueryDatabase(context.Background(), databaseId, nil)
	if err != nil {
		panic(err)
	}

	for _, entity := range page.Results {
		row := entity.Properties.(notion.DatabasePageProperties)
		table := Table{name: row["name"], tag: row["tag"]}
		fmt.Printf("(%s), %s\n", table.name.Title[0].PlainText, table.tag.Select.Name)
	}

profile
하루 25분의 투자
post-custom-banner

0개의 댓글