This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import time | |
from selenium import webdriver | |
from selenium.webdriver.common.by import By | |
import pdfkit | |
# 작년의 모든 애드몹 수입 지불 영수증을 자동으로 PDF로 다운로드하는 스크립트 | |
# 필요한 의존 라이브러리 | |
# PIP : selenium, pdfkit | |
# Webdriver for Chrome | |
# wkhtmltopdf : https://wkhtmltopdf.org | |
def start(): | |
# 스크립트 작성자는 OTP가 아닌 구글 앱을 통한 2차 인증을 사용하기 때문에 | |
# selenium에서 로그인 창을 우회할 방법이 없으므로 | |
# 로그인 창을 거치지 않고 그냥 자동 로그인이 활성화 되어 있다고 가정하고 스크립트를 작성했음 | |
# 따라서 과거에 크롬 selenium 이라는 유저 프로파일로 미리 애드몹 사이트에 로그인해두어야 스크립트가 정상 작동 | |
# selenium이라는 프로필로 크롬 드라이버 생성 | |
chrome_options = webdriver.ChromeOptions() | |
chrome_options.add_argument("user-data-dir=selenium") | |
browser = webdriver.Chrome(chrome_options=chrome_options) | |
# 크롬 브라우저로 애드몹 결제 통계 탭으로 접속 | |
browser.get("https://apps.admob.com/v2/payments/transaction-service") | |
# 중간에 어떤 에러가 나든 그냥 브라우저 통채로 닫을 수 있게 자동화 전체 코드를 try로 묶어둠 | |
try: | |
# 로딩 기다림 | |
time.sleep(10) | |
# 통계 창이 나타나는 프레임으로 들어감 | |
browser.switch_to.frame(r'embedded-portal-containerIframe') | |
# 결제 타입 드롭 다운 메뉴에서 "지불" 선택 | |
browser.find_element_by_css_selector( | |
r'[data-id="transactionFilters-1.timelineViewTransactionTypeFilter"]').click() | |
browser.find_element_by_css_selector( | |
r'[data-value="PAYMENTS"]').click() | |
# 통계창 갱신되므로 로딩 기다림 | |
time.sleep(5) | |
# 통계창이 새로 생성되고 지워지면서 이전 iframe이 날아가므로, 뒤로 빠졌다가 다시 통계창 iframe으로 재전환 | |
browser.switch_to.default_content() | |
browser.switch_to.frame(r'embedded-portal-containerIframe') | |
# 기간 드롭 다운 메뉴에서 "작년" 선택 | |
browser.find_element_by_css_selector( | |
r'[data-id="transactionFilters-1.timelineViewDateRangeFilter"]').click() | |
browser.find_element_by_css_selector( | |
r'[data-value="PREVIOUS_YEAR"]').click() | |
# 통계창 갱신되므로 로딩 기다림 | |
time.sleep(5) | |
# 통계창이 새로 생성되고 지워지면서 이전 iframe이 날아가므로, 뒤로 빠졌다가 다시 통계창 iframe으로 재전환 | |
browser.switch_to.default_content() | |
browser.switch_to.frame(r'embedded-portal-containerIframe') | |
# 이 시점에서 작년의 모든 지불 영수증 통계와 링크가 나타남 | |
# 클릭 링크들이 지연 활성화되므로, 모두 활성화 할수 있게 브라우저 페이지를 맨 아래로 스크롤링 | |
browser.execute_script( | |
"window.scrollTo(0, document.body.scrollHeight);") | |
time.sleep(1) | |
# 은행으로 지불을 전송한 자료에 대한 모든 링크를 찾기, 이들은 "자동 결제"라는 텍스트를 포함하고 있음 | |
payment_links = browser.find_elements_by_partial_link_text("자동 결제") | |
print("저장할 애드몹 지불 영수증 개수", len(payment_links)) | |
# 하나씩 클릭 | |
for payment_link in payment_links: | |
time.sleep(1) | |
payment_link.click() | |
time.sleep(5) | |
browser.switch_to.window(browser.window_handles[-1]) | |
payment_date_elements = browser.find_elements( | |
by=By.CLASS_NAME, value="payment-receipt-value") | |
if len(payment_date_elements) > 0: | |
filename = payment_date_elements[0].text | |
pdfkit.from_string(input=browser.page_source, | |
output_path=(filename + ".pdf")) | |
print("PDF로 저장됨 : ", filename) | |
else: | |
print("NO PAYMENT DATA") | |
browser.close() | |
browser.switch_to.window(browser.window_handles[0]) | |
browser.switch_to.default_content() | |
browser.switch_to.frame(r'embedded-portal-containerIframe') | |
finally: | |
browser.quit() | |
return | |
if __name__ == "__main__": | |
start() |
세무처리에 일일이 애드몹 지불 영수증을 찍어 보내는게 귀찮아서 파이썬으로 짰다.
작년의 모든 애드몹 지불 영수증을 웹으로 찾아 들어가 PDF로 캡쳐해 파일로 저장해준다.
돌리면 이런식으로 사용자 폴더에 결과가 저장됨.
