Как реализовать чтоб аккаунт писал при подписке на канал?
Сейчас ситуация такая: у меня есть Telegram бот который админ в канале и он принимает заявки и это я настроил но не могу настроить чтоб при подписке на канал, подключенный аккаунт через сессию 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()
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос