موتور جمعآوری
منابع: @string.Join("، ", Model.SourceNames)
فعال/غیرفعالسازی و تنظیم کانالها در تنظیمات .
موتور: واکشی ← حذف تکراری ← تجزیه ← اعتبارسنجی ← صف بررسی.
کش حذف تکراری و آگهیهای جمعآوریشده پاک و از نو با AI پردازش میشوند. (آگهیهای مراکز حذف نمیشوند.)
توصیهشده برای پاکسازیِ آمادهبهکارها: متنِ خام نگه داشته میشود و فقط با منطقِ جدید (یکنفر=یکآگهی، نقش پایه، گروه ثابت، تگ تمیز، موقعیت تقریبی) بازساخته میشوند. صفحاتِ «آماده به کار» ایندکس نمیشوند، پس آدرسِ ایندکسشدهای تغییر نمیکند؛ شیفت/استخدام بهمرور با ایمیجستِ تازه پاک میشوند.
شیفت/استخدام/آمادهبهکارِ جمعآوریشدهای که مختصات ندارند، از روی محلهٔ ذکرشده در متنِ آگهی روی نقشه قرار میگیرند (محدودهٔ تقریبی). فقط مختصاتِ خالی پر میشود؛ موقعیتِ واقعیِ مراکز دستنخورده میماند.
آگهیهایی که حقوقشان «توافقی» است ولی در متن مبلغ دارند (مثل «۴۰ تا ۵۰ تومان» = میلیون)، مبلغشان استخراج و ثبت میشود (درجا، بدون تغییر شناسه/آدرس).
فقط آگهیهایی که با صافیِ فعلی «خارج از حوزه» تشخیص داده میشوند (نه صرفاً ناقص) و استخدامهای تکراری بایگانی میشوند (وضعیت «بایگانی»، نه حذف). آگهیهای معتبر دستنخوردهاند، پس آدرسِ ایندکسشدهشان تغییر نمیکند؛ صفحهٔ موارد بایگانیشده ۴۱۰ Gone میدهد تا گوگل تمیز حذفشان کند.
نقشهای هممعنا (تکراری، ترکیبی مثل «پرستار و بهیار»، یا غلطاملایی مثل «بیهیار») در یک نقشِ پایه ادغام میشوند تا فهرستِ نقشها تمیز شود. مدیریتِ دستی در نقشها .
آگهیهایی که هوش مصنوعی به اشتباه «پزشک عمومی» زده ولی متنشان نقش دیگری دارد، از روی متن اصلاح میشوند (درجا، بدون تغییر شناسه/آدرس).
مراکز تکراری (با تطبیقِ فارسی) در یک رکورد ادغام و مراکزِ بدونِ نامِ واقعی به «نامشخص» منتقل میشوند. آگهیها حفظ میشوند؛ فقط مراکزِ جمعآوریشده و مدیریتنشده پاک میشوند.
افزودن دستی
منتشرشده: @JalaliDate.ToPersianDigits(Model.PublishedShifts.ToString()) شیفت،
@JalaliDate.ToPersianDigits(Model.PublishedJobs.ToString()) استخدام
@if (Model.Runs.Count > 0)
{
زمان
یافتشده
صف
منتشر
پرچم
اسپم
تکراری
@foreach (var run in Model.Runs)
{
@JalaliDate.DateTimeLabel(run.RunAt)
@JalaliDate.ToPersianDigits(run.Fetched.ToString())
@JalaliDate.ToPersianDigits(run.Queued.ToString())
@JalaliDate.ToPersianDigits(run.Published.ToString())
@JalaliDate.ToPersianDigits(run.Flagged.ToString())
@JalaliDate.ToPersianDigits(run.Spam.ToString())
@JalaliDate.ToPersianDigits(run.Duplicates.ToString())
}
جزئیات هر منبع را با نگهداشتن نشانگر روی هر ردیف ببین. لاگ کامل: docker logs hamkadr_api
}
صف بررسی
@if (Model.Queue.Count == 0)
{
صف خالی است. «اجرای جمعآوری» را بزن یا آگهی اضافه کن.
}
else
{
foreach (var r in Model.Queue)
{
}
@if (Model.QueuePages > 1)
{
@if (Model.QueuePage > 1)
{
→ قبلی }
صفحه @JalaliDate.ToPersianDigits(Model.QueuePage.ToString()) از @JalaliDate.ToPersianDigits(Model.QueuePages.ToString())
@if (Model.QueuePage < Model.QueuePages)
{
بعدی ← }
}
}
@if (Model.FlaggedTotal > 0)
{
پرچمخورده (ناقص/مشکوک)
اعتبارسنجی اینها را کامل ندانست؛ در صورت صحت میتوانی منتشرشان کنی.
foreach (var r in Model.Flagged)
{
}
@if (Model.FlaggedPages > 1)
{
@if (Model.FlaggedPage > 1)
{
→ قبلی }
صفحه @JalaliDate.ToPersianDigits(Model.FlaggedPage.ToString()) از @JalaliDate.ToPersianDigits(Model.FlaggedPages.ToString())
@if (Model.FlaggedPage < Model.FlaggedPages)
{
بعدی ← }
}
}