Memorandum

普段の生活の覚え書き。主に技術録

【Python】Chromeの自動操作

先日いつものようにSplatoonで遊んでいたらガチマッチで放置勢がいました。 試合開始直後から煽ってきて、試合に参加せず自滅やリスポーン放置を決め込んでいました。 その時はガチヤグラの試合だったのですが、最近ガチヤグラの戦績が悪く、A帯まで落ちたこともあったので、かなり苛立っていました。

幸いその試合は、相手チームの一人が回線落ちをして実質3対3の試合で勝てたのですが、このようなプレイヤーとは二度と試合したくありません。

Splatoon2ではマッチングしたくない相手をブロックする機能と、悪質なプレイヤーを通報する機能があり、以前はイカリング2で通報を一回のみできたのですが、いつからか何度も通報できるようになっていました。(累積してカウントされているかは不明です)

なので、自分の技術試しと好奇心、そして悪質なプレイヤーへのお仕置きとして、通報自動化スクリプトを組んでみました。

API

まずはじめに以前取得したiksm_sessionを使用してPCのChromeイカリング2にアクセスします。

アクセスしてChromeデベロッパーツール(F12)を使用します。 開発者ツールとはWebページの検証ができるツールで、HTMLのソースの確認やJavascriptの実行、パフォーマンス、通信の確認などが行なえます。

イカリング2にアクセスして開発者ツールを開いておき、今回通報したい試合を選び、通報したいプレイヤーを通報します。 すると、開発者ツールの「Network」に今回送信した通報内容が表示されます。

この情報を使って通報を自動化しようとしたのですが、通報にはAPIが使われてるらしく、必要なパラメータが分かりませんでした。

ブラウザ操作の自動化

APIを使っての通報が難しそうなので、Chromeを自動操作して通報するツールの作成に取り掛かりました。

自動化に使ったツールは以前紹介したPythonGoogle ChromeSeleniumです。

Selenium

Seleniumとは様々ブラウザ、プラットフォームで使えるUIテストツールです。 ブラウザで表示される要素を操作・取得し、テストすることが出来ます。

色々なプログラミング言語に対応していて先日導入したPythonでも使えます。

導入

Seleniumを含めた導入手順を以下のサイトを参考にさせていただきました。 https://www.inet-solutions.jp/technology/python-selenium/

簡略な手順としては

  1. Pythonインストール
  2. Seleniumをインストール
  3. WebDriverをインストール

Chromeを使った自動テストを行うと以下のような画面が表示されます。

いざ実装!

実装した処理の流れとして

  1. WebDriverを設定
  2. iksm_sessionをCookieの値として設定
  3. 実際にアクセスし、通報内容を設定して送信

といった感じです。 Cookieの設定方法やXPathと呼ばれる要素の指定方法が初めただったので時間がかかりましたが、慣れると簡単に出来ます。

実装したプログラムが以下です。

クリックで開きます

import requests
import time
from selenium import webdriver

cookie_name = 'iksm_session'
cookie_value = 'XXXXXXXXXXX' #取得したiksm_sessionの値

s = requests.session()

# WebDriverの場所を参照
driver = webdriver.Chrome("C:/Python/Python37/chromedriver_win32/chromedriver.exe")
driver.get("https://app.splatoon2.nintendo.net/")

# cookieとしてiksm_sessionの値をセット
driver.add_cookie({
    'name': cookie_name,
    'value': cookie_value,
    'domain': 'app.splatoon2.nintendo.net'
})

try:
    for i in range(10):
    # 任天堂サーバに負荷をかけないように10秒に一度通報する
        time.sleep(10)
        # 要素の値が読み込めるまで最長10秒待つ
        driver.implicitly_wait(10)
        driver.get("https://app.splatoon2.nintendo.net/results/***/player/********/report_abuse") # 事前に通報したいプレイヤーのURLを取得する

        # 通報内容を入力
        elem_search_word = driver.find_element_by_name("text")
        elem_search_word.send_keys("放置")

        # 通報理由を選択
        elem_search_btn = driver.find_element_by_xpath("//*[@type='radio'][@value='playing_inactivity']")
        elem_search_btn.click()

        # 送信ボタンを押す
        elem_submit_btn = driver.find_element_by_xpath("""//*[@id="app"]/div/div[1]/div[2]/div/div/div/div[2]/div[9]/div/div/div/div/div/div/div[2]/div[2]/form/button""")
        elem_submit_btn.click()
finally:
    time.sleep(1)
    driver.quit()

このスクリプトで10秒に一回、合計10回通報を行えます。手作業のほうが早いかも知れませんが、早すぎてもサーバに負荷をかけてしまうので、抑えめにしています。

No悪質プレイヤー!

今回は悪質プレイヤーの通報を自動化したいという少し意地の悪い動機でしたが、PythonSeleniumを使った自動化を試すことが出来たので、いい経験になったと思います。 自動化で前回紹介したようなスクレイピングをすることができるので、どこかで役に立つと思います。

通報が溜まるとアカウントBANやswitch本体BANなどの処置が行われるので、悪質なプレイヤーは考えを改めてほしいですね。 前作のWiiUSplatoonではチーターが蔓延していて、私も被害にあったので今回はそういったことがないように願います。