سایت خبری · CMS اختصاصی · ربات · آمار
مدالیک
سایت خبری ورزشی با CMS اختصاصی، خبرخوان هوشمند و تحریریه در تلگرام
- Laravel 13
- PHP 8.4
- Redis
- MySQL
- Python
- DeepSeek
- Tesseract OCR
- ربات تلگرام و بله
- GitHub Actions
- ابر آروان
مسئله
خبرهای ورزشی، بهخصوص رشتههایی مثل تنیس روی میز، کشتی، رزمیها و وزنهبرداری، دیر و پراکنده پوشش داده میشوند. خبر قهرمانی یک ملیپوش اول در صفحهی اینستاگرام فدراسیون یا یک کانال تلگرام میآید، خبر جهانیاش در سایت فدراسیون بینالمللی به انگلیسی، و تا خبرگزاریها آن را بنویسند یکی دو روز گذشته است. خبری که دو روز بعد منتشر شود، دیگر نه در گوگل دیده میشود و نه برای مخاطب تازه است.
راه معمول، یک تحریریهی چندنفره است که شبانهروز سایتها و کانالها را بگردد، ترجمه کند، بنویسد و منتشر کند. هدف مدالیک این بود که همین کار را بدون تیم بزرگ انجام دهد:
- خبر را چند دقیقه بعد از انتشار در منبع، به فارسی روان روی سایت ببرد؛
- از منابع داخلی و خارجی، حتی اینستاگرام و تلگرام، بخواند؛
- کار تکراری را ربات انجام دهد، ولی تصمیم انتشار همیشه با انسان بماند؛
- آنقدر سریع باشد که هم کاربر موبایل و هم گوگل راضی بمانند؛
- بدون ابزار بیرونی بفهمم مخاطب از کجا میآید و چه میخواند.
راهحل در یک نگاه
- ربات خبرخوان (پایتون)هر چند دقیقه خبرگزاریها، جستوجوی جهانی بینگ، اینستاگرام و کانالهای تلگرام فدراسیونها را میخواند.
- فیلتر و هوش مصنوعیخبر بیربط و تکراری پیش از هر هزینهای کنار میرود؛ بقیه با یک درخواست به DeepSeek ترجمه، بازنویسی و امتیازدهی میشوند.
- پیشنویس در سایتAPI لاراول خبر را با عکس روی سرور خود سایت ذخیره میکند؛ هنوز هیچکس آن را نمیبیند.
- تحریریه در تلگرامپیامی با دکمههای «انتشار / رد / ویرایش در پنل» در گروه تحریریه میآید.
- سایت و آمارصفحهها از کش Redis و CDN آروان باز میشوند و هر بازدید واقعی در آمار اختصاصی ثبت میشود.
خبرخوان: چشمهای تحریریه
ربات خبرخوان یک سرویس پایتون است که روی سرور رباتها با pm2 دائماً اجرا میشود. کارش این است که هیچ خبر مهمی از دست نرود و هیچ خبر بیارزشی وقت ویراستار را نگیرد.
از کجا میخواند
- خبرگزاریهای داخلی: فید ورزشی تسنیم، ایسنا، مهر، ایرنا، خبرآنلاین و باشگاه خبرنگاران جوان.
- جستوجوی جهانی برای هر رشته: برای پینگپنگ، WTT، کشتی آزاد و فرنگی، تکواندو، کاراته، جودو، وزنهبرداری، والیبال، بسکتبال، هندبال، فوتسال، فوتبال ساحلی، دوومیدانی و شنا، جستوجوی جداگانه در اخبار بینگ. لینکها باز میشوند تا اسم ناشر واقعی، نه موتور جستوجو، زیر خبر بیاید.
- اینستاگرام: پستهای فدراسیونها و ورزشکاران. وقتی اینستاگرام متن پست را نمیدهد، ربات متن را با OCR فارسی (Tesseract) از روی اسکرینشات میخواند و عکس تمیز پست را از خود لینک برمیدارد.
- کانالهای عمومی تلگرام: کانالهای خود فدراسیونها، از نسخهی وب عمومی؛ عکسی که درست قبل از متن فرستاده شده همراه خبر میماند و پیامهای کوتاه تبریک کنار گذاشته میشوند.
- هر چیزی که در گروه تحریریه بیندازم: یک لینک یا یک عکس در گروه، خودش پیشنویس خبر میشود.
هوش مصنوعی، آخر خط و با حساب
فراخوانی DeepSeek هزینه دارد، پس هر کار ارزانتری پیش از آن انجام میشود:
- فیدی که عوض نشده دوباره دانلود نمیشود؛
- لینک تکراری و تیتر شبیه به خبرهای سه روز اخیر دوباره پردازش نمیشود؛
- خبری که کلیدواژهی هیچ رشتهای را ندارد، فقط یک بررسی ارزان «ورزشی هست یا نه» میگیرد؛
- منابعی که ربات نمیتواند متنشان را بخواند، پیش از مصرف اعتبار کنار میروند.
برای هر خبرِ باقیمانده فقط یک درخواست زده میشود که هم ترجمه و بازنویسی میکند، هم تیتر و لید و برچسب میسازد، هم به اهمیت خبر امتیاز میدهد. خبرهای خارجی فقط با امتیاز ۷ از ۱۰ به بالا (و برای رشتههای کمخبرتر ۶) به تحریریه میرسند؛ مثلاً قهرمانی جهان در کاراته رد نمیشود، ولی خبر دستهدوم لیگ یک کشور دیگر هم مزاحم نمیشود.
ریزهکاریهایی که فرق میسازند
- اسم آدمها درست نوشته میشود: فهرستی از املای ثابت اسم ورزشکاران به DeepSeek گفته میشود و بعد از جواب هم دوباره اعمال میشود.
- اصطلاح هر رشته همانطور که منبع نوشته میماند: «کومیته» در کاراته به «کمیته» تبدیل نمیشود.
- خبر کهنه، خبر نیست: جستوجوهای خارجی فقط خبرهای ۴۸ ساعت اخیر را میپذیرند.
- اگر DeepSeek در دسترس نباشد (اعتبار تمام شده، کلید اشتباه، قطعی)، خبرها دور ریخته نمیشوند؛ صبر میکنند و فقط یکبار در گروه هشدار میآید.
- تنظیمات از خود تلگرام: با دستور /settings در گروه، خبرهای داخلی یا خارجی و هر رشته را جدا روشن و خاموش میکنم؛ خبرهای نگهداشتهشده بعد از روشن کردن دوباره میرسند.
تحریریه در تلگرام
ربات هیچ خبری را خودش منتشر نمیکند. هر پیشنویس با تیتر، خلاصه، رشته و لینک منبع در گروه تحریریه میآید و با یک لمس تکلیفش روشن میشود.


