[Python] 네이버 카페 자동 포스팅

공매로 나온 부동산 매물을 크롤링한 데이터를 네이버 카페에 자동으로 포스팅 해주는 프로그램 외주 개발을 진행하였습니다. 네이버 카페 글쓰기 API를 이용하여 개발하였고 개발 중 애먹었던 문제사항과 해결책을 코드의 일부와 함께 공유드립니다.

 

자세한 API 명세는 아래 사이트에서 확인하실 수 있습니다.

 

카페 가입 · 글쓰기 API 명세 - LOGIN

카페 가입 · 글쓰기 API 명세 NAVER Developers - 카페 가입/글쓰기 개발가이드 네이버 카페에 가입 또는 카페 게시판에 글을 올릴 수 있는 로그인 오픈 API입니다. 기존 REST API처럼 요청 URL과 요청 변수

developers.naver.com

 

 

code와 access_token 발급의 번거로움 

네이버 카페 API
네이버 카페 API

카페 글쓰기 API를 사용하기 위해선 access_token이 필요하고 이를 발급받기 위해선 code가 필요합니다. 또한 code를 받급 받으려면 Client ID, Client Secret과 네이버 로그인 작업이 필요합니다. 매번 로그인을 하여 코드를 발급받고 이를 이용해 access_token을 발급 받는 것이 번거로워 selenium을 이용하여 수동 로그인 후 driver의 url을 받아와 code를 파싱하여 json 파일에 저장하도록 하였습니다.

 

import  base64
import requests
import os
from selenium import webdriver

with open('./secret.json', 'r') as f:
    json_data = json.load(f)
    
redirect_uri = 'http://localhost:8888'
client_id = json_data["client_id"]
client_secret  = json_data["client_secret"]
state = "REWERWERTATE"

url = f'https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&state={state}'

driver = webdriver.Chrome('./chromedriver')
driver.implicitly_wait(1)
driver.get(url)

print("[로그인 대기 중]")
while driver.current_url[:16] != 'http://localhost':
    driver.implicitly_wait(10)

code = driver.current_url.split("?")[1].split("&")[0].split("=")[1]
driver.quit()
print("[로그인 완료]")
print("[code]",code)

이후의 access_token 발급 방식은 동일합니다.

 

html 게시글 작성 문제

카페 글쓰기 API
카페 글쓰기 API

네이버 카페 API 명세에선 html 태그가 사용 가능하다고 명시되어 있으나  아래와 같은  "status" : "500", error "code" : "999"의 오류를 반환하였습니다.

{"message":{"@type":"response","@service":"korea.naverkoreaservice.community.cafe","@version":"1.0.0","status":"500","error":{"code":"999","msg":"오류가 발생하였습니다."}}}

위 오류는 html 태그 안의 큰따옴표(")를 처리하지 못하여 발생하는 오류입니다. 따라서 파이썬 문자열 내장함수인 replace() 함수를 이용하여 수정하였습니다.

content = content.replace('"', "'") #본문

 

html 게시글 스타일 미적용 문제

게시글의 css 스타일이 일부 적용이 되지 않는 것을 확인할 수 있었습니다. 왼쪽이 원본 스타일이나 오른쪽 사진처럼 왼쪽 사진의 스타일이 일부 적용 되지 않는 모습니다.

네이버 카페 API
네이버 카페 API

이 경우 내부 스타일 형식으로 정의된 css 코드가 반영하지 않아서 생기는 문제입니다. 내부 스타일 형식으로 정의된 css 코드를 인라인 형식으로 바꾸어주어야 합니다. 하드코딩으로 해결하기엔 너무 복잡해보여 이를 해결할 수 있는 css_inline 패키지를 찾았고 다음과 같이 해결하였습니다.

 

import css_inline
content = css_inline.inline(posts[key])

css_inline 패키지에 대한 자세한 내용은 아래 링크를 참고하시면 됩니다.

 

css-inline

Fast CSS inlining written in Rust

pypi.org