Discord.com协议进群DEMO:此方法有封号风险,仅供参考
最近很多人咨询discord.com如何用协议进群,因为dc使用了比较多的手段来检测,简直防不胜防,
所以以下代码仅供参考思路,如果直接使用,有封号风险,请谨慎选择。
代码有几个注意点:
发起请求前需要使用
CipherAdapter
方法来处理ssl问题发请请求前需要指定userAgent值,创建验证码需要使用这个值
如果验证码接口返回的userAgent与值自己提交的不同,使用接口返回的
返回{"message":"Unknown Message""code": 10008}错误的原因未知,可能与账号有关
import sys
sys.path.append(".")
import os
import requests
import time
from loguru import logger
from faker import Faker
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
# disable ssl warning
requests.packages.urllib3.disable_warnings()
class CipherAdapter(HTTPAdapter):
# 用于处理部分网站需要验证ssl
# 在test中的load方法中使用
# 使用self.mount_adapter()加载
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context(ciphers='DEFAULT:@SECLEVEL=2')
kwargs['ssl_context'] = context
return super(CipherAdapter, self).init_poolmanager(*args, **kwargs)
def proxy_manager_for(self, *args, **kwargs):
context = create_urllib3_context(ciphers='DEFAULT:@SECLEVEL=2')
kwargs['ssl_context'] = context
return super(CipherAdapter, self).proxy_manager_for(*args, **kwargs)
class YesCaptchaSolver:
# Yescaptcha 接口测试工具
# YesCaptchaSolver:创建任务请求,生成验证码结果
def __init__(self, key="", url="", type="", proxy={}, args={}):
self.server = "https://api.yescaptcha.com"
self.clientkey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 填你的密钥
self.key = key
self.url = url
self.type = type
self.proxy = proxy
self.args = args
def create(self, url):
data = {
"clientKey": self.clientkey,
"task": {
"websiteURL": self.url,
"websiteKey": self.key,
"type": self.type
}
}
if self.args:
data["task"].update(self.args)
print("create: ", data)
response = requests.post(f"{self.server}/createTask", json=data, timeout=30, proxies=self.proxy, verify=False)
return response.json()
def get(self, task_id):
data = {
"clientKey": self.clientkey,
"taskId": task_id
}
response = requests.post(f"{self.server}/getTaskResult", json=data, timeout=30, proxies=self.proxy, verify=False)
return response.json()
def solve(self):
task = self.create(self.url)
logger.info(f"Task created: {task}")
task_id = task.get("taskId")
if not task_id:
return
for i in range(60):
result = self.get(task_id)
# logger.info(f"Task result: {result}")
if result.get("errorId") == 1:
logger.info(f"Task fail: {result}")
return
if result.get("status") == "ready":
logger.info(f"Task result: {result}")
return result.get("solution")
time.sleep(2)
class YescaptchaTester:
# Yescaptcha 接口测试实例
# YescaptchaTester: 提交验证码结果,获取结果
def __init__(self, proxy={}):
self.solver = YesCaptchaSolver(proxy=proxy)
self.token = ""
self.proxy = proxy
self.session = requests.Session()
# 生成随机user-agent
# fake = Faker(locale='zh_CN')
# self.session.headers = {'User-Agent': fake.user_agent()}
# discord注册需要计算fingerprint,因此需要配套的user-agent
self.userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
self.session.headers.update({'User-Agent': self.userAgent})
# 以下参数可以阅读开发文档获取
self.type = ""
# key和url可以在创建任务时获取
self.key = ""
self.url = ""
self.args = {
"userAgent": self.userAgent,
# rqdata值是通过请求获取的,这里先留空
"rqdata": "",
}
def get_token(self):
# 获取验证码token
self.solver.key = self.key
self.solver.url = self.url
self.solver.type = self.type
self.solver.proxy = self.proxy
self.solver.args = self.args
result = self.solver.solve()
if result and 'userAgent' in result:
return result
elif result and result.get("gRecaptchaResponse"):
return result.get("gRecaptchaResponse")
def load(self):
# 在提交验证之前可能需要处理其他内容,可以在这里处理
# mount adapter for ssl warning
self.session.mount('https://', CipherAdapter())
self.session.mount('http://', CipherAdapter())
# 添加登陆成功后的帐号token
self.session.headers.update({"authorization": "这里填自己的帐号Token"})
# 访问邀请页
url = self.url = "https://discord.com/invite/fusionist"
r = self.session.get(url, proxies=self.proxy)
logger.info(f"load invite page: {r.status_code}")
self.session.headers.update({"Referer": url})
# 点击进群按钮,获取验证码参数
url = "https://discord.com/api/v9/invites/fusionist"
r = self.session.post(url, json={}, proxies=self.proxy)
logger.info(f"post invite page: {r.status_code}")
if "401: Unauthorized" in r.text:
logger.info(f"请先登陆,获取登陆token -> {r.text}")
return False
# 判断是不是已经在群里了
if 'code' in r.text:
logger.info(f"已经在群里了 -> {r.text}")
return False
self.sitekey = self.key = r.json().get("captcha_sitekey")
self.rqdata = r.json().get("captcha_rqdata")
self.rqtoken = r.json().get("captcha_rqtoken")
assert self.rqdata and self.rqtoken and self.sitekey, f"Args is None: {r.text}"
self.args['rqdata'] = self.rqdata
return True
def submit(self):
# discord提交进群
captcha_key = self.token.get('gRecaptchaResponse')
userAgent = self.token.get('userAgent')
if self.userAgent != userAgent:
logger.info(f"User-Agent不一致,使用接口返回的User-Agent: {userAgent}")
self.session.headers.update({
'User-Agent': userAgent,
})
url = "https://discord.com/api/v9/invites/fusionist"
data = {"captcha_key": captcha_key, "captcha_rqtoken":self.rqtoken}
response = self.session.post(url, json=data, proxies=self.proxy)
if 'show_verification_form' in response.text:
logger.info(f"验证成功! -> {response.text}")
return True
else:
logger.info(f"验证失败! -> {response.text}")
def test(self):
# 完整测试流程
# 加载网页
if self.load():
# 创建验证码任务和获取结果
self.token = self.get_token()
assert self.token, "获取token失败"
# 提交验证
self.submit()
if __name__ == "__main__":
tester = YescaptchaTester()
# tester.type = "HCaptchaTaskProxylessM1"
tester.type = "HCaptchaTaskProxyless"
tester.solver.server = "https://dev.yescaptcha.com"
# 填你的密钥,或者从环境变量中获取
tester.solver.clientkey = "" or os.environ.get("YESCAPTCHA_CLIENTKEY")
tester.test()
执行正确的结果:
再次提醒:协议进群有封号风险,请谨慎使用。