pythonを勉強したときに練習として、Amazonの領収書をPDF化してPCに保存するプログラムを作りましたのでソースを共有します。
Amazonの領収書を確定申告で使用しているけどPDFにするのが面倒な方、ぜひこちらを使ってください!!
前提
- Amazonアカウント発行済み
- Amazonの注文履歴あり
プログラムの概要
pythonを使って、seleniumで自動操作し、Amazonの注文履歴の印刷設定で「PDF」にしてPCに保存します。
そして他に履歴があれば同じように繰り返し自動操作する。
というプログラムです。
完成のソースコード
python
import json
import os
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
# import chromedriver_binary
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.common.by import By
EMAIL = [ メールアドレス ]
PASS = [ パスワード ]
def main():
options = webdriver.ChromeOptions()
options.add_argument('--headless')
chopt = webdriver.ChromeOptions()
# 保存方法をPDFに変更
pdfSetting(chopt)
# 印刷ボタンを自動で押下
chopt.add_argument('--kiosk-printing')
# driver = webdriver.Chrome(options=chopt)
driver = webdriver.Chrome(ChromeDriverManager().install(), options=chopt)
driver.get('https://www.amazon.co.jp/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.co.jp%2F%3Fref_%3Dnav_ya_signin&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=jpflex&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&')
input_box = driver.find_element_by_id("ap_email")
input_box.send_keys(EMAIL)
input_box.submit()
input_box = driver.find_element_by_id("ap_password")
input_box.send_keys(PASS)
input_box.submit()
wait = WebDriverWait(driver, 20)
element = wait.until(expected_conditions.presence_of_element_located((By.ID, "nav-orders")))
element = driver.find_element_by_id("nav-orders").click()
# 期間の選択 会員状態によって下記のコメントアウトを解除してください
# 通常の会員
driver.find_element_by_id("a-autoid-1-announce").click()
# アソシエイトツールバーがある会員
# driver.find_element_by_id("a-autoid-4-announce").click()
input("PDF保存したい範囲を設定してください\n設定完了したらエンターキーを押してください。")
print("続行")
page_items = driver.find_elements_by_class_name("a-box-group")
for i, j in enumerate(page_items):
driver.find_elements_by_class_name("a-box-group")[i].find_element_by_link_text("領収書等").click()
driver.implicitly_wait(5)
driver.find_element_by_link_text("領収書/購入明細書").click()
driver.execute_script('window.print();')
driver.back()
print("終了")
def pdfSetting(chopt):
# Google Chrome Driverの設定
appState = {
"recentDestinations": [
{
"id": "Save as PDF",
"origin": "local",
"account":""
}
],
"selectedDestinationId": "Save as PDF",
"version": 2
}
prefs = {'printing.print_preview_sticky_settings.appState':json.dumps(appState)}
return chopt.add_experimental_option('prefs', prefs)
if __name__ == "__main__":
main()
python [ファイル名].py
上記のコマンドで実行できます。
ソースコードの説明
options = webdriver.ChromeOptions()
options.add_argument('--headless')
chopt = webdriver.ChromeOptions()
# 保存方法をPDFに変更
pdfSetting(chopt)
# 印刷ボタンを自動で押下
chopt.add_argument('--kiosk-printing')
# driver = webdriver.Chrome(options=chopt)
driver = webdriver.Chrome(ChromeDriverManager().install(), options=chopt)
EMAIL = [ メールアドレス ]
PASS = [ パスワード ]
ご自身のメールアドレスとパスワードの設定してください
driver.get('https://www.amazon.co.jp/ap/signin?openid.pape.max_auth_age=0&openid.return_to=https%3A%2F%2Fwww.amazon.co.jp%2F%3Fref_%3Dnav_ya_signin&openid.identity=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.assoc_handle=jpflex&openid.mode=checkid_setup&openid.claimed_id=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0%2Fidentifier_select&openid.ns=http%3A%2F%2Fspecs.openid.net%2Fauth%2F2.0&')
input_box = driver.find_element_by_id("ap_email")
input_box.send_keys(EMAIL)
input_box.submit()
input_box = driver.find_element_by_id("ap_password")
input_box.send_keys(PASS)
input_box.submit()
Amazonのログインページを開き、上記で設定されたメールアドレスとパスワードを入力し、自動でログインします。
※連絡用の電話番号を入力する画面が表示する場合がありますが「後で」をクリックすればスキップします。
wait = WebDriverWait(driver, 20)
element = wait.until(expected_conditions.presence_of_element_located((By.ID, "nav-orders")))
element = driver.find_element_by_id("nav-orders").click()
右上にある「注文履歴」を自動クリックし注文履歴画面を表示する。
# 期間の選択 会員状態によって下記のコメントアウトを解除してください
# 通常の会員
driver.find_element_by_id("a-autoid-1-announce").click()
# アソシエイトツールバーがある会員
# driver.find_element_by_id("a-autoid-4-announce").click()
input("PDF保存したい範囲を設定してください\n設定完了したらエンターキーを押してください。")
print("続行")
期間を選択します。
※ツールバーがあるため、idが変わります。
page_items = driver.find_elements_by_class_name("a-box-group")
for i, j in enumerate(page_items):
driver.find_elements_by_class_name("a-box-group")[i].find_element_by_link_text("領収書等").click()
driver.implicitly_wait(5)
driver.find_element_by_link_text("領収書/購入明細書").click()
driver.execute_script('window.print();')
driver.back()
print("終了")
選択された期間にある注文履歴の履歴書をPDF保存を繰り返し行います。
終了したらターミナル上に 終了 と表示されます。
def pdfSetting(chopt):
# Google Chrome Driverの設定
appState = {
"recentDestinations": [
{
"id": "Save as PDF",
"origin": "local",
"account":""
}
],
"selectedDestinationId": "Save as PDF",
"version": 2
}
prefs = {'printing.print_preview_sticky_settings.appState':json.dumps(appState)}
return chopt.add_experimental_option('prefs', prefs)
これで印刷設定をPDF保存に変更できます。
最後に
最後までご覧いただきありがとうございます。
実際に使ってみて不明点があればコメントください!!