Cloudflare-Scamalytics
این پروژه چیه؟
یک Cloudflare Worker که سه کار انجام میدهد:
- ریسک/فراداسکور یک IP تکی را از طریق سرویس Scamalytics بررسی میکند.
- یک دامنه را ریزالو میکند و ریسک همهی IPهای پشت آن را برمیگرداند.
- تست شبکهی سبک 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 فقط پاسخ آن را پروکسی و کش میکند |
جریان کار بهطور خلاصه:
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=)

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

اندپوینتها (Routes)
IP - بررسی تکی
GET /<ip>
GET /api/<ip>
GET /?ip=<ip>فراداسکور و جزئیات یک IP را برمیگرداند.
دامنه - بررسی کامل ریسک
GET /api/domain/<domain>
GET /?domain=<domain>دامنه را ریزالو کرده و ریسکاسکور همهی IPهای پشت آن را در یک پاسخ برمیگرداند.
دامنه - فقط Resolve (در نسخهی قدیمی، برای سازگاری با برخی از سرویس ها نگه داشته شده)
GET /api/<domain>
GET /?api=<domain>فقط گروههای خام IP را برمیگرداند، بدون اسکورینگ.
بررسی گروهی IP
POST /api/check-ips
Content-Type: application/json
{ "ips": ["8.8.8.8", "1.1.1.1"] }Check-Host
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 و اسکور میشوند |
api | IP یا دامنه (نسخهی قدیمی) | نوع را خودکار تشخیص میدهد؛ برای دامنه فقط گروه خام برمیگرداند، نه اسکور |
پشتیبانی از 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را ویرایش کنید:
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