pythonでAmazonの領収書をPDF化

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

上記のコマンドで実行できます。

ソースコードの説明

Chrome起動し、印刷設定

    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)

Amazonにログイン

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()

右上にある「注文履歴」を自動クリックし注文履歴画面を表示する。

PDF保存したい範囲設定

    # 期間の選択 会員状態によって下記のコメントアウトを解除してください
    # 通常の会員
    driver.find_element_by_id("a-autoid-1-announce").click()
    # アソシエイトツールバーがある会員
    # driver.find_element_by_id("a-autoid-4-announce").click()

    input("PDF保存したい範囲を設定してください\n設定完了したらエンターキーを押してください。")
    print("続行")

期間を選択します。

会員状態によってコードを変えてください。

通常会員:driver.find_element_by_id(“a-autoid-1-announce“).click()

アソシエイトツールバーがある会員:driver.find_element_by_id(“a-autoid-4-announce“).click()

※ツールバーがあるため、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保存を繰り返し行います。

終了したらターミナル上に 終了 と表示されます。

1ページ目しか繰り返し操作されない。

もし、2ページ目以降も保存する場合、コードを修正する必要があります。

Google Chrome Driverの設定

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保存に変更できます。

最後に

最後までご覧いただきありがとうございます。

実際に使ってみて不明点があればコメントください!!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA