fix command
This commit is contained in:
+57
-27
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user