У меня есть телеграмм бот который админ в канале и он принимает заявки и это я настроил но не могу настроить чтоб при подписке на канал , подключенный аккаунт через сессию pyrogram отправлял приветствие , даже сделала живые логи для этого но не получается я прикрепил вот код бота, помогите и в проблеме, надо чтоб при подписке на канал аккаунт писал приветствие пользователю, бот и так принимает заявки а аккаунт который авторизован его бот и видит и взаимодействует но приветствие не отправляется, хотя аккаунт и админ и все, и в хранилище есть данные об аккаунте подписчика
код вот что связанное
clients = {}
channels_db = {}
async def get_client(account_type: str) -> Client:
if account_type not in clients:
accounts = get_accounts()
if account_type not in accounts:
raise ValueError(f"Account {account_type} not found")
phone = accounts[account_type]['phone']
session_name = accounts[account_type]['session_name']
if not phone:
raise ValueError(f"Phone not set for {account_type}")
client = Client(
name=session_name,
api_id=API_ID,
api_hash=API_HASH,
phone_number=phone
)
await client.start()
clients[account_type] = client
return clients[account_type]
async def stop_clients():
for client in clients.values():
await client.stop()
async def approve_with_delay(chat_id: int, user_id: int, delay: int, user, channel_id: str):
log.info("[APPROVE] Жду %s сек перед одобрением user=%s в chat=%s", delay, user_id, chat_id)
await asyncio.sleep(delay)
try:
log.info("[APPROVE] ✅ Заявка user=%s в chat=%s одобрена (ботом)", user_id, chat_id)
join_time = datetime.now(MOSCOW_TZ)
users = get_users_data()
users[str(user_id)] = {
'channel': channel_id,
'join_time': join_time.isoformat(),
'sent_main': False,
'sent_fake': False
}
save_users_data(users)
channels = get_channels()
channel_settings = channels[channel_id]
# Добавляем проверку на включение приветствия
if channel_settings.get('greeting_enabled', True): # Проверка на разрешение приветствия
user_mention = getattr(user, 'mention', f"@{user.username}") # Если атрибут mention отсутствует, используем username
greeting_text = channel_settings.get('greeting', GREETING_TEXT).format(user_mention=user_mention)
# Задержка отправки приветственного сообщения
await asyncio.sleep(channel_settings.get('send_delay_minutes', 1) * 60) # Задержка отправки
await send_greeting(user_id, 'main', greeting_text, channel_id) # Передаем channel_id
fake_delay = 12 * 60 * 60 # 12 часов для фейкового сообщения
scheduler.add_job(
send_greeting,
'date',
run_date=join_time + timedelta(seconds=fake_delay),
args=[str(user_id), 'fake', channel_settings.get('fake_msg', 'привет, ты тоже ставишь с Максом?'), channel_id] # Передаем channel_id
)
except Exception as e:
log.exception("[APPROVE] ❌ Ошибка при обработке user=%s: %s", user_id, e)
async def send_greeting(user_id: str, account_type: str, message: str, channel_id: str):
try:
log.info(f"[GREET] Отправляю сообщение: {message} пользователю {user_id}")
client = await get_client(account_type) # Использование account_type для выбора аккаунта
# Проверяем, является ли пользователь участником канала
try:
chat_member = await client.get_chat_member(int(channel_id), int(user_id))
if chat_member.status in ['member', 'administrator', 'creator']:
await client.send_message(int(user_id), message)
users = get_users_data()
if account_type == 'main':
users[user_id]['sent_main'] = True
elif account_type == 'fake':
users[user_id]['sent_fake'] = True
save_users_data(users)
log.info(f"[GREET] ✅ Сообщение отправлено пользователю {user_id}")
else:
log.info(f"[GREET] ❌ Пользователь {user_id} не является участником канала")
except Exception as e:
log.exception(f"[GREET] ❌ Ошибка получения информации о пользователе {user_id}: {e}")
except Exception as e:
log.exception(f"[GREET] ❌ Ошибка отправки приветственного сообщения для {user_id}: {e}")
def _parse_broadcast(message: types.Message) -> dict:
cfg = {
"text": "",
"media_type": None,
"file_id": None,
"buttons": []
}
if message.photo:
cfg["media_type"] = "photo"
cfg["file_id"] = message.photo[-1].file_id
cfg["text"] = message.caption or ""
elif message.video:
cfg["media_type"] = "video"
cfg["file_id"] = message.video.file_id
cfg["text"] = message.caption or ""
elif message.voice:
cfg["media_type"] = "voice"
cfg["file_id"] = message.voice.file_id
cfg["text"] = message.caption or ""
elif message.video_note:
cfg["media_type"] = "video_note"
cfg["file_id"] = message.video_note.file_id
elif message.text:
cfg["text"] = message.text
if cfg["text"]:
lines = cfg["text"].splitlines()
text_lines = []
button_lines = []
for line in lines:
stripped_line = line.strip()
if " - " in stripped_line:
parts = stripped_line.split(" - ", 1)
if len(parts) == 2:
btn_text = parts[0].strip()
btn_url = parts[1].strip()
if btn_text and btn_url and (btn_url.startswith(('http', 'https', 't.me', 'www')) or '.' in btn_url):
button_lines.append(stripped_line)
continue
text_lines.append(line)
cfg["text"] = "\n".join(text_lines).strip()
for line in button_lines:
btn_text, btn_url = map(str.strip, line.split(" - ", 1))
cfg["buttons"].append({"text": btn_text, "url": btn_url})
return cfg
@dp.message(BroadcastState.waiting_for_message)
async def send_broadcast(message: types.Message, state: FSMContext):
data = await state.get_data()
users = data.get("target_users", [])
cfg = _parse_broadcast(message)
if not cfg.get("text") and not cfg.get("file_id"):
await message.answer("❌ Сообщение не может быть пустым!")
return
markup = None
if cfg.get("buttons"):
markup = types.InlineKeyboardMarkup(
inline_keyboard=[[types.InlineKeyboardButton(text=b["text"], url=b["url"])] for b in cfg["buttons"]]
)
success = 0
failed = 0
unique_users = list(set([int(uid) for uid in users if uid.isdigit()]))
if not unique_users:
await message.answer("❌ Нет пользователей для рассылки!")
await state.clear()
return
await message.answer(f" Начинаю рассылку для {len(unique_users)} пользователей...")
client = await get_client('main')
for uid in unique_users:
try:
if cfg.get("media_type") == "photo" and cfg.get("file_id"):
await client.send_photo(uid, cfg["file_id"], caption=cfg["text"], reply_markup=markup)
elif cfg.get("media_type") == "video" and cfg.get("file_id"):
await client.send_video(uid, cfg["file_id"], caption=cfg["text"], reply_markup=markup)
elif cfg.get("media_type") == "voice" and cfg.get("file_id"):
await client.send_voice(uid, cfg["file_id"], caption=cfg["text"], reply_markup=markup)
elif cfg.get("media_type") == "video_note" and cfg.get("file_id"):
await client.send_video_note(uid, cfg["file_id"])
if cfg["text"]:
await client.send_message(uid, cfg["text"], reply_markup=markup)
elif cfg.get("text"):
await client.send_message(uid, cfg["text"], reply_markup=markup)
success += 1
await asyncio.sleep(0.1)
except Exception as e:
failed += 1
await message.answer(f"✅ Рассылка завершена! Отправлено: {success}, Ошибок: {failed}")
await state.clear()