구글 북스에 특정 주제 관련 새 책이 나오면 저자에게 이메일 발송 (진행)

소개

저널을 만드는 워고편집인의 고민은 논문을 모집하는 일이다. 주기적으로 특정 주제의 신간이 나오는가를 검색하고 저장에게 메일을 보내야한다. 이일을 자동화하는것이 큰 도움이 된다

진행 방법

특정 주제의 신간을 차는데 구글스칼라를 이용하면 좋았겠지만 구글 스칼라는 n8n도구가 없어서 n8n 노드가 있는 구글books를 이용하기로 했다.

일단 챗GPT에 원하는 n8n 워크플로우를 묘사하고 노드를 알려달라고 했다.

n8n으로 구글 북스에 east asisian religion에 관한 새 책이 나오면 그 책의 volume을 가지고오는 node를 알려줘

먼저 주기적으로 검색하는 스케줄러, 구글북스를 불러오는 HTTPS를 알려주었다

이메일 보내는 과정을 보여주는 다이어그램

크레덴셜을 구글제미나이 API로 하고 크레덴셜문제는 없었는데

지피티가 알려준데로 하니

The service is receiving too many requests from you 라는 오류가 떳다

// 입력: HTTP Request의 응답(JSON) 구조를 그대로 받는다고 가정

const data = items[0].json; // Google Books API 응답

const list = (data.items || []);

// 워크플로우 전역 저장소

const store = $getWorkflowStaticData('global');

// 마지막 본 출간일 & 본 적 있는 ID 목록 로드

const lastDate = store.lastPublishedDate || ''; // 예: '2024-09-01'

const seenIds = new Set(store.seenIds || []);

// publishedDate 문자열을 Date로 안전 변환

function toDate(s) {

if (!s) return null;

// 형식이 'YYYY', 'YYYY-MM', 'YYYY-MM-DD' 등 다양함 → 유연 파싱

const parts = s.split('-').map(Number);

const y = parts[0], m = (parts[1] || 1) - 1, d = (parts[2] || 1);

return new Date(Date.UTC(y, m, d));

}

const last = lastDate ? toDate(lastDate) : null;

let maxDate = last; // 이번 실행에서 가장 최신 날짜

const fresh = [];

for (const it of list) {

const id = it.id;

const vi = it.volumeInfo || {};

const pdStr = vi.publishedDate || '';

const pd = toDate(pdStr);

// 새 항목 판정: (1) 출간일이 마지막보다 최신이거나, (2) 처음 보는 ID

const isNewByDate = last ? (pd && pd > last) : true;

const isNewById = !seenIds.has(id);

if (isNewByDate || isNewById) {

fresh.push({

json: {

id,

title: vi.title,

authors: vi.authors || [],

publishedDate: pdStr,

categories: vi.categories || [],

description: vi.description || '',

pageCount: vi.pageCount || null,

language: vi.language || '',

previewLink: vi.previewLink || '',

infoLink: vi.infoLink || '',

canonicalVolumeLink: vi.canonicalVolumeLink || '',

// 판매/가용정보

saleInfo: it.saleInfo || {},

accessInfo: it.accessInfo || {},

// 원문 Raw

raw: it

}

});

}

// 최대 출간일 갱신

if (pd && (!maxDate || pd > maxDate)) {

maxDate = pd;

}

// 본 ID 기록

seenIds.add(id);

}

// static data 업데이트

if (maxDate) {

// YYYY-MM-DD 로 저장

const iso = maxDate.toISOString().slice(0,10);

store.lastPublishedDate = iso;

}

store.seenIds = Array.from(seenIds);

// 출력: 새로 감지된 항목만

return fresh.length ? fresh : [];

에러를 수정하지는 못했지만

장기적으로 시도해 볼 예정이다.

자동화는 서두르지 않으면

장기적으로 고민하는 것이 해결될 실마리를 제공해준다

1
1개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요