Skip to content

Cloudflare-Scamalytics

این پروژه چیه؟

یک Cloudflare Worker که سه کار انجام می‌دهد:

  1. ریسک/فراد‌اسکور یک IP تکی را از طریق سرویس Scamalytics بررسی می‌کند.
  2. یک دامنه را ریزالو می‌کند و ریسک همه‌ی IPهای پشت آن را برمی‌گرداند.
  3. تست شبکه‌ی سبک Check-Host (Ping/HTTP/TCP/UDP/DNS از چند کشور) را پروکسی می‌کند.

نکته‌ی مهم درباره‌ی نحوه‌ی کارکرد: این پروژه از API رسمی Scamalytics و کلید/یوزرنیم استفاده نمی‌کند. به‌جای آن، مستقیماً صفحه‌ی عمومی scamalytics.com/ip/<ip> را اسکرپ می‌کند و اطلاعات را از HTML آن استخراج می‌کند؛ اگر این اسکرپ مستقیم بلاک یا ریت‌لیمیت شود، به‌صورت خودکار از چند پراکسی CORS عمومی به‌عنوان مسیر جایگزین استفاده می‌کند. به همین دلیل هیچ متغیر محیطی یا کلید API‌ای برای این بخش لازم نیست.

معماری و وابستگی‌ها

این پروژه به دو سرویس جانبی دیگر (هرکدام یک ریپوی مجزا، هر دو روی Render) وابسته است:

سرویسنقش در این پروژه
Domain-Resolveوقتی کاربر یک دامنه وارد می‌کند، Worker به‌جای resolve مستقیم (که می‌تواند سقف Subrequest کلادفلر را پر کند)، این سرویس را صدا می‌زند و لیست IPهای گروه‌بندی‌شده را می‌گیرد
Check-Host (ریپوی جدا، پیش‌فرض check-host.onrender.com)تست‌های Ping/HTTP/TCP/UDP/DNS از کشورهای مختلف را انجام می‌دهد؛ Worker فقط پاسخ آن را پروکسی و کش می‌کند

جریان کار به‌طور خلاصه:

js
User → Cloudflare-Scamalytics Worker

           ├─ IP → scrap scamalytics.com
           ├─ Domain → fetch to domain-resolve → Get IPs →  Scamalytics 
           └─ Check-Host → fetch to Check-Host

رابط کاربری (Web UI)

صفحه‌ی اصلی Worker (وقتی بدون پارامتر باز شود) یک رابط کاربری با دو تب دارد:

  • Scamalytics IP Check — یک باکس ورودی که IPv4، IPv6 یا دامنه می‌پذیرد، با راهنمای استفاده از پارامترهای URL (?ip= یا ?domain=)

نتیجه‌ی بررسی کامل یک دامنه با ریسک‌اسکور همه‌ی IPهای پشتش

  • Check-Host Network Test — انتخاب نوع تست (Ping/HTTP/TCP/UDP/DNS) و یک یا چند کشور، با جدول نتایج متناسب با نوع تست (مثلاً کد HTTP + زمان پاسخ برای HTTP، باز/بسته + زمان پاسخ برای TCP/UDP، تعداد رکورد برای DNS)

جدول نتایج Check-Host برای چند کشور

اندپوینت‌ها (Routes)

IP - بررسی تکی

js
GET /<ip>
GET /api/<ip>
GET /?ip=<ip>

فراد‌اسکور و جزئیات یک IP را برمی‌گرداند.

دامنه - بررسی کامل ریسک

js
GET /api/domain/<domain>
GET /?domain=<domain>

دامنه را ریزالو کرده و ریسک‌اسکور همه‌ی IPهای پشت آن را در یک پاسخ برمی‌گرداند.

دامنه - فقط Resolve (در نسخه‌ی قدیمی، برای سازگاری با برخی از سرویس ها نگه داشته شده)

js
GET /api/<domain>
GET /?api=<domain>

فقط گروه‌های خام IP را برمی‌گرداند، بدون اسکورینگ.

بررسی گروهی IP

js
POST /api/check-ips
Content-Type: application/json

{ "ips": ["8.8.8.8", "1.1.1.1"] }

Check-Host

js
GET /checkhost/<country>/<host>
GET /checkhost/<type>/<country>/<host>
GET /checkhost/check?host=<host>&type=<type>&country=<country>&country=<country>...
  • type یکی از ping, http, tcp, udp, dns است و در صورت ننوشتن، پیش‌فرض ping است.
  • country یک کد ۲ یا ۳ حرفی کشور است (مثل us, de, ir)؛ در اندپوینت check حداکثر ۱۰ کشور در هر درخواست قابل انتخاب است.

جدول پارامترهای Query

پارامترمعنیرفتار
ipیک IP تکیهمان IP اسکور می‌شود
domainنام دامنههمه‌ی IPهای پشت آن resolve و اسکور می‌شوند
apiIP یا دامنه (نسخه‌ی قدیمی)نوع را خودکار تشخیص می‌دهد؛ برای دامنه فقط گروه خام برمی‌گرداند، نه اسکور

پشتیبانی از IPv6

