مسدودکننده اسپم
Spam Blocker یک سرویس متمرکز تشخیص اسپم است که انتشارهای ورودی را ارزیابی میکند و به هرکدام امتیاز ریسک میدهد. از دو بسته تشکیل شده است:
@bitsocial/spam-blocker-server— سرور HTTP که APIهای ارزیابی و چالش را میزبانی میکند.@bitsocial/spam-blocker-challenge— یک بسته سبک سمت کلاینت که انجمنها آن را یکپارچه میکنند تا انتشارها را برای ارزیابی بفرستند.
کد منبع: github.com/bitsocialnet/spam-blocker
امتیازدهی ریسک چگونه کار میکند
هر انتشاری که به نقطه پایانی /evaluate فرستاده شود یک امتیاز ریسک عددی میگیرد. این امتیاز ترکیب وزندار چند سیگنال است:
| سیگنال | توضیح |
|---|---|
| قدمت حساب | حسابهای تازهتر امتیاز ریسک بالاتری میگیرند. |
| کارما | کارمای انباشته در انجمنها ریسک را کم میکند. |
| اعتبار نویسنده | دادههای اعتباری که نمایهساز پسزمینه شبکه گرد میآورد. |
| تحلیل محتوا | اکتشافیهای سطح متن (چگالی پیوند، الگوهای شناختهشده اسپم و مانند آن). |
| سرعت انتشار | مطالب پیاپی و پرشتاب از یک نویسنده ریسک را بالا میبرد. |
| هوشمندی IP | مکانیابی جغرافیایی در سطح کشور و استعلام از فیدهای تهدید. فقط کد کشور نگهداری میشود — نشانیهای خام IP هرگز با انجمنها به اشتراک گذاشته نمیشود. |
آستانههای ردهها
امتیاز ریسک به یکی از چهار رده قابل تنظیم نگاشت میشود و همان رده تعیین میکند در ادامه چه اتفاقی بیفتد:
- پذیرش خودکار — امتیاز آنقدر پایین است که انتشار بدون هیچ چالشی تأیید میشود.
- کفایت OAuth — نویسنده باید یک تأیید هویت OAuth را کامل کند تا ادامه دهد.
- OAuth بهعلاوه موارد بیشتر — تنها OAuth کافی نیست؛ تأیید افزوده (مثلاً CAPTCHA) لازم است.
- رد خودکار — امتیاز بیش از اندازه بالاست؛ انتشار یکسره رد میشود.
همه مقادیر آستانه برای هر انجمن جداگانه قابل تنظیم است.
جریان چالش
وقتی یک انتشار در ردهای میافتد که تأیید لازم دارد، جریان چالش آغاز میشود:
- نخست از نویسنده خواسته میشود از راه OAuth (GitHub، Google، Twitter و دیگر ارائهدهندگان پشتیبانیشده) احراز هویت کند.
- اگر تنها OAuth کافی نباشد (رده ۳)، یک CAPTCHA جایگزین بر پایه Cloudflare Turnstile نمایش داده میشود.
- هویت OAuth تنها برای تأیید به کار میرود و هرگز با انجمن یا کاربران دیگر در میان گذاشته نمیشود.
نقاط پایانی API
POST /evaluate
یک انتشار را برای ارزیابی ریسک ثبت میکند. امتیاز ریسک محاسبهشده و رده چالشی که لازم است را برمیگرداند.
POST /challenge/verify
نتیجه یک چالش کاملشده (توکن OAuth، پاسخ CAPTCHA یا هر دو) را برای تأیید ثبت میکند.
GET /iframe/:sessionId
یک صفحه HTML قابل جاسازی برمیگرداند که رابط چالش مناسب آن نشست را رندر میکند.
محدودسازی نرخ
محدودیتهای نرخ بهصورت پویا و بر پایه قدمت و اعتبار نویسنده اعمال میشوند. نویسندگان تازهتر یا کماعتبارتر با محدودیتهای سختگیرانهتری روبهرو میشوند و نویسندگان جاافتاده آستانههای دستودلبازتری دارند. این کار جلوی سیل اسپم را میگیرد بدون آنکه شرکتکنندگان مورد اعتماد جریمه شوند.
نمایهساز پسزمینه شبکه
سرور یک نمایهساز پسزمینه اجرا میکند که پیوسته شبکه را میپیماید تا دادههای اعتبار نویسندگان را بسازد و بهروز نگه دارد. این دادهها مستقیماً وارد خط لوله امتیازدهی ریسک میشوند و به سامانه امکان میدهند شرکتکنندگان خوشنیت و همیشگی را در سراسر انجمنها بازبشناسد.
حریم خصوصی
Spam Blocker با نگاه به حریم خصوصی طراحی شده است:
- هویتهای OAuth تنها برای تأیید چالش به کار میروند و هرگز به انجمنها اعلام نمیشوند.
- نشانیهای IP فقط به کد کشور تبدیل میشوند؛ IPهای خام نه ذخیره میشوند و نه در اختیار کسی قرار میگیرند.
پایگاه داده
سرور برای ماندگاری محلی دادههای اعتبار، وضعیت نشستها و پیکربندی از SQLite (از راه better-sqlite3) استفاده میکند.