GTAオンライン面白いですよね。
2013年発売のゲームなんですが、未だにアップデートが続いてます。
私も頻度は減りましたがまだログインしてます。
今は運悪く新型コロナウイルスによる非常事態宣言期間内なのでますますログインが増えそうです。
最近のゲームはメーカーのアカウントを作ってオンラインでステータスを確認することができます。
何でも記録に残っちゃいますね。
しかし基本的に現時点のステータスしか確認できません。
GTAオンラインの重要な要素であるお金の推移が分かるようにしたかったので
いっちょ作ってみようと思います。
自アカウントのステータスを取る
Rockster Social Clubで自キャラのステータスを確認できます。
APIが用意されていた様なのですがしばらくメンテされていないようで動きませんでした。
(日本Social Clubにログインすると日本のドメインにリダイレクトされるのでそれがダメなのかも)
となればseleniumの出番ですね。
環境
ノートWindows10でやります。
WSLも入ってますがGUIも見れた方がいいと思いWindowsのpythonで動かします。
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
準備
pythonのseleniumはだいぶなれたので今回もこれで行きます。
主な処理
- SocialClubにアクセス
- ログイン処理
- GTAマネーの値をゲット
- ファイルに保存
認証が突破できない、困った
seleniumで起動するとまっさらなChromeが立ち上がります。
当然ブラウザにもアカウントのデータがないのでSoclal Clubサインイン時に画像選択の認証がでます。
ロボット対策のreCAPTCHA認証というらしいです。
これね。
認証を手動でやるのは本末転倒なので他の方法を考えます。
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モジュールもインポートしてます。
数時間後
お気に入りマイカーのインテヴェーロ コケット。
シボレー コルベットがモデルですね。
データはこんな感じで溜まってます。
取得時間、現金、銀行預金のデータです。
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というライブラリがメジャーで色々情報があり使いやすそうだったのでこれを使ってみます。
と言うわけで次回に続きます。