SAKITOのポイントガチャ自動化
KIT Developer Advent Calendar の20日目です。 今は21日目ですが、空いていたので書いてみました。
はじめに
KITランチを無料で食べるためには、毎日SAKITOのガチャを回すことが必要不可欠です!!
そこで今回はPythonを使ってガチャを自動化したいと思います。
あまりよろしくない記事なら消すので言ってください。
準備
$ pip install requests beautifulsoup4
seleniumを使ったほうが、簡単ですがサーバーで動かすことを考えると環境構築するのが面倒くさいので、今回はrequestsとbeautifulsoup4でやることにしました。
ログイン
requestsを使ってログインするには、セッションを保持する必要があるので、requests.Session()
を使います。
とりあえず、デベロッパーツールを使ってログイン時にどんなデータ送っているか見てます。
ユーザー名とパスワード以外にもトークンをポストすればいけそうなことがわかりました。
それでは、ログインしてみます。
import requests import time from bs4 import BeautifulSoup BASE_URL = 'https://sakito.cirkit.jp/' session = requests.Session() login_url = BASE_URL + 'user/sign_in' # ログインページにGETリクエストしてトークン得る bs = BeautifulSoup(session.get(login_url).text, 'html.parser') authenticity_token = bs.find(attrs={'name': 'authenticity_token'}).get('value') login_data = { 'authenticity_token': authenticity_token, 'user[email]': 'メールアドレス', 'user[password]': 'パスワード', } login = session.post(login_url, data=login_data) print(login.text)
ガチャを引く
ログインできたので、次はガチャを引いていきます。
ガチャを引くボタンのaタグをみるとdata-method="post" href="/user/point"
となっています。
method="post"
じゃないのでなんかあやしいけどpostで/user/pointにリクエスト投げれば良さそうです。 1
point_gacha_url = BASE_URL + 'user/point'
point = session.post(point_gacha_url)
ですがこのままpostリクエストをなげてもエラーになります。
X-CSRF-Tokenヘッダをつけることで解決できます。
以下が完成したコードになります。
コード書いている途中で間違ってガチャ回してしまったのでちゃんと確認とれてないので動くが心配・・・
import requests import time from bs4 import BeautifulSoup BASE_URL = 'https://sakito.cirkit.jp/' session = requests.Session() login_url = BASE_URL + 'user/sign_in' bs = BeautifulSoup(session.get(login_url).text, 'html.parser') authenticity_token = bs.find(attrs={'name': 'authenticity_token'}).get('value') login_data = { 'authenticity_token': authenticity_token, 'user[email]': 'メールアドレス', 'user[password]': 'パスワード', } login = session.post(login_url, data=login_data) time.sleep(2) # サーバーへの配慮 bs = BeautifulSoup(login.text, 'html.parser') csrf_token = bs.find(attrs={'name': 'csrf-token'}).get('content') headers = {'X-CSRF-Token': csrf_token} point_url = BASE_URL + 'user/point' point = session.post(point_url, headers=headers) print(point.text)
これをサーバーにおいてcronで一日一回動かせば、勝手にポイント溜まっていきます!!
-
SAKITOはたぶんRailsで動いていて、Railsでは実際のリクエストをJavaScriptで投げているっぽいです↩