Привет, делаю джоинер с обходом капчи на питоне, но есть некоторые проблемы. Короче, есть пост запрос https://discord.com/api/v9/invites/{invitecode} ,по которому можно зайти на сервер, в заголовках передаю само собой с токеном. Тут начинается веселье, если обнаруживается капча, то по запросу, что выше, приходит статус код 400 и инфа про капчу RESPDISCORD: {"captcha_key": ["You need to update your app to join this server."], "captcha_sitekey": "a9b5fb07-92ff-493f-86fe-352a2803b3df", "captcha_service": "hcaptcha", "captcha_rqdata": "T5TGhdE17CuNjRXGVTMJxewVgQWWvBv6655WHvsyRI7BUrr2XYuhfLYkU1xd0xEhmc7rfxyOB13FIIsibSpdkc5wx2rtQwCdimji5yZSzPOC5Vy3f5zLCgth4MNbEdQ9KI1PdBBl2cv1BbhOguRGa3MJvZYlmePGipmx/gO2", "captcha_rqtoken": "Im5TMzhIaXFvbjNORkxlYTZsMXZEdmtUMzcxZUlVQWhBV1U5bFFiVUVtYjBaOFB0OXd2eDBrMmVHOGlXZzJzMFRJNkYwRGc9PXBqbWNSSmVRNnc1cUNyNHAi.YyRT5A.Afx9SjAbHiTq5c5VKAzA-LP8TUw"} Я решил проходить эту капчу с помощью стороннего сервиса, через его API я передаю captcha_sitekey, через некоторое время получаю captcha_key. Так вот, когда лазил в нетворке входа на сервер дискорда, увидел, что когда я решил капчу отправляется такой же пост запрос дискорду, что и выше, но передается так же captcha_key, captcha_rqtoken и прочее. Вообщем я все это повторил, но у меня не получается. Всё так же запросы возвращают код 400 и ответ, который выглядит примерно вот так: RESPDISCORD: {"captcha_key":["invalid-response"],"captcha_sitekey":"a9b5fb07-92ff-493f-86fe-352a2803b3df","captcha_service":"hcaptcha","captcha_session_id":"1f092198-0235-47ae-b1b4-5cd5d8c7b640","captcha_rqdata":"4HtBO+Bkh1dSW60i/FCtXBEl+M4/wAYtJptUGh25pxGSLrVubUObqzFTsVyWhORTfJA/q495gFs3cyZfzit2rT7u71VaJlWQjX5GJyX1DU1RcS1QSLtFrrb8jW23OqJZrmDvR5H/v9zUjA==FR0oaGXcHxfQXanX","captcha_rqtoken":"IjNSZkoxQyt4STE3RnpkUnNnRHY3a0JNRG9iRGgzVjdVV0pBckFONHcxcUY3TGJmQlJ1L3Vsck16QllLVklCZjdzd0tKd2c9PTdJTmxZTGZMcUJqN1ViT1Ai.aChi6g.C1h5unPYpWZ4O3rWXeCtNZ2Mh2k"} Если кто то знает как это правильно делается, прошу помощи. Код ниже: import requests as r import ssl import time import json ssl._create_default_https_context = ssl._create_unverified_context def solve_hcaptcha(sitekey, url): API_KEY = "" in_url = "https://api.solvecaptcha.com/in.php" payload = { 'key': API_KEY, 'method': 'hcaptcha', 'sitekey': sitekey, 'pageurl': url, 'json': 1 } response = r.post(in_url, data=payload) result = response.json() if result.get("status") != 1: print("Ошибка при отправке запроса:", result.get("request")) return None captcha_id = result.get("request") print("Получен captcha_id:", captcha_id) res_url = "https://api.solvecaptcha.com/res.php" params = { 'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1 } while True: res = r.get(res_url, params=params) data = res.json() if data.get("status") == 1: print("Капча успешно решена!") return data["request"] elif data.get("request") == "CAPCHA_NOT_READY": print("Капча ещё не готова, ждем 1 секунду...") time.sleep(1) else: print("Ошибка получения решения:", data.get("request")) exit() def invite(token, invitecode): s = r.session() s.headers['authorization'] = token resp = s.get('https://discord.com/') coo = resp.cookies cookies = { '__dcfduid': coo.get('__dcfduid'), '__sdcfduid': coo.get('__sdcfduid'), '__cfruid': coo.get('__cfruid'), 'locale': 'en-US', } print("cookies: ", cookies) url = f"https://discord.com/invite/{invitecode}" resp = s.post(f"https://discord.com/api/v9/invites/{invitecode}", json={}, timeout=20) print("RESPDISCORD:", resp.text) if resp.text.__contains__("captcha_sitekey"): serialized_resp = resp.json() captcha_sitekey = serialized_resp.get("captcha_sitekey", "") print(captcha_sitekey) captcha_key = solve_hcaptcha(captcha_sitekey, url) captcha_rqtoken = serialized_resp.get("captcha_rqtoken", "") captcha_session_id = serialized_resp.get("captcha_session_id", "") print("captcha_key: ", captcha_key) print("captcha_rqtoken: ",captcha_rqtoken) print("captcha_session_id: ",captcha_session_id) s.headers = { "authority": "discord.com", "method": "POST", "path": f"/api/v9/invites/{invitecode}", "scheme": "https", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7", "Authorization": token, #"Content-Length": "19", "Content-Type": "application/json", "Cookie": '; '.join([f"{k}={v}" for k, v in cookies.items() if v is not None]), "Origin": "https://discord.com", "Priority": "u=1, i", "Referer": f"https://discord.com/invite/{invitecode}", "Sec-Ch-Ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', "Sec-Ch-Ua-Mobile": "?0", "Sec-Ch-Ua-Platform": '"Windows"', "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", "X-Context-Properties": "eyJsb2NhdGlvbiI6IkFjY2VwdCBJbnZpdGUgUGFnZSIsImxvY2F0aW9uX2d1aWxkX2lkIjoiMTM2OTY1MDg1ODAyNjg2NDY5MiIsImxvY2F0aW9uX2NoYW5uZWxfaWQiOiIxMzY5NjUwODU4NTI2MTEzODA0IiwibG9jYXRpb25fY2hhbm5lbF90eXBlIjowfQ==", "X-Debug-Options": "bugReporterEnabled", "X-Discord-Locale": "en-US", "X-Discord-Timezone": "Europe/Moscow", "X-Captcha-Key": captcha_key, "X-Captcha-Rqtoken": captcha_rqtoken, "X-Captcha-Session-Id": captcha_session_id, "X-Super-Properties": "eyJvcyI6IldpbmRvd3MiLCJicm93c2VyIjoiQ2hyb21lIiwiZGV2aWNlIjoiIiwic3lzdGVtX2xvY2FsZSI6InJ1LVJVIiwiaGFzX2NsaWVudF9tb2RzIjpmYWxzZSwiYnJvd3Nlcl91c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzNi4wLjAuMCBTYWZhcmkvNTM3LjM2IiwiYnJvd3Nlcl92ZXJzaW9uIjoiMTM2LjAuMC4wIiwib3NfdmVyc2lvbiI6IjEwIiwicmVmZXJyZXIiOiIiLCJyZWZlcnJpbmdfZG9tYWluIjoiIiwicmVmZXJyZXJfY3VycmVudCI6IiIsInJlZmVycmluZ19kb21haW5fY3VycmVudCI6IiIsInJlbGVhc2VfY2hhbm5lbCI6InN0YWJsZSIsImNsaWVudF9idWlsZF9udW1iZXIiOjQwMDQ1MywiY2xpZW50X2V2ZW50X3NvdXJjZSI6bnVsbCwiY2xpZW50X2xhdW5jaF9pZCI6IjM1ZTkzOGUwLWU2YjktNGVjMS1hN2QyLWVlMmUyZDUzZWY2MSIsImNsaWVudF9oZWFydGJlYXRfc2Vzc2lvbl9pZCI6IjNlY2RmZmI5LTIyMzAtNDk2NC1hOWVlLTU4MWMzNWU2OWI3YyJ9" } print(s.headers) resp = s.post(f"https://discord.com/api/v9/invites/{invitecode}", json={}) print("RESPDISCORD:", resp.text) print(resp.status_code) else: print("Нету капчи") token = "" if __name__ == "__main__": invite(token, "abcd") Python import requests as r import ssl import time import json ssl._create_default_https_context = ssl._create_unverified_context def solve_hcaptcha(sitekey, url): API_KEY = "" in_url = "https://api.solvecaptcha.com/in.php" payload = { 'key': API_KEY, 'method': 'hcaptcha', 'sitekey': sitekey, 'pageurl': url, 'json': 1 } response = r.post(in_url, data=payload) result = response.json() if result.get("status") != 1: print("Ошибка при отправке запроса:", result.get("request")) return None captcha_id = result.get("request") print("Получен captcha_id:", captcha_id) res_url = "https://api.solvecaptcha.com/res.php" params = { 'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1 } while True: res = r.get(res_url, params=params) data = res.json() if data.get("status") == 1: print("Капча успешно решена!") return data["request"] elif data.get("request") == "CAPCHA_NOT_READY": print("Капча ещё не готова, ждем 1 секунду...") time.sleep(1) else: print("Ошибка получения решения:", data.get("request")) exit() def invite(token, invitecode): s = r.session() s.headers['authorization'] = token resp = s.get('https://discord.com/') coo = resp.cookies cookies = { '__dcfduid': coo.get('__dcfduid'), '__sdcfduid': coo.get('__sdcfduid'), '__cfruid': coo.get('__cfruid'), 'locale': 'en-US', } print("cookies: ", cookies) url = f"https://discord.com/invite/{invitecode}" resp = s.post(f"https://discord.com/api/v9/invites/{invitecode}", json={}, timeout=20) print("RESPDISCORD:", resp.text) if resp.text.__contains__("captcha_sitekey"): serialized_resp = resp.json() captcha_sitekey = serialized_resp.get("captcha_sitekey", "") print(captcha_sitekey) captcha_key = solve_hcaptcha(captcha_sitekey, url) captcha_rqtoken = serialized_resp.get("captcha_rqtoken", "") captcha_session_id = serialized_resp.get("captcha_session_id", "") print("captcha_key: ", captcha_key) print("captcha_rqtoken: ",captcha_rqtoken) print("captcha_session_id: ",captcha_session_id) s.headers = { "authority": "discord.com", "method": "POST", "path": f"/api/v9/invites/{invitecode}", "scheme": "https", "Accept": "*/*", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7", "Authorization": token, #"Content-Length": "19", "Content-Type": "application/json", "Cookie": '; '.join([f"{k}={v}" for k, v in cookies.items() if v is not None]), "Origin": "https://discord.com", "Priority": "u=1, i", "Referer": f"https://discord.com/invite/{invitecode}", "Sec-Ch-Ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', "Sec-Ch-Ua-Mobile": "?0", "Sec-Ch-Ua-Platform": '"Windows"', "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", "X-Context-Properties": "eyJsb2NhdGlvbiI6IkFjY2VwdCBJbnZpdGUgUGFnZSIsImxvY2F0aW9uX2d1aWxkX2lkIjoiMTM2OTY1MDg1ODAyNjg2NDY5MiIsImxvY2F0aW9uX2NoYW5uZWxfaWQiOiIxMzY5NjUwODU4NTI2MTEzODA0IiwibG9jYXRpb25fY2hhbm5lbF90eXBlIjowfQ==", "X-Debug-Options": "bugReporterEnabled", "X-Discord-Locale": "en-US", "X-Discord-Timezone": "Europe/Moscow", "X-Captcha-Key": captcha_key, "X-Captcha-Rqtoken": captcha_rqtoken, "X-Captcha-Session-Id": captcha_session_id, "X-Super-Properties": "eyJvcyI6IldpbmRvd3MiLCJicm93c2VyIjoiQ2hyb21lIiwiZGV2aWNlIjoiIiwic3lzdGVtX2xvY2FsZSI6InJ1LVJVIiwiaGFzX2NsaWVudF9tb2RzIjpmYWxzZSwiYnJvd3Nlcl91c2VyX2FnZW50IjoiTW96aWxsYS81LjAgKFdpbmRvd3MgTlQgMTAuMDsgV2luNjQ7IHg2NCkgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgQ2hyb21lLzEzNi4wLjAuMCBTYWZhcmkvNTM3LjM2IiwiYnJvd3Nlcl92ZXJzaW9uIjoiMTM2LjAuMC4wIiwib3NfdmVyc2lvbiI6IjEwIiwicmVmZXJyZXIiOiIiLCJyZWZlcnJpbmdfZG9tYWluIjoiIiwicmVmZXJyZXJfY3VycmVudCI6IiIsInJlZmVycmluZ19kb21haW5fY3VycmVudCI6IiIsInJlbGVhc2VfY2hhbm5lbCI6InN0YWJsZSIsImNsaWVudF9idWlsZF9udW1iZXIiOjQwMDQ1MywiY2xpZW50X2V2ZW50X3NvdXJjZSI6bnVsbCwiY2xpZW50X2xhdW5jaF9pZCI6IjM1ZTkzOGUwLWU2YjktNGVjMS1hN2QyLWVlMmUyZDUzZWY2MSIsImNsaWVudF9oZWFydGJlYXRfc2Vzc2lvbl9pZCI6IjNlY2RmZmI5LTIyMzAtNDk2NC1hOWVlLTU4MWMzNWU2OWI3YyJ9" } print(s.headers) resp = s.post(f"https://discord.com/api/v9/invites/{invitecode}", json={}) print("RESPDISCORD:", resp.text) print(resp.status_code) else: print("Нету капчи") token = "" if __name__ == "__main__": invite(token, "abcd")
На каждый запрос Дискорд отвечает капчей и каждый раз капча новая. Вы пытаетесь отправить запрос Дискорду с уже включенными "ключами" капчи. По сути Вы отвечаете Дискорду на "реши капчу номер 124" запросом "на держи данные и решение капчи 132".
PersonOfInterest, Ну так есть сервисы по типу 2captcha, rucaptcha и тд. Я как раз и пользуюсь таким. Мне возвращается ключ капчи (captcha_key) P1_............ И как я уже говорил "когда я решил капчу отправляется такой же пост запрос дискорду, что и выше, но передается так же captcha_key, captcha_rqtoken и прочее."
PersonOfInterest, ну так после получения captcha_key от сервиса надо же что-то сделать, чтобы дискорд обработал мой запрос на вступление на дс сервер
1. Ты не передаёшь captcha_rqdata, хотя Discord его часто требует 2. Некорректный captcha_key от solvecaptcha (Возможно сервис который ты юзаешь не поддерживает hCaptcha Enterprise - именно его юзает дс) 3. Отсутствие X-Captcha-Rqdata, либо же некорректный заголовок X-Captcha-* (Все значения нужно передавать как строку, ничего не должно быть None или '') Если поле вообще не нужное то его вообще не передавай даже Второй запрос после получения капчи должен выглядеть примерно так { "captcha_key": "РЕШЕНИЕ ОТ СЕРВИСА", "captcha_rqtoken": "ТО ЧТО ДАЛ DISCORD", "captcha_rqdata": "ТО ЧТО ДАЛ DISCORD" } JSON { "captcha_key": "РЕШЕНИЕ ОТ СЕРВИСА", "captcha_rqtoken": "ТО ЧТО ДАЛ DISCORD", "captcha_rqdata": "ТО ЧТО ДАЛ DISCORD" } А не просто пустой json={} как у тебя сейчас.