SAKITOのポイントガチャ自動化

KIT Developer Advent Calendar20日目です。 今は21日目ですが、空いていたので書いてみました。

はじめに

KITランチを無料で食べるためには、毎日SAKITOのガチャを回すことが必要不可欠です!!

そこで今回はPythonを使ってガチャを自動化したいと思います。

あまりよろしくない記事なら消すので言ってください。

準備

$ pip install requests beautifulsoup4

seleniumを使ったほうが、簡単ですがサーバーで動かすことを考えると環境構築するのが面倒くさいので、今回はrequestsとbeautifulsoup4でやることにしました。

ログイン

requestsを使ってログインするには、セッションを保持する必要があるので、requests.Session()を使います。

とりあえず、デベロッパーツールを使ってログイン時にどんなデータ送っているか見てます。

f:id:ta2mi:20191221012925p:plain

ユーザー名とパスワード以外にもトークンをポストすればいけそうなことがわかりました。

それでは、ログインしてみます。

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リクエストをなげてもエラーになります。

原因はCSRFトークンがついてないためです。

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で一日一回動かせば、勝手にポイント溜まっていきます!!


  1. SAKITOはたぶんRailsで動いていて、Railsでは実際のリクエストをJavaScriptで投げているっぽいです