سایت خبری · CMS اختصاصی · ربات
مدالیک
سایت خبری ورزشی با CMS اختصاصی، خبرخوان هوشمند و کش کامل صفحه
- Laravel 13
- PHP 8.4
- Redis
- MySQL
- Python
- DeepSeek
- ربات تلگرام و بله
- ابر آروان
مسئله
خبرهای ورزشی، بهخصوص رشتههایی مثل تنیس روی میز و کشتی، دیر و پراکنده پوشش داده میشوند. سایتهای خبری یا دیر منتشر میکنند یا برای انتشار هزینه میخواهند، و خبری که دو روز بعد منتشر شود دیگر در گوگل دیده نمیشود.
هدف ساختن رسانهای بود که:
- خبر را چند دقیقه بعد از انتشار در منبع اصلی (فدراسیونها، ITTF و…) به فارسی منتشر کند؛
- بدون تیم بزرگ تحریریه اداره شود؛
- آنقدر سریع باشد که هم کاربر موبایل و هم گوگل راضی بمانند؛
- کنترل نهایی همیشه دست ویراستار انسانی بماند.
راهحل در یک نگاه
سیستم سه بخش دارد که هر کدام فقط یک کار را انجام میدهند:
- ربات خبرخوان (پایتون)هر ۵ دقیقه منابع را میخواند، خبرهای نامرتبط و تکراری را کنار میگذارد و فقط خبرهای باقیمانده را با DeepSeek ترجمه و بازنویسی میکند.
- API لاراولخبر بهصورت پیشنویس ذخیره میشود، عکسش روی سرور خود سایت WebP میشود و HTML آن پاکسازی میشود.
- ویراستار در تلگرامبرای هر خبر پیامی با دکمهی «انتشار / رد» میآید؛ یک لمس کافی است. پنل سایت و پیام تلگرام همیشه با هم هماهنگاند.
- صفحههای عمومیبدون سشن و کوکی ساخته میشوند و HTML آماده مستقیم از Redis و CDN آروان برمیگردد.
تصمیمهای فنی مهم
کش کامل صفحه، با یک عدد برای باطلکردن همه
هر صفحهی عمومی یکبار ساخته میشود و HTML آمادهاش در Redis میماند. درخواست بعدی اصلاً به Blade یا دیتابیس نمیرسد.
مشکل همیشگی کش، باطلکردن بهموقع آن است. بهجای پاککردن تکتک کلیدها، همهی کلیدهای کش یک «نسخهی محتوا» دارند. با هر انتشار یا ویرایش فقط همین عدد یکی بالا میرود و همهی صفحهها در بازدید بعدی تازه میشوند. پیشنویسهایی که ربات میفرستد این عدد را عوض نمیکنند، پس کش در طول روز گرم میماند.
صفحهی بدون کوکی، یعنی CDN هم کش میکند
صفحههای عمومی عمداً هیچ سشن و کوکیای ندارند. نتیجه این است که ابر آروان هم میتواند کل صفحه را کش کند و بخش بزرگی از بازدیدها اصلاً به سرور نمیرسد. پنل مدیریت جداست و فقط آنجا سشن وجود دارد.
کوئریهای سبک
صفحهی اول با چهار کوئری ایندکسدار ساخته میشود و فهرستها هیچوقت ستون سنگین متن خبر را نمیخوانند. در محیط توسعه، لاراول هر کوئری N+1 را فوراً به خطا تبدیل میکند تا چنین مشکلی هرگز به سرور نرسد.
هوش مصنوعی آخر خط، نه اول آن
فراخوانی DeepSeek هزینه دارد، پس پیش از آن هر کار ارزانی انجام میشود: فید بدون تغییر دوباره دانلود نمیشود، خبرهای بیربط با کلیدواژه کنار میروند و لینک یا تیتر تکراری سه روز اخیر دوباره پردازش نمیشود. برای هر خبرِ باقیمانده فقط یک درخواست زده میشود که هم مرتبط بودن را میسنجد، هم ترجمه و بازنویسی میکند، هم تیتر و لید و برچسب میسازد.
یک خبر، دو جای تأیید
خبر فقط یکجا وجود دارد: دیتابیس سایت. پیام تلگرام کنترل از راه دورِ همان پیشنویس است. اگر ویراستار از پنل منتشر کند، حداکثر ۳۰ ثانیه بعد پیام تلگرام هم بهروز میشود و دکمهها برداشته میشوند. خبری که رد شود دیگر هیچوقت از همان منبع برنمیگردد. برای بله هم کافی است آدرس API عوض شود.
فرانت بدون وزن اضافه
بدون jQuery، بدون فریمورک CSS و بدون مرحلهی build: یک فایل CSS که فشردهاش حدود سه کیلوبایت است و یک فونت variable محلی. تاریخ شمسی، اعداد فارسی و اسلاگ فارسی هم بدون هیچ پکیج جانبی پیاده شدهاند.
سئو
- sitemap عادی و News Sitemap برای گوگل نیوز، بههمراه فید RSS
- آدرس هر خبر شناسهی عددی دارد و تغییر تیتر لینک را خراب نمیکند
- هدر
Cache-Controlدرست، تا CDN و مرورگر صفحه را نگه دارند - با یک تنظیم در
.envکل سایت روی دامنهی موقت از دید گوگل پنهان میماند
پنل مدیریت
پنل اختصاصی، بدون قالب آماده: داشبورد پیشنویسها و انتشارهای امروز، ویرایشگر ساده با چسباندن تمیز متن، برچسب، زمانبندی انتشار، خبر شاخص، برچسب «زنده»، آپلود عکس با تبدیل خودکار به WebP و پیشنمایش پیشنویس با همان ظاهر سایت.
نتیجه
- خبر چند دقیقه بعد از انتشار در منبع، با یک لمس ویراستار روی سایت است
- صفحهها در حالت عادی بدون اجرای هیچ کوئریای از Redis یا CDN برمیگردند
- هزینهی هوش مصنوعی فقط برای خبرهایی پرداخت میشود که واقعاً منتشرشدنیاند
- ۵۵ تست برای سایت و ۱۶ تست برای ربات، پیش از هر تغییر اجرا میشوند