fix command

This commit is contained in:
Yuriy Yuriev
2026-05-18 19:07:56 +07:00
parent b3989c6837
commit 69bd0c1d63
+57 -27
View File
@@ -814,14 +814,14 @@ class BotInterface:
else str(params.min_series) else str(params.min_series)
) )
perlink_label = ( perlink_label = (
f"🔢 *Кликов в одной серии*\n" f"🔢 *Кликов в одном цикле*\n"
f"Сколько кликов подряд делать перед паузой.\n" f"Сколько кликов подряд делать перед паузой.\n"
f"Текущее: {cur}\n" f"Текущее: {cur}\n"
f"Диапазон `2-5` или фиксированно `3`." f"Диапазон `2-5` или фиксированно `3`."
) )
delay_label = ( delay_label = (
f"⏱️ *Пауза между сериями*\n" f"⏱️ *Пауза между циклами*\n"
f"Сколько секунд ждать после каждой серии кликов.\n" f"Сколько секунд ждать после каждого цикла кликов.\n"
f"Текущая: {params.min_delay}{params.max_delay} сек\n" f"Текущая: {params.min_delay}{params.max_delay} сек\n"
f"Диапазон `30-60` или фиксированно `45`." f"Диапазон `30-60` или фиксированно `45`."
) )
@@ -856,8 +856,8 @@ class BotInterface:
), ),
"perlink": perlink_label, "perlink": perlink_label,
"clickdelay": ( "clickdelay": (
f"⏳ *Задержка между кликами в серии*\n" f"⏳ *Задержка между кликами в цикле*\n"
f"Сколько секунд ждать между каждым кликом внутри одной серии.\n" f"Сколько секунд ждать между каждым кликом внутри одного цикла.\n"
f"Текущая: {params.min_click_delay}{params.max_click_delay} сек\n" f"Текущая: {params.min_click_delay}{params.max_click_delay} сек\n"
f"Диапазон `5-15` или фиксированно `10`." f"Диапазон `5-15` или фиксированно `10`."
), ),
@@ -1734,7 +1734,7 @@ class BotInterface:
mn = mx = int(value) mn = mx = int(value)
await self.task_manager.update_task(task_id, min_series=mn, max_series=mx) await self.task_manager.update_task(task_id, min_series=mn, max_series=mx)
lbl = f"{mn}{mx}" if mn != mx else str(mn) lbl = f"{mn}{mx}" if mn != mx else str(mn)
await message.answer(f"Серия: {lbl} кликов") await message.answer(f"Цикл: {lbl} кликов")
else: else:
await self.task_manager.update_task(task_id, visits_per_link=int(value)) await self.task_manager.update_task(task_id, visits_per_link=int(value))
await message.answer(f"✅ На ссылку: {value}") await message.answer(f"✅ На ссылку: {value}")
@@ -1809,9 +1809,9 @@ class BotInterface:
info = ( info = (
f"🔗 {params.url[:50]}\n" f"🔗 {params.url[:50]}\n"
f"📊 Выполнено: {params.successful_visits} из {params.max_visits} переходов\n\n" f"📊 Выполнено: {params.successful_visits} из {params.max_visits} переходов\n\n"
f"🔢 Кликов в серии: {series_range}\n" f"🔢 Кликов в цикле: {series_range}\n"
f"⏳ Задержка между кликами: {params.min_click_delay}{params.max_click_delay} сек\n" f"⏳ Задержка между кликами: {params.min_click_delay}{params.max_click_delay} сек\n"
f"⏱ Пауза между сериями: {params.min_delay}{params.max_delay} сек\n" f"⏱ Пауза между циклами: {params.min_delay}{params.max_delay} сек\n"
f"📖 Время на странице: {params.min_reading}{params.max_reading} сек" f"📖 Время на странице: {params.min_reading}{params.max_reading} сек"
) )
else: else:
@@ -1844,16 +1844,14 @@ class BotInterface:
) )
if params.task_type == "user_visit": if params.task_type == "user_visit":
builder.row( builder.row(
InlineKeyboardButton(text="🔢 Размер серии", callback_data=f"uset_{task_id}_perlink"), InlineKeyboardButton(text="🔢 Размер цикла", callback_data=f"uset_{task_id}_perlink"),
InlineKeyboardButton(text="⏳ Между кликами", callback_data=f"uset_{task_id}_clickdelay"), InlineKeyboardButton(text="⏳ Между кликами", callback_data=f"uset_{task_id}_clickdelay"),
) )
else: else:
builder.row( builder.row(
InlineKeyboardButton(text="👥 % зрителей", callback_data=f"uset_{task_id}_percent"), InlineKeyboardButton(text="📊 % CTR зрителей", callback_data=f"uset_{task_id}_ctr"),
InlineKeyboardButton(text="🔗 Резерв кликов", callback_data=f"uset_{task_id}_perlink"), InlineKeyboardButton(text="🌐 Домены", callback_data=f"uedit_{task_id}"),
InlineKeyboardButton(text="📊 CTR %", callback_data=f"uset_{task_id}_ctr"),
) )
builder.row(InlineKeyboardButton(text="🌐 Домены", callback_data=f"uedit_{task_id}"))
builder.row(InlineKeyboardButton(text="🔙 К задачам", callback_data="my_tasks")) builder.row(InlineKeyboardButton(text="🔙 К задачам", callback_data="my_tasks"))
try: try:
@@ -1955,7 +1953,7 @@ class BotInterface:
async def _run_url_visits(self, task_id: str, params: TaskParams, bot): async def _run_url_visits(self, task_id: str, params: TaskParams, bot):
"""Посещает URL сериями: sleep(межсерийная) → N кликов(+sleep между ними) → повтор.""" """Посещает URL циклами: sleep(межцикловая) → N кликов(+sleep между ними) → повтор."""
total_done = 0 total_done = 0
max_v = params.max_visits or 1 max_v = params.max_visits or 1
@@ -1969,15 +1967,15 @@ class BotInterface:
try: try:
while total_done < max_v and not params.stopped: while total_done < max_v and not params.stopped:
# --- пауза перед серией --- # --- пауза перед циклом ---
await _sleep_interruptible(params.get_delay()) await _sleep_interruptible(params.get_delay())
if params.stopped: if params.stopped:
break break
# размер серии выбирается случайно каждый раз # размер цикла выбирается случайно каждый раз
series_size = params.get_series_size() series_size = params.get_series_size()
# --- серия кликов --- # --- цикл кликов ---
for click_num in range(series_size): for click_num in range(series_size):
if params.stopped or total_done >= max_v: if params.stopped or total_done >= max_v:
break break
@@ -2007,7 +2005,7 @@ class BotInterface:
logger.error(f"URL visit error: {e}") logger.error(f"URL visit error: {e}")
total_done += 1 total_done += 1
# задержка между кликами внутри серии (кроме последнего) # задержка между кликами внутри цикла (кроме последнего)
if click_num < series_size - 1 and not params.stopped and total_done < max_v: if click_num < series_size - 1 and not params.stopped and total_done < max_v:
await _sleep_interruptible(params.get_click_delay()) await _sleep_interruptible(params.get_click_delay())
@@ -2171,6 +2169,11 @@ class BotInterface:
builder.row(InlineKeyboardButton(text="🔙 К пользователю", callback_data=f"udetail_{user_id}")) builder.row(InlineKeyboardButton(text="🔙 К пользователю", callback_data=f"udetail_{user_id}"))
else: else:
for tid, p in list(user_tasks.items())[:8]: for tid, p in list(user_tasks.items())[:8]:
if p.task_type == "user_visit":
domain = extract_domain(p.url)[:18] if p.url else "?"
label = f"🔗 {domain}"
else:
label = f"📺 {p.channel}"
if not p.completed and not p.stopped: if not p.completed and not p.stopped:
pause_btn = ( pause_btn = (
InlineKeyboardButton(text="▶️", callback_data=f"uresume_{tid}") InlineKeyboardButton(text="▶️", callback_data=f"uresume_{tid}")
@@ -2178,13 +2181,14 @@ class BotInterface:
InlineKeyboardButton(text="⏸️", callback_data=f"upause_{tid}") InlineKeyboardButton(text="⏸️", callback_data=f"upause_{tid}")
) )
builder.row( builder.row(
InlineKeyboardButton(text=label, callback_data=f"utask_{tid}"),
pause_btn, pause_btn,
InlineKeyboardButton(text="⚙️", callback_data=f"utask_{tid}"), InlineKeyboardButton(text="⚙️", callback_data=f"utask_{tid}"),
InlineKeyboardButton(text="🗑️", callback_data=f"ustop_{tid}"), InlineKeyboardButton(text="🗑️", callback_data=f"ustop_{tid}"),
) )
else: else:
builder.row(InlineKeyboardButton( builder.row(InlineKeyboardButton(
text=f"🗑️ {p.channel} (завершена)", text=f"🗑️ {label} (завершена)",
callback_data=f"ustop_{tid}" callback_data=f"ustop_{tid}"
)) ))
builder.row(InlineKeyboardButton(text="📝 Новая задача", callback_data="new_task")) builder.row(InlineKeyboardButton(text="📝 Новая задача", callback_data="new_task"))
@@ -2241,7 +2245,7 @@ class BotInterface:
builder = InlineKeyboardBuilder() builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task")) builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task"))
sent = await message.answer( sent = await message.answer(
f"🔗 {text[:50]}\n\nШаг 2/3 — введите количество переходов:", f"🔗 {text[:50]}\n\nШаг 2/4 — введите количество переходов:",
reply_markup=builder.as_markup() reply_markup=builder.as_markup()
) )
self._menu_msg[user_id] = sent.message_id self._menu_msg[user_id] = sent.message_id
@@ -2270,9 +2274,9 @@ class BotInterface:
builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task")) builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task"))
sent = await message.answer( sent = await message.answer(
f"✅ Переходов: {count}\n\n" f"✅ Переходов: {count}\n\n"
"Шаг 3/3 — сколько кликов в одной серии?\n\n" "Шаг 3/4 — сколько кликов в одном цикле?\n\n"
"Бот делает N кликов подряд, затем ждёт паузу и начинает следующую серию.\n\n" "Бот делает N кликов подряд, затем ждёт паузу и начинает следующий цикл.\n\n"
"Диапазон `2-5` — каждая серия будет случайной длины от 2 до 5.\n" "Диапазон `2-5` — каждый цикл будет случайной длины от 2 до 5.\n"
"Одно число `3` — всегда ровно 3 клика.", "Одно число `3` — всегда ровно 3 клика.",
reply_markup=builder.as_markup() reply_markup=builder.as_markup()
) )
@@ -2290,12 +2294,38 @@ class BotInterface:
await self._send_temp(message, "Введите число или диапазон, например: `3` или `2-5`") await self._send_temp(message, "Введите число или диапазон, например: `3` или `2-5`")
return return
if user_id in self._menu_msg:
await self._safe_delete(message.bot, message.chat.id, self._menu_msg.pop(user_id))
self._user_task_state[user_id] = {**state, "step": "delay", "min_series": mn, "max_series": mx}
builder = InlineKeyboardBuilder()
builder.row(InlineKeyboardButton(text="❌ Отмена", callback_data="cancel_new_task"))
series_label = f"{mn}{mx}" if mn != mx else str(mn)
sent = await message.answer(
f"✅ Цикл: {series_label} кликов\n\n"
"Шаг 4/4 — таймаут между циклами (в минутах)\n\n"
"Введите одно число, например `3` — пауза 3 минуты.",
reply_markup=builder.as_markup()
)
self._menu_msg[user_id] = sent.message_id
elif state["step"] == "delay":
try:
mn_d = mx_d = int(text)
if mn_d < 1:
raise ValueError
except Exception:
await self._send_temp(message, "Введите целое число минут, например: `3`")
return
del self._user_task_state[user_id] del self._user_task_state[user_id]
await self._clean_prev(message) await self._clean_prev(message)
url = state["url"] url = state["url"]
count = state["count"] count = state["count"]
mn = state["min_series"]
mx = state["max_series"]
series_label = f"{mn}{mx}" if mn != mx else str(mn) series_label = f"{mn}{mx}" if mn != mx else str(mn)
delay_label = str(mn_d)
task_id = f"u{user_id}_{extract_domain(url)[:12]}_{datetime.now().strftime('%H%M%S')}" task_id = f"u{user_id}_{extract_domain(url)[:12]}_{datetime.now().strftime('%H%M%S')}"
params = TaskParams( params = TaskParams(
@@ -2305,8 +2335,8 @@ class BotInterface:
min_series=mn, min_series=mn,
max_series=mx, max_series=mx,
user_id=user_id, user_id=user_id,
min_delay=settings.DEFAULT_MIN_DELAY, min_delay=mn_d * 60,
max_delay=settings.DEFAULT_MAX_DELAY, max_delay=mx_d * 60,
min_reading=settings.DEFAULT_MIN_READING, min_reading=settings.DEFAULT_MIN_READING,
max_reading=settings.DEFAULT_MAX_READING, max_reading=settings.DEFAULT_MAX_READING,
started_at=datetime.now(), started_at=datetime.now(),
@@ -2327,8 +2357,8 @@ class BotInterface:
await self._send_temp( await self._send_temp(
message, message,
f"✅ Задача создана\n🔗 {url[:50]}\n" f"✅ Задача создана\n🔗 {url[:50]}\n"
f"🔢 Переходов: {count} | Серия: {series_label} кликов\n" f"🔢 Переходов: {count} | Цикл: {series_label} кликов\n"
f"⏱ Пауза между сериями: {settings.DEFAULT_MIN_DELAY}{settings.DEFAULT_MAX_DELAY} сек", f"⏱ Пауза между циклами: {delay_label} мин",
delay=6 delay=6
) )
await self._show_user_menu(message, user_id=user_id) await self._show_user_menu(message, user_id=user_id)