inven-helper

inven 출석 봇

image

GitHub repository

바로 가기

container 구성

.env

vi /opt/python/.env
...
INVEN_USERNAME=n*******
INVEN_PASSWORD=5***************************************************************
...

inven_helper.sh 1

#!/bin/bash
# inven_helper

source /home/dev/.bashrc
source /home/dev/.local/bin/utils.sh
log_file=/home/dev/.local/log/$(basename "$0" | sed 's/.sh//').log
msg_file=/home/dev/.local/log/$(basename "$0" | sed 's/.sh//').tmp

for ((i=1; i<=2; i++)); do
  docker run \
    -i --rm --name=py-inven-helper --network=dev --user=0:0 \
    --env-file=/opt/python/.env \
    -v /home/dev/workspace/inven_helper/inven_helper.py:/data/inven_helper.py:rw \
    e7hnr8ov/python:3-slim \
    python /data/inven_helper.py > "$log_file"
  cp "$log_file" "$msg_file"
  send_tel_msg "$TEL_BOT_KEY" "$TEL_CHAT_ID" "$msg_file"
  rm "$msg_file"
  sleep 5
done

inven_helper.py 2

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec
from lxml.html import fromstring
import os, sys, time

try:
  executor = str(os.environ.get("WEBDRIVER_URL"))
  options = webdriver.ChromeOptions()
  #options.add_argument('--disable-gpu')
  options.add_argument('--headless')
  options.add_argument('--blink-settings=imagesEnabled=false')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--lang=en_US')
  options.add_argument('--mute-audio')
  options.add_argument('user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edg/107.0.1418.35')
  driver = webdriver.Remote(command_executor=executor, options=options)
  driver.set_window_size(1280, 720)

  # https://it.inven.co.kr/
  url = 'https://it.inven.co.kr/'
  driver.switch_to.window(driver.window_handles[0])
  driver.get(url)
  print('driver.get=' + url)
  try:
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="itBody"]/div[1]/section/article/section[1]/div[1]/div/a')))
    driver.find_element(By.XPATH, '//*[@id="itBody"]/div[1]/section/article/section[1]/div[1]/div/a').click()
  except:
    pass
  print('debug:1')

  # https://member.inven.co.kr/user/scorpio/mlogin
  try:
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="loginBtn"]')))
    username = str(os.environ.get("INVEN_USERNAME"))
    password = str(os.environ.get("INVEN_PASSWORD"))
    # print('INVEN_USERNAME=' + username)
    # print('INVEN_PASSWORD=' + password)
    driver.find_element(By.XPATH, '//*[@id="user_id"]').send_keys(username)
    driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(password)
    driver.find_element(By.XPATH, '//*[@id="password"]').send_keys(Keys.ENTER)
  except:
    pass
  print('debug:2')

  # Change Password
  try:
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="btn-extend"]')))
    driver.find_element(By.XPATH, '//*[@id="btn-extend"]').click()
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="btn-ok"]')))
    driver.find_element(By.XPATH, '//*[@id="btn-ok"]').click()
  except:
    pass
  print('debug:3')

  # https://it.inven.co.kr/
  try:
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="itBody"]/div[1]/section/article/section[1]/div[1]/div/form/ul/li[6]/button')))
    driver.find_element(By.XPATH, '//*[@id="comItBanner"]/div[4]/a/span').click()
  except:
    pass
  print('debug:4')
  # Guaranteed tab open time
  time.sleep(10)

  # https://imart.inven.co.kr/attendance/ Check Attendance
  driver.switch_to.window(driver.window_handles[1])
  try:
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="invenAttendCheck"]/div/div[2]/div/div[3]/div[1]/div[4]/a')))
    driver.find_element(By.XPATH, '//*[@id="invenAttendCheck"]/div/div[2]/div/div[3]/div[1]/div[4]/a').click()
  except:
    pass
  print('debug:5')

  try:
    wait = WebDriverWait(driver, 3).until(ec.alert_is_present())
    alert = driver.switch_to.alert
    print('alert.text=' + alert.text)
    alert.accept()
  except:
    pass
  print('debug:6')

  # if time.localtime().tm_wday == 2:
  try:
    driver.find_element(By.XPATH, '//*[@id="invenAttendCheck"]/div/div[2]/div/div[3]/div[1]/div[3]/a').click()
    driver.switch_to.window(driver.window_handles[2])
    wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="imageCollectDiv"]/div/div[2]/div[2]/div[1]/div[19]/div/label/span')))
    vote_text = driver.find_element(By.XPATH, '//*[@id="imageCollectDiv"]/div/div[2]/div[2]/div[2]').text
    if vote_text == '투표에 참여 완료했습니다.':
      print('div.text=' + vote_text)
    else:
      driver.find_element(By.XPATH, '//*[@id="imageCollectDiv"]/div/div[2]/div[2]/div[1]/div[19]/div/label/span').click()
      driver.find_element(By.XPATH, '//*[@id="imageCollectDiv"]/div/div[2]/div[2]/div[2]/div/button').click()
    driver.close()
    driver.switch_to.window(driver.window_handles[1])
  except:
    pass
  driver.close()
  print('debug:7')

  # https://it.inven.co.kr/
  driver.switch_to.window(driver.window_handles[0])
  driver.find_element(By.XPATH, '//*[@id="comItBanner"]/div[5]/a/span').click()
  print('debug:8')

  # https://imart.inven.co.kr/imarble/ Dice
  for i in range(8):
    driver.switch_to.window(driver.window_handles[1])
    try:
      wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="imarbleBoard"]/div[4]/img')))
      driver.find_element(By.XPATH, '//*[@id="imarbleBoard"]/div[4]/img').click()
    except:
      pass
    try:
      wait = WebDriverWait(driver, 3).until(ec.alert_is_present())
      alert = driver.switch_to.alert
      alert_text = alert.text
      print('alert.text=' + alert.text.replace("\n", " "))
      alert.accept()
      if alert_text.startswith('주사위 1개를 \'5제니\'로 구매하실 수 있습니다.'):
        try:
          wait = WebDriverWait(driver, 3).until(ec.alert_is_present())
          alert = driver.switch_to.alert
          alert.accept()
        except:
          pass
      if alert_text == '오늘의 주사위를 모두 사용하셨습니다.':
        driver.close()
        break
    except:
      pass
    time.sleep(10)
    driver.execute_script('window.open("about:blank", "_blank");')
    driver.switch_to.window(driver.window_handles[2])
    url = 'https://imart.inven.co.kr/imarble/'
    driver.get(url)
    print('driver.get=' + url)
    driver.switch_to.window(driver.window_handles[1])
    driver.close()
  print('debug:9')

  # https://it.inven.co.kr/ Advertisement
  driver.switch_to.window(driver.window_handles[0])
  try:
    wait = WebDriverWait(driver, 5).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="topskyAd"]/div/img')))
    xpaths = ['//*[@id="topskyAd"]/div/img', '//*[@id="rightThumbNailAd"]/img']
    for j in xpaths:
      # print("xpaths=" + j)
      driver.find_element(By.XPATH, j).click()
      driver.switch_to.window(driver.window_handles[1])
      driver.close()
      driver.switch_to.window(driver.window_handles[0])
  except:
    pass
  print('debug:10')

  # https://it.inven.co.kr/
  driver.switch_to.window(driver.window_handles[0])
  res = driver.page_source
  parser = fromstring(res)
  article_list = parser.xpath('//*[@id="commu-nav"]/ul/li[6]/ol')
  parsed_articles = article_list[0].xpath('.//li')
  links = []
  for article in parsed_articles:
    parsed_link = article.xpath('.//a[@href]')
    link = parsed_link[0].get('href')
    links.append(link)
  # print("links=" + str(links))
  print('debug:11')

  # https://links.inven.co.kr/ Brand partners
  for i in links:
    # https://zotac.inven.co.kr/ No like button
    if i == 'https://zotac.inven.co.kr/':
      break
    driver.switch_to.window(driver.window_handles[0])
    driver.execute_script('window.open("about:blank", "_blank");')
    driver.switch_to.window(driver.window_handles[1])
    driver.get(i)
    print('driver.get=' + i)
    try:
      wait = WebDriverWait(driver, 3).until(ec.element_to_be_clickable((By.XPATH, '//*[@id="brandSubscribe"]/div[1]/button')))
      for j in range(3):
        driver.find_element(By.XPATH, '//*[@id="brandSubscribe"]/div[1]/button').click()
        if j <= 1:
          time.sleep(5)
    except:
      pass
    driver.close()
  print('debug:12')

  # close
  driver.switch_to.window(driver.window_handles[0])
  driver.close()
  driver.quit()
  print('debug:13')

except Exception as error:
  print(error)
  pass

Troubleshooting