134 lines
4.6 KiB
Python
134 lines
4.6 KiB
Python
|
|
import requests
|
||
|
|
from bs4 import BeautifulSoup
|
||
|
|
import re
|
||
|
|
import os
|
||
|
|
import json
|
||
|
|
import time
|
||
|
|
|
||
|
|
# File to store session data
|
||
|
|
SESSION_FILE = "session_cache.json"
|
||
|
|
CACHE_DURATION = 30 * 60 # 30 minutes in seconds
|
||
|
|
|
||
|
|
# URL of the login page
|
||
|
|
LOGIN_URL = "https://play.battlesnake.com/login"
|
||
|
|
|
||
|
|
def load_session():
|
||
|
|
"""Load session data from the cache file if it exists and is still valid."""
|
||
|
|
if os.path.exists(SESSION_FILE):
|
||
|
|
with open(SESSION_FILE, "r") as f:
|
||
|
|
session_data = json.load(f)
|
||
|
|
# Check if the cache is still valid
|
||
|
|
if time.time() - session_data["timestamp"] < CACHE_DURATION:
|
||
|
|
session = requests.Session()
|
||
|
|
# Load cookies into the session
|
||
|
|
session.cookies.update(session_data["cookies"])
|
||
|
|
print("Session loaded from cache.")
|
||
|
|
return session, session_data.get("csrf_token")
|
||
|
|
return None, None
|
||
|
|
|
||
|
|
def save_session(session, csrf_token):
|
||
|
|
"""Save session data and CSRF token to the cache file."""
|
||
|
|
session_data = {
|
||
|
|
"cookies": dict(session.cookies),
|
||
|
|
"csrf_token": csrf_token,
|
||
|
|
"timestamp": time.time(),
|
||
|
|
}
|
||
|
|
with open(SESSION_FILE, "w") as f:
|
||
|
|
json.dump(session_data, f)
|
||
|
|
print("Session and CSRF token saved to cache.")
|
||
|
|
|
||
|
|
def login():
|
||
|
|
"""Log in to Battlesnake and return the session and CSRF token."""
|
||
|
|
session = requests.Session()
|
||
|
|
|
||
|
|
# Get the login page to extract CSRF token
|
||
|
|
response = session.get(LOGIN_URL)
|
||
|
|
soup = BeautifulSoup(response.text, "html.parser")
|
||
|
|
|
||
|
|
# Extract CSRF token
|
||
|
|
csrf_token = soup.find("input", {"name": "csrfmiddlewaretoken"})["value"]
|
||
|
|
|
||
|
|
# Define login payload
|
||
|
|
payload = {
|
||
|
|
"csrfmiddlewaretoken": csrf_token,
|
||
|
|
"username": "bsaroya41@gmail.com", # Replace with your email
|
||
|
|
"password": "Threads@78", # Replace with your password
|
||
|
|
}
|
||
|
|
|
||
|
|
# Headers to mimic a browser
|
||
|
|
headers = {
|
||
|
|
"User-Agent": "Mozilla/5.0",
|
||
|
|
"Referer": LOGIN_URL,
|
||
|
|
}
|
||
|
|
|
||
|
|
# Send login request
|
||
|
|
login_response = session.post(LOGIN_URL, data=payload, headers=headers)
|
||
|
|
|
||
|
|
# Check if login was successful
|
||
|
|
if "logout" in login_response.text:
|
||
|
|
print("Login successful!")
|
||
|
|
return session, csrf_token
|
||
|
|
else:
|
||
|
|
print("Login failed.")
|
||
|
|
return None, None
|
||
|
|
|
||
|
|
def create_snake(session, csrf_token):
|
||
|
|
"""Creates a new Battlesnake using the logged-in session and CSRF token."""
|
||
|
|
# URL to create a new Battlesnake
|
||
|
|
CREATE_SNAKE_URL = "https://play.battlesnake.com/account/battlesnakes?s=new"
|
||
|
|
|
||
|
|
# Define create snake payload
|
||
|
|
payload = {
|
||
|
|
"slug": "",
|
||
|
|
"name": "snek", # Replace with desired snake name
|
||
|
|
"url": "https://snaketest.fly.dev/fdaa:c:cd38:a7b:bbfb:6619:1264:2/", # Replace with your snake's URL
|
||
|
|
"engine_region": "engr_HqgfRd3YGM799YRJbGmYF3B7", # Replace with your engine region
|
||
|
|
"description": "", # Optional: Add a description
|
||
|
|
"language_tag": "", # Optional: Add a language tag
|
||
|
|
"platform_tag": "", # Optional: Add a platform tag
|
||
|
|
"is_public": "True", # Set to "True" or "False"
|
||
|
|
}
|
||
|
|
|
||
|
|
# Headers to mimic a browser
|
||
|
|
headers = {
|
||
|
|
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:135.0) Gecko/20100101 Firefox/135.0",
|
||
|
|
"Accept": "*/*",
|
||
|
|
"Accept-Language": "en-CA,en-US;q=0.7,en;q=0.3",
|
||
|
|
"Accept-Encoding": "gzip, deflate, br, zstd",
|
||
|
|
"Referer": CREATE_SNAKE_URL,
|
||
|
|
"HX-Request": "true",
|
||
|
|
"HX-Current-URL": CREATE_SNAKE_URL,
|
||
|
|
"Content-Type": "application/x-www-form-urlencoded",
|
||
|
|
"X-CSRFToken": csrf_token,
|
||
|
|
"Origin": "https://play.battlesnake.com",
|
||
|
|
"Alt-Used": "play.battlesnake.com",
|
||
|
|
"Connection": "keep-alive",
|
||
|
|
"Sec-Fetch-Dest": "empty",
|
||
|
|
"Sec-Fetch-Mode": "cors",
|
||
|
|
"Sec-Fetch-Site": "same-origin",
|
||
|
|
"Priority": "u=0",
|
||
|
|
"TE": "trailers",
|
||
|
|
}
|
||
|
|
|
||
|
|
# Send create snake request
|
||
|
|
create_snake_response = session.post(CREATE_SNAKE_URL, data=payload, headers=headers)
|
||
|
|
|
||
|
|
# Check if snake creation was successful
|
||
|
|
if create_snake_response.status_code == 200:
|
||
|
|
print("Battlesnake created successfully!")
|
||
|
|
else:
|
||
|
|
print(f"Battlesnake creation failed. Status code: {create_snake_response.status_code}")
|
||
|
|
print(create_snake_response.text)
|
||
|
|
return
|
||
|
|
|
||
|
|
# Main logic
|
||
|
|
session, csrf_token = load_session()
|
||
|
|
if not session or not csrf_token:
|
||
|
|
session, csrf_token = login()
|
||
|
|
if session and csrf_token:
|
||
|
|
save_session(session, csrf_token)
|
||
|
|
|
||
|
|
if session and csrf_token:
|
||
|
|
create_snake(session, csrf_token)
|
||
|
|
else:
|
||
|
|
print("Failed to initialize session or CSRF token.")
|