diff --git a/.gitignore b/.gitignore index 23566b0..8edf750 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,8 @@ share/python-wheels/ *.egg MANIFEST .idea/ +logs +config # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. @@ -130,3 +132,4 @@ dmypy.json # Pyre type checker .pyre/ +/logs/ diff --git a/Bot.py b/Bot.py index 4f4c5ed..0384245 100644 --- a/Bot.py +++ b/Bot.py @@ -1,7 +1,7 @@ from aiogram.utils import executor from loguru import logger from aiogram import Bot, Dispatcher, types -from functions import get_audio_messages_func +from functions import get_audio_messages_func, create_statistic, openai_answer bot = Bot(token="5941118321:AAG0g0keLrlnuH_9U9X6ehpFFAdOX38qeXI") # создаю объект бота dp = Dispatcher(bot) # создаю объект слушателя @@ -10,14 +10,50 @@ logger.add("logs/logging_log.log", level="INFO") # создаю логер @dp.message_handler(commands=['start']) # обрабатываю команду start -def start(message: types.Message): +async def start(message: types.Message): # получаю имя отправителя if message.chat.first_name: name = message.chat.first_name else: name = message.chat.title logger.info(f"Группа {name} (ID: {message.chat.id}) запустил бота") # записываю в логи - bot.send_message(message.chat.id, 'Привет! Отправляй голосовое, я расшифрую!') # отправляю ответное сообщение + await bot.send_message(message.chat.id, 'Привет! Отправляй голосовое, я расшифрую!') # отправляю ответное сообщение + + +@dp.message_handler(commands=['statistic']) +async def statistic(message: types.Message): + if message.chat.id != "": + for i in create_statistic.create_statistic(): + await bot.send_message(message.chat.id, i) + await bot.delete_message(message.chat.id, message.message_id) + else: + await bot.delete_message(message.chat.id, message.message_id) + await bot.send_message(message.chat.id, "У вас нет прав на просмотр статистики") + + +@dp.message_handler(commands=['response']) +async def answer(message: types.Message): + openai_answer.get_response(message) + await message.answer_document(open("response_ru.txt", "rb"), reply=True) + await message.answer_document(open("resource_ru_not_translate.txt", "rb"), reply=True) + + +@dp.message_handler(commands=['r']) +async def r(message: types.Message): + import openai + openai.api_key = "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" + response = openai.Completion.create( + model="text-davinci-003", + prompt=' '.join(message.text.split()[1:]), + temperature=0.5, + max_tokens=1000, + top_p=1.0, + frequency_penalty=0.5, + presence_penalty=0.0 + ) + for i in response['choices']: + await bot.send_message(message.chat.id, f"ChatGPT\n{i['text']}", + parse_mode=None, reply_to_message_id=message.message_id) @dp.message_handler(content_types=['voice', 'video_note', 'video']) # обрабатываю голосовые сообщения, кружки, видео diff --git a/db.sql b/db.sql new file mode 100644 index 0000000..3dc3fcd Binary files /dev/null and b/db.sql differ diff --git a/functions/convert.py b/functions/convert.py index 2c8f1fa..c038db3 100644 --- a/functions/convert.py +++ b/functions/convert.py @@ -20,22 +20,25 @@ class Converter: :return: str - текст + служебная информация """ + f = -1.0 try: try: import mutagen f = mutagen.File(self.path_to_file) # получение данных mutagen - if float(f.info.length) >= 30.0: # если длинна больше 30 секунд + f = float(f.info.length) + if f >= 30.0: # если длинна больше 30 секунд self.service = "google" # устанавливаю сервис google - return self.google() # запуск функции google + return self.google(f) # запуск функции google else: self.service = "yandex" # устанавливаем сервис yandex - return self.yandex() # запуск функции yandex - except: # если какая-то проблема - return self.google() # запуск функции google + return self.yandex(f) # запуск функции yandex + except Exception as e: # если какая-то проблема + print(e) + return self.google(f) # запуск функции google except sr.RequestError: # обработка ошибки размера файлов return "Толи файл слишком большой, толи с ботом что-то случилось" # возвращение ошибки - def google(self) -> str: + def google(self, f) -> str: """ Функция работающая с stt google @@ -52,7 +55,7 @@ class Converter: r.adjust_for_ambient_noise(source) # мини очистка шума try: response = "google\n\n" + r.recognize_google(audio, language=self.language) # получение текста - loging(self.message, "google", wav_file, response) # записываю логи + loging(self.message, "google", wav_file, response, f) # записываю логи os.remove(wav_file) # удаляю лишние файлы return response # возвращаю текст except sr.UnknownValueError: # ошибка распознавания текста @@ -61,7 +64,7 @@ class Converter: except FileNotFoundError: # ошибка файла(из-за веса telegram не пускает) return "Толи файл слишком большой, толи с ботом что-то случилось" # возвращение ошибки - def yandex(self) -> str: + def yandex(self, f) -> str: """ Функция работающая с stt yandex @@ -71,6 +74,6 @@ class Converter: reg = ShortAudioRecognition(Session.from_api_key("AQVN3xNJamAFP4_FS6Gis0Uud0vONFk24umBSXvh")) # получаю # объект для расшифровки response = "yandex\n\n" + reg.recognize(open(str(self.path_to_file), str('rb')).read()) # получаю весь текст - loging(self.message, "yandex", self.path_to_file, response) # записываю логи + loging(self.message, "yandex", self.path_to_file, response, f) # записываю логи os.remove(self.path_to_file) # удаляю лишние файлы return response # возвращаю ответ diff --git a/functions/create_statistic.py b/functions/create_statistic.py new file mode 100644 index 0000000..82675c9 --- /dev/null +++ b/functions/create_statistic.py @@ -0,0 +1,20 @@ +import sqlite3 + + +def create_statistic(): + conn = sqlite3.connect("db.sql") + cur = conn.cursor() + # result = cur.execute("SELECT * FROM statistic") + # data = cur.execute("select (select count(user_name) from statistic) as count, * from statistic") + data = cur.execute("select count(user_id), user_id from statistic") + # for i in data: + # print(i[1]) + # print(cur.execute("SELECT * FROM statistic WHERE user_id=?", (i[1], ))) + # users = [] + # for i in result: + # if i[5] in users: + # print(1) + # users[users.index(i[5])] += users[users.index(i[5])] + # else: + # users.append([i[5], 1]) + return data diff --git a/functions/get_audio_messages_func.py b/functions/get_audio_messages_func.py index 0bce366..6ba4b8d 100644 --- a/functions/get_audio_messages_func.py +++ b/functions/get_audio_messages_func.py @@ -12,6 +12,8 @@ async def get_audio_messages_func(message: types.Message, logger, bot) -> None: :param bot: - объект бота :return: None """ + os.system("rm -rf config") # удаляю папку с файлами + os.mkdir("config") # создаю папку обратно # достаю file_id из разнообразных полей if message.content_type in ['voice']: file_id = message.voice.file_id @@ -34,5 +36,3 @@ async def get_audio_messages_func(message: types.Message, logger, bot) -> None: logger.info(f"Чат {name} (ID: {message.chat.id}) обработал файл {file_name}, " f"сервисом {converter.service}") # записываю всё в logger await bot.send_message(message.chat.id, message_text, reply_to_message_id=message.message_id) # отправляю сообщение - os.removedirs("config") # удаляю папку с файлами - os.mkdir("config") # создаю папку обратно diff --git a/functions/loging.py b/functions/loging.py index 6fa4733..e415d20 100644 --- a/functions/loging.py +++ b/functions/loging.py @@ -1,9 +1,10 @@ import os import shutil from aiogram import types +import sqlite3 -def loging(message: types.Message, service: str, file_path: str, text: str) -> None: +def loging(message: types.Message, service: str, file_path: str, text: str, f: float) -> None: """ Функция логирует каждое сообщение @@ -11,6 +12,7 @@ def loging(message: types.Message, service: str, file_path: str, text: str) -> N :param service: str - название сервиса для генерации :param file_path: str - путь до файла :param text: str - текст который был разобран + :param f: float - длинна аудиофайла :return: None """ if not os.path.isdir(f"logs/{message.chat.id}"): # если папки нет @@ -23,3 +25,18 @@ def loging(message: types.Message, service: str, file_path: str, text: str) -> N shutil.copy(file_path, f"logs/{message.chat.id}/{file_name[0]}/audio.{file_name[1]}") # копирование файла with open(f'logs/{message.chat.id}/{file_name[0]}/{service}-text.txt', 'w+') as the_file: # открываю файл в запись the_file.write(text) # записываю + user_id = message.from_user.id + group_id = message.chat.id + time = f + user_name = message.from_user.first_name + if message.chat.first_name: + chat_title = message.chat.first_name + else: + chat_title = message.chat.title + print(user_id, group_id, service, time, user_name, chat_title) + conn = sqlite3.connect("db.sql") + cur = conn.cursor() + user = (user_id, group_id, service, time, user_name, chat_title) + cur.execute("INSERT INTO statistic(user_id, group_id, service, time, user_name, chat_title) " + "VALUES(?, ?, ?, ?, ?, ?);", user) + conn.commit() diff --git a/functions/openai_answer.py b/functions/openai_answer.py new file mode 100644 index 0000000..e1e2333 --- /dev/null +++ b/functions/openai_answer.py @@ -0,0 +1,38 @@ +from aiogram import types + + +def get_response(message: types.Message): + answer_en = get_translation(' '.join(message.text.split()[1:]), "en") + print(answer_en) + response_en = get_response_to_openai(answer_en) + print(response_en) + response_ru = get_translation(response_en, "ru") + resource_ru_not_translate = get_response_to_openai(' '.join(message.text.split()[1:])) + save_file(response_ru, resource_ru_not_translate) + + +def get_translation(text, language): + from deep_translator import GoogleTranslator + return GoogleTranslator(target=language).translate(text) + + +def get_response_to_openai(text): + import openai + openai.api_key = "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" + response = openai.Completion.create( + model="text-davinci-003", + prompt=text, + temperature=0.5, + max_tokens=1000, + top_p=1.0, + frequency_penalty=0.5, + presence_penalty=0.0 + ) + return response['choices'][0]['text'] + + +def save_file(response_ru, resource_ru_not_translate): + with open('response_ru.txt', 'w') as f: + f.write(response_ru) + with open('resource_ru_not_translate.txt', 'w') as f: + f.write(resource_ru_not_translate) diff --git a/logs/-1001560258527/310/audio.ogg b/logs/-1001560258527/310/audio.ogg new file mode 100644 index 0000000..0acbfc6 Binary files /dev/null and b/logs/-1001560258527/310/audio.ogg differ diff --git a/logs/-1001560258527/310/yandex-text.txt b/logs/-1001560258527/310/yandex-text.txt new file mode 100644 index 0000000..8b4b4d7 --- /dev/null +++ b/logs/-1001560258527/310/yandex-text.txt @@ -0,0 +1,3 @@ +yandex + +Бот упал видимо у вас там все выключили \ No newline at end of file diff --git a/logs/-1001560258527/319/audio.ogg b/logs/-1001560258527/319/audio.ogg new file mode 100644 index 0000000..f30377f Binary files /dev/null and b/logs/-1001560258527/319/audio.ogg differ diff --git a/logs/-1001560258527/319/yandex-text.txt b/logs/-1001560258527/319/yandex-text.txt new file mode 100644 index 0000000..9397679 --- /dev/null +++ b/logs/-1001560258527/319/yandex-text.txt @@ -0,0 +1,3 @@ +yandex + +Тестовое голосовое чтобы увидеть название группы \ No newline at end of file diff --git a/logs/-1001798095401/10999/audio.wav b/logs/-1001798095401/10999/audio.wav new file mode 100644 index 0000000..58103a6 Binary files /dev/null and b/logs/-1001798095401/10999/audio.wav differ diff --git a/logs/-1001798095401/10999/google-text.txt b/logs/-1001798095401/10999/google-text.txt new file mode 100644 index 0000000..608095e --- /dev/null +++ b/logs/-1001798095401/10999/google-text.txt @@ -0,0 +1,3 @@ +google + +мы тут уже работаем работаем Костя работаем девочки \ No newline at end of file diff --git a/logs/620318992/661/audio.ogg b/logs/620318992/661/audio.ogg new file mode 100644 index 0000000..8b8df03 Binary files /dev/null and b/logs/620318992/661/audio.ogg differ diff --git a/logs/620318992/661/yandex-text.txt b/logs/620318992/661/yandex-text.txt new file mode 100644 index 0000000..5362721 --- /dev/null +++ b/logs/620318992/661/yandex-text.txt @@ -0,0 +1,3 @@ +yandex + +Какое то случайное голосовое \ No newline at end of file diff --git a/logs/620318992/662/audio.ogg b/logs/620318992/662/audio.ogg new file mode 100644 index 0000000..8b8df03 Binary files /dev/null and b/logs/620318992/662/audio.ogg differ diff --git a/logs/620318992/662/yandex-text.txt b/logs/620318992/662/yandex-text.txt new file mode 100644 index 0000000..5362721 --- /dev/null +++ b/logs/620318992/662/yandex-text.txt @@ -0,0 +1,3 @@ +yandex + +Какое то случайное голосовое \ No newline at end of file diff --git a/logs/620318992/666/audio.wav b/logs/620318992/666/audio.wav new file mode 100644 index 0000000..f2067f6 Binary files /dev/null and b/logs/620318992/666/audio.wav differ diff --git a/logs/620318992/666/google-text.txt b/logs/620318992/666/google-text.txt new file mode 100644 index 0000000..d754ed4 --- /dev/null +++ b/logs/620318992/666/google-text.txt @@ -0,0 +1,3 @@ +google + +ну там типа этого села поймали А мне кстати уровни надо познание на опознание надо будет приходить потому что мне 16 Это победа \ No newline at end of file diff --git a/logs/620318992/733/audio.wav b/logs/620318992/733/audio.wav new file mode 100644 index 0000000..ff168fb Binary files /dev/null and b/logs/620318992/733/audio.wav differ diff --git a/logs/620318992/733/google-text.txt b/logs/620318992/733/google-text.txt new file mode 100644 index 0000000..d4f59bc --- /dev/null +++ b/logs/620318992/733/google-text.txt @@ -0,0 +1,3 @@ +google + +я отдохнул Я нарисую покадрово просто эту анимацию открытия книжечки и всё вот если есть какие-то задания для меня пишет а может пока просто программной части или ещё что-то нарисовать надо Всё сделаю короче про болото болото я придумал тебя как у тебя было квадратным и на зелёном фоне кастомку тетрадку там нарисую и вместо вот этих клеточек которые у тебя я сделаю кувшинки что жаба буду сидеть на кувшинках и всё там ещё может какие-то скину кувшинки нарисуй \ No newline at end of file diff --git a/test.py b/test.py index e69de29..c8aea3f 100644 --- a/test.py +++ b/test.py @@ -0,0 +1,5 @@ +import os + +# os.system("rm -rf config") +os.removedirs("config") +# os.mkdir("config")