نتایج گوگل

مرجع خطاها

مرجع کامل کدهای وضعیت؛ ۴۰۰، ۴۰۱، ۴۰۳، ۴۰۴، ۴۲۲ و ۴۲۹ و کاری که برای هرکدام باید بکنید.

مرجع کامل. اگر دنبال این هستید که یک کد مشخص یعنی چه، همین‌جاست. برای اینکه در کدتان چه کاری انجام دهید، جدول تصمیم در پایین صفحه را ببینید.

شکل بدنهٔ خطا

بدنهٔ خطا همیشه یک فیلد detail دارد و فیلد ok ندارد:

{"detail": "missing scope targets:write"}

بر اساس کد وضعیت HTTP تصمیم بگیرید، نه متن بدنه. متن detail برای انسان است و ممکن است تغییر کند؛ الگوی ثابت، وضعیت HTTP است.

جدول مرجع

وضعیتدر چه حالتی
400کرسر خراب یا منقضی؛ period با قالب غلط؛ فیلتر status ناشناخته
401کلید نفرستاده‌اید، ناشناخته است یا باطل شده
403کلید معتبر، دسترسی لازم را ندارد
404task_id / target_id ناشناخته؛ شناسهٔ حساب دیگر؛ درخواستی که چیزی را عوض نکرد
422فیلد جاافتاده یا ناشناخته در بدنه، مقدار خارج از بازه، فیلد غیرقابل تغییر
429محدودیت نرخ رد شده — Retry-After را ببینید

چهار موردی که بیشتر غافلگیر می‌کنند

404 برای شناسهٔ دیگران

task_id یا target_id یک حساب دیگر 404 می‌گیرد، نه 403. وجودش فاش نمی‌شود؛ 403 تأیید می‌کرد که این شناسه واقعی است.

از 404 نمی‌توانید تشخیص دهید شناسه وجود ندارد یا متعلق به دیگری است — و نباید بتوانید. اگر لازم دارید بدانید، از پشتیبانی بپرسید، نه از تفاوت کد وضعیت. مالکیت داده در احراز هویت توضیح داده شده.

404 برای درخواستی که چیزی را عوض نکرد

PATCH /targets/{id} وقتی واقعاً هیچ فیلدی تغییر نکرده باشد 404 می‌گیرد. این عمدی است تا این پرسش قابل پاسخ بماند که «ویرایش من اعمال شد؟».

می‌خواهیدچه کنید
مطمئن شوید ویرایش اعمال شده404 یعنی «چیزی برای اعمال نبود»
ست کردن دقیق همین مقداراول GET کنید و فقط تفاوت را بفرستید
یک POST ساده که idempotent استاز POST /targets استفاده کنید، نه PATCH
404 در PATCH همیشه «پیدا نشد» نیست. اگر کلاینت شما 404 را به معنی «هدف وجود ندارد» ترجمه می‌کند، در حالی که هدف هست و فقط تفاوتی نبوده، به کاربر اطلاعات غلط می‌دهد. متن خطا را هم بخوانید، یا از POST استفاده کنید که این ابهام را ندارد.

422 برای فیلد ناشناخته

فیلد ناشناختهٔ بدنه رد می‌شود، نه اینکه بی‌صدا دور ریخته شود. یک املای غلط مثل cadence_hour در غیر این صورت نادیده گرفته می‌شد و زمان‌بندی شما هرگز تغییر نمی‌کرد.

حالت 422یعنی چه
فیلد بدنهٔ جاافتادهفیلد الزامی نفرستاده‌اید
فیلد ناشناخته در بدنهاملا را اشتباه نوشته‌اید
مقدار خارج از بازهمثلاً cadence_hours صفر یا منفی
فیلد غیرقابل تغییرdomain، keyword یا city را در PATCH فرستاده‌اید

422 برای فیلد غیرقابل تغییر

آن سه‌تایی هویت هدف است و تغییر نمی‌کند. کلمهٔ کلیدیِ ذخیره‌شده همان چیزی است که واقعاً جستجو می‌شود؛ تغییرش تاریخچه را بازنویسی می‌کند، نه اینکه آن را ویرایش. برای رهگیری یک پرس‌وجوی متفاوت، DELETE کنید و بعد POST — در اهداف توضیح داده شده.

کدام خطا را تلاش مجدد کنیم

این جدول تصمیم است، نه جدول مرجع:

وضعیتتلاش مجدد؟چرا
400خیرورودی شما خراب است؛ فرستادن دوبارهٔ همان ورودی خراب چیزی را درست نمی‌کند
401هرگزکلید با تلاش دوباره درست نمی‌شود؛ فقط بی‌نهایت حلقه می‌زنید
403هرگزمجوز باید عوض شود؛ این کار شما (انسان) است نه کد
404خیریا مال شما نیست یا وجود ندارد
422خیربدنه غلط است
429بلهبا زمان حل می‌شود؛ Retry-After را رعایت کنید
401 و 403 هرگز با تلاش مجدد حل نمی‌شوند. کدی که با این دو مثل 429 برخورد می‌کند، در حلقه می‌افتد — 401 چون کلید همان است و 403 چون مجوز همان است. جزئیات در احراز هویت.

حالتی که در جدول نیست: Blocked

این کد وضعیت نیست. اجرایی که کپچا خورده 200 برمی‌گرداند و مشکل در فلگ‌های سند گزارش می‌شود:

نشانهکجا
flags.blocked: trueسند نتیجه
status: "Blocked"search_metadata در خروجی serpapi
blocked در شمارنده‌هامصرف
اجرای Blocked را با همان ورودی دوباره نفرستید. کپچا با تکرار بی‌تغییر دوباره بلاک می‌شود. ورودی را عوض کنید — شهر دیگر یا device متفاوت — یا صبر کنید. توضیح کامل در نتایج.

الگوی کلی

if r.status_code in (401, 403):
    raise ConfigurationError("کلید یا مجوز را اصلاح کنید")   # تلاش مجدد بی‌فایده
if r.status_code == 404:
    raise LookupError("پیدا نشد، یا متعلق به شما نیست")
if r.status_code == 422:
    raise ValueError(r.json()["detail"])                        # بدنهٔ ورودی غلط
if r.status_code == 429:
    time.sleep(int(r.headers["Retry-After"]))                   # تنها موردی که صبر می‌کند
r.raise_for_status()
بر اساس وضعیت HTTP تصمیم بگیرید، نه متن خطا