상세 컨텐츠

본문 제목

Selenium을 이용해 네이버 포인트를 자동 적립해보자

Python

by mingoon.com 2023. 2. 11. 01:44

본문

반응형

요즘 인터넷에 네이버페이 포인트 적립하는 글이 자주 눈에 띈다.

중복 링크도 가끔 있고, 바쁠 땐 잊기도 해서 자동으로 적립해주는 스크립트를 만들어봤다.

Python 개발자는 아니니 stackoverflow의 도움으로..

단, 네이버 로그인에 이중 인증이 설정되어 있으면 실행할 수 없다.

 

패키지 설치

  • selenium : 웹 어플리케이션 테스트를 위한 포터블 프레임워크지만 동적인 웹사이트를 크롤링하는데 많이 쓰인다.
  • Webdriver Manager : Selenium에서 사용하는 브라우저의 드라이버가 필요했는데, 이 패키지를 사용하면 자동으로 해당 버전의 드라이버를 다운로드한다.
  • pyperclip : 네이버 로그인과 같은 경우 단순 키 입력으로 로그인하면 캡챠 인증이 나오는데, 이를 해결하기 위해 클립보드를 통해 복사/붙여넣기하여 입력한다.
  • Telegram Bot : 모든 링크를 다 클릭하고 나서, 적립된 포인트를 알림 받기 위해 텔레그램 봇을 사용한다.
  • asyncio : 텔ㄹ그램 메시지 발송할 때 발생하는 오류를 방지하기 위해 사용하는 비동기 I/O 패키지이다.
pip3 install selenium
pip3 install webdriver_manager 
pip3 install pyperclip 
pip3 install python-telegram-bot
pip3 install asyncio

크롬 드라이버 다운로드 및 로드

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--single-process")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'ko,ko_KR'})
chrome_options.add_argument("--window-size=100,100")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.implicitly_wait(5)

네이버 로그인

driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com")

user_id = driver.find_element(By.ID,'id')
passwd = driver.find_element(By.ID,'pw')
pyperclip.copy(naver_id)
user_id.send_keys(Keys.COMMAND, 'v')

pyperclip.copy(naver_pw)
passwd.send_keys(Keys.COMMAND, 'v')

btn_login = driver.find_element(By.CSS_SELECTOR,'button.btn_login')
btn_login.click()

윈도우에선 Keys.COMMAND 대신 Keys.CONTROL로 변경한다.

네이버 포인트 적립 사이트 크롤링

여기선 클리앙 알뜰구매 게시판의 글 중 '네이버'가 포함된 글에서 링크를 추출한다.

driver.get("https://www.clien.net/service/board/jirum")

jirum_elements = driver.find_elements(By.CSS_SELECTOR,'div.list_title a[data-role=list-title-text]')
jirum_links = []
for element in jirum_elements:
  title = element.text
  if title.find("네이버") >= 0:
    jirum_url = element.get_attribute('href')
    jirum_links.append(jirum_url)

npay_links = []
for jirum_url in jirum_links:
  driver.get(jirum_url)
  pay_elements = driver.find_elements(By.CSS_SELECTOR,'.post_content a.url')
  for link in pay_elements:
    link_url = link.get_attribute('href')
    npay_links.append(link_url)

자동 적립

for link_url in npay_links:
  driver.get(link_url)
  try:
    WebDriverWait(driver, 5).until(EC.alert_is_present())
    driver.switch_to.alert.accept()
    print("alert accepted")
  except TimeoutException:
    print("no alert")
  except WebDriverException as e:
    print("load failed", e)
  time.sleep(5)

포인트 적립 링크의 경우 alert가 뜨는 케이스도 있기 때문에 alert가 나타나는 경우에 accept 해주고, 웹페이지 진입 후 몇초 기다려야 적립되므로 5초동안 대기하도록 해준다.

적립된 포인트 조회

driver.get("https://new-m.pay.naver.com/pointshistory/list")
points = driver.find_element(By.CSS_SELECTOR,'strong:has(span)')
points_text = points.text
print(points_text)

텔레그램 알림

bot = telegram.Bot(telegram_token)
asyncio.run(bot.sendMessage(chat_id=telegram_chat_id, text="네이버페이 " + points_text))

전체 소스

 #!/usr/bin/python
# -*- coding: utf-8 -*-
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import WebDriverException
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
import pyperclip
import time
import telegram
import asyncio

naver_id = "네이버 아이디"
naver_pw = "네이버 비밀번호"
telegram_token = "텔레그램 봇 토큰"
telegram_chat_id = "텔레그램 채팅 ID"

# 드라이버 다운로드 및 로딩
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--single-process")
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'ko,ko_KR'})
chrome_options.add_argument("--window-size=100,100")

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
driver.implicitly_wait(5)

# 네이버 로그인
driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com")

user_id = driver.find_element(By.ID,'id')
passwd = driver.find_element(By.ID,'pw')
pyperclip.copy(naver_id)
user_id.send_keys(Keys.COMMAND, 'v')

pyperclip.copy(naver_pw)
passwd.send_keys(Keys.COMMAND, 'v')

btn_login = driver.find_element(By.CSS_SELECTOR,'button.btn_login')
btn_login.click()

# 클리앙 게시판 조회
driver.get("https://www.clien.net/service/board/jirum")

jirum_elements = driver.find_elements(By.CSS_SELECTOR,'div.list_title a[data-role=list-title-text]')
jirum_links = []
for element in jirum_elements:
  title = element.text
  if title.find("네이버") >= 0:
    jirum_url = element.get_attribute('href')
    jirum_links.append(jirum_url)

npay_links = []
for jirum_url in jirum_links:
  driver.get(jirum_url)
  pay_elements = driver.find_elements(By.CSS_SELECTOR,'.post_content a.url')
  for link in pay_elements:
    link_url = link.get_attribute('href')
    npay_links.append(link_url)

for link_url in npay_links:
  driver.get(link_url)
  print(link_url)
  time.sleep(1)
  try:
    WebDriverWait(driver, 5).until(EC.alert_is_present())
    driver.switch_to.alert.accept()
    print("alert accepted")
  except TimeoutException:
    print("no alert")
  except WebDriverException as e:
    print("load failed", e)
  time.sleep(5)

# 포인트 확인
driver.get("https://new-m.pay.naver.com/pointshistory/list")
points = driver.find_element(By.CSS_SELECTOR,'strong:has(span)')
points_text = points.text
print(points_text)

bot = telegram.Bot(telegram_token)
asyncio.run(bot.sendMessage(chat_id=telegram_chat_id, text="네이버페이 " + points_text))
driver.quit()

추가 내용

  • 맥에서 실행하는 경우 로그인 정보의 붙여넣기가 안될 때가 있는데, 시스템 설정 > 개인정보 보호 및 보안 > 손쉬운 사용에 사용중인 터미널 프로그램을 등록하도록 한다.

댓글 영역