paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

GTAオンラインマネーのキャッシュフローを可視化したい データ溜める編

GTAオンライン面白いですよね。
2013年発売のゲームなんですが、未だにアップデートが続いてます。

私も頻度は減りましたがまだログインしてます。

今は運悪く新型コロナウイルスによる非常事態宣言期間内なのでますますログインが増えそうです。

最近のゲームはメーカーのアカウントを作ってオンラインでステータスを確認することができます。
何でも記録に残っちゃいますね。

しかし基本的に現時点のステータスしか確認できません。

GTAオンラインの重要な要素であるお金の推移が分かるようにしたかったので
いっちょ作ってみようと思います。

自アカウントのステータスを取る

Rockster Social Clubで自キャラのステータスを確認できます。

APIが用意されていた様なのですがしばらくメンテされていないようで動きませんでした。
(日本Social Clubにログインすると日本のドメインにリダイレクトされるのでそれがダメなのかも)

rockstar-api.readthedocs.io

となればseleniumの出番ですね。

環境

ノートWindows10でやります。
WSLも入ってますがGUIも見れた方がいいと思いWindowspythonで動かします。

PS C:\Users\masashi\tools\gta_assets> $psversiontable

Name                           Value
----                           -----
PSVersion                      5.1.18362.628
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.18362.628
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1


PS C:\Users\masashi\tools\gta_assets> python --version
Python 3.7.2

準備

pythonseleniumはだいぶなれたので今回もこれで行きます。

主な処理

  1. SocialClubにアクセス
  2. ログイン処理
  3. GTAマネーの値をゲット
  4. ファイルに保存

seleniumの使用ブラウザはChromeです。

認証が突破できない、困った

seleniumで起動するとまっさらなChromeが立ち上がります。
当然ブラウザにもアカウントのデータがないのでSoclal Clubサインイン時に画像選択の認証がでます。
ロボット対策のreCAPTCHA認証というらしいです。

これね。

f:id:paloma69:20200412215517p:plain

認証を手動でやるのは本末転倒なので他の方法を考えます。

  1. reCAPTCHAを突破する機能を作る
  2. pyautoguiでブラウザ操作する
  3. seleniumGoogleアカウントを読み込ませる

1を実装が出来たらハッカー級です、今の私には無理…
2は座標の取得が大変です。
無難に3でやることにしました。

さすがというかこの辺のナレッジがたくさんありました。

ブラウザセッションの関係で本当は専用ユーザープロファイルを作った方がいいのですが
このためにわざわざ作るのもなんなのでいつも使ってる自分のプロファイルを使います。

保存ディレクトリはURLにchrome://veisionで確認出来ます。

Chromeはバックエンドでプロセスが動いていてこの状態でselenium起動するとセッション重複でエラーになります。

プロセス終了すればseleniumは動くので今回はChromeが動いていない状態での挙動になります。

コード

  • getgtamoney.py
from selenium import webdriver
import configure
import datetime
import time
import csv
import os

os.chdir(configure.my_path)

URL = 'https://ja.socialclub.rockstargames.com'

options = webdriver.ChromeOptions()
options.add_argument('--user-data-dir=' + configure.chrome_path)
browser = webdriver.Chrome(options=options)

browser.get(URL)
time.sleep(10)

# For Singin Function at Firsttime
def Sitelogin():
    signin_btn = browser.find_element_by_xpath('//*[@id="app-page"]/div[1]/div/div/div/div/div/div[1]/a[1]')
    signin_btn.click()

    email = browser.find_element_by_xpath('//*[@id="app-page"]/div[2]/div[1]/div/div/form/fieldset[1]/span/input')
    email.send_keys(configure.email)

    password = browser.find_element_by_xpath('//*[@id="app-page"]/div[2]/div[1]/div/div/form/fieldset[2]/span[1]/span[1]/input')
    password.send_keys(configure.password)

    login_btn = browser.find_element_by_xpath('//*[@id="app-page"]/div[2]/div[1]/div/div/form/fieldset[3]/div/button')
    login_btn.click()

browser.get('/'.join([URL, 'games/gtav/pc/career/overview/gtaonline']))
time.sleep(3)

getcash = browser.find_element_by_xpath('//*[@id="cash-value"]').text
getbank = browser.find_element_by_xpath('//*[@id="bank-value"]').text

# Change datatype integer
cash = int(getcash[1:].replace(',', ''))
bank = int(getbank[1:].replace(',', ''))

gettime = datetime.datetime.today().strftime('%Y/%m/%d %H:%M')

with open('.\\data\\gtacashflow.csv', 'a', newline='') as f:
    writer = csv.writer(f)
    writer.writerow([gettime, cash, bank])


browser.close()
browser.quit()

コードの解説

自アカウント、環境系はconfigureファイルに外だししてます。

ページ遷移の時にseleniumのwaitを使いたかったのですが、今回はsleepで凌いでます。
エラー処理も特にやってないやっつけです。

--user-data-dirで自分のChromeプロファイルのフォルダを指定してRockster Social Clubにログインしておくことで認証をスキップできます。
def Sitelogin()はログイン用に用意したのですが、今回の方法なら不要でした。
なのでコード内で使っていません。
(いつか消します)

このコードで現在の自キャラの現金と銀行の預金が取れます。

値を取ってきた状態はstr型なので計算出来るようにint型に直してます。

実行はこれだけですね。

PS C:\Users\masashi\tools\gta_assets> python .\getgtamoney.py

取得データのタンキング

これで取得出来るようになったので定刻おきに取得してタンキングします。

取るデータは取得時間とその時の所持金だけなのでcsvに溜めます。

2~3時間ほどプレイします。
効率の良いカーディーラーをメインに稼ぎます。

今回は上記のコードをタスクスケジューラで起動しました。
15分おきに起動しています。
タスクスケジューラ起動の際にファイル保存できるようにosモジュールもインポートしてます。

数時間後

お気に入りマイカーのインテヴェーロ コケット。
シボレー コルベットがモデルですね。

f:id:paloma69:20200412220334p:plain

データはこんな感じで溜まってます。
取得時間、現金、銀行預金のデータです。

PS C:\Users\masashi\tools\gta_assets> cat '.\data\gtacashflow.csv'
2020/04/12 17:15,40000,1081924
2020/04/12 17:30,40000,1081924
2020/04/12 17:45,0,1121924
2020/04/12 18:00,0,1095781
2020/04/12 18:15,0,1060181
2020/04/12 18:30,0,1236818
2020/04/12 18:45,2000,1236818
2020/04/12 19:00,2000,1136818
2020/04/12 19:15,0,1122693
2020/04/12 19:30,0,1239993
2020/04/12 19:45,0,1248918
2020/04/12 20:00,0,1248918
2020/04/12 20:15,0,1248918

いよいよ可視化します!

表計算ソフトを使っても面白くないのでここもpythonを使ってグラフ化してみます。

pythonはライブラリが沢山あるのでグラフ化パッケージもちゃんとあります。

matplotlibというライブラリがメジャーで色々情報があり使いやすそうだったのでこれを使ってみます。

と言うわけで次回に続きます。

参考サイト