네이버 카페에 올라온 게시글을 자동으로 airtable에 쌓아두기 (n8n 활용)

소개

저희 회사(영어 교육 관련)는 수강생들을 위해 네이버 카페를 운영하고 있어요!

여기서 수강생 분들은 자발적으로 또는 지피터스 같은 스터디에 참여하며 반(?)강제적으로 과제 인증 게시글을 올리시고는 합니다.

지금은 이 과제를 스터디장 분들이 일일이 체크하며 확인하고 있는데요,
이걸 자동화할 수는 없을까?라는 생각이 들었습니다.

꼭 스터디에서 쓰지 않더라도 자동적으로 데이터를 기록할 수 있다면
자발적으로 과제를 올리는 분들을 위한 대시보드를 만들어서 동기부여를 하거나
사내 메신저로 알림을 보내서 빠르게 반응을 해줄 수 있도록 하는 등의 방향으로 활용할 수 있을 것 같았어요.

그래서 만들게 되었는데 이것보다 더 효율적인 방법이 있을 것 같습니다..!
일단은 사례 공유차 작성해봅니다

==> (수정) 스터디 진행하면서 닿님이 훨씬 효율적인 방법을 알려주셨습니다 ㅎㅎㅎ 그 방법도 같이 작성해두겠습니다

[기존 ver.]

진행 방법

진행 순서를 먼저 요약하자면 다음과 같습니다

1) 네이버 카페 API 찾기

2) airtable을 원하는 대로 세팅하기

3) n8n을 통해 특정 게시판의 게시글을 airtable에 적재하기

4) airtable에서 빈칸 삭제하기

5) airtable에서 중복된 값 삭제하기

단계별로 자세히 설명드리겠습니다!

STEP 1: 네이버 카페 API 찾기

처음에는 네이버 카페의 html을 가지고 크롤링을 하려고 했습니다만... 잘 안 되더라고요 ㅠ0ㅠ

한참 씨름을 하다가 일반인도 네이버 카페 API에 접근이 가능하다는 것을 알게되었습니다!

GPT가 알려줬던 것 같은데 그때 오류가 계속 발생했어서 그런지... 기록이 안 보이네요

API 찾는 법은 다음과 같습니다

1) 모바일 카페 사이트로 접속하기

  • m.cafe.naver.com~ 로 시작하는 링크입니다

  • 크롤링 하고 싶은 게시판으로 들어가주세요
    (아마 전체 게시글도 가능하긴 할 거예요! 저는 특정 게시판의 글만 모으고 싶어서 게시판으로 들어갔습니다)

  • PC에서도 가능하긴 할텐데 PC는 UI가 더 복잡하고, 모바일에서는 게시글 리스트가 잘 보여서 모바일 버전 웹사이트로 들어갔습니다

2) 마우스 우클릭 > [검사] 클릭

인터넷 탐색

3) [Network] 클릭

Adobe Premiere Pro CS6- Adobe Premiere Pro에서 비디오 편집 방법

4) 필터에서 [fetch/XHR] 선택

Adobe Adobe Adobe Adobe의 오디오 트랙의 스크린 샷 a

5) 기존의 카페 사이트에서 새로고침

6) ArticleList~로 되어있는 거 클릭 후 Request URL 복사하기

Adobe Adobe Adobe Adobe Adobe의 스크린 샷
  • Request URL을 붙여넣기 해 보시면 까만 배경과 흰 글이 잔뜩 보일텐데요...
    이게 제대로 된 게 맞는지 확인하려면 한번 여기서 게시글 제목이나 유저 이름을 검색해보세요!
    subject/writerNickname으로 보일 거예요

STEP 2: airtable을 원하는 대로 세팅하기

다양한 유형의 데이터를 보여주는 스프레드 시트의 스크린 샷

