본문 바로가기

프로그램 개발일지

[Python] 네이버 카페 API 없이 requests 하기 - 1 댓글편

 

Instagram

 

www.instagram.com

 
 

 

 

 


 
네이버 카페에 관한 프로젝트가 많이 있다.
 
아무래도 네이버 카페를 활용해서 돈을 버는 사람이 많기에, 이런 의뢰도 많다본다.
 
 
 
 
 
앞으로 더 빠르고 간편하게 코딩 하기위해 네이버 카페 class를 만들어보자.
 
 
 
 
 
 
 
처음엔 API를 활용해볼까 했는데, 지원하는 기능이 영 시원찮아서 API 없이 해보기로 한다.
 
 
 
 
 
 
셀레니움과 requests를 활용해서 빠르고 간편하게 해보자.
 
 
 
 

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver import ActionChains, Keys
from selenium.webdriver.common.by import By

import pyperclip, time


class cafe():
    def __init__(self, id, pw):
        self.id = id
        self.pw = pw
        self.chrome_options = Options()
        self.chrome_options.add_argument("lang=ko_KR")
        self.chrome_options.add_argument('no-sandbox')
        self.chrome_options.add_argument('disable-gpu')
        self.chrome_options.add_argument("disable-dev-shm-usage")
        self.chrome_options.add_argument('window-size=1920,1080')
        self.chrome_options.add_argument("--log-level=3")
        self.chrome_options.add_experimental_option('excludeSwitches', ['enable-logging'])
        self.chrome_options.add_argument("--disable-3d-apis")
        self.driver = webdriver.Chrome(service=Service(), options=self.chrome_options)
    def login(self):
        driver = self.driver
        driver.get("https://nid.naver.com/nidlogin.login?url=https%3A%2F%2Fkin.naver.com%2F")
        id = self.id
        pw = self.pw

        
        WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.ID, "id"))
        ).click()
        a = pyperclip.paste()
        pyperclip.copy(id)
        actions = ActionChains(driver)
        actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
        time.sleep(1)

        WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.ID, "pw"))
        ).click()

        a = pyperclip.paste()
        pyperclip.copy(pw)
        actions = ActionChains(driver)
        actions.key_down(Keys.CONTROL).send_keys('v').key_up(Keys.CONTROL).perform()
        time.sleep(1)
        pyperclip.copy(a)


        WebDriverWait(driver, 5).until(
            EC.presence_of_element_located((By.ID, "log.login"))
        ).click()

        try:
            WebDriverWait(driver, 3).until(
                EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/div[2]/div[3]/div/a"))
            )
            self.cookie = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}
            driver.quit()
            return self.cookie
        except:
            self.cookie = None
            driver.quit()
            return None

 
 
 
cafe라는 클래스를 생성할 때, 네이버 ID/PW를 받아오고,
login함수에서는 이를 활용해서 로그인 후 쿠키값을 가져온다.
그 뒤로는 셀레니움이 필요없으니 driver는 quit() 해서 완전히 종료시켜버린다.
 
 
 
 
 

cafes = cafe()

result = cafes.login()

if result is not None:
    print('로그인 성공!')

 
 
 
 
로그인 후, 로그인 성공 이라는 내용이 나오게된다.
 
 
 
 
오늘은 댓글 작성기능을 구현할 예정이다.
 
 
 
 
 
 
comment 함수를 만들어주자.
 
 
 
 

    def comment(self, txt):

        url = 'https://apis.naver.com/cafe-web/cafe-mobile/CommentPost.json'
        data = {
            'content': txt,
            'stickerId': '',
            'cafeId': '카페ID',
            'articleId': '게시물번호',
            'requestFrom': 'A'
        }

        header = {
            'Content-Type': 'application/x-www-form-urlencoded',
			'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Whale/3.27.254.15 Safari/537.36'
        }

        a = requests.post(url=url,headers=header,data=data,cookies=self.cookie)

        data = a.json()

        print(data['commentId'], data['refCommentId'])

 
 
 
 
웹에서 어떤 동작을 할 때, 개발자도구 네트워크 탭을 분석하면 위와 같은 정보들을 다 얻을 수 있다.
 
 
 
 
그럼, 이제 중요한건 카페 ID와 게시물 번호다.
 
 
그걸 구해보자
 
 
 
 

https://cafe.naver.com/카페명

 
 
 
 
네이버카페는 위와 같은 url을 구성하고 있다.
 

    def cafeid(self, url):
        a = requests.get(url=url,cookies=self.cookie)
        return a.text.split('var g_sClubId = "')[1].split('"')[0]

 
 
cafeid를 구하는 함수도 새로 만들어주자.
 
url을 넣고 requests.get을 하게 되면, 카페 페이지 소스를 받게 되는데
상단에 var g_sClubId = " 와 같은 부분이 있다.
 
이 부분의 값이 바로 카페ID가 된다.
 
이 값을 split 해서 return 해주면, url을 넣으면 카페 ID를 반환해주는 함수가 만들어진다 !
 
 
 

    def comment(self, txt, urls):

        url = 'https://apis.naver.com/cafe-web/cafe-mobile/CommentPost.json'
        data = {
            'content': txt,
            'stickerId': '',
            'cafeId': self.cafeid(urls),
            'articleId': '게시물번호',
            'requestFrom': 'A'
        }

        header = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Whale/3.27.254.15 Safari/537.36'
        }

        a = requests.post(url=url,headers=header,data=data,cookies=self.cookie)

        data = a.json()

        print(data['commentId'], data['refCommentId'])

    def cafeid(self, url):
        a = requests.get(url=url,cookies=self.cookie)
        return a.text.split('var g_sClubId = "')[1].split('"')[0]

 
 
수정본이다.
 
 

cafes = cafe('네이버ID','네이버PW')

result = cafes.login()

if result is not None:
    cafes.comment('test', 'https://cafe.naver.com/카페명')

 
 
 

 

 

아래는 이미지 첨부도 포함된 완성본의 영상.

 

네이버카페 댓글 매크로


 

 

 

 

[종합 매크로] 공지사항

---업데이트 예정

myworld1004.tistory.com