Задать вопрос
@senkysultan

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

У меня есть телеграмм бот который админ в канале и он принимает заявки и это я настроил но не могу настроить чтоб при подписке на канал , подключенный аккаунт через сессию 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()
  • Вопрос задан
  • 73 просмотра
Подписаться 1 Средний 2 комментария
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы