commit 2866295ba708fc3751878a4d3a38882325bd859e Author: Alexander Date: Sun Apr 20 18:40:42 2025 +0200 part1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78ed36a --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +venv/ +.env +*.csv diff --git a/main.py b/main.py new file mode 100644 index 0000000..de812aa --- /dev/null +++ b/main.py @@ -0,0 +1,115 @@ +import os +import logging +import requests +import csv +import datetime +from dotenv import load_dotenv +from telegram import Update +from telegram.ext import Application, CommandHandler, MessageHandler, filters, ContextTypes, CallbackContext + +load_dotenv() + +logging.basicConfig( + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + level=logging.INFO +) + +TELEGRAM_TOKEN = os.getenv("TELEGRAM_TOKEN") +FOLDER_ID = os.getenv("FOLDER_ID") +OAUTH_TOKEN = os.getenv("OAUTH_TOKEN") + + +STATS_FILE = "bot_statistics.csv" + +def get_iam_token(): + response = requests.post( + 'https://iam.api.cloud.yandex.net/iam/v1/tokens', + json={'yandexPassportOauthToken': OAUTH_TOKEN} + ) + + response.raise_for_status() + return response.json()['iamToken'] + +def init_stats_file(): + if not os.path.exists(STATS_FILE): + with open(STATS_FILE, 'w', newline='') as file: + writer = csv.writer(file) + writer.writerow(['timestamp', 'user_id', 'username', 'status']) + logging.info(f"Statistics file created at {STATS_FILE}") + +def save_statistics(user_id, username, type="success"): + with open(STATS_FILE, 'a', newline='') as file: + writer = csv.writer(file) + timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + writer.writerow([timestamp, user_id, username, type]) + +async def start(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None: + """Send a welcome message when the command /start is issued.""" + user = update.effective_user + await update.message.reply_html( + f"Hi {user.mention_html()}! I'm your AI assistant powered by YandexGPT. Ask me anything!" + ) + + save_statistics( + user_id=user.id, + username=user.username or "unknown", + type="command_start" + ) + +async def process_message(update: Update, context: CallbackContext) -> None: + user_text = update.message.text + + iam_token = get_iam_token() + + data = {} + data["modelUri"] = f"gpt://{FOLDER_ID}/yandexgpt" + data["completionOptions"] = {"temperature": 0.3, "maxTokens": 1000} + data["messages"] = [ + {"role": "user", "text": f"{user_text}"}, + ] + + URL = "https://llm.api.cloud.yandex.net/foundationModels/v1/completion" + response = requests.post( + URL, + headers={ + "Accept": "application/json", + "Authorization": f"Bearer {iam_token}" + }, + json=data, + ).json() + + print(response) + + save_statistics( + user_id=update.message.from_user.id, + username=update.effective_user.username, + type="Message" + ) + + answer = response.get('result', {})\ + .get('alternatives', [{}])[0]\ + .get('message', {})\ + .get('text', {}) + + await update.message.reply_text(answer) + +def main() -> None: + """Start the bot.""" + init_stats_file() + + if not TELEGRAM_TOKEN: + print("No telegram token.") + return + + print(TELEGRAM_TOKEN) + application = Application.builder().token(TELEGRAM_TOKEN).build() + + application.add_handler(CommandHandler("start", start)) + + application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, process_message)) + + application.run_polling() + logging.info("Bot started") + +if __name__ == "__main__": + main() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..1158cd6 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +python-telegram-bot==20.6 +requests==2.31.0 +python-dotenv==1.0.0