API 활용
[cafe24 api] 쇼핑몰에 새로운 게시글 있는지 확인하기
cha2hyun
2021. 12. 15. 16:08
곧 업데이트 됩니다.
utils.py
from django.http import Http404
from ..static import CLIENT_ID, CLIENT_SECRET_KEY, BASE64_ENCODED, REDIRECT_URI, CAFE24_OAUTH_URL, ERR_MESSAGE, AS_URL, CAFE24_BOARD_URL, ADMIN_NICKNAME, KIMCHI_BOARD_URL, CAFE24_API_URL, CAFE24_ORDER_URL
from ..log.views import LogSave
from ..serialnumber.utils import clean_text
from .models import cafe24_token, cafe24_article, cafe24_board, cafe24_order
from datetime import datetime, timedelta
from bs4 import BeautifulSoup
import requests
import time
class TokenManager():
headers = {
"Authorization": "Basic " + BASE64_ENCODED,
"Content-Type": "application/x-www-form-urlencoded",
}
def createToken(self, code):
response = requests.post(CAFE24_OAUTH_URL,
headers = self.headers,
data = {
"grant_type" : "authorization_code",
"redirect_uri" : REDIRECT_URI,
"code" : code,
}
).json()
self.saveToken(response)
def updateToken(self):
try:
obj = cafe24_token.objects.latest('expires_at')
refresh_token = obj.refresh_token
response = requests.post(CAFE24_OAUTH_URL,
headers = self.headers,
data = {
"grant_type" : "refresh_token",
"redirect_uri" : REDIRECT_URI,
"refresh_token" : refresh_token,
}
).json()
self.saveToken(response)
return True
except Exception as e:
raise Http404(f"Please Do OAuth First or check the error {e}")
return False
def saveToken(self, response):
self.deleteOldToken()
access_token = response['access_token']
expires_at = response['expires_at']
refresh_token = response['refresh_token']
refresh_token_expires_at = response['refresh_token_expires_at']
cafe24_token(access_token = access_token, expires_at = expires_at, refresh_token = refresh_token, refresh_token_expires_at = refresh_token_expires_at).save()
def deleteOldToken(self):
obj = cafe24_token.objects.all().delete()
def getToken(self):
obj = cafe24_token.objects.latest('expires_at')
return obj.access_token
class Cafe24BoardManager():
title = "카페24 게시글 크롤링"
headers = {'Content-Type': 'text/text; charset=utf-8'}
def __init__(self):
self.access_token = TokenManager().getToken()
self.end_date = datetime.today().strftime('%Y-%m-%d')
self.start_date = (datetime.today() + timedelta(days=-7)).strftime('%Y-%m-%d')
self.limit = "20"
self.board_list = ["4", "5", "6", "14", "15"]
def getNewArticle(self):
for board_no in self.board_list:
url = f"{CAFE24_API_URL}/boards/{board_no}/articles?start_date={self.start_date}&end_date={self.end_date}&limit={self.limit}"
response = Cafe24APIResponseToJson(url, self.access_token)
articles = list(response['articles'])
for article in articles:
self.checkArticle(article, board_no)
def checkArticle(self, article, board_no):
if cafe24_article.objects.filter(article__board_no=board_no).filter(article_no = article['article_no']):
pass
# print("새로운 게시글 없음")
else:
# 관리자 글 패스
if article['parent_article_no'] != None:
pass
else:
article_no = str(article['article_no'])
writer = str(article['writer'])
member_id = str(article['member_id'])
nick_name = str(article['nick_name'])
created_date = str(article['created_date'])
title = str(article['title'])
content = str(article['content'])
board = cafe24_board.objects.get(board_no=board_no)
board_name = board.board_name
article_link = KIMCHI_BOARD_URL + f"{board_name.replace(' ','-')}/{board_no}/{article_no}/"
message = ""
message += "`[" + board_name + "]에 새로운 글이 등록되었어요.*`" + "\n"
message += ">*" + title + "* | " + writer + " | " + created_date[:10] + " | <" + article_link + "|(바로가기)>" + "\n"
message += ">" + content[:300] + "\n"
content_contain = ["수리", "as", "AS", "As", "소리", "교체", "선골", "팁교체"]
if any(_ in content for _ in content_contain) or board_no == "14":
self.send_message(AS_URL, message)
else:
self.send_message(CAFE24_BOARD_URL, message)
cafe24_article(article = board, article_no = article_no,writer = writer,member_id = member_id,nick_name = nick_name,created_date = created_date,title = title,content = content).save()
def send_message(self, url, message):
message = clean_text(message)
payload = 'payload={"text": "' + message + '"}'
res = requests.post(url, data=payload.encode('utf-8'), headers=self.headers)
time.sleep(1)
if res.json()["success"] != True:
self.send_error(res)
def send_error(self, res):
LogSave(f">{ADMIN_NICKNAME} CAFE24 BOARD ERROR\nres > {res.json()}")
def Cafe24APIResponseToJson(url, access_token):
response = requests.get(url,
headers = {
"Authorization": "Barrer " + access_token,
"Content-Type": "application/json",
},
data = {}
).json()
return response
views.py
class Board(APIView):
# path(r'cafe24/board/', cafe24.Board.as_view(), name='Board'),
def get(self, request):
if TokenManager().updateToken():
BoardManager = Cafe24BoardManager()
BoardManager.getNewArticle()
return Response(status=200)
else:
return Response(status=400)