这是我的代码。我使用两个captcha,请求,bs4, fake_user_agent。代码应该使用请求在站点上注册。Post方法,但有些地方出了问题。此外,代码不输出错误,结果为200。但事实上,代码并没有履行它的职责。
import time
from twocaptcha import TwoCaptcha
import requests
from bs4 import BeautifulSoup
from fake_user_agent.main import user_agent
# Капча
config = {
'server': 'rucaptcha.com',
'apiKey': 'API',
'defaultTimeout': 120,
'recaptchaTimeout': 600,
'pollingInterval': 10,
}
solver = TwoCaptcha(**config)
print(solver.balance())
result = solver.recaptcha(sitekey='6LdTYk0UAAAAAGgiIwCu8pB3LveQ1TcLUPXBpjDh',
url='https://funpay.com/account/login',
param1=...)
result = result["code"]
print(result)
# Подменяем UserAgent
site = "https://funpay.com/account/login"
user = user_agent()
header = {
"user-agent": user
}
# Ищем csrf-token
r = requests.get(site)
soup = BeautifulSoup(r.text, "lxml")
csrf = soup.find("body").get("data-app-data").split('"')[3]
print(csrf)
# Ключи
data = {
"login": login,
"password": pasword,
"csrf_token": csrf,
"g-recaptcha-response": result
}
print(data)
link = "https://funpay.com/chat/"
session = requests.Session()
session.headers = header
session.get(site)
responce = session.post(url=link, data=data, headers=header)
print(responce.text)
# Парсинг
link = "https://funpay.com/chat/"
k = session.get(link, headers=header).text
很难给你一个100%的答案,因为网站如何处理从时间到csrf生成的所有事情,以及您无法真正测试以查看recaptcha响应是否正确的事实,这些都可能是一个因素。说,我怀疑,如果这个网站并不是那么慢,花30秒后一分钟recaptcha是解决为你提交表单,问题可能是你之前多次调用无状态请求实例初始化会话对象。这很容易造成这样的情况:服务器最后与您关联的会话不是连接到您开始使用的PHPSESSIONID的会话。
更安全的工作流程应该是这样的:
import requests
import bs4
from twocaptcha import TwoCaptcha
session = requests.Session()
headers = {"user-agent": "blahblahblah agent"}
session.headers.update(headers)
因为你的用户代理从现在开始不会改变,你可以把它放在这里。任何额外的标题部分,可能会更改将自动或手动添加到以后,但这种方式,你可以保持在相同的页面上与服务器,而你解决验证码。
r = session.get("https://funpay.com/account/login")
soup = bs4.BeautifulSoup(r.content)
csrf = soup.find(name="csrf_token")["value"]
即使代码在页面上从其他地方获得csrf令牌,抓住它的形式,将提交清洁而不易错误当你把一个字符串urlencoded等等,但取决于你。我会在这里初始化求解器对象。您的会话仍然是打开的,并且会话对象应该没有更多的移动,直到您在登录时发出post请求。这应该是唯一一次调用登录页面。
solver = TwoCaptcha("apikey")
response = solver.recaptcha(sitekey="6LdTYk0UAAAAAGgiIwCu8pB3LveQ1TcLUPXBpjDh", url="https://funpay.com/account/login", json=1)
顺便说一句,你的apikey应该适用于2captcha和rucaptcha后端,尽管令人恼火的是,如果你在这两个后端都有账户,那么不使用它就没有简单的方法知道哪个是以哪个命名的。应该是一样的。无论如何,一旦captcha响应进来,您就可以构建有效负载并提交。
data = {"csrf_token": csrf, "login": yourlogin, "password": yourpassword, "g-recaptcha-response": response["code"]}
soutput = session.post("https://funpay.com/account/login", data=data)
print(soutput.text)
我怀疑你的问题,如果你能合理地确定recaptcha被正确解决,是你没有一个持久的会话,直到为时已晚,服务器正在处理你的请求作为新的,并分配给你新的cookie。