네이버에서 제공해주는 openapi를 이용해서 카페에 글쓰기를 할 수 있다.
관련예제는 여기링크를 클릭하면 볼 수는 있다.
글쓰는 순서
1. login api를 이용해서 접근 토큰 정보를 가져온다.
2. 포스팅한다.
아래의 내용을 따라하기전에 우선 Naver openapi를 사용하기 위한
사전 준비사항을 완료해야한다. --> 링크
특히 사용 API에 카페를 반드시 추가해야한다.
순서는 간단하지만 막상 따라해보려는데 첫줄에서 막힌다.
token = "YOUR_ACCESS_TOKEN"
어떻게 받아와야되나 ??
이를 확인하기 위해서 로그인 API 명세를 찾아본다.
아... 나는 파이썬으로 다 하려고 했는데 없다.
하지만 뒤져보면 다 나온다.
Selenium을 이용하면 받아올 수 있다.
이와 관련된 기본적인 세팅은 이준범님의 블로그에 가면 잘 나와있으니 따라하면됨
(https://beomi.github.io/2017/02/27/HowToMakeWebCrawler-With-Selenium/)
이 정보들을 바탕으로 로그인을 한다.
아래의 코드에서 로그인 관련, OAUTH관련 중요 정보는 설정에서 가져오거나 직접 입력하거나 알아서 한다.
# Token 정보 가져오는 코드
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import os
import re
import urllib.request
from bs4 import BeautifulSoup
from requests import get
from selenium import webdriver
from urllib.error import HTTPError
from urllib.parse import urlencode
def get_naver_token():
chromedriver_path = os.environ.get('CHROMEDRIVER_PATH')
naver_id = os.environ.get('NAVER_ID')
naver_pw = os.environ.get('NAVER_PW')
naver_cid = os.environ.get('NAVER_CLIENT_ID')
naver_csec = os.environ.get('NAVER_CLIENT_SECRET')
naver_redirect = os.environ.get('NAVER_BLOG_REDIRECT')
driver = webdriver.Chrome(chromedriver_path) # driver = webdriver.PhantomJS()
driver.implicitly_wait(3)
driver.get('https://nid.naver.com/nidlogin.login')
driver.find_element_by_name('id').send_keys(naver_id)
driver.find_element_by_name('pw').send_keys(naver_pw)
driver.find_element_by_xpath('//*[@id="frmNIDLogin"]/fieldset/input').click()
state = "REWERWERTATE"
req_url = 'https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id=%s&redirect_uri=%s&state=%s' % (naver_cid, naver_redirect, state)
driver.get(req_url)
##########################
# XXX: 최초 1회만 반드시 필요하고 이후엔 불필요함
driver.find_element_by_xpath('//*[@id="confirm_terms"]/a[2]').click()
##########################
redirect_url = driver.current_url
temp = re.split('code=', redirect_url)
code = re.split('&state=', temp[1])[0]
driver.quit()
print(redirect_url)
url = 'https://nid.naver.com/oauth2.0/token?'
data = 'grant_type=authorization_code' + '&client_id=' + naver_cid + '&client_secret=' + naver_csec + '&redirect_uri=' + naver_redirect + '&code=' + code + '&state=' + state
request = urllib.request.Request(url, data=data.encode("utf-8"))
request.add_header('X-Naver-Client-Id', naver_cid)
request.add_header('X-Naver-Client-Secret', naver_redirect)
response = urllib.request.urlopen(request)
rescode = response.getcode()
token = ''
if rescode == 200:
response_body = response.read()
js = json.loads(response_body.decode('utf 8'))
token = js['access_token']
else:
print("Error Code:", rescode)
return None
if len(token) == 0:
return None
print(token)
return token
Access token 정보를 가져왔다.
잠시 숨을 고르고 아래에 이어서 카페 글쓰기를 시도하면 된다. (스크롤을 내려야함)
위의 코드를 이용해서 토큰을 가져왔다면 그 다음에는 카페 글쓰기 api를 사용하면 된다.
반가운 Python 예제 코드다.
그런데 또 막힌다.
clubid = 'xxxxxx'
menuid = 'x'
이건 직접 찾아봐야한다.
Chrome의 검사 기능을 이용해서 찾을 수 있다. (다른 웹브라우저에서도 알아서 찾아볼 수 있음)
아래 같이 카페에 로그인해서 게시판에 들어가고
마우스 우클릭해서 '검사' 기능을 사용하면
오른쪽에 정보를 찾을 수 있다.
샘플코드대로 했는데,,,
한글이 다 깨진다.
그러면 urlencode를 사용한 아래의 코드로 수행하면된다.
def naver_cafe_post(subject, content):
token = get_naver_token()
header = "Bearer " + token # Bearer 다음에 공백 추가
clubid = 'xxxxxx'
menuid = 'x'
url = "https://openapi.naver.com/v1/cafe/" + clubid + "/menu/" + menuid + "/articles"
subject = urllib.parse.quote(subject)
content = urllib.parse.quote(content)
data = urlencode({'subject': subject, 'content': content}).encode()
request = urllib.request.Request(url, data=data)
request.add_header("Authorization", header)
try:
response = urllib.request.urlopen(request)
except HTTPError as e:
print("url open failed", e, subject, content)
return
rescode = response.getcode()
if rescode == 200:
response_body = response.read()
print(response_body.decode('utf-8'))
else:
print("Error Code:" + rescode)
그냥 텍스트를 가지고 하면 잘 되는데
기존에 사용했던 방식으로 HTML 태그를 붙이니까 에러가 난다.
대충 형태는 아래와 같은 모양이었다.
<font color="red"> xxxx </font>
이럴 때는 쌍따옴표를 제거하면 된다.
<font color=red> xxxx </font>
그런데 또 안된다????????
열이 받아서 때려치울라고 하던 찰나 '%' 문자가 눈에 띈다.
content로 사용할 문자열에 그냥 '%'가 있으면 에러가 나서 아래 처럼 역슬래쉬를 추가해줘야 한다.
content = content.replace('%', '\%')
꺠지지도 않고 잘 포스팅 된다.
편리하다.