IPv4 و IPv6 در همه‌جا به‌صورت یکسان پشتیبانی می‌شوند:

  • همه‌ی نقاط ورودی، آدرس IPv6 را در هر فرم متنی معتبری می‌پذیرند: با کروشه ([2606:4700:4700::1111]، [::1]:443) و حتی لینک-لوکال با Zone ID (fe80::1%eth0 — که Zone ID آن حذف می‌شود، چون فقط محلی معناست و scamalytics.com نمی‌تواند آن را resolve کند)
  • هر آدرس IPv6 معتبر به فرم استاندارد RFC 5952 نرمال‌سازی می‌شود (حروف کوچک، کوتاه‌ترین فشرده‌سازی ::، فرم ::ffff:a.b.c.d برای آدرس‌های IPv4-mapped) پیش از استفاده در URL خروجی، کلید کش Edge یا پاسخ JSON — یعنی 2001:0DB8::1، 2001:db8:0:0:0:0:0:1 و 2001:db8::1 همگی به یک کش واحد می‌رسند و یکسان نمایش داده می‌شوند، نه اینکه سه‌بار جدا اسکور/کش شوند.
  • اسکورینگ دامنه و گروهی، لیست IP را ابتدا بر اساس فرم نرمال‌شده یکتاسازی می‌کنند.
  • پاسخ‌های API یک فیلد ip_version (4 یا 6) برای هر IP دارند، و رابط کاربری یک برچسب IPv4/IPv6 کنار هر آدرس نشان می‌دهد.
  • ورودی‌های نامعتبر در یک درخواست گروهی، تک‌تک گزارش می‌شوند ("error": true, "message": "Invalid IP address format") به‌جای اینکه کل درخواست fail شود.

کشینگ (Caching)

  • بررسی تک IP: با Cache API خودِ کلادفلر، به مدت ۱ ساعت (Cache-Control: public, max-age=3600)؛ هدر X-Cache مقدار HIT یا MISS را نشان می‌دهد.
  • Check-Host: برای هر ترکیب کشور+هاست+نوع، به مدت ۶۰ ثانیه در Edge کش می‌شود.

کنترل نرخ درخواست (Throttling)

برای بررسی گروهی/دامنه، IPها در دسته‌های ۳تایی اسکور می‌شوند: داخل هر دسته، درخواست‌ها با فاصله‌ی ۲۵۰ میلی‌ثانیه‌ای پخش می‌شوند (تا هم‌زمان به scamalytics.com نخورند)، بین هر دسته و دسته‌ی بعدی هم ۴۰۰ میلی‌ثانیه مکث وجود دارد، و روی هر IP در صورت خطا یک بار تلاش مجدد انجام می‌شود. به همین دلیل، بررسی دامنه‌های با تعداد IP بالا زمان بیشتری می‌برد.

نکات مهم

  • چون اسکورینگ از اسکرپ صفحه‌ی عمومی scamalytics.com استفاده می‌کند، ممکن است گاهی ریت‌لیمیت یا بلاک شود؛ در این حالت آن IP خاص با "error": true برمی‌گردد، نه کل درخواست.
  • اگر سرویس Check-Host (روی Render) کند یا خاموش باشد، فقط کارت همان کشور با پیام خطا نمایش داده می‌شود، بقیه‌ی کشورهای همان درخواست تحت‌تأثیر قرار نمی‌گیرند.

پیش‌نیازها

  • حساب کاربری Cloudflare
  • بدون نیاز به هیچ متغیر محیطی، کلید API یا اکانت Scamalytics — این پروژه کاملاً بدون کانفیگ کار می‌کند.
  • (اختیاری) اگر می‌خواهید به‌جای سرویس‌های عمومی پیش‌فرض، نسخه‌ی خودتان از domain-resolve و/یا Check-Host را دیپلوی کنید، باید دو ثابت بالای فایل _worker.js را ویرایش کنید:
js
  const RENDER_RESOLVER_API = 'https://domain-resolve.onrender.com'; // your service
  const CH_RENDER_API_BASE = 'https://check-host.onrender.com';

راهنمای دیپلوی

۱. فایل _worker.js را (در صورت نیاز، بعد از ویرایش دو ثابت بالا) داخل یک فایل zip فشرده کن. ۲. در داشبورد Cloudflare به «Workers & Pages» برو و روی «Create application» بزن. ۳. تب «Pages» را انتخاب کن، روی «Upload assets» بزن و فایل zip را آپلود کن. ۴. روی «Deploy site» بزن.

بعد از دیپلوی، آدرس Pages  (مثل https://your-project.pages.dev) هم رابط کاربری وب و هم همه‌ی اندپوینت‌های بالا را رندر می‌کند.

عیب‌یابی

  • یک IP خاص همیشه error: true برمی‌گرداند: احتمالاً scamalytics.com آن درخواست را بلاک کرده و هر ۵ پراکسی جایگزین هم fail شده‌اند؛ کمی بعد دوباره امتحان کن
  • بررسی یک دامنه خیلی طول می‌کشد: طبیعی است اگر دامنه IPهای زیادی داشته باشد، چون اسکورینگ عمداً throttle شده (دسته‌های ۳تایی با فاصله)
  • یک کشور در Check-Host خطا نشان می‌دهد ولی بقیه کار می‌کنند: یعنی فقط سرویس Check-Host برای همان درخواست کند/خاموش بوده؛ چیزی در Worker خراب نیست
  • پاسخ IPv6 با فرم‌های مختلف کش جدا می‌گیرد: نباید این‌طور باشد — اگر دیدی، مطمئن شو آدرس واقعاً معتبر است (isValidIPv6)، چون نرمال‌سازی فقط روی ورودی‌های معتبر اعمال می‌شود
  • در بخش Check-Host , به ارور HTTP 502 میخورم: این مورد به خاطر لیمیت خود چک هاست هست و 5 دقیقه بعد درست میشه چون خود چک هاست برای شلوغ نشدن node هاش مجبوره یک rate-limit بزاره که بازدهی بهتری داشته باشه. در این باره سعی میکنم راهی پیدا کنم.

لینک‌های مرتبط

  • ریپوی این پروژه: https://github.com/mehdi-hexing/Cloudflare-Scamalytics
  • سرویس Resolve دامنه: https://github.com/mehdi-hexing/Domain-Resolve
  • سرویس Check-Host: https://github.com/mehdi-hexing/Check-Host-API