저는 위와 같이 세팅했습니다

  • articleID

    • 네이버 API에서 내려주는 게시글의 ID입니다

    • 글 자체의 url은 api에서 안 내려주는데,
      어차피 이 값을 알면 해당 게시글로 이동 시킬 수 있어서 패스했습니다!

    • 참고로 이런 아이디처럼 숫자로만 나온 값은 Number로 생성해줘야 문제가 안 생기더라고요

  • subject

    • 네이버 API에서 내려주는 게시글의 제목입니다

  • memberKey

    • 네이버 API에서 내려주는 유저의 고유한 key값입니다

    • 이게 제가 알기로는 닉네임이 바뀌어도 안 바뀌는 값으로 알고 있어요

    • 다른 카페에서도 이 값은 동일할 것 같긴 한데... 확실히는 모르겠습니다!

  • writerNickname

    • 네이버 API에서 내려주는 유저의 닉네임입니다

  • writeDateTimestamp

    • 네이버 API에서 내려주는 게시글 업로드 시간입니다

    • 이 값은 timestamp로 나오고 저희가 아는 날짜 방식으로 안 나오기 떄문에 dateTime 행을 따로 만들었습니다

  • dateTime

    • writeDateTimestamp을 YYYY-MM-DD HH:MM 형식으로 바꿔주기 위한 열입니다

    • Fomula로 만들고 아래와 같이 식을 써줬습니다 (GPT야 고마워!)

      웹 페이지에서 공식 필드의 스크린 샷
    • 날짜 포맷과 타임존은 Formatting에서 설정해줬습니다
      (Fomula에서 입력해놓긴 했지만 실제로 작동하는 건진 모르겠습니다 ㅋㅋㅋㅋ)

      Google 캘린더에서 시간대 설정의 스크린 샷
  • Created

    • 이 데이터가 생성된 시간을 보여주는 열입니다

  • original

    • STEP 4에서 자세히 설명드리겠지만... 그냥 쌓기만 하면 여러 데이터들이 중복되는 문제가 발생합니다!
      그래서 추후 중복 항목을 없애고 1개만 남기는 과정을 위해 만들어둔 행입니다

STEP 3: n8n을 통해 특정 게시판의 게시글을 airtable에 적재하기

우선 제가 구성한 n8n 노드를 보여드릴게요

앱의 흐름을 보여주는 다이어그램

이렇게까지 길 필요는 없을 것 같은데.... ㅠ

제가 n8n 초보라 압축하지 못하고 누덕누덕하게 붙여놨습니다

그래도 게시글 정보를 적제하는 거 자체는 쉽습니다!

첫째줄에 있는 4개의 노드면 충분해요

1) Schedule Trigger

  • 게시글이 올라올 때마다 바로바로 쌓이면 좋겠지만... 네이버 카페 자체에 신호를 보내줄 수 있는 기능은 없다보니 어쩔 수 없이 몇 시간에 한 번씩 trigger 되도록 설정해주었습니다

2) cafe crawling

  • 이건 제가 구분을 위해 지은 이름이고요, 노드 찾으실 땐 'HTTP Request'로 찾으시면 됩니다!

  • Method는 'GET'으로 설정해주세요

  • URL은 STEP 1 - 6에서 복사한 Request URL을 그대로 넣어주세요
    (제가 보려고 한 게시판은 비회원에게도 공개된 게시판이기 때문에 Authentication은 따로 필요 없었는데요, 권한이 있어야만 게시판 리스트를 볼 수 있는 경우에는 따로 조치가 필요할 수 있습니다 ㅠㅠ)

    iPad에서 크롤링하는 커피 설정의 스크린 샷

3) Split Out

  • Split Out 노드를 추가해주세요

  • 이걸 쓰는 이유는 api를 그대로 썼을 때 articleList가 보시는 것처럼 배열로 저장되기 때문입니다
    이러면 게시글 제목/작성자 등등을 쭉 나열하는 것이 안되어서...

    빨간색 화살표가 화면을 가리키는 검은 색 화면
    혹시나 궁금해하실 분을 위해.. 회사는 가리지 않았습니다 ㅋㅋㅋㅋㅋ
  • 'Fields To Split Out'에는 messege.result.articleList를 입력해주세요
    (message 안의 result 안의 articleList 안에 있는 배열을 각각 하나씩 쪼개는 기능인 것 같습니다)

    Adobe Adobe Adobe Adobe의 분할 필드의 스크린 샷

4) write on airtable

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable > Create a record로 추가해주세요

    Adobe Adobe Adobe Adobe의 검색 동작 스크린 샷 a
  • 에어테이블 권한과 Base, Table을 선택해주고

  • airtable의 열 중에 api 값을 그대로 쓸 것만 남겨두고, 각각 매칭해줬습니다
    (매칭하기 쉽게 airtable의 이름을 api key값과 동일하게 했어요)
    original 뒤에서 설명드릴 예정인데요, 여기서는 False가 되도록 설정해주세요!

