イベンターノートにおけるZero Project問題を解決する

playwright,python

どうも

イベンターノートにおけるZero Project問題を解決したいのでpythonで解決しました。

イベンターノートにおけるZero Project問題とは

イベンターノート真剣部かつ地下アイドルのオタクがイベンターノートを書くときにキレそうになるのはZero Projectだろう。

こいつらはブロックごとにアーティストページが分かれており、ブロックごとにアーティスト情報を登録しないといけない。あ☆ね。

手動で登録するのだるいなと思って、イベンターノートに登録されていないブロックを自動で登録するプログラムを書きました。

いままでは登録されていないブロックはめんどくさいのでスルーしていましたが、これからはイベンターノート登録前にzero projectがいる場合はこのプログラム回せば解決するのでありがたいねの気持ちです。

コード

from playwright.sync_api import sync_playwright
import pathlib
import re

#イベンターノートのログイン情報
LoginMail =""
LoginPass = ""

#Chromeオプション
bargs = [
              "--enable-features=enable-automation",
              '--blink-settings=imagesEnabled=false',
              "--disable-gpu",
              "--disable-web-security",
              "--disable-xss-auditor",    
              "--no-sandbox",
              "--disable-setuid-sandbox",
              "--allow-running-insecure-content",
              "--disable-webgl",
              "--disable-popup-blocking",
              '--disable-dev-shm-usage',
              '--hide-scrollbars',
              '--lang=ja',
              "--log-level=3",
              "--disable-infobars",
              '--proxy-server="direct://"',
              '--proxy-bypass-list=*',

            ]

#ぜろぷろじぇくとのHPから現行のブロックを取得
def check():
    with sync_playwright() as p:

        browser =p.chromium.launch_persistent_context(
          user_data_dir= pathlib.Path(r'ud').resolve(),
          channel="chrome",
          headless=True,
          args=bargs,
          chromium_sandbox=True,
          no_viewport=True,
          )
        page = browser.new_page()
        page.goto("https://zero-project.net/block",wait_until="domcontentloaded")
        zpl = page.locator('img[alt^="Z"]')
        return [zpl.nth(i).get_attribute("alt") for i in range(zpl.count())]

#ブロック名のひらがなよみを生成する
def hiragana(bn):
    eisu = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
    hiragana = ("えー・びー・しー・でぃー・いー・えふ・じー・えいち・あい・じぇー・けー・える・えむ・えぬ・おー・ぴー・きゅー・あーる・えす・てぃー・ゆー・ぶい・だぶりゅー・えっくす・わい・ぜっと・ぜろ・わん・つー・すりー・ふぉー・ふぁいぶ・しっくす・せぶん・えいち・ないん").split("・")
    by = ""
    for i in bn:
        if i == "-":
            pass
        else:
            hi = hiragana[eisu.index(i)]
            by += hi
    return by

#イベンターノートに書き込む
def wright(x):
    rslt = x
    if len(rslt) > 0:
        with sync_playwright() as p:

            browser =p.chromium.launch_persistent_context(
            user_data_dir= pathlib.Path(r'ud').resolve(),
            channel="chrome",
            headless=False,
            args=bargs,
            chromium_sandbox=True,
            no_viewport=True,
            )
            global page
            page = browser.new_page()
            login()
            for i in rslt:
                page.goto("https://www.eventernote.com/actors/add",wait_until="domcontentloaded")
                page.fill("#input_name","Zero Project "+i)
                page.fill("#input_kana","ぜろぷろじぇくと"+hiragana(i))
                page.check('[value="1"]')
                page.click('[class="btn btn-primary"]')
                page.wait_for_url("https://www.eventernote.com/actors/add/confirm",wait_until="domcontentloaded")
                try:
                    page.inner_text('[for="input_name"]+div>p',timeout=500)
                    page.click('[class="btn btn-primary"]')
                    page.wait_for_url("https://www.eventernote.com/actors/add/complete",wait_until="domcontentloaded")
                except:pass
    else:pass

#イベンターノートにログインする    
def login():

    page.goto("https://www.eventernote.com/login",wait_until='domcontentloaded')
    try:
        page.wait_for_url("https://www.eventernote.com/login",wait_until="commit",timeout=500)
        page.fill('//input[@name="email"]', LoginMail,no_wait_after=True)
        page.fill('//input[@name="password"]', LoginPass,no_wait_after=True)
        page.click('//input[@value="ログインする"]')
        page.wait_for_url("https://www.eventernote.com/")
    except:pass

#イベンターノートに登録されているぜろぷろじぇくとのブロックを取得する         
def fg():
    with sync_playwright() as p:

        browser =p.chromium.launch_persistent_context(
          user_data_dir= pathlib.Path(r'ud').resolve(),
          channel="chrome",
          headless=True,
          args=bargs,
          chromium_sandbox=True,
          no_viewport=True,
          )
        page = browser.new_page()
        page.goto("https://www.eventernote.com/actors/search?keyword=zero+project+z",wait_until="domcontentloaded")
        cz =[]
        while True:
            cz.extend(page.locator('[href^="/actors/Zero%"]').all_inner_texts()) 
            try:
                page.click('[class="next"]>a',timeout=1000)
                page.wait_for_load_state(state="domcontentloaded")
            except:
                break

        return [re.sub("Zero Project ","",x) for x in cz]
        
#イベンターノートとホームページの情報を比較してイベンターノートに登録されていないブロックを取得する          
def nc():
    el = fg()
    wp = check()
    return [x for x in set(el) ^ set(wp)if len(x) == 5 and not x in el]

a = nc()
wright(a)

解説

ぜろぷろじぇくとのHPとイベンターノートに登録されているぜろぷろじぇくとを比較して差分をイベンターノートに登録するだけです。

ブラウジングはPlaywrightでやってあとは標準ライブラリで行けてると思う。

気分で登録作業だけヘッドレス解除してます。

あとがき

ぜろぷろじぇくと、どこに需要あるのか不明ですが、女からもオタクからも搾取できるシステムとしては優秀ですね。曲書かせてください。Zero Project Zx-Xx 音質派ってブロック作ってください。

playwright,python