SeleniumによるEvernoteの自動クリップ

インフラエンジニアなのでSeleniumなどのフロントエンド系は触ることはないのですが、「連載記事をまとめてEvernoteのWebクリッパーでクリップしたい」と考えて自動化する手段を調べた結果、Seleniumによるバッチ処理という答えにたどり着きました。

やっていることはシンプルで、SeleniumからGeckoドライバーでFirefoxを起動したあと、URLを開く、ショートカットキーを押下する、次のURLを開く…を続けるだけ。
PythonでSeleniumやGeckoドライバの配置についてはググっていただき、「listをfor文で回すな」等のツッコミはご容赦下さい…

import time

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

def loader_url(filepath):
    urllist = list()
    with open(filepath, "r") as f:
        line = f.readline()

        while line:
            line_trim = line.strip()

            # 空行はスキップする
            if len(line_trim) == 0:
                line = f.readline()
                continue

            # 処理の開始
            urllist.append(line_trim)

            line = f.readline()

    return urllist

def evernote_webclip(url, driver=None):
    # キー操作
    WEBCLIPPER_KICK = "`"
    WEBCLIPPER_SIMPLE = "C"
    # 待ち時間
    LOAD_PAGE = 5  # ページ読取り待ち
    SEND_WEBCLIP = 5 # Webクリップ起動まで
    LOAD_NEXT_PAGE = 10 # 簡易版の次のページ読み込みを待つ
    STORE_WAIT = 10 # ページ保存

    if driver == None:
        driver = webdriver.Firefox()
    driver.get(url)

    # 読取り待ち
    time.sleep(LOAD_PAGE)
    element = driver.find_element_by_tag_name("html")

    # Webクリッパーを起動
    element.send_keys(WEBCLIPPER_KICK);
    # Webクリッパーの起動待ち
    time.sleep(SEND_WEBCLIP)

    # 簡易版記事の保存
    element.send_keys(WEBCLIPPER_SIMPLE);
    time.sleep(LOAD_NEXT_PAGE)
    element.send_keys(Keys.ENTER);
    # Webクリッパーの起動待ち
    time.sleep(STORE_WAIT)


if __name__ == '__main__':
    firefox_profile = r'C:\Users\user\AppData\Roaming\Mozilla\Firefox\Profiles\123abcde.default'
    url_file = r'C:\Users\user\Documents\selenium_urls.txt'
    url_list = loader_url(url_file)

    driver = webdriver.Firefox(firefox_profile)

    for url in url_list:
        evernote_webclip(url, driver=driver)

変数定義などが多いため、実際の処理部分はそんなに多くありませんので詳細はコードを見ていただきたいですが、下記の様な実装になっています。

  • loader_url()関数は、渡されたテキストファイルに書かれている1行ごとのURLをリストに格納します
  • evernote_webclip()関数は、URLとドライバーを元にEvernote WebClipを使って保存します
  • Selenium内でショートカットキーを発行するには、何か要素をつかむ必要があるようなので、適当にhtmlタグをつかませています
  • evernote_webclip()関数内で発行しているWebCliperのショートカットキーは「`」でWebCliper起動、「C」で簡易版の記事の保存です