- پیش از انتشار: «✅ انتشار»، «❌ رد» و «✏️ ویرایش در پنل».
- بعد از انتشار: پیام به «منتشر شد — اسم ویراستار» با لینک سایت تبدیل میشود و دکمههای تازه میگیرد: «⭐ شاخص صفحه اول»، «📌 شاخص رشته»، «🌐 در سایت» و «🗑 حذف از سایت» که پیش از حذف تأیید میگیرد.
- یک خبر، دو جای تأیید: خبر فقط یکجا وجود دارد، در دیتابیس سایت؛ پیام تلگرام کنترل از راه دور همان است. اگر از پنل منتشر کنم، حداکثر ۳۰ ثانیه بعد پیام تلگرام هم بهروز میشود.
- ردشده برنمیگردد: لینکی که رد شود، دیگر هیچوقت پیشنهاد نمیشود.
- تلگرام یا بله: برای بله فقط آدرس API عوض میشود؛ بقیهی کد یکی است.
پنل مدیریت اختصاصی
برای وقتهایی که خبری دستی نوشته میشود یا باید با دقت ویرایش شود، پنل اختصاصی ساختم؛ تیره، سریع، و از اول برای کار با گوشی طراحیشده، چون بیشتر انتشارها از روی موبایل انجام میشود.



- داشبورد: پیشنویسهای منتظر، منتشرشدههای امروز، زمانبندیشدهها و پربازدیدترینها.
- خبرها: تبهای پیشنویس و منتشرشده، جستوجو در تیترها و فیلتر رشته.
- ویرایشگر: چسباندن متن بدون قالببندی اضافه، برچسب، رشته، نوع خبر (خبر، تحلیل، ویدیو)، زمانبندی انتشار، برچسب «زنده».
- شاخص دولایه: هر خبر میتواند شاخص صفحهی اول یا شاخص صفحهی رشتهی خودش باشد.
- عکس و ویدیو: آپلود عکس که خودکار WebP و کوچک میشود، آلبوم عکس، و پخشکننده برای آپارات، یوتیوب یا فایل مستقیم.
- پیشنمایش هر پیشنویس دقیقاً با ظاهر سایت.
آمار: سرچ کنسولِ خودمان
برای فهمیدن مخاطب به گوگل آنالیتیکس یا ابزار بیرونی وابسته نیستم. مدالیک سیستم آمار خودش را دارد؛ در عمل سرچ کنسول و آنالیتیکس اختصاصی خودمان است، با این فرق که چیزهایی را میبیند که ابزارهای خارجی نمیبینند.

- از کجا آمدهاند: گوگل، بینگ، یاندکس، داکداکگو و ذرهبین؛ و شبکههایی که ابزارهای خارجی اصلاً نمیشناسند: تلگرام، ایتا، روبیکا، بله، واتساپ و اینستاگرام. کمپینها (utm) هم جدا شمرده میشوند.
- با چه دستگاهی: موبایل، کامپیوتر یا تبلت، و سیستمعامل.
- چه میخوانند: صفحههای ورود، پربازدیدترین خبرها و بازدید به تفکیک رشته.
- کی میآیند: ساعتهای اوج بازدید، تا خبر مهم در بهترین ساعت منتشر شود.
- عددهای واقعی: رباتها و خزندهها شمرده نمیشوند و مرورگر خود ویراستارها هم کنار گذاشته میشود.
- بدون خراب کردن کش: بازدید با یک درخواست سبک جداگانه از صفحهی خبر ثبت میشود؛ خود صفحه همچنان از کش میآید. همین عددها «پربازدیدترینهای هفته» را در صفحهی اول میسازند.
سایت: سریع، تیره، فارسی



