all ruff checking and modify Converter class

This commit is contained in:
2024-06-21 12:30:27 +07:00
parent cd3bae23e6
commit e1034fb927
19 changed files with 1067 additions and 995 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
import os
from typing import List, Dict, Any
from typing import Any, Dict, List
def get_log(log_id: int) -> List[Dict[str, Any]]:
+4 -2
View File
@@ -1,12 +1,14 @@
import jwt
from fastapi import Cookie, Depends
from functions.admin.models import token, database
from functions.admin.models import database, token
def is_logged_in(access_token: str = Cookie(None), db=Depends(database.get_db)):
if not access_token:
return False
response = db.query(token.Token).filter(token.Token.access_token == access_token).first()
response = db.query(token.Token).filter(
token.Token.access_token == access_token).first()
if not response or not response.is_active:
return False
try:
+2
View File
@@ -1,7 +1,9 @@
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from functions.admin.models.database import Base
class Token(Base):
__tablename__ = "tokens"
+2
View File
@@ -2,8 +2,10 @@ import hashlib
from sqlalchemy import Boolean, Column, Integer, String
from sqlalchemy.orm import relationship
from functions.admin.models.database import Base
class User(Base):
__tablename__ = "users"
+9 -4
View File
@@ -1,10 +1,15 @@
from fastapi import Request, Depends, responses, HTTPException
from fastapi import Depends, HTTPException, Request, responses
from functions.admin import get_log, is_logged_in
async def log(templates, request: Request, log_id: int, logged_in: bool = Depends(is_logged_in.is_logged_in)):
async def log(templates, request: Request, log_id: int,
logged_in: bool = Depends(is_logged_in.is_logged_in)):
if logged_in:
if not get_log.get_log(log_id):
raise HTTPException(status_code=400)
return templates.TemplateResponse("log.html", {"request": request, "log": get_log.get_log(log_id)})
return templates.TemplateResponse("log.html", {"request": request,
"log": get_log.get_log(log_id)})
else:
return responses.RedirectResponse(url=f"/refresh?source=/logs/{log_id}", status_code=303)
return responses.RedirectResponse(url=f"/refresh?source=/logs/{log_id}",
status_code=303)
+13 -7
View File
@@ -1,25 +1,31 @@
from fastapi import Form, Depends, responses, HTTPException
from functions.admin.models import database, user, token
import jwt
from datetime import datetime, timedelta
import jwt
from fastapi import Depends, Form, HTTPException, responses
async def logins(username: str = Form(...), password: str = Form(...), db=Depends(database.get_db)):
from functions.admin.models import database, token, user
async def logins(username: str = Form(...), password: str = Form(...),
db=Depends(database.get_db)):
# username = "Dmitrium12"
response = db.query(user.User).filter(user.User.username == username).first()
if not response or not response.check_password(password):
raise HTTPException(status_code=400, detail="Неправильное имя пользователя или пароль")
raise HTTPException(status_code=400,
detail="Неправильное имя пользователя или пароль")
access_token_expires = datetime.utcnow() + timedelta(minutes=15)
access_token_payload = {"sub": response.username, "exp": access_token_expires}
access_token = jwt.encode(access_token_payload, "secret", algorithm="HS256")
refresh_token_expires = datetime.utcnow() + timedelta(days=7)
refresh_token_payload = {"sub": response.username, "exp": refresh_token_expires}
refresh_token = jwt.encode(refresh_token_payload, "secret", algorithm="HS256")
db_token = token.Token(access_token=access_token, refresh_token=refresh_token, user=response)
db_token = token.Token(access_token=access_token, refresh_token=refresh_token,
user=response)
db.add(db_token)
db.commit()
response = responses.RedirectResponse(url="/logs", status_code=303)
response.set_cookie(key="access_token", value=access_token, expires=int(access_token_expires.timestamp()))
response.set_cookie(key="access_token", value=access_token,
expires=int(access_token_expires.timestamp()))
response.set_cookie(key="refresh_token", value=refresh_token,
expires=int(refresh_token_expires.timestamp()))
return response
+7 -3
View File
@@ -1,8 +1,12 @@
from fastapi import Request, Depends, responses
from fastapi import Depends, Request, responses
from functions.admin import get_logs, is_logged_in
async def logs(templates, request: Request, logged_in: bool = Depends(is_logged_in.is_logged_in)):
async def logs(templates, request: Request,
logged_in: bool = Depends(is_logged_in.is_logged_in)):
if logged_in:
return templates.TemplateResponse("logs.html", {"request": request, "logs": get_logs.get_logs()})
return templates.TemplateResponse("logs.html",
{"request": request, "logs": get_logs.get_logs()})
else:
return responses.RedirectResponse(url="/refresh?source=/logs", status_code=303)
+10 -5
View File
@@ -1,15 +1,20 @@
from fastapi import Request, Depends, Cookie, responses
from functions.admin.models import database, user, token
import jwt
from datetime import datetime, timedelta
async def refresh_access_token(req: Request, refresh_token: str = Cookie(None), db=Depends(database.get_db)):
import jwt
from fastapi import Cookie, Depends, Request, responses
from functions.admin.models import database, token, user
async def refresh_access_token(req: Request, refresh_token: str = Cookie(None),
db=Depends(database.get_db)):
request_args = dict(req.query_params)
try:
refresh_token_payload = jwt.decode(refresh_token, "secret", algorithms=["HS256"])
except jwt.exceptions.DecodeError:
return responses.RedirectResponse(url="/login", status_code=303)
response = db.query(user.User).filter(user.User.username == refresh_token_payload["sub"]).first()
response = db.query(user.User).filter(
user.User.username == refresh_token_payload["sub"]).first()
if not response:
return responses.RedirectResponse(url="/login", status_code=303)
access_token_expires = datetime.utcnow() + timedelta(minutes=15)
+38 -35
View File
@@ -5,12 +5,24 @@ class Converter:
"""
Этот класс выполняет главную функцию, конвертирует голос в текст
"""
def __init__(self, path_to_file: str, message, model, language: str = "ru-RU"):
self.language = language
def __init__(self, path_to_file: str):
self.path_to_file = path_to_file
self.service = None
self.message = message
self.model = model
self.ip_list = ["192.168.0.108", "192.168.0.109", "localhost"] # Список IP-адресов
@staticmethod
def ping(ip):
"""
Пингует указанный IP-адрес.
:param ip: str - IP-адрес для пинга
:return: bool - True если доступен, False если нет
"""
try:
r = requests.get(f"http://{ip}:5000/ping", timeout=5)
return r.status_code == 200
except requests.RequestException:
return False
def audio_to_text(self) -> dict:
"""
@@ -18,33 +30,24 @@ class Converter:
:return: str - текст + служебная информация
"""
try:
r = requests.get("http://192.168.0.108:5000/ping")
if r.status_code == 200:
print(self.path_to_file)
response = requests.post(
"http://192.168.0.108:5000/decrypt_audio",
files={"file": open(self.path_to_file, "rb").read()},
timeout=6000
)
if response.status_code == 200:
return response.json()
else:
return {
"timestamp": " ",
"final_text": "Не удалось получить текст."
}
else:
result = self.model.transcribe(self.path_to_file)
return {
"timestamp": "Тут такое не работает, "
"жди пока главный сервер поднимется",
"final_text": result["text"]
}
except requests.ConnectionError:
result = self.model.transcribe(self.path_to_file)
return {
"timestamp": "Тут такое не работает, "
"жди пока главный сервер поднимется",
"final_text": result["text"]
}
for ip in self.ip_list:
if self.ping(ip):
try:
response = requests.post(
f"http://{ip}:5000/decrypt_audio",
files={"file": open(self.path_to_file, "rb").read()},
timeout=6000
)
if response.status_code == 200:
return response.json()
else:
return {
"timestamp": " ",
"final_text": "Не удалось получить текст."
}
except requests.RequestException:
continue
return {
"timestamp": " ",
"final_text": "Не удалось получить текст или все сервера недоступны."
}
+1 -1
View File
@@ -3,7 +3,7 @@ import json
def load_data():
try:
with open('users.json', 'r') as f:
with open('users.json') as f:
return json.load(f)
except FileNotFoundError:
return {'users': [], 'chats': []}
+8 -5
View File
@@ -1,10 +1,12 @@
import os
from io import BytesIO
from aiogram import exceptions, types
from functions.convert import Converter
from aiogram import types, exceptions
async def get_audio_messages_func(message: types.Message, logger, bot, model) -> None:
async def get_audio_messages_func(message: types.Message, logger, bot) -> None:
"""
Функция выкачивает файл, потом конвертирует его в текст, потом логирует
@@ -39,10 +41,11 @@ async def get_audio_messages_func(message: types.Message, logger, bot, model) ->
file = await bot.get_file(file_id) # ссылка для скачивая файла
file_dow = await bot.download_file(file.file_path) # скачанный файл
new_file.write(file_dow.getvalue()) # записываю
converter = Converter(file_name, message, model) # запуск конвертора
converter = Converter(file_name) # запуск конвертора
message_text = converter.audio_to_text() # получаю текст из конвертора
logger.info(f"Чат {name} (ID: {message.chat.id}) обработал файл {file_name}, "
f"сервисом {converter.service}") # записываю всё в logger
logger.info(
f"Чат {name} (ID: {message.chat.id}) обработал файл {file_name}, "
) # записываю всё в logger
file = BytesIO(message_text['timestamp'].encode('utf-8'))
file.name = 'timestamp.txt'
await bot.send_document(
+7 -4
View File
@@ -1,10 +1,11 @@
import os
import shutil
from aiogram import types
import sqlite3
def loging(message: types.Message, service: str, file_path: str, text: str, f: float) -> None:
def loging(message: types.Message, service: str, file_path: str, text: str,
f: float) -> None:
"""
Функция логирует каждое сообщение
@@ -22,9 +23,11 @@ def loging(message: types.Message, service: str, file_path: str, text: str, f: f
os.makedirs(f"static/logs/{message.chat.id}/{file_name[0]}") # создание папки
except FileExistsError:
pass
shutil.copy(file_path, f"static/logs/{message.chat.id}/{file_name[0]}/audio.{file_name[1]}")
shutil.copy(file_path,
f"static/logs/{message.chat.id}/{file_name[0]}/audio.{file_name[1]}")
# копирование файла
with open(f'static/logs/{message.chat.id}/{file_name[0]}/{service}-text.txt', 'w+') as the_file:
with open(f'static/logs/{message.chat.id}/{file_name[0]}/{service}-text.txt',
'w+') as the_file:
# открываю файл в запись
the_file.write(text) # записываю
user_id = message.from_user.id
-72
View File
@@ -1,72 +0,0 @@
import json
from aiogram import types
import sqlite3
import openai
async def get_response_to_openai(message: types.Message, bot):
if message.from_user.id in json.load(open("not_work_user.json"))["chat_gpt"]:
await bot.send_message(message.chat.id, "ПИШЁВ ТИ НАХУЙ")
return
conn = sqlite3.connect('db.sql')
cur = conn.cursor()
openai.api_key = "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"
try:
points = cur.execute("SELECT * FROM 'f'".replace("f", str(message.from_user.id))).fetchall()
message_send = []
for i in points:
message_send.append({"role": i[1], "content": i[2]})
message_send.append({"role": "user", "content": ' '.join(message.text.split()[1:])})
except sqlite3.OperationalError:
message_send = [{"role": "user", "content": ' '.join(message.text.split()[1:])}]
try:
await bot.send_message(message.chat.id, "Внимание!!!!\nБот начинает разделение, через 2 дней этот бот перестанет принимать запросы для ChatGPT, вам стоит начать переходит на этого бота: @db_ChatGPT_bot. Бот уже работает.")
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=message_send,
temperature=0.5,
max_tokens=1000,
top_p=1.0,
frequency_penalty=0.5,
presence_penalty=0.0
)
try:
await bot.send_message(message.chat.id, f"ChatGPT\n{response['choices'][0]['message']['content']}",
parse_mode="Markdown", reply_to_message_id=message.message_id)
except Exception as e:
await bot.send_message(message.chat.id, f"ChatGPT\n{response['choices'][0]['message']['content']}",
parse_mode=None, reply_to_message_id=message.message_id)
except Exception as e:
print(e)
conn = sqlite3.connect('db.sql')
cur = conn.cursor()
cur.execute(f"DELETE FROM '{str(message.from_user.id)}'")
conn.commit()
conn.close()
await bot.send_message(message.chat.id, "У вас превышено количество сообщений в памяти, я всё очистил"
" попробуйте задать вопрос заново))")
try:
cur.execute("INSERT INTO 'f' (role, content) VALUES (?, ?)".replace("f", str(message.from_user.id)),
("user", ' '.join(message.text.split()[1:])))
cur.execute("INSERT INTO 'f' (role, content) VALUES (?, ?)".replace("f", str(message.from_user.id)),
("assistant", response['choices'][0]['message']['content']))
conn.commit()
conn.close()
except sqlite3.OperationalError:
cur.execute(f"CREATE TABLE IF NOT EXISTS '{message.from_user.id}' (id INTEGER PRIMARY KEY AUTOINCREMENT"
f" UNIQUE NOT NULL, role STRING NOT NULL,"
f" content STRING NOT NULL)")
cur.execute("INSERT INTO 'f' (role, content) VALUES (?, ?)".replace("f", str(message.from_user.id)),
("user", ' '.join(message.text.split()[1:])))
cur.execute("INSERT INTO 'f' (role, content) VALUES (?, ?)".replace("f", str(message.from_user.id)),
("assistant", response['choices'][0]['message']['content']))
conn.commit()
conn.close()
async def clear_db(message: types.Message):
conn = sqlite3.connect('db.sql')
cur = conn.cursor()
cur.execute(f"DELETE FROM '{str(message.from_user.id)}'")
conn.commit()
conn.close()
+1 -1
View File
@@ -1,4 +1,5 @@
from aiogram import types
from functions.file_data import load_data
@@ -24,4 +25,3 @@ async def start_stat(message: types.Message):
ChatGPT ботом воспользовались {data["static"]["chatGPT"]} раз
"""
await message.reply(send_message)
+20 -9
View File
@@ -1,5 +1,6 @@
import sqlite3
import time
import requests
from aiogram import types
from selenium import webdriver
@@ -11,41 +12,51 @@ from webdriver_manager.chrome import ChromeDriverManager
async def create_yandex(message: types.Message):
conn = sqlite3.connect('db.sql')
cur = conn.cursor()
response = cur.execute("SELECT * FROM yandex WHERE user_id=?", (message.from_user.id, )).fetchall()
response = cur.execute("SELECT * FROM yandex WHERE user_id=?",
(message.from_user.id,)).fetchall()
conn.close()
if response:
await message.reply("Ваш аккаунт уже добавлен")
options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()),
options=options)
driver.get('https://passport.yandex.ru/auth/')
time.sleep(1)
driver.find_element(By.CLASS_NAME, "Button2").click()
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="passp-field-login"]').send_keys(message.text.split()[1])
driver.find_element(By.XPATH, '//*[@id="passp-field-login"]').send_keys(
message.text.split()[1])
driver.find_element(By.XPATH, '//*[@id="passp:sign-in"]').click()
time.sleep(1)
driver.find_element(By.XPATH, '//*[@id="passp-field-passwd"]').send_keys(message.text.split()[2])
driver.find_element(By.XPATH, '//*[@id="passp-field-passwd"]').send_keys(
message.text.split()[2])
driver.find_element(By.XPATH, '//*[@id="passp:sign-in"]').click()
time.sleep(5)
try:
cookies = [i["value"] for i in driver.get_cookies() if i["name"] == "Session_id"][0]
conn = sqlite3.connect('db.sql')
cur = conn.cursor()
cur.execute("INSERT INTO yandex (user_id, Session_id) VALUES (?, ?)", (message.from_user.id, str(cookies)))
cur.execute("INSERT INTO yandex (user_id, Session_id) VALUES (?, ?)",
(message.from_user.id, str(cookies)))
conn.commit()
conn.close()
await message.reply("Ваш аккаунт добавлен")
except IndexError:
await message.reply("Ошибка пароля или логина")
async def statistic(message: types.Message):
conn = sqlite3.connect('db.sql')
cur = conn.cursor()
response = cur.execute("SELECT * FROM yandex WHERE user_id=?", (message.from_user.id,)).fetchall()
response = cur.execute("SELECT * FROM yandex WHERE user_id=?",
(message.from_user.id,)).fetchall()
conn.close()
if not response:
await message.reply("Сначала используйте /create_yandex с логином и паролем для добавление аккаунта")
await message.reply(
"Сначала используйте /create_yandex с логином и паролем для добавление аккаунта")
cookies = {"Session_id": response[0][2]}
response = requests.get("https://lyceum.yandex.ru/api/notifications?isRead=false&limit=20", cookies=cookies)
await message.reply(f'У вас {response.json()["unreadCount"]} уведомлений. Прочитайте хоть')
response = requests.get(
"https://lyceum.yandex.ru/api/notifications?isRead=false&limit=20", cookies=cookies)
await message.reply(
f'У вас {response.json()["unreadCount"]} уведомлений. Прочитайте хоть')