part1
This commit is contained in:
commit
2866295ba7
|
|
@ -0,0 +1,3 @@
|
|||
venv/
|
||||
.env
|
||||
*.csv
|
||||
|
|
@ -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()
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
python-telegram-bot==20.6
|
||||
requests==2.31.0
|
||||
python-dotenv==1.0.0
|
||||
Loading…
Reference in New Issue