الحفاظ على ملفات تعريف ارتباط التطبيق عند إرسال رمز محلول

بقلم solvethreeمدة القراءة: 3 دقيقة

لا يحل رمز reCAPTCHA الناتج عن الحل محل ملفات تعريف ارتباط جلسة التطبيق أو قيمة CSRF. اجلب النموذج وأرسله عبر requests.Session نفسها كي يحتفظ طلب POST بملفات تعريف الارتباط المستلمة أثناء طلب GET.

استخدم ترويسات المتصفح التي تعيدها خدمة الحل والوكيل نفسه لطلبي التطبيق. ينفّذ المثال الحل أولًا لتتوفر هذه الترويسات قبل فتح النموذج.

في هذه الصفحة

نفّذ طلبي GET وPOST للنموذج ضمن جلسة واحدة

استخدم Python 3.10+ مع تثبيت requests وحزمة SDK الرسمية الخاصة بـ solvethree للغة Python. يحتاج اسم مضيف الموقع المستهدف إلى ملف تعريف نشط في مساحة عملك؛ ولا يؤدي إرسال اسم مضيفه في مهمة إلى إنشاء ملف تعريف. راجع إعداد ملف تعريف الموقع إذا لم يكن مضبوطًا.

  • اضبط TARGET_URL على عنوان URL لنموذج تطبيقك. يستخدم هذا المثال التوضيحي المملوك عنوان URL نفسه لطلبي GET وPOST.
  • اضبط SOLVETHREE_PROXY على الوكيل الوحيد المستخدم للحل ولطلبي التطبيق.
  • اضبط SOLVETHREE_API_KEY على مفتاح API لمساحة عملك. شغّل هذا الكود على الخادم.
requests.Session · الاحتفاظ بملفات تعريف ارتباط التطبيق وقيمة CSRF
# This owned demo form has an input named csrf_token and g-recaptcha-response.
import os
from html.parser import HTMLParser
from urllib.parse import urlsplit
import requests
from solvethree import Solvethree

class FormParser(HTMLParser):
    csrf = None
    def handle_starttag(self, tag, attributes):
        values = dict(attributes)
        if tag == "input" and values.get("name") == "csrf_token":
            self.csrf = values.get("value")

target = os.environ["TARGET_URL"]
proxy = os.environ["SOLVETHREE_PROXY"]
request = {"site": urlsplit(target).hostname, "action": "login", "proxy": proxy}
# Obtain the solver's browser headers before opening the application session.
result = Solvethree(os.environ["SOLVETHREE_API_KEY"]).solve(request, timeout=180)
solution = result["solution"]
with requests.Session() as session:
    session.headers.update({"User-Agent": solution["userAgent"], "sec-ch-ua": solution["secChUa"]})
    proxies = {"http": proxy, "https": proxy}
    page = session.get(target, proxies=proxies, timeout=20, allow_redirects=False)
    page.raise_for_status()
    parser = FormParser(); parser.feed(page.text)
    if not parser.csrf: raise RuntimeError("The expected demo CSRF input was not found")
    response = session.post(target, proxies=proxies, timeout=20, allow_redirects=False,
        data={"csrf_token": parser.csrf, "g-recaptcha-response": solution["token"]})
    print("Application HTTP status:", response.status_code)
    # Use the actual form's submit URL, fields and session rules. Inspect its result.

ينشئ استدعاء solve في SDK المهمة ويستعلم عنها دوريًا حتى تصبح جاهزة أو يطلق استثناءً. يطبّق المثال بعد ذلك solution.userAgent وsolution.secChUa على الجلسة. يملأ طلب GET مخزن ملفات تعريف الارتباط الخاص بها؛ ويعيد طلب POST استخدام هذا المخزن ويرسل solution.token مع قيمة CSRF المستخرجة من النموذج.

غيّر الإجراء login وعنوان URL للإرسال وحقول النموذج في المثال لتطابق تطبيقك. إن csrf_token هو اسم الحقل في هذا النموذج، وليس متطلبًا من solvethree. عدّل محلل HTML إذا كان نموذجك يستخدم اسمًا أو بنية أخرى، وأدرج أي حقول أخرى مطلوبة، مثل بيانات اعتماد تسجيل الدخول. وإذا اختلف عنوان URL للإرسال عن عنوان URL للنموذج، فاستخدم الجلسة نفسها أيضًا.

إذا رفض التطبيق طلب POST

حالة HTTP المطبوعة نقطة بداية، وليست دليلًا على نجاح تسجيل الدخول. افحص استجابة التطبيق والطلب الصادر قبل الدفع مقابل حل آخر. تعني المهمة الجاهزة أنه تم إنشاء حل؛ ويظل التطبيق هو من يقرر قبول الإرسال.

لم يُعثر على حقل إدخال CSRF.

تحقّق من حالة استجابة GET ومحتواها. اتباع عمليات إعادة التوجيه معطّل، لذا فإن استجابة إعادة التوجيه ليست النموذج المتوقع.

جرّب هذا: اجلب النموذج الصحيح بشكل مقصود عبر الجلسة نفسها، ثم عدّل المحلل ليتوافق مع حقل CSRF الفعلي فيه.

يبلّغ التطبيق عن جلسة مفقودة أو قيمة CSRF غير صالحة.

تحقّق مما إذا كان طلب GET قد تلقى ملفات تعريف ارتباط، وما إذا كان طلب POST قد أرسل ملفات تعريف الارتباط المناسبة، وما إذا كانت قيمة CSRF فيه مأخوذة من استجابة ذلك النموذج.

جرّب هذا: نفّذ الطلبين ضمن requests.Session نفسها. لا تجلب النموذج بعميل ثم ترسله بعميل آخر.

يرفض التطبيق CAPTCHA.

افحص حقل الرمز الصادر، والإجراء، والوكيل، وUser-Agent وsec-ch-ua. تأكّد من إرسال solution.token بدلًا من معرّف المهمة أو رمز أقدم.

جرّب هذا: استخدم الرمز الحالي والوكيل نفسه المستخدم للحل وترويسات المتصفح المُعادة. إذا انتهت صلاحية الرمز أو سبق تقييمه، فاحصل على رمز جديد قبيل الإرسال.

يكتمل طلب POST، لكن تسجيل الدخول لا يكتمل.

افحص محتوى الاستجابة وأي وجهة لإعادة التوجيه، إلى جانب عنوان URL الفعلي للإرسال وحقول النموذج المطلوبة.

جرّب هذا: كيّف بيانات النموذج في المثال وفق متطلبات التطبيق. لا يوفّر رمز CAPTCHA بيانات الاعتماد أو غيرها من حقول التطبيق الناقصة.

شغّل مهمتك الأولى.

ابدأ برصيد قدره $5 في مساحة العمل.

إنشاء مساحة عمل
الحفاظ على ملفات تعريف ارتباط التطبيق عند إرسال رمز محلول · solvethree