|
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 |
|
|
|
from utils.Logger import logger |
|
from utils.configs import conversation_only |
|
|
|
cores = [8, 16, 24, 32] |
|
timeLayout = "%a %b %d %Y %H:%M:%S" |
|
|
|
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)" |
|
|
|
|
|
def get_config(user_agent): |
|
config = [ |
|
random.randint(1080, 1440+1080), |
|
get_parse_time(), |
|
4294705152, |
|
0, |
|
user_agent, |
|
"", |
|
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(), |
|
str(uuid.uuid4()), |
|
"", |
|
random.choice(cores), |
|
] |
|
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 = "dpl=453ebaec0d44c2decab71692e1bfe39be35a24b3" |
|
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) |
|
|