ヤフオクで過去に買った商品を自動でPDFに保存するツール[Python]

#課題
ヤフオクで商品を買った場合、基本的には、領収書は発行されません。そのため、証明するものがない場合、経費として落ちないことがあります。この対処法として、取引画面のキャプチャという方法があります。しかし、一個一個を手作業でやるのは、かなりの苦行です😌

今回は、ChromeDriverを使って、自動化していきたいと思います。

***動作環境***
Mac OS Mojave
Python 3.7.6
VSCode
ChromeDriver

#処理の流れ

①【ヤフオクに自動ログイン】
↓
②【商品毎の落札の取引画面を開く】
↓
③【PDFに変換】
↓
④【指定のファイルに保存】


#処理後の例
<img width="932" alt="スクリーンショット 2020-05-25 15.51.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/643713/22485a90-1a5c-248f-218b-18fe1f3cf8b2.png">



#ソースコードはこちら

```
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time 
import json
import sys

username= "ユーザー名"
password="パスワード"

def main():
 #ヤフオクのURL
driver.get('https://login.yahoo.co.jp/config/login?.src=auc&.done=https%3A%2F%2Fauctions.yahoo.co.jp%2F' ) 
 #自動ログイン
   driver.find_element_by_id("username").send_keys(username)
   driver.find_element_by_id("btnNext").click()
   time.sleep(1)
   driver.find_element_by_id("passwd").send_keys(password)
   driver.find_element_by_id("btnSubmit").click()
 #driver.find_element_by_id("").click() *ポップアップ広告が出た時

   driver.find_element_by_xpath('//*[@id="yjMain"]/div/div[2]/div[2]/div/div[2]/table/tbody/tr[3]/td[1]/a').click()
   time.sleep(1)
 #次へのボタンがなくなるまでループ  

   while True:
     try:
        if len(driver.find_elements_by_xpath("//img[@src='https://s.yimg.jp/images/auct/template/ui/search/arrow_next.gif']")) > -1:
               print("start PDF")
               item_list= []
               for item in driver.find_elements_by_css_selector('p.decTxt01'):
                   try:
                       link = item.find_element_by_tag_name("a").get_attribute("href")
                   except:
                       link = "skip"    
                   item_list.append(link)

               for link in item_list:
                   try:
                           driver.get(link)
                           time.sleep(2)
                           driver.find_element_by_class_name('decIcoArw').click()
                           time.sleep(2)
                           driver.execute_script('return window.print()')
                           driver.back()
                   except :
                           print("None")
               btn = driver.find_element_by_link_text("次の50件").get_attribute("href")
               print(btn)
               print("next url:{}".format(btn))
               driver.get(btn)
               print("Next page") #強制的に終了
     except:
           sys.exit()
 #印刷を無理やりPDF保存する設定

chopt=webdriver.ChromeOptions()
appState = {
   "recentDestinations": [
       {
           "id": "Save as PDF",
           "origin": "local",
           "account":"" #Chrome (78.0.3904.108)は、必要
       }
   ],
   "selectedDestinationId": "Save as PDF",
   "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
chopt.add_experimental_option('prefs', prefs)
chopt.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='chromedriverのディレクトリ ',options=chopt)
 #処理実行
if __name__ == '__main__':
   main()
 #*注意点

掲示板にて、取引をしている場合のみは、手作業でのPDF保存になります。

```

まず最初に、selenium, time, json,sysをインポートします。

```
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time 
import json
import sys
```
ヤフオクのログイン画面から自動的にログインしてくれます。サーバーに負荷をかけないようにtime.sleep(1)で1秒間だけ時間を置いてます。

```
def main():
 #ヤフオクのURL
driver.get('https://login.yahoo.co.jp/config/login?.src=auc&.done=https%3A%2F%2Fauctions.yahoo.co.jp%2F' ) 
 #自動ログイン
   driver.find_element_by_id("username").send_keys(username)
   driver.find_element_by_id("btnNext").click()
   time.sleep(1)
   driver.find_element_by_id("passwd").send_keys(password)
   driver.find_element_by_id("btnSubmit").click()
 #driver.find_element_by_id("記入").click() *ポップアップ広告が出た時

   driver.find_element_by_xpath('//*[@id="yjMain"]/div/div[2]/div[2]/div/div[2]/table/tbody/tr[3]/td[1]/a').click()
   time.sleep(1)
```

次のページがなくなるまで、自動でページ遷移するようにループします。

```
 #次へのボタンがなくなるまでループ  

   while True:
     try:
        if len(driver.find_elements_by_xpath("//img[@src='https://s.yimg.jp/images/auct/template/ui/search/arrow_next.gif']")) > -1:
               print("start PDF")
               item_list= []
               for item in driver.find_elements_by_css_selector('p.decTxt01'):
                   try:
                       link = item.find_element_by_tag_name("a").get_attribute("href")
                   except:
                       link = "skip"    
                   item_list.append(link)

               for link in item_list:
                   try:
                           driver.get(link)
                           time.sleep(2)
                           driver.find_element_by_class_name('decIcoArw').click()
                           time.sleep(2)
                           driver.execute_script('return window.print()')
                           driver.back()
                   except :
                           print("None")
               btn = driver.find_element_by_link_text("次の50件").get_attribute("href")
               print(btn)
               print("next url:{}".format(btn))
               driver.get(btn)
               print("Next page") #強制的に終了
     except:
           sys.exit()
```
ChromeOptionsによって、印刷を強制的に停止させて、PDF保存を自動的にするようにしてます。

```
#印刷を無理やりPDF保存する設定

chopt=webdriver.ChromeOptions()
appState = {
   "recentDestinations": [
       {
           "id": "Save as PDF",
           "origin": "local",
           "account":"" #Chrome (78.0.3904.108)は、必要
       }
   ],
   "selectedDestinationId": "Save as PDF",
   "version": 2
}

prefs = {'printing.print_preview_sticky_settings.appState': 
json.dumps(appState)}
chopt.add_experimental_option('prefs', prefs)
chopt.add_argument('--kiosk-printing')
driver = webdriver.Chrome(executable_path='chromedriverのディレクトリ ',options=chopt)
 #処理実行
if __name__ == '__main__':
   main()
```

#おわりに
ヤフオクのデータは90日で、更新されてまうので、3ヶ月毎にこのツールを使っていきたいと思います。Xpathで要素を指定している箇所は、次に使う時に変わっているかもしれませんが…🤗(2020/5/25　動作確認済み)