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されても責任は取れませんのでご利用は計画的に。