|
import contextlib
|
|
import json
|
|
import re
|
|
from pathlib import Path
|
|
import time
|
|
|
|
import api
|
|
import misc
|
|
|
|
|
|
def parse_curl_string(curl_string: str) -> dict[str, str]:
|
|
headers = {}
|
|
header_lines = curl_string.strip().splitlines()
|
|
|
|
for header_line in header_lines:
|
|
found = re.search(r"-H\s*'(.*?)\s*:\s*(.*)'", header_line)
|
|
if not found:
|
|
continue
|
|
|
|
headers[found.group(1)] = found.group(2)
|
|
|
|
return headers
|
|
|
|
|
|
def prompt_for_headers() -> dict[str, str]:
|
|
while True:
|
|
print(
|
|
"Follow these directions to bypass CloudFlare anti-bot restrictions.\n"
|
|
" 1. Go to https://neal.fun/infinite-craft/\n"
|
|
" 2. Open the developer tools, and select the Network tab\n"
|
|
" 3. Make any pair\n"
|
|
" 4. In the Network tab, find the network request that was made (search 'pair')\n"
|
|
" 5. Right click on it -> Copy -> Copy as cURL (bash)\n"
|
|
" 6. Come back to the terminal, and press 'Enter'.",
|
|
)
|
|
curl_string = misc.header_bank_and_impersonate()
|
|
if curl_string.startswith("curl 'https://neal.fun/api/infinite-craft/pair?first="):
|
|
headers = parse_curl_string(curl_string)
|
|
if headers:
|
|
return headers
|
|
|
|
print(
|
|
"Hmm... it doesn't look like your clipboard contains the right data. Try again.\n\n",
|
|
)
|
|
|
|
|
|
def verify_headers(headers: dict[str, str]) -> Exception | None:
|
|
try:
|
|
api.raw_make_pair("Fire", "Water", headers)
|
|
except Exception as e:
|
|
return e
|
|
|
|
return None
|
|
|
|
|
|
def get_headers(verify: bool = True) -> dict[str, str]:
|
|
filename = Path(__file__).parent / ".cloudflare-headers-cache.json"
|
|
try:
|
|
with filename.open() as f:
|
|
headers = json.load(f)
|
|
except Exception as e:
|
|
pass
|
|
else:
|
|
if verify and verify_headers(headers) is None:
|
|
return headers
|
|
with contextlib.suppress(Exception):
|
|
filename.unlink()
|
|
|
|
headers = prompt_for_headers()
|
|
if verify:
|
|
error = verify_headers(headers)
|
|
if error is not None:
|
|
print(f"Those headers are not valid! Error: {error!r}")
|
|
print("Try again.\n")
|
|
time.sleep(90)
|
|
return get_headers(verify)
|
|
|
|
with contextlib.suppress(Exception), filename.open("w") as f:
|
|
json.dump(headers, f, indent=2)
|
|
|
|
return headers
|
|
|
|
|
|
if __name__ == "__main__":
|
|
headers = get_headers()
|
|
print("Your (working) headers:")
|
|
print(json.dumps(headers, indent=2))
|
|
|