여기까지 하셨다면 기록은 trigger할 때마다 최신 게시글 50개의 정보를 airtbale에 쌓아둘 거예요.

여기서 발생하는 문제는 2가지 있습니다

  • 빈칸으로 나오는 애들이 한 번에 4개씩 있다는 것
    (이유는 저도 모르겠습니다...)

  • 매번 50개씩 쌓기 때문에 중복 정보가 생긴다는 것

이걸 그냥 필요할 때마다 빈 칸 삭제 해주거나. 빈칸은 필터링되도록 view를 만들고
중복된 건 수동으로 삭제해주면 쉬울 것 같은데요

빈칸이 계속 남아있는 게 기분 나쁘고...
저는 게으름뱅이이기 떄문에 이것도 자동화해보고자 했습니다.

STEP 4: airtable에서 빈칸 삭제하기

1) search blanks

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable > Search records로 추가해주세요

  • Table을 설정해주고 Filter는 NOT({articleID})로 해줬습니다
    이러면 articleID 값이 없는 애들이 나오겠죠?!

  • 추가로 이유는 잘 모르겠지만.... Settings에서 Excute Once를 켜두지 않으면 동일한 결과가 여러 번 나오게 되더라고요. (Search records라 그런가?)
    결과 자체는 동일하지만 속도가 엄청 느려지기 때문에 켜줬습니다

2) delete blanks

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable >Delete a record로 추가해주세요

    방송 가능한 검색 작업의 스크린 샷
  • Input으로 받아온 애들(빈칸인 애들)은 전부 삭제해줄 거기 때문에 Record ID에 id를 그대로 넣어줬습니다.

STEP 5: airtable에서 중복된 값 삭제하기

1) Search records

  • 중복된 값을 찾기 위해 n8n 자체 기능을 쓸 건데, 그러려면 input으로 다시 Airtable을 넣어줘야하는 것 같더라고요... (테이블 내용이 업데이트 되기도 했고) 그래서 번거롭지만 다시 이 과정을 반복했습니다

  • 노드는 Airtable > Search records로 추가해주세요

  • 이번에는 전부 불러오는 게 목적이라 Filter는 설정하지 않았고,
    Parameters의 Return All과 Settings의 Excute Once는 켜줬습니다

2) Remove Duplicates

  • n8n 자체에 중복 항목은 제거해주는 게 있더라고요. 그래서 그대로 사용했습니다!

  • 여러 옵션이 있는데 저는 이전 input을 그대로 받아오고, 특정 필드만 비교하는 것을 선택했습니다
    중복된 게시글을 없앨 것이기 때문에 Fields To Compare에는 'articleID'를 입력해줬습니다.
    이건 원래 텍스트 형태로 입력하는 거라고 하네요 (끌어오기 X)


3) check original

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable >Update record로 추가해주세요

  • '2) Remove Duplicates'에서 중복이 아닌 것들만 input으로 받았는데요, 얘네의 'original'을 True로 바꿔주도록 이렇게 설정했습니다

  • 이 노드를 돌리고 나면 이런 식으로 중복되는 데이터 중 하나에만 체크 표시가 됩니

4) search not original

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable > Search records로 추가해주세요

  • Table을 설정해주고 Filter는 original이 아닌 애들을 찾기 위해
    {original} = FALSE()로 해줬습니다

5) IF

  • 이전 단계에서 찾은, original이 아닌 애들은 삭제해줄건데요,
    이게 output 값이 있다면 문제가 없이 굴러가지만
    output 값이 없다먼 (모두가 original이어서 삭제될 게 없다면) 오류가 생겨버립니다...!
    이것 또한 시행착오를 통해 꺠달은..

  • 그래서 if 노드를 추가해서 id가 없다면 (output이 없다면) 삭제 단계를 거치지 않고 그 다음 단계로 넘어가도록 설정했습니다

5) delete not original

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable >Delete a record로 추가해주세요

  • '4) search not original'와 '5) If'를 거쳐서 온 모든 input을 삭제해줄 것이기 떄문에 id를 그대로 입력해줬습니다

6) Search records1

  • 다시 이 사이클을 돌릴 수 있게, original에 체크해뒀던 것을 해제하려고 합니다!

  • update를 하기 전에 search부터 다시 했습니다

    검색 레코드 설정의 스크린 샷

