Aktualizovat telegram_bot/bot.py

This commit is contained in:
Tetiana Mohorian 2025-05-20 11:04:30 +00:00
parent 3f46dfbb0a
commit 78278ba469

View File

@ -1,97 +1,96 @@
import os import os
import torch import torch
import logging import logging
from transformers import AutoModelForSequenceClassification, AutoTokenizer from transformers import AutoModelForSequenceClassification, AutoTokenizer
from telegram import Update from telegram import Update
from telegram.ext import Application, MessageHandler, filters, CommandHandler, CallbackContext from telegram.ext import Application, MessageHandler, filters, CommandHandler, CallbackContext
from dotenv import load_dotenv from dotenv import load_dotenv
import mysql.connector import mysql.connector
# Load environment variables from .env file
# Загрузка переменных окружения из .env load_dotenv()
load_dotenv() TOKEN = os.getenv("TOKEN")
TOKEN = os.getenv("TOKEN")
# Path to the model
# Путь к модели MODEL_PATH = "./hate_speech_model/final_model"
MODEL_PATH = "./hate_speech_model/final_model"
# Database configuration
db_config = { db_config = {
"host": "mysql", "host": "mysql",
"user": "root", "user": "root",
"password": "0674998280tanya", "password": "0674998280tanya",
"database": "telegram_bot" "database": "telegram_bot"
} }
def save_violator(username, message): def save_violator(username, message):
"""Сохраняет нарушителя в базу данных""" """Saves the violator's message to the database"""
try: try:
conn = mysql.connector.connect(**db_config) conn = mysql.connector.connect(**db_config)
cursor = conn.cursor() cursor = conn.cursor()
query = "INSERT INTO violators (username, message) VALUES (%s, %s)" query = "INSERT INTO violators (username, message) VALUES (%s, %s)"
cursor.execute(query, (username, message)) cursor.execute(query, (username, message))
conn.commit() conn.commit()
cursor.close() cursor.close()
conn.close() conn.close()
except mysql.connector.Error as err: except mysql.connector.Error as err:
logging.error(f"Ошибка MySQL: {err}") logging.error(f"MySQL error: {err}")
# Logging setup
# Настройка логирования logging.basicConfig(
logging.basicConfig( format="%(asctime)s - %(levelname)s - %(message)s",
format="%(asctime)s - %(levelname)s - %(message)s", level=logging.INFO,
level=logging.INFO, handlers=[
handlers=[ logging.FileHandler("log.txt"),
logging.FileHandler("log.txt"), logging.StreamHandler()
logging.StreamHandler() ]
] )
)
# Load tokenizer and model
# Загрузка модели и токенизатора device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH)
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH) model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH).to(device)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH).to(device)
def classify_text(text):
def classify_text(text): """Classifies the input text"""
"""Функция для классификации текста""" model.eval()
model.eval() inputs = tokenizer(text, return_tensors="pt", truncation=True, padding="max_length", max_length=128).to(device)
inputs = tokenizer(text, return_tensors="pt", truncation=True, padding="max_length", max_length=128).to(device)
with torch.no_grad():
with torch.no_grad(): outputs = model(**inputs)
outputs = model(**inputs)
logits = outputs.logits
logits = outputs.logits pred = torch.argmax(logits, dim=-1).item()
pred = torch.argmax(logits, dim=-1).item()
return "🛑 Hate speech detected" if pred == 1 else "✅ OK"
return "🛑 Nenávistná reč" if pred == 1 else "✅ OK"
async def check_message(update: Update, context: CallbackContext):
async def check_message(update: Update, context: CallbackContext): """Checks chat messages and reacts to toxic content"""
"""Проверяет сообщения в чате и реагирует на токсичные сообщения""" message_text = update.message.text
message_text = update.message.text result = classify_text(message_text)
result = classify_text(message_text)
if result == "🛑 Hate speech detected":
if result == "🛑 Nenávistná reč": username = update.message.from_user.username or "unknown"
username = update.message.from_user.username or "unknown" await update.message.reply_text("⚠️ Warning! Please maintain respectful communication.")
await update.message.reply_text("⚠️ Upozornenie! Dodržiavajte kultúru komunikácie.") await update.message.delete() # Automatically deletes toxic message
await update.message.delete() # Автоматическое удаление токсичных сообщений
# Log the toxic message
# Логирование токсичного сообщения logging.warning(f"Toxic message from {username}: {message_text}")
logging.warning(f"Toxická správa od {update.message.from_user.username}: {message_text}") save_violator(username, message_text)
save_violator(username, message_text)
async def start(update: Update, context: CallbackContext):
async def start(update: Update, context: CallbackContext): """Sends welcome message on /start"""
"""Отправляет приветственное сообщение при запуске бота""" await update.message.reply_text("Hi! I'm monitoring the chat for hate speech!")
await update.message.reply_text("Ahoj! Sledujem kultúru komunikácie v chate!")
def main():
def main(): """Starts the bot"""
"""Запуск бота""" app = Application.builder().token(TOKEN).build()
app = Application.builder().token(TOKEN).build()
# Register command and message handlers
# Добавление обработчиков команд и сообщений app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("start", start)) app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, check_message))
app.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, check_message))
# Start polling
# Запуск бота app.run_polling()
app.run_polling()
if __name__ == "__main__":
if __name__ == "__main__": main()
main()