雑木林

頭の中の整理と忘れないための確認メモ

デイリーパチンコに接続するコンテナを作った話

DMMにはアイテムやガチャの購入に利用可能なDMMポイントというのがあります。
DMMポイントは実際に課金する以外にもいくつかの条件で貯めることが可能です。
その1つにデイリーパチンコがあり、DMM GAMESのみに利用可能なポイントに変換できます。
デイリーパチンコは1日1回できるのですが、面倒なのでSeleniumで実現したお話。
利用規約とかに抵触する可能性もあるので、垢Banされても責任は取れません。

実行環境
・ ハード:Raspberry pi 3 Model B
・ ホストOS:Rasbian Buster
・コンテナ:Alpine Linux:latest

コンテナ化について

コンテナ化する意味はほぼなかったりします。
後付けですがSelenium環境を独立して、それなりに軽量に作れる…くらいでしょうか。
Dockerfile自体はかなりシンプルで、Selenium入れてスクリプトを実行するだけです。
ユーザ名とパスワードを環境変数で渡すので、デフォルト値を入れています。

FROM alpine:latest
RUN apk --update --no-cache add python3 chromium chromium-chromedriver \
    && rm -rf /var/cache/apk/* \
    && pip3 install selenium

COPY dmm.py dmm.py
ENV DMM_USERNAME='username' DMM_PASSWORD='password'

ENTRYPOINT ["python3" , "dmm.py"]
Seleniumスクリプト

実際にデイリーパチンコに接続するSeleniumスクリプトは以下です。
スクリプトを実行するとパチンコの結果を出力します。
ログインが成功するとDMMトップページにリダイレクトされる事を判定に使ってます。
エラー判定がザルなのはお察し…。

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

import os
import sys
import time
from selenium import webdriver
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException

DMM_GAME_TOPPAGE="https://www.dmm.com/"
DMM_LOGIN_PAGE="https://accounts.dmm.com/service/login/password/"
DMM_PACHINKO_PAGE="http://www.dmm.com/netgame/pachinko/-/game/"
DMM_USERNAME=os.environ['DMM_USERNAME']
DMM_PASSWORD=os.environ['DMM_PASSWORD']
WAIT_TIMER=30

try:
    options = webdriver.ChromeOptions()
    options.add_argument('--headless')
    options.add_argument('--no-sandbox')
    driver = webdriver.Chrome(options=options)
    wait = WebDriverWait(driver, WAIT_TIMER)

    # ログイン処理
    driver.get(DMM_LOGIN_PAGE)
    id = driver.find_element_by_id("login_id")
    id.send_keys(DMM_USERNAME)
    password = driver.find_element_by_id("password")
    password.send_keys(DMM_PASSWORD)
    driver.find_element_by_xpath("//form[@name='loginForm']//input[@type='submit']").click()
    wait.until(expected_conditions.url_to_be(DMM_GAME_TOPPAGE))

    # パチンコ画面の表示
    driver.get(DMM_PACHINKO_PAGE)
    wait.until(expected_conditions.presence_of_element_located)

    # 現在のパチンコ玉の取得
    message = driver.execute_script("return txt_tama_get;") + "玉取得\n累計:" \
                  + driver.execute_script("return txt_tama_all;") + "玉"
    print(message)

except TimeoutException:
    print("Login Error.")
except:
    print("Unexpected error:", sys.exc_info()[0])
    raise
finally:
    driver.close()
    driver.quit()
buildとrun

コンテナイメージは276MB…軽量?というほどでもないです。

$ docker build . -t dmm_pachinko:1.0
Sending build context to Docker daemon  13.82kB
Step 1/5 : FROM alpine:latest
 ---> 962e8b19ad7b

...


Removing intermediate container 719eea033813
 ---> 94f6d3d7c542
Successfully built 94f6d3d7c542
Successfully tagged dmm_pachinko:1.0

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
dmm_pachinko        1.0                 94f6d3d7c542        About a minute ago   276MB

失敗例(ログインに失敗した場合)

$ docker run --rm --env-file envfile_ng dmm_pachinko:1.0
Login Error.

$ cat envfile_ng
DMM_USERNAME=user@dummy.local
DMM_PASSWORD=password

成功例(複数回実行してもOK)

$ docker run --rm --env-file envfile_ok dmm_pachinko:1.0
10玉取得
累計:190玉

$ cat envfile_ok
DMM_USERNAME=正しいログインID
DMM_PASSWORD=正しいパスワード

$ docker run --rm --env-file envfile_ok dmm_pachinko:1.0
0玉取得
累計:190玉

あとはこれを1日1回実行すればよいです。
結果をSlackとかに通知すれば更に楽になります。
最後に…この仕組みを使って垢Banされても責任は取れませんのでご利用は計画的に。