- صفحهی اول: خبر شاخص، شبکهی آخرین خبرها، یک بلوک برای هر رشته، تحلیل، ویدیو و پربازدیدترینهای هفته.
- صفحهی هر رشته با خبر شاخص خودش.
- صفحهی خبر: آلبوم عکس، پخشکنندهی ویدیو، شش خبر مرتبط و دکمهی اشتراکگذاری.
- تم شب و روز، فونت فارسی محلی، تاریخ شمسی و اعداد فارسی، بدون هیچ پکیج جانبی.
- شبکهای که همیشه پر است: تعداد خبرها طوری انتخاب شده که در گوشی، تبلت و کامپیوتر هیچ ردیفی نیمهخالی نماند.
سرعت، از معماری
کش کامل صفحه، با یک عدد برای باطلکردن همه
هر صفحهی عمومی یکبار ساخته میشود و HTML آمادهاش در Redis میماند. درخواست بعدی اصلاً به دیتابیس نمیرسد. بهجای پاککردن تکتک کلیدها، همهی کلیدها یک «نسخهی محتوا» دارند؛ با هر انتشار یا ویرایش فقط همین عدد بالا میرود و همهی صفحهها در بازدید بعدی تازه میشوند. پیشنویسهای ربات این عدد را عوض نمیکنند، پس کش در طول روز گرم میماند.
صفحهی بدون کوکی، یعنی CDN هم کش میکند
صفحههای عمومی عمداً هیچ سشن و کوکیای ندارند. نتیجه این است که ابر آروان هم کل صفحه را کش میکند و بیشتر بازدیدها اصلاً به سرور نمیرسد. پنل مدیریت جداست و فقط آنجا سشن هست.
کوئریهای سبک و فرانت بیوزن
صفحهی اول با چهار کوئری ایندکسدار ساخته میشود و فهرستها هیچوقت ستون سنگین متن خبر را نمیخوانند. بدون jQuery، بدون فریمورک CSS و بدون مرحلهی build: کل CSS سایت پس از فشردهسازی حدود چهار کیلوبایت است.
عکسها مستقل از منبع
عکس هر خبر را خود ربات، که به سایتهای خارجی دسترسی دارد، دانلود میکند و همراه خبر میفرستد؛ روی سرور سایت WebP میشود و زیرش «عکس: منبع» میآید. اگر سایت منبع فردا عکس را بردارد یا از ایران در دسترس نباشد، خبر مدالیک سالم میماند.
سئو
- دادهی ساختاریافتهی NewsArticle برای هر خبر و BreadcrumbList برای هر صفحه، تا گوگل خبر را خبر بشناسد.
- News Sitemap برای گوگل نیوز، sitemap عادی و خوراک RSS.
- آدرس هر خبر شناسهی عددی دارد؛ تغییر تیتر لینک را خراب نمیکند.
- با یک تنظیم، کل سایت روی دامنهی موقت از دید گوگل پنهان میماند تا محتوای تکراری ساخته نشود.
کیفیت و روند ساخت
- اولین خط کد: ۲۳ مهر ۱۴۰۵. در دو هفتهی اول، ۷۸ تغییر ثبتشده در گیت، از پایهی CMS تا آمار و خواندن اینستاگرام.
- ۱۰۰ تست خودکار: ۷۲ تست برای سایت و ۲۸ تست برای ربات خبرخوان.
- GitHub Actions: هر تغییر پیش از رسیدن به سرور، روی PHP 8.4 تست میشود.
- مستندات نصب و استقرار برای سایت و ربات، تا پروژه به حافظهی یک نفر وابسته نماند.
نتیجه
- ۶۱۶ خبر در کمتر از دو هفته از اولین خط کد، با تحریریهای که یک گروه تلگرامی است.
- خبر چند دقیقه بعد از انتشار در منبع، با یک لمس روی سایت است؛ از خبرگزاریها، فدراسیونهای جهانی، اینستاگرام و تلگرام.
- هزینهی هوش مصنوعی فقط برای خبرهایی پرداخت میشود که واقعاً ارزش انتشار دارند.
- صفحهها در حالت عادی بدون اجرای هیچ کوئریای از Redis یا CDN باز میشوند.
- آمار مخاطب، از گوگل تا ایتا و روبیکا، بدون هیچ ابزار بیرونی.
مدالیک نشان میدهد وقتی محصول، طراحی، کد، هوش مصنوعی و سرور با هم دیده شوند، میشود رسانهای ساخت که با کمترین نیرو بیشترین خروجی را بدهد. اگر برای کسبوکار شما هم سیستمی با همین سرعت و هوشمندی لازم است، با هم صحبت کنیم.