扶桑工廠

I sleep all night and I work all day.

WaifuLabsを自動化する


一年ぐらい更新してませんでした。

この間に前の記事botが凍結されました。悲しい。
今回もPythonでWebサイトと遊びます。

 
さて、Waifulabs(https://waifulabs.com)をご存知でしょうか。
AIがアニメ絵の女の子を描いてくれるWebサービスです。
4×4のタイル表示の中から選択して(もしくは再抽選)いくことを4回繰り返し、好みのWaifuを作っていきます。

しかし、そこそこ遊んでいると当然自分の好みに大幅に偏り、新鮮さがなくなってきます。でもたまには別のも欲しくなりません?(わがまま)
というわけで、自動的にWaifuLabsで作ってもらうプログラムを組みます。公式のDiscordbotを使えばいいとか言わない
今回もPythonを使います。

 
最初にサイト構造を調べる作業から。前の記事とやることはほとんど一緒ですが、今回は操作しないと進まないので、ブラウザを自動化することを考えながら調べます。
まずはスタート画面。"MEET YOUR DREAM WAIFU"を押さないと先に進まないので、要素を調べます。

 f:id:fusowasedr09:20200502140459p:plain

割とすぐに見つかりました。ですが、上の画像をよく見ると同じclassが2つあるのがわかります。
ここで押したいのは(HTML抜粋)

<div class="button-content">
    <span class="label">Meet your dream waifu</span>

なので、覚えておきます。

次はアプリケーションの操作。

f:id:fusowasedr09:20200502141619p:plain

class="container"以下に16個のclass="girl"がありますが、今回はランダム生成なので最初の1個めを取れば良さそうです。
相手のランダム性にかけて、手を抜きます。(手を抜かないなら、リストに格納したあとで0から15までの乱数で選択すれば動くと思います)
あと残り3回のステップでも、格納場所は一緒だったので同じ動作を回すだけです。

最後の保存画面でWaifuをダウンロードすれば完了です。

f:id:fusowasedr09:20200502142321p:plain

画像のダウンロードを、ソースから直抜きするかダウンロードボタンを押してDLするかは選べますが、ソースから引っこ抜く方が簡単です(動いてないなら)。
が、作ったときは何も考えてなかったのでボタンを押してダウンロードする方法を取りました。
最後に、初期画面に戻してループさせれば、自動装置が完成します。

見通しが持てたのでコードを書きます。
それで出来上がったものがこちらです。githubに上げてあるのとほぼ一緒。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import os
import os.path
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

Target =  "https://waifulabs.com/" # 指定URL
Driver_path = "chromedriver.exe"   # chromedriverの場所
Interval = 3 # 遅延時間設定(あまり短くしないこと)

kaisu = input("何回繰り返す?(半角数字)")
kaisu = int(kaisu)
driver = webdriver.Chrome(executable_path=Driver_path)

def main():
    driver.get(Target) # URL先に移動
    # ボタン操作
    driver.find_element_by_xpath("//*[contains(text(), 'Meet your dream waifu')]").click()
    time.sleep(Interval)
    # escキー入力(ポップアップ回避)
    webdriver.ActionChains(driver).send_keys(Keys.ESCAPE).perform()
    # 本命の操作
    for j in range(4):
        driver.find_element_by_class_name("girl").click()
        time.sleep(Interval)
    # 保存ボタン入力
    driver.find_element_by_class_name("download-button").click()
    time.sleep(Interval)

if __name__ =="__main__":
    for i in range(kaisu):
        main()
    driver.quit()

今回は動的な作業が必要なのでBeautifulSoup4ではなく、Seleniumを使用しています。
Seleniumをpip経由でインストールし、chromedriverをダウンロードし(面倒なので)プログラムと一緒の階層に置きました。
階層指定はwindows版の指定で書いているので、別OSを使用する場合は指定場所を変更する必要があります。ググれば出ます。

やっていることはURL先に飛んで、自動的にアプリケーションを回すだけです。
最初のボタン指定はxpathで書くことで適切なボタンを押すようにしています。
(ここではワイルドカードで指定してテキストに指定文字列を含むものを探していますが、もし指定文字列が2つ以上ある可能性があるなら、一回直上の階層をリストで取得してから下層に降りて本命を取る形にします)

また、最初だけはチュートリアルが表示されてしまい、そのまま進行すると要素がなくてエラーを出すので、それを回避します。
だいぶ時間がかかった後、ESCキーで飛ぶことに気がついたため、キー入力を送るようにしました。
最初さえ終わればあとは順番通りに書いていくだけ…

と思いきや、"Restart from the beginning”をクリックする動作を入れるとなぜか失敗することがあったので(おそらく早すぎ)、再接続でごまかすことにします。

これで回数指定すればぐるぐる自動的にまわしてくれます。調整しないので出来は回数で補おう。