mirror of
https://github.com/lanqian528/chat2api.git
synced 2026-06-12 21:00:46 +08:00
509 lines
14 KiB
Python
509 lines
14 KiB
Python
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 = [
|
||
"registerProtocolHandler−function registerProtocolHandler() { [native code] }",
|
||
"storage−[object StorageManager]",
|
||
"locks−[object LockManager]",
|
||
"appCodeName−Mozilla",
|
||
"permissions−[object Permissions]",
|
||
"share−function share() { [native code] }",
|
||
"webdriver−false",
|
||
"managed−[object NavigatorManagedData]",
|
||
"canShare−function canShare() { [native code] }",
|
||
"vendor−Google Inc.",
|
||
"vendor−Google Inc.",
|
||
"mediaDevices−[object MediaDevices]",
|
||
"vibrate−function vibrate() { [native code] }",
|
||
"storageBuckets−[object StorageBucketManager]",
|
||
"mediaCapabilities−[object MediaCapabilities]",
|
||
"getGamepads−function getGamepads() { [native code] }",
|
||
"bluetooth−[object Bluetooth]",
|
||
"share−function share() { [native code] }",
|
||
"cookieEnabled−true",
|
||
"virtualKeyboard−[object VirtualKeyboard]",
|
||
"product−Gecko",
|
||
"mediaDevices−[object MediaDevices]",
|
||
"canShare−function canShare() { [native code] }",
|
||
"getGamepads−function getGamepads() { [native code] }",
|
||
"product−Gecko",
|
||
"xr−[object XRSystem]",
|
||
"clipboard−[object Clipboard]",
|
||
"storageBuckets−[object StorageBucketManager]",
|
||
"unregisterProtocolHandler−function unregisterProtocolHandler() { [native code] }",
|
||
"productSub−20030107",
|
||
"login−[object NavigatorLogin]",
|
||
"vendorSub−",
|
||
"login−[object NavigatorLogin]",
|
||
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
||
"mediaDevices−[object MediaDevices]",
|
||
"locks−[object LockManager]",
|
||
"webkitGetUserMedia−function webkitGetUserMedia() { [native code] }",
|
||
"vendor−Google Inc.",
|
||
"xr−[object XRSystem]",
|
||
"mediaDevices−[object MediaDevices]",
|
||
"virtualKeyboard−[object VirtualKeyboard]",
|
||
"virtualKeyboard−[object VirtualKeyboard]",
|
||
"appName−Netscape",
|
||
"storageBuckets−[object StorageBucketManager]",
|
||
"presentation−[object Presentation]",
|
||
"onLine−true",
|
||
"mimeTypes−[object MimeTypeArray]",
|
||
"credentials−[object CredentialsContainer]",
|
||
"presentation−[object Presentation]",
|
||
"getGamepads−function getGamepads() { [native code] }",
|
||
"vendorSub−",
|
||
"virtualKeyboard−[object VirtualKeyboard]",
|
||
"serviceWorker−[object ServiceWorkerContainer]",
|
||
"xr−[object XRSystem]",
|
||
"product−Gecko",
|
||
"keyboard−[object Keyboard]",
|
||
"gpu−[object GPU]",
|
||
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
||
"webkitPersistentStorage−[object DeprecatedStorageQuota]",
|
||
"doNotTrack",
|
||
"clearAppBadge−function clearAppBadge() { [native code] }",
|
||
"presentation−[object Presentation]",
|
||
"serial−[object Serial]",
|
||
"locks−[object LockManager]",
|
||
"requestMIDIAccess−function requestMIDIAccess() { [native code] }",
|
||
"locks−[object LockManager]",
|
||
"requestMediaKeySystemAccess−function requestMediaKeySystemAccess() { [native code] }",
|
||
"vendor−Google Inc.",
|
||
"pdfViewerEnabled−true",
|
||
"language−zh-CN",
|
||
"setAppBadge−function setAppBadge() { [native code] }",
|
||
"geolocation−[object Geolocation]",
|
||
"userAgentData−[object NavigatorUAData]",
|
||
"mediaCapabilities−[object MediaCapabilities]",
|
||
"requestMIDIAccess−function requestMIDIAccess() { [native code] }",
|
||
"getUserMedia−function getUserMedia() { [native code] }",
|
||
"mediaDevices−[object MediaDevices]",
|
||
"webkitPersistentStorage−[object DeprecatedStorageQuota]",
|
||
"sendBeacon−function sendBeacon() { [native code] }",
|
||
"hardwareConcurrency−32",
|
||
"credentials−[object CredentialsContainer]",
|
||
"storage−[object StorageManager]",
|
||
"cookieEnabled−true",
|
||
"pdfViewerEnabled−true",
|
||
"windowControlsOverlay−[object WindowControlsOverlay]",
|
||
"scheduling−[object Scheduling]",
|
||
"pdfViewerEnabled−true",
|
||
"hardwareConcurrency−32",
|
||
"xr−[object XRSystem]",
|
||
"webdriver−false",
|
||
"getInstalledRelatedApps−function getInstalledRelatedApps() { [native code] }",
|
||
"getInstalledRelatedApps−function 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)
|