6) Update record

  • input으로 들어온 애들 모두 original이 false가 될 수 있도록, 이렇게 설정해줬습니다

그럼 이제 정말 끝!!!!

결과와 배운 점

배운 점

  • 이번에도 많은 시행착오를 거쳤는데요.. 이걸 만들어두고 시간이 좀 지난 뒤에 사례글을 작성하려니 기억이 잘 안 나네요
    다음엔 메모를 잘 해두어야겠습니다

  • 점차 활용을 할 수 있게되고, 어찌저찌 원하는 결과물을 만들어서 기분이 좋네요!

고민

  • 조잡하게 만들다보니 안 그래도 느린 n8n + airtable이 더 느린 것 같아요...ㅠㅠ
    더 효율적이고 빠르게 만드는 방법을 고민하고 있습니다.

이후 목표

  • 사실 이걸 만들기 전에 회사 메신저에서 웹훅으로 정보를 외부로 보내고, 그걸 n8n을 통해 가공하고, 에어테이블에서 대시보드로 만들고, 에어테이블 링크를 다시 웹훅을 통해 메신저로 보내는 것도 성공했는데요 다음 사례 때 쓰겠습니다!
    (한 주 치 더 챙기기 위해... 참고로 저희는 '잔디'라는 메신저를 쓰고 있습니다)

  • 가능하면 이번에 만든 네이버 카페 크롤링 기능에서 웹훅으로 카톡이나 회사 메신저로 보내주는 것도 만들 예정입니다




[수정 ver.]

진행 방법

진행 순서를 먼저 요약하자면 다음과 같습니다

1) 네이버 카페 API 찾기

2) airtable을 원하는 대로 세팅하기

3) n8n을 통해 특정 게시판의 게시글을 airtable에 적재하기

단계별로 자세히 설명드리겠습니다!

STEP 1: 네이버 카페 API 찾기

처음에는 네이버 카페의 html을 가지고 크롤링을 하려고 했습니다만... 잘 안 되더라고요 ㅠ0ㅠ

한참 씨름을 하다가 일반인도 네이버 카페 API에 접근이 가능하다는 것을 알게되었습니다!

GPT가 알려줬던 것 같은데 그때 오류가 계속 발생했어서 그런지... 기록이 안 보이네요

API 찾는 법은 다음과 같습니다

1) 모바일 카페 사이트로 접속하기

  • m.cafe.naver.com~ 로 시작하는 링크입니다

  • 크롤링 하고 싶은 게시판으로 들어가주세요
    (아마 전체 게시글도 가능하긴 할 거예요! 저는 특정 게시판의 글만 모으고 싶어서 게시판으로 들어갔습니다)

  • PC에서도 가능하긴 할텐데 PC는 UI가 더 복잡하고, 모바일에서는 게시글 리스트가 잘 보여서 모바일 버전 웹사이트로 들어갔습니다

2) 마우스 우클릭 > [검사] 클릭

3) [Network] 클릭

4) 필터에서 [fetch/XHR] 선택

5) 기존의 카페 사이트에서 새로고침

6) ArticleList~로 되어있는 거 클릭 후 Request URL 복사하기

  • Request URL을 붙여넣기 해 보시면 까만 배경과 흰 글이 잔뜩 보일텐데요...
    이게 제대로 된 게 맞는지 확인하려면 한번 여기서 게시글 제목이나 유저 이름을 검색해보세요!
    subject/writerNickname으로 보일 거예요

STEP 2: airtable을 원하는 대로 세팅하기

