lanqian528_chat2api/chatgpt/proofofWork.py
lanqian528 6820a421ab
Some checks failed
Build Docker Image (dev) / main (push) Has been cancelled
v1.8.6-beta1
2025-03-23 22:30:49 +08:00

509 lines
14 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import hashlib
import json
import random
import re
import time
import uuid
from datetime import datetime, timedelta, timezone
from html.parser import HTMLParser
import pybase64
import diskcache as dc
from utils.Logger import logger
from utils.configs import conversation_only
cores = [8, 16, 24, 32]
timeLayout = "%a %b %d %Y %H:%M:%S"
cache = dc.Cache('./data/pow_config_cache')
cached_scripts = []
cached_dpl = ""
cached_time = 0
cached_require_proof = ""
navigator_key = [
"registerProtocolHandlerfunction registerProtocolHandler() { [native code] }",
"storage[object StorageManager]",
"locks[object LockManager]",
"appCodeNameMozilla",
"permissions[object Permissions]",
"sharefunction share() { [native code] }",
"webdriverfalse",
"managed[object NavigatorManagedData]",
"canSharefunction canShare() { [native code] }",
"vendorGoogle Inc.",
"vendorGoogle Inc.",
"mediaDevices[object MediaDevices]",
"vibratefunction vibrate() { [native code] }",
"storageBuckets[object StorageBucketManager]",
"mediaCapabilities[object MediaCapabilities]",
"getGamepadsfunction getGamepads() { [native code] }",
"bluetooth[object Bluetooth]",
"sharefunction share() { [native code] }",
"cookieEnabledtrue",
"virtualKeyboard[object VirtualKeyboard]",
"productGecko",
"mediaDevices[object MediaDevices]",
"canSharefunction canShare() { [native code] }",
"getGamepadsfunction getGamepads() { [native code] }",
"productGecko",
"xr[object XRSystem]",
"clipboard[object Clipboard]",
"storageBuckets[object StorageBucketManager]",
"unregisterProtocolHandlerfunction unregisterProtocolHandler() { [native code] }",
"productSub20030107",
"login[object NavigatorLogin]",
"vendorSub",
"login[object NavigatorLogin]",
"getInstalledRelatedAppsfunction getInstalledRelatedApps() { [native code] }",
"mediaDevices[object MediaDevices]",
"locks[object LockManager]",
"webkitGetUserMediafunction webkitGetUserMedia() { [native code] }",
"vendorGoogle Inc.",
"xr[object XRSystem]",
"mediaDevices[object MediaDevices]",
"virtualKeyboard[object VirtualKeyboard]",
"virtualKeyboard[object VirtualKeyboard]",
"appNameNetscape",
"storageBuckets[object StorageBucketManager]",
"presentation[object Presentation]",
"onLinetrue",
"mimeTypes[object MimeTypeArray]",
"credentials[object CredentialsContainer]",
"presentation[object Presentation]",
"getGamepadsfunction getGamepads() { [native code] }",
"vendorSub",
"virtualKeyboard[object VirtualKeyboard]",
"serviceWorker[object ServiceWorkerContainer]",
"xr[object XRSystem]",
"productGecko",
"keyboard[object Keyboard]",
"gpu[object GPU]",
"getInstalledRelatedAppsfunction getInstalledRelatedApps() { [native code] }",
"webkitPersistentStorage[object DeprecatedStorageQuota]",
"doNotTrack",
"clearAppBadgefunction clearAppBadge() { [native code] }",
"presentation[object Presentation]",
"serial[object Serial]",
"locks[object LockManager]",
"requestMIDIAccessfunction requestMIDIAccess() { [native code] }",
"locks[object LockManager]",
"requestMediaKeySystemAccessfunction requestMediaKeySystemAccess() { [native code] }",
"vendorGoogle Inc.",
"pdfViewerEnabledtrue",
"languagezh-CN",
"setAppBadgefunction setAppBadge() { [native code] }",
"geolocation[object Geolocation]",
"userAgentData[object NavigatorUAData]",
"mediaCapabilities[object MediaCapabilities]",
"requestMIDIAccessfunction requestMIDIAccess() { [native code] }",
"getUserMediafunction getUserMedia() { [native code] }",
"mediaDevices[object MediaDevices]",
"webkitPersistentStorage[object DeprecatedStorageQuota]",
"sendBeaconfunction sendBeacon() { [native code] }",
"hardwareConcurrency32",
"credentials[object CredentialsContainer]",
"storage[object StorageManager]",
"cookieEnabledtrue",
"pdfViewerEnabledtrue",
"windowControlsOverlay[object WindowControlsOverlay]",
"scheduling[object Scheduling]",
"pdfViewerEnabledtrue",
"hardwareConcurrency32",
"xr[object XRSystem]",
"webdriverfalse",
"getInstalledRelatedAppsfunction getInstalledRelatedApps() { [native code] }",
"getInstalledRelatedAppsfunction getInstalledRelatedApps() { [native code] }",
"bluetooth[object Bluetooth]"
]
document_key = ['_reactListeningo743lnnpvdg', 'location']
window_key = [
"0",
"window",
"self",
"document",
"name",
"location",
"customElements",
"history",
"navigation",
"locationbar",
"menubar",
"personalbar",
"scrollbars",
"statusbar",
"toolbar",
"status",
"closed",
"frames",
"length",
"top",
"opener",
"parent",
"frameElement",
"navigator",
"origin",
"external",
"screen",
"innerWidth",
"innerHeight",
"scrollX",
"pageXOffset",
"scrollY",
"pageYOffset",
"visualViewport",
"screenX",
"screenY",
"outerWidth",
"outerHeight",
"devicePixelRatio",
"clientInformation",
"screenLeft",
"screenTop",
"styleMedia",
"onsearch",
"isSecureContext",
"trustedTypes",
"performance",
"onappinstalled",
"onbeforeinstallprompt",
"crypto",
"indexedDB",
"sessionStorage",
"localStorage",
"onbeforexrselect",
"onabort",
"onbeforeinput",
"onbeforematch",
"onbeforetoggle",
"onblur",
"oncancel",
"oncanplay",
"oncanplaythrough",
"onchange",
"onclick",
"onclose",
"oncontentvisibilityautostatechange",
"oncontextlost",
"oncontextmenu",
"oncontextrestored",
"oncuechange",
"ondblclick",
"ondrag",
"ondragend",
"ondragenter",
"ondragleave",
"ondragover",
"ondragstart",
"ondrop",
"ondurationchange",
"onemptied",
"onended",
"onerror",
"onfocus",
"onformdata",
"oninput",
"oninvalid",
"onkeydown",
"onkeypress",
"onkeyup",
"onload",
"onloadeddata",
"onloadedmetadata",
"onloadstart",
"onmousedown",
"onmouseenter",
"onmouseleave",
"onmousemove",
"onmouseout",
"onmouseover",
"onmouseup",
"onmousewheel",
"onpause",
"onplay",
"onplaying",
"onprogress",
"onratechange",
"onreset",
"onresize",
"onscroll",
"onsecuritypolicyviolation",
"onseeked",
"onseeking",
"onselect",
"onslotchange",
"onstalled",
"onsubmit",
"onsuspend",
"ontimeupdate",
"ontoggle",
"onvolumechange",
"onwaiting",
"onwebkitanimationend",
"onwebkitanimationiteration",
"onwebkitanimationstart",
"onwebkittransitionend",
"onwheel",
"onauxclick",
"ongotpointercapture",
"onlostpointercapture",
"onpointerdown",
"onpointermove",
"onpointerrawupdate",
"onpointerup",
"onpointercancel",
"onpointerover",
"onpointerout",
"onpointerenter",
"onpointerleave",
"onselectstart",
"onselectionchange",
"onanimationend",
"onanimationiteration",
"onanimationstart",
"ontransitionrun",
"ontransitionstart",
"ontransitionend",
"ontransitioncancel",
"onafterprint",
"onbeforeprint",
"onbeforeunload",
"onhashchange",
"onlanguagechange",
"onmessage",
"onmessageerror",
"onoffline",
"ononline",
"onpagehide",
"onpageshow",
"onpopstate",
"onrejectionhandled",
"onstorage",
"onunhandledrejection",
"onunload",
"crossOriginIsolated",
"scheduler",
"alert",
"atob",
"blur",
"btoa",
"cancelAnimationFrame",
"cancelIdleCallback",
"captureEvents",
"clearInterval",
"clearTimeout",
"close",
"confirm",
"createImageBitmap",
"fetch",
"find",
"focus",
"getComputedStyle",
"getSelection",
"matchMedia",
"moveBy",
"moveTo",
"open",
"postMessage",
"print",
"prompt",
"queueMicrotask",
"releaseEvents",
"reportError",
"requestAnimationFrame",
"requestIdleCallback",
"resizeBy",
"resizeTo",
"scroll",
"scrollBy",
"scrollTo",
"setInterval",
"setTimeout",
"stop",
"structuredClone",
"webkitCancelAnimationFrame",
"webkitRequestAnimationFrame",
"chrome",
"caches",
"cookieStore",
"ondevicemotion",
"ondeviceorientation",
"ondeviceorientationabsolute",
"launchQueue",
"documentPictureInPicture",
"getScreenDetails",
"queryLocalFonts",
"showDirectoryPicker",
"showOpenFilePicker",
"showSaveFilePicker",
"originAgentCluster",
"onpageswap",
"onpagereveal",
"credentialless",
"speechSynthesis",
"onscrollend",
"webkitRequestFileSystem",
"webkitResolveLocalFileSystemURL",
"sendMsgToSolverCS",
"webpackChunk_N_E",
"__next_set_public_path__",
"next",
"__NEXT_DATA__",
"__SSG_MANIFEST_CB",
"__NEXT_P",
"_N_E",
"regeneratorRuntime",
"__REACT_INTL_CONTEXT__",
"DD_RUM",
"_",
"filterCSS",
"filterXSS",
"__SEGMENT_INSPECTOR__",
"__NEXT_PRELOADREADY",
"Intercom",
"__MIDDLEWARE_MATCHERS",
"__STATSIG_SDK__",
"__STATSIG_JS_SDK__",
"__STATSIG_RERENDER_OVERRIDE__",
"_oaiHandleSessionExpired",
"__BUILD_MANIFEST",
"__SSG_MANIFEST",
"__intercomAssignLocation",
"__intercomReloadLocation"
]
class ScriptSrcParser(HTMLParser):
def handle_starttag(self, tag, attrs):
global cached_scripts, cached_dpl, cached_time
if tag == "script":
attrs_dict = dict(attrs)
if "src" in attrs_dict:
src = attrs_dict["src"]
cached_scripts.append(src)
match = re.search(r"c/[^/]*/_", src)
if match:
cached_dpl = match.group(0)
cached_time = int(time.time())
def get_data_build_from_html(html_content):
global cached_scripts, cached_dpl, cached_time
parser = ScriptSrcParser()
parser.feed(html_content)
if not cached_scripts:
cached_scripts.append("https://chatgpt.com/backend-api/sentinel/sdk.js")
if not cached_dpl:
match = re.search(r'<html[^>]*data-build="([^"]*)"', html_content)
if match:
data_build = match.group(1)
cached_dpl = data_build
cached_time = int(time.time())
logger.info(f"Found dpl: {cached_dpl}")
async def get_dpl(service):
global cached_scripts, cached_dpl, cached_time
if int(time.time()) - cached_time < 15 * 60:
return True
headers = service.base_headers.copy()
cached_scripts = []
cached_dpl = ""
try:
if conversation_only:
return True
r = await service.s.get(f"{service.host_url}/", headers=headers, timeout=5)
r.raise_for_status()
get_data_build_from_html(r.text)
if not cached_dpl:
raise Exception("No Cached DPL")
else:
return True
except Exception as e:
logger.info(f"Failed to get dpl: {e}")
cached_dpl = None
cached_time = int(time.time())
return False
def get_parse_time():
now = datetime.now(timezone(timedelta(hours=-5)))
return now.strftime(timeLayout) + " GMT-0500 (Eastern Standard Time)"
@cache.memoize(expire=3600 * 24 * 7)
def get_config(user_agent, req_token=None):
config = [
random.choice([1920 + 1080, 2560 + 1440, 1920 + 1200, 2560 + 1600]),
get_parse_time(),
4294705152,
0,
user_agent,
random.choice(cached_scripts) if cached_scripts else "",
cached_dpl,
"en-US",
"en-US,es-US,en,es",
0,
random.choice(navigator_key),
random.choice(document_key),
random.choice(window_key),
time.perf_counter() * 1000,
str(uuid.uuid4()),
"",
random.choice(cores),
time.time() * 1000 - (time.perf_counter() * 1000),
]
return config
def get_answer_token(seed, diff, config):
start = time.time()
answer, solved = generate_answer(seed, diff, config)
end = time.time()
logger.info(f'diff: {diff}, time: {int((end - start) * 1e6) / 1e3}ms, solved: {solved}')
return "gAAAAAB" + answer, solved
def generate_answer(seed, diff, config):
diff_len = len(diff)
seed_encoded = seed.encode()
static_config_part1 = (json.dumps(config[:3], separators=(',', ':'), ensure_ascii=False)[:-1] + ',').encode()
static_config_part2 = (',' + json.dumps(config[4:9], separators=(',', ':'), ensure_ascii=False)[1:-1] + ',').encode()
static_config_part3 = (',' + json.dumps(config[10:], separators=(',', ':'), ensure_ascii=False)[1:]).encode()
target_diff = bytes.fromhex(diff)
for i in range(500000):
dynamic_json_i = str(i).encode()
dynamic_json_j = str(i >> 1).encode()
final_json_bytes = static_config_part1 + dynamic_json_i + static_config_part2 + dynamic_json_j + static_config_part3
base_encode = pybase64.b64encode(final_json_bytes)
hash_value = hashlib.sha3_512(seed_encoded + base_encode).digest()
if hash_value[:diff_len] <= target_diff:
return base_encode.decode(), True
return "wQ8Lk5FbGpA2NcR9dShT6gYjU7VxZ4D" + pybase64.b64encode(f'"{seed}"'.encode()).decode(), False
def get_requirements_token(config):
require, solved = generate_answer(format(random.random()), "0fffff", config)
return 'gAAAAAC' + require
if __name__ == "__main__":
# cached_scripts.append(
# "https://cdn.oaistatic.com/_next/static/cXh69klOLzS0Gy2joLDRS/_ssgManifest.js?dpl=453ebaec0d44c2decab71692e1bfe39be35a24b3")
# cached_dpl = "453ebaec0d44c2decab71692e1bfe39be35a24b3"
# cached_time = int(time.time())
# for i in range(10):
# seed = format(random.random())
# diff = "000032"
# config = get_config("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome")
# answer = get_answer_token(seed, diff, config)
cached_scripts.append(
"https://cdn.oaistatic.com/_next/static/cXh69klOLzS0Gy2joLDRS/_ssgManifest.js?dpl=453ebaec0d44c2decab71692e1bfe39be35a24b3")
cached_dpl = "prod-f501fe933b3edf57aea882da888e1a544df99840"
config = get_config("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36")
get_requirements_token(config)