Не обрабатывает сообщения в разрешенных чатах
Бот просто не реагирует на сообщения из указанных групп (а только на сообщения с ">"). Нужно чтобы бот отвечал на все сообщения в указанных группах. (указанные айди не настоящие)
import os
import asyncio
import requests
import json
import time
from dotenv import load_dotenv
from telethon import TelegramClient, events
# Отключение предупреждений о небезопасных запросах
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# Загрузка ключей
load_dotenv()
API_ID = int(os.getenv('API_ID'))
API_HASH = os.getenv('API_HASH')
GIGACHAT_AUTH_KEY = os.getenv('GIGACHAT_AUTH_KEY')
ALLOWED_CHATS = [
-1001082242887375, # Rigota Riders
-1001961994586691, # Другая группа
-1001904753846008 # Еще одна группа
]
KEYWORDS = ['@kostoli', '>', 'Привет', 'Прохор', 'Сладких снов']
DELAY_BETWEEN_SHEEP = 0.3
# Клиент Telegram
tg_client = TelegramClient('my_account', API_ID, API_HASH)
# Глобальные переменные для GigaChat
gigachat_access_token = None
gigachat_token_time = 0
async def send_sheep(event):
"""Отправка 100 баранов"""
for i in range(1, 101):
await event.reply(f"{i} баран")
await asyncio.sleep(DELAY_BETWEEN_SHEEP)
def get_gigachat_token():
"""Получение нового токена доступа GigaChat"""
global gigachat_access_token, gigachat_token_time
url = "https://ngw.devices.sberbank.ru:9443/api/v2/oauth"
payload = {'scope': 'GIGACHAT_API_PERS'}
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'Accept': 'application/json',
'RqUID': '1bfc10fe-0540-4e4b-ad2a-ca33706db67f',
'Authorization': f'Basic {GIGACHAT_AUTH_KEY}'
}
try:
response = requests.post(url, headers=headers, data=payload, verify=False)
if response.status_code == 200:
data = response.json()
gigachat_access_token = data['access_token']
gigachat_token_time = time.time()
return True
print(f"Ошибка получения токена: {response.status_code} - {response.text}")
except Exception as e:
print(f"Ошибка подключения: {str(e)}")
return False
def generate_gigachat_response(text):
"""Генерация ответа через GigaChat API"""
global gigachat_access_token, gigachat_token_time
if not gigachat_access_token or (time.time() - gigachat_token_time) > 3500:
if not get_gigachat_token():
return "⚠️ Ошибка авторизации в GigaChat"
url = "https://gigachat.devices.sberbank.ru/api/v1/chat/completions"
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'Authorization': f'Bearer {gigachat_access_token}'
}
payload = {
"model": "GigaChat",
"messages": [{"role": "user", "content": text}],
"temperature": 0.7,
"max_tokens": 1000
}
try:
response = requests.post(url, headers=headers, json=payload, verify=False)
if response.status_code == 401:
if get_gigachat_token():
headers['Authorization'] = f'Bearer {gigachat_access_token}'
response = requests.post(url, headers=headers, json=payload, verify=False)
if response.status_code == 200:
data = response.json()
return data['choices'][0]['message']['content']
return f"⚠️ Ошибка GigaChat ({response.status_code}): {response.text}"
except Exception as e:
return f"⚠️ Ошибка подключения: {str(e)}"
@tg_client.on(events.NewMessage(incoming=True))
async def handler(event):
# Игнорируем исходящие сообщения
if event.out:
return
# Получаем информацию о чате
chat = await event.get_chat()
chat_id = chat.id
chat_username = getattr(chat, 'username', '')
# Проверяем разрешен ли чат
is_allowed_chat = any([
#event.is_private,
event.is_private and ("Привет" or "привет" or "Пока" or "пока"),
chat.id in ALLOWED_CHATS,
">" in event.text,
#chat_username in ALLOWED_CHATS,
#f"@{chat_username}" in ALLOWED_CHATS
])
if not is_allowed_chat:
return
# Логика ответа:
# 1. В ЛС - на все сообщения
# 2. В группах - только если чат разрешен И есть ключевое слово
# Обработка команды /sleep
if event.raw_text == '/sleep':
if event.is_private:
await event.delete()
await send_sheep(event)
else:
await event.reply("? Эта команда доступна только в личных сообщениях")
return
# Ответ нейросетью
response = generate_gigachat_response(event.raw_text)
await event.reply(response)
if __name__ == '__main__':
print("Бот запущен с GigaChat API")
print(f"Разрешенные чаты: {ALLOWED_CHATS}")
print(f"Ключевые слова для групп: {KEYWORDS}")
if not get_gigachat_token():
print("ОШИБКА: Не удалось получить токен GigaChat! Проверьте ключ в .env")
else:
tg_client.start()
tg_client.run_until_disconnected()```
Ответы (1 шт):
Автор решения: Рустам Рысаев
→ Ссылка
У вас неккоректная проверка разрешенных чатов
is_allowed_chat = any([
event.is_private and ("Привет" or "привет" or "Пока" or "пока"),
chat.id in ALLOWED_CHATS,
">" in event.text,
])
В выражении
event.is_private and ("Привет" or "привет" or "Пока" or "пока")
Вы всегда получаете True, потому что Python интерпретирует это так:
event.is_private and "Привет" # строка "Привет" — это всегда True
Т.е. вы всегда будете считать, что ЛС подходит, даже если там нет этих слов
Да и в целом делите логику ответов в личных сообщений и в группе, самим же проще будет...
И самое интересное, зачем вам список KEYWORDS, если вы его нигде не используете?
Вы только хардкодом прописали '>' in event.text, вот бот и реагирует только на '>'