저는 위와 같이 세팅했습니다

  • articleID

    • 네이버 API에서 내려주는 게시글의 ID입니다

    • 글 자체의 url은 api에서 안 내려주는데,
      어차피 이 값을 알면 해당 게시글로 이동 시킬 수 있어서 패스했습니다!

    • 참고로 이런 아이디처럼 숫자로만 나온 값은 Number로 생성해줘야 문제가 안 생기더라고요

  • subject

    • 네이버 API에서 내려주는 게시글의 제목입니다

  • memberKey

    • 네이버 API에서 내려주는 유저의 고유한 key값입니다

    • 이게 제가 알기로는 닉네임이 바뀌어도 안 바뀌는 값으로 알고 있어요

    • 다른 카페에서도 이 값은 동일할 것 같긴 한데... 확실히는 모르겠습니다!

  • writerNickname

    • 네이버 API에서 내려주는 유저의 닉네임입니다

  • writeDateTimestamp

    • 네이버 API에서 내려주는 게시글 업로드 시간입니다

    • 이 값은 timestamp로 나오고 저희가 아는 날짜 방식으로 안 나오기 떄문에 dateTime 행을 따로 만들었습니다

  • dateTime

    • writeDateTimestamp을 YYYY-MM-DD HH:MM 형식으로 바꿔주기 위한 열입니다

    • Fomula로 만들고 아래와 같이 식을 써줬습니다 (GPT야 고마워!)

    • 날짜 포맷과 타임존은 Formatting에서 설정해줬습니다
      (Fomula에서 입력해놓긴 했지만 실제로 작동하는 건진 모르겠습니다 ㅋㅋㅋㅋ)

  • Created

    • 이 데이터가 생성된 시간을 보여주는 열입니다

STEP 3: n8n을 통해 특정 게시판의 게시글을 airtable에 적재하기

우선 제가 구성한 n8n 노드를 보여드릴게요

닿님의 손길을 거쳐 엄청 단순화되었습니다....

1) Schedule Trigger

  • 게시글이 올라올 때마다 바로바로 쌓이면 좋겠지만... 네이버 카페 자체에 신호를 보내줄 수 있는 기능은 없다보니 어쩔 수 없이 몇 시간에 한 번씩 trigger 되도록 설정해주었습니다

2) cafe crawling

  • 이건 제가 구분을 위해 지은 이름이고요, 노드 찾으실 땐 'HTTP Request'로 찾으시면 됩니다!

  • Method는 'GET'으로 설정해주세요

  • URL은 STEP 1 - 6에서 복사한 Request URL을 그대로 넣어주세요
    (제가 보려고 한 게시판은 비회원에게도 공개된 게시판이기 때문에 Authentication은 따로 필요 없었는데요, 권한이 있어야만 게시판 리스트를 볼 수 있는 경우에는 따로 조치가 필요할 수 있습니다 ㅠㅠ)

3) Split Out

  • Split Out 노드를 추가해주세요

  • 이걸 쓰는 이유는 api를 그대로 썼을 때 articleList가 보시는 것처럼 배열로 저장되기 때문입니다
    이러면 게시글 제목/작성자 등등을 쭉 나열하는 것이 안되어서...

    혹시나 궁금해하실 분을 위해.. 회사는 가리지 않았습니다 ㅋㅋㅋㅋㅋ
  • 'Fields To Split Out'에는 messege.result.articleList를 입력해주세요
    (message 안의 result 안의 articleList 안에 있는 배열을 각각 하나씩 쪼개는 기능인 것 같습니다)

4) Filter

  • 이유는 명확히 모르겠지만 api를 통해 카페 게시글을 불러올 때 더미데이터(?)가 꼭 4개씩 포함이 되더라고요. (빈 값으로 나옴)

  • 이걸 걸러주기 위해 필터를 추가했습니다

  • 'articleID'가 비어있지 않은 경우만 필터링되도록 했구요,
    이때 airtable 상의 articleID는 속성이 'Number'로 설정되어있어서 Number로 했습니다!
    (이것도 닿님의 팁!)

4) write on airtable

  • 이것도 제가 작성한 이름입니다!

  • 노드는 Airtable > Create or update a record로 추가해주세요

  • 에어테이블 권한과 Base, Table을 선택해주고

  • airtable의 열 중에 api 값을 그대로 쓸 것만 남겨두고, 각각 매칭해줬습니다
    (매칭하기 쉽게 airtable의 이름을 api key값과 동일하게 했어요)

  • Columns to match on을 'articleID'로 설정하면, 이거 기준으로 데이터를 만들기 때문에 중복 데이터가 생기지 않는다고 하더라고요!!

결과와 배운 점

결과

  • 닿님 덕분에 워크플로우가 매우 단순해졌습니다

배운 점

  • 멍청하면 몸이 고생한다....!!!

  • 물론 굳이굳이 복잡하게 만들었던 걸 후회하지는 않습니다! (레슨런이 많음)

  • 그래도 이렇게 스터디에서 부족한 점을 채울 수 있어서 좋았습니당

이제 진짜진짜 끝!

1
2개의 답글

뉴스레터 무료 구독

👉 이 게시글도 읽어보세요