Python でキャプチャを解決して、登録フォームの送信を自動化する必要があります。ターゲット サイトは、ユーザーから詳細のリストを収集し、データ コールバック モードを介して Java スクリプトのフォームとして送信するように設計されていることに気付きました。以下のスニペットを添付 [1]。ブラウザ経由で試してみると、フォームが送信され、HTTPP 302 コードと確認メールを含む成功した登録ページにページがリダイレクトされます。Python [2] (cloudscraper/scrapy を使用) で実行しようとすると、成功した登録ページにリダイレクトされますが、詳細の登録も確認メールも受信されません。data-callback メソッドを呼び出して Python で Java スクリプトを実行する方法を教えてもらえますか?
[1] HTML コード:
<button class="g-recaptcha" data-callback="submitRuleOptin" data-sitekey="6LfbPnAUAAAAAAACqfb_YCtJi7RY0WkK-1T4b9cUO8">Sign up!</button>
<script>
function submitRuleOptin(token) { document.getElementById("rule-optin-form").submit(); }
<script>
[2] Python コード:
# function is to process raffle entries
def raffle_entry(self,url,suburl,proxy,accounts,auth=None):
try:
log('Entering raffle URL')
i=0
tk= self.get_sitekey(url,proxy)
first_form = self.get_all_forms(url,proxy)[0]
form_details = self.get_form_details(first_form)
buttonvalue = form_details["button"]
selectvalue = form_details["select"]
log("Resolving Captcha")
gresp=self.twocaptcha(tk,url) # Resolving 2Captch here !
data = {}
for individual_list in accounts:
log("Constructing payload for the", individual_list[5])
for input_tag,value_tag in zip(form_details["inputs"],individual_list):
if input_tag["type"] == "hidden":
data[input_tag["name"]] = input_tag["value"]
elif input_tag["type"] != "submit":
data[input_tag["name"]] = value_tag
for button_tag in buttonvalue:
if button_tag["class"] == "g-recaptcha":
data["g-recaptcha-response"]=gresp
data['fields[Raffle.Country]']="GB"
log("Sending payload to the requested URL")
parsedata=json.dumps(data)
url = urljoin(url, form_details["action"])
submit = self.scraper.post(url,data=parsedata,headers=self.json_headers,proxies={"http": proxy, "https": proxy})
if submit.status_code == 200:
log("Your registration was sucessfull !!")
i += 1
else:
log("Failed to register !!")
with codecs.open("output.txt", 'w',encoding='utf-8') as outfile: # writing a text file with the ouput for future reference,
outfile.write(submit.text)
soup = BeautifulSoup(submit.content, "html.parser")
open("submit.html", "w").write(str(soup)) # writing a html file with the ouput for future reference,
return i
except cloudscraper.exceptions.CloudflareChallengeError as err:
pass
except requests.exceptions.RequestException as err:
print(err)