Как реализовать чтоб аккаунт писал при подписке на канал?

Ссылка скопирована
0 ответов

Сейчас ситуация такая: у меня есть 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()
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно