USER
User: import telebot
from gradio_client import Client
import requests
import sqlite3
from datetime import datetime
# Инициализация бота и клиента
bot = telebot.TeleBot('7821415435:AAFa5yDOmYiOIwFCfbLyoRTnJIcD0Ulzo5Q')
client = Client("yuntian-deng/ChatGPT4")
# Подключение к базе данных SQLite
conn = sqlite3.connect('telegram_bot.db', check_same_thread=False)
cursor = conn.cursor()
# Создание таблиц
cursor.execute("""
CREATE TABLE IF NOT EXISTS messages (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
message TEXT,
response TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
)
""")
cursor.execute("""
CREATE TABLE IF NOT EXISTS users (
user_id INTEGER PRIMARY KEY,
user_name TEXT
)
""")
# Список администраторов
admins = [1013039772] # Замените на реальные ID администраторов
# Функции для работы с БД
def save_user(user_id, user_name):
cursor.execute("INSERT OR IGNORE INTO users (user_id, user_name) VALUES (?, ?)", (user_id, user_name))
conn.commit()
def save_interaction(user_id, message_text, response_text):
cursor.execute("INSERT INTO messages (user_id, message, response) VALUES (?, ?, ?)", (user_id, message_text, response_text))
conn.commit()
def get_user_interactions(user_id, limit=5):
cursor.execute("SELECT message, response FROM messages WHERE user_id = ? ORDER BY timestamp DESC LIMIT ?", (user_id, limit))
rows = cursor.fetchall()
return [(row[0], row[1]) for row in reversed(rows)] # Возвращаем в обратном порядке
def main():
@bot.message_handler(commands=['start'])
def send_welcome(message):
user_id = message.from_user.id
user_name = f"{message.from_user.first_name} {message.from_user.last_name or ''}".strip()
save_user(user_id, user_name)
bot.send_message(message.chat.id, "Добро пожаловать в бота с ИИ от Nort8985. Используйте /help для списка команд.")
@bot.message_handler(commands=['help'])
def user_help(message):
commands = (
"Доступные команды:\n"
"/start - Начать работу с ботом\n"
"/help - Показать список команд\n"
"/music [жанр/настроение] - Рекомендации по музыке\n"
"/ask - Задать вопрос ИИ\n"
"/joke - Получить случайную шутку\n"
"/jokeb - Получить шутку с черным юмором\n"
"/clear - Удалить ваши данные из базы\n"
"/feedback [сообщение] - Отправить отзыв администратору\n"
"/stats - Показать вашу статистику использования бота"
)
bot.send_message(message.chat.id, commands)
@bot.message_handler(commands=['feedback'])
def send_feedback(message):
user_id = message.from_user.id
user_name = f"{message.from_user.first_name} {message.from_user.last_name or ''}".strip()
feedback_text = message.text[len('/feedback '):].strip()
if feedback_text:
for admin_id in admins:
bot.send_message(admin_id, f"Отзыв от пользователя {user_name} (ID: {user_id}): {feedback_text}")
bot.send_message(message.chat.id, "Спасибо за ваш отзыв! Он был отправлен администратору.")
else:
bot.send_message(message.chat.id, "Пожалуйста, укажите текст отзыва после команды /feedback.")
@bot.message_handler(commands=['music'])
def music_recommendation(message):
query = message.text[7:].strip()
if not query:
bot.send_message(message.chat.id, "Укажите жанр или настроение после /music.")
return
prompt = f"Посоветуй музыку для {query}."
response = process_text(prompt, message.from_user.id, message.chat.id)
bot.send_message(message.chat.id, response)
@bot.message_handler(commands=['ask'])
def ask_ai(message):
prompt = "Задай мне интересный вопрос и дай на него ответ."
response = process_text(prompt, message.from_user.id, message.chat.id)
bot.send_message(message.chat.id, response)
@bot.message_handler(commands=['joke'])
def tell_joke(message):
prompt = "Придумай шутку"
try:
result = client.predict(
inputs=prompt,
top_p=1,
temperature=1,
chat_counter=0,
chatbot=[],
api_name="/predict"
)
joke = result[0][-1][1]
bot.send_message(message.chat.id, joke)
except Exception as e:
bot.send_message(message.chat.id, f"Произошла ошибка при генерации шутки: {e}")
@bot.message_handler(commands=['jokeb'])
def tell_joke_b(message):
prompt = "Придумай шутку с чёрным юмором и с использованием матов"
try:
result = client.predict(
inputs=prompt,
top_p=1,
temperature=1,
chat_counter=0,
chatbot=[],
api_name="/predict"
)
joke = result[0][-1][1]
bot.send_message(message.chat.id, joke)
except Exception as e:
bot.send_message(message.chat.id, f"Произошла ошибка при генерации шутки: {e}")
@bot.message_handler(commands=['clear'])
def clear_user_data(message):
user_id = message.from_user.id
cursor.execute("DELETE FROM messages WHERE user_id = ?", (user_id,))
conn.commit()
bot.send_message(message.chat.id, "Ваши данные были успешно удалены из базы данных.")
@bot.message_handler(commands=['stats'])
def user_stats(message):
user_id = message.from_user.id
cursor.execute("SELECT COUNT(*) FROM messages WHERE user_id = ?", (user_id,))
message_count = cursor.fetchone()[0]
cursor.execute("SELECT MIN(timestamp) FROM messages WHERE user_id = ?", (user_id,))
first_interaction = cursor.fetchone()[0]
stats = f"Статистика использования:\nКоличество сообщений: {message_count}\nПервое взаимодействие: {first_interaction}"
bot.send_message(message.chat.id, stats)
# Админские команды
@bot.message_handler(commands=['ahelp'])
def admin_help(message):
if message.from_user.id in admins:
commands = (
"Админские команды:\n"
"/ahelp - Показать админ команды\n"
"/clear_db - Очистка базы данных\n"
"/users - Просмотр всех пользователей\n"
"/broadcast [сообщение] - Отправить сообщение всем пользователям\n"
"/stats_global - Показать общую статистику бота"
)
bot.send_message(message.chat.id, commands)
else:
bot.send_message(message.chat.id, "У вас нет прав для выполнения этой команды.")
@bot.message_handler(commands=['users'])
def list_users(message):
if message.from_user.id in admins:
cursor.execute("SELECT user_id, user_name FROM users")
users = cursor.fetchall()
user_list = "\n".join([f"{user_name} (ID: {user_id})" for user_id, user_name in users])
bot.send_message(message.chat.id, f"Список пользователей:\n{user_list}")
else:
bot.send_message(message.chat.id, "У вас нет прав для выполнения этой команды.")
@bot.message_handler(commands=['clear_db'])
def clear_database(message):
if message.from_user.id in admins:
cursor.execute("DELETE FROM messages")
conn.commit()
bot.send_message(message.chat.id, "База данных очищена.")
else:
bot.send_message(message.chat.id, "У вас нет прав для выполнения этой команды.")
@bot.message_handler(commands=['broadcast'])
def broadcast_message(message):
if message.from_user.id in admins:
broadcast_text = message.text[11:].strip()
if broadcast_text:
cursor.execute("SELECT user_id FROM users")
users = cursor.fetchall()
for user in users:
try:
bot.send_message(user[0], f"Сообщение от администратора:\n{broadcast_text}")
except Exception as e:
print(f"Не удалось отправить сообщение пользователю {user[0]}: {e}")
bot.send_message(message.chat.id, "Сообщение разослано всем пользователям.")
else:
bot.send_message(message.chat.id, "Пожалуйста, укажите текст сообщения после команды /broadcast.")
else:
bot.send_message(message.chat.id, "У вас нет прав для выполнения этой команды.")
@bot.message_handler(commands=['stats_global'])
def global_stats(message):
if message.from_user.id in admins:
cursor.execute("SELECT COUNT(*) FROM users")
user_count = cursor.fetchone()[0]
cursor.execute("SELECT COUNT(*) FROM messages")
message_count = cursor.fetchone()[0]
cursor.execute("SELECT MIN(timestamp) FROM messages")
first_interaction = cursor.fetchone()[0]
stats = f"Общая статистика бота:\nКоличество пользователей: {user_count}\nКоличество сообщений: {message_count}\nПервое взаимодействие: {first_interaction}"
bot.send_message(message.chat.id, stats)
else:
bot.send_message(message.chat.id, "У вас нет прав для выполнения этой команды.")
@bot.message_handler(content_types=['text', 'document'])
def handle_message(message):
if message.content_type == 'document':
handle_document(message)
else:
response = process_text(message.text, message.from_user.id, message.chat.id)
bot.send_message(message.chat.id, response)
def handle_document(message):
file_info = bot.get_file(message.document.file_id)
file_data = requests.get(f'https://api.telegram.org/file/bot{bot.token}/{file_info.file_path}')
if message.document.mime_type == 'text/plain':
text_content = file_data.text
response = process_text(text_content, message.from_user.id, message.chat.id)
bot.send_message(message.chat.id, response)
else:
bot.send_message(message.chat.id, "Пожалуйста, отправьте текстовый файл в формате .txt.")
def process_text(text, user_id, chat_id):
try:
# Получаем последние взаимодействия пользователя
previous_interactions = get_user_interactions(user_id)
# Формируем историю взаимодействий
context = ""
for msg, rsp in previous_interactions:
context += f"User: {msg}\nAI: {rsp}\n"
context += f"User: {text}\nAI:"
# Отправляем запрос в ИИ
result = client.predict(
inputs=context,
top_p=1,
temperature=1,
chat_counter=0,
chatbot=[],
api_name="/predict"
)
response = result[0][-1][1]
# Сохраняем текущее взаимодействие
save_interaction(user_id, text, response)
return response
except Exception as e:
return f"Произошла ошибка: {e}"
bot.polling()
if __name__ == "__main__":
try:
main()
finally:
conn.close()
какие команды можно добавить?
AI:ASSISTANT
There are several useful commands and features you might consider adding to enhance your Telegram bot. Here are some ideas:
1. **/news [topic]**: Fetch and display the latest news on a given topic using a news API (e.g., NewsAPI).
2. **/weather [city]**: Provide current weather information for a specified city using a weather API (e.g., OpenWeatherMap).
3. **/quote**: Send a random motivational or inspirational quote.
4. **/translate [text] [language]**: Translate the given text to a specified language using a translation API such as Google Translate.
5. **/remind [time] [message]**: Set a reminder that will send the specified message at a given time.
6. **/poll [question] [option1] [option2] ...**: Create a simple poll in the chat with the provided question and options.
7. **/fact**: Provide a random interesting fact.
8. **/meme**: Send a random meme from an external API or a preloaded collection.
To implement these, you would typically use external APIs or develop the necessary logic within your code to handle these requests. Below are some basic command function templates you could integrate into your existing bot setup:
```python
import time # For the reminder functionality
import random # For random selection of quotes or memes
@bot.message_handler(commands=['news'])
def get_news(message):
topic = message.text[6:].strip()
# Integrate with a news API
# Send news to the user
bot.send_message(message.chat.id, "Here are the latest news headlines about {}".format(topic))
@bot.message_handler(commands=['weather'])
def get_weather(message):
city = message.text[9:].strip()
# Integrate with a weather API
# Send weather details to the user
bot.send_message(message.chat.id, "Current weather in {}: Sunny, 25°C".format(city))
@bot.message_handler(commands=['quote'])
def send_quote(message):
# Choose a random quote from a list
quotes = ["Quote 1", "Quote 2", "Quote 3"]
quote = random.choice(quotes)
bot.send_message(message.chat.id, quote)
@bot.message_handler(commands=['remind'])
def set_reminder(message):
# Example: /remind 10m 'Drink water'
parts = message.text.split(' ', 2)
if len(parts) < 3:
bot.send_message(message.chat.id, "Use format /remind [time] [message]. Example: /remind 10m 'Drink water'")
return
try:
time_minutes = int(parts[1][:-1]) if parts[1][-1] == 'm' else int(parts[1]) # Assuming time is in minutes
reminder_message = parts[2]
bot.send_message(message.chat.id, f"Reminder set for {time_minutes} minutes.")
time.sleep(time_minutes * 60)
bot.send_message(message.chat.id, f"Reminder: {reminder_message}")
except Exception as e:
bot.send_message(message.chat.id, f"Error setting reminder: {e}")
@bot.message_handler(commands=['fact'])
def send_fact(message):
# Choose a random fact from a list
facts = ["Fact 1", "Fact 2", "Fact 3"]
fact = random.choice(facts)
bot.send_message(message.chat.id, fact)
@bot.message_handler(commands=['meme'])
def send_meme(message):
# Choose a random meme from a preloaded list or API
memes = ['meme_url_1', 'meme_url_2', 'meme_url_3']
meme_url = random.choice(memes)
bot.send_photo(message.chat.id, meme_url)
```
These are basic structures and will require integration with external APIs and further development to handle specific cases.