def send_list_of_audio(uid): audio_list = dbfuncs.get_user_audio_list(uid) if len(audio_list) < 1: text = "У вас нет аудио в базе" else: text = "Список ваших аудио:\n" for item in audio_list: text += "\n" + item[2] + (" (%d байт)" % item[4]) bot.send_message(uid, text)
def send_list_of_photos(uid): photos_list = dbfuncs.get_user_photos_list(uid) if len(photos_list) < 1: text = "У вас нет фото в базе" else: text = "Список ваших фото:\n" for item in photos_list: text += "\n" + item[2] + (" (%d байт)" % item[4]) bot.send_message(uid, text)
def get_text_messages(message): logger.info( f"{message.from_user.id} ({message.from_user.username}) - handle: text ({message.text})" ) if message.text.lower().strip() in ("привет", "приветствую", "здравствуй", "хай"): bot.send_message(message.from_user.id, "Приветствую") else: bot.send_message(message.from_user.id, "Хм...")
def remove_audio(message): file_list = message.text.replace(",", " ").strip().split()[1:] logger.info( f"{message.from_user.id} ({message.from_user.username}) - command: remove_audio (" + ", ".join(file_list) + ")") if len(file_list) == 0: bot.send_message(message.from_user.id, "Не указаны файлы") return threading.Thread(target=(lambda: audio_funcs.remove_audio_files( message.from_user.id, file_list))).start()
def get_audio_files(uid, file_list): file_list = sorted(list(set(file_list))) result = dbfuncs.get_user_audio_files(uid, file_list) for item in result: file = BytesIO(item[1]) bot.send_audio(uid, file, title=item[0]) file.close() dif = sorted(list(set(file_list) - set([x[0] for x in result]))) if dif: logger.info(f"{uid}: not found: " + ", ".join(dif)) bot.send_message(uid, "Следующие файлы не были найдены:\n" + "\n".join(dif))
def start(message): help_text = \ '''Функции бота: Конвертирование аудио в wav 16 khz, запись в бд на сервере и возможность скачать их. Поиск лиц на отправленных фото и запись их в бд, если лица обнаружены. Команды: /help - Показать описание /audio_list - Показать список аудио файлов /get_audio - Скачать указанные аудио (через пробел или запятую) /remove_all_audio - Удалить все аудио /photos_list - Показать список фото /get_photo - Скачать указанные фото (через пробел или запятую) /remove_all_photos - Удалить все фото ''' bot.send_message(message.from_user.id, help_text)
def process_audio(uid, file_id): audio_id = file_id file_info = bot.get_file(audio_id) file_link = f'https://api.telegram.org/file/bot{_config.token}/{file_info.file_path}' try: r = requests.get(file_link, proxies=_config.proxies) except Exception as e: bot.send_message(uid, "Не удалось получить файл с сервера telegram") logger.error(f"{uid}: Error during getting file from telegram server: {str(e)}") return if r.status_code != 200: bot.send_message(uid, "Не удалось загрузить файл в базу") logger.error(f"{uid}: Can't get file from telegram server (not 200 code)") return logger.info(f"{uid}: file downloaded from telegram server") input_filename = f"{file_id}.tmp" output_filename = f"{file_id}." + _config.audio_file_extension with open(input_filename, "wb") as fin: fin.write(r.content) try: logger.info(f"{uid}: start processing audio file") process = subprocess.check_call(f"ffmpeg -i {input_filename} -f wav -acodec pcm_s16le -ar 16000 {output_filename}") logger.info(f"{uid}: file processed") except subprocess.CalledProcessError as e: logger.error(f"{uid}: Error during processing file: {str(e)}") bot.send_message(uid, "Не удалось обработать файл") return # os.system(f"ffmpeg -i {input_filename} -f wav -acodec pcm_s16le -ar 16000 {output_filename}") os.remove(input_filename) with open(output_filename, "rb") as res_file: file_data = res_file.read() res = dbfuncs.insert_user_audio(uid, file_data) os.remove(output_filename) if res is not None: bot.send_message(uid, res) else: logger.info(f"{uid}: audio file added") bot.send_message(uid, "Аудио добавлено")
def upload_photo(uid, file_id): file_info = bot.get_file(file_id) file_link = f'https://api.telegram.org/file/bot{_config.token}/{file_info.file_path}' try: r = requests.get(file_link, proxies=_config.proxies) except Exception as e: logger.error( f"{uid}: Error during getting file from telegram server: {str(e)}") bot.send_message(uid, "Не удалось получить файл с сервера telegram") return if r.status_code != 200: logger.error( f"{uid}: Can't get file from telegram server (not 200 code)") bot.send_message(uid, "Не удалось загрузить файл в базу") return logger.info(f"{uid}: file downloaded from telegram server") file_data = r.content file_name = "file_" + file_id + ".tmp" with open(file_name, "wb") as f: f.write(file_data) logger.info(f"{uid}: start processing photo file") face_detector = dlib.get_frontal_face_detector() image = io.imread(file_name) detected_faces = face_detector(image, 1) logger.info(f"{uid}: photo file processed") os.remove(file_name) if len(detected_faces) > 0: res = dbfuncs.insert_user_photo(uid, file_data) if res is not None: bot.send_message(uid, res) else: logger.info(f"{uid}: photo file added") bot.send_message(uid, "Фото добавлено") else: logger.info(f"{uid}: photo file not added (faces not detected)") bot.send_message(uid, "Лица не обнаружены, фото не добавлено")
def handle_document(message): #print(message) if message.document.mime_type.split('/')[0] == "audio": logger.info( f"{message.from_user.id} ({message.from_user.username}) - handle: audio as document (" + f"{message.document.mime_type}, {message.document.file_size} bytes)" ) threading.Thread(target=(lambda: audio_funcs.process_audio( message.from_user.id, message.document.file_id))).start() elif message.document.mime_type.split('/')[0] == "image": logger.info( f"{message.from_user.id} ({message.from_user.username}) - handle: photo as document" ) threading.Thread(target=(lambda: image_funcs.upload_photo( message.from_user.id, message.document.file_id))).start() else: logger.info( f"{message.from_user.id} ({message.from_user.username}) - handle: document" ) bot.send_message(message.from_user.id, "Не знаю, что с этим делать.")
def remove_all_audio_files(uid): result = dbfuncs.remove_all_audio_files(uid) logger.info(f"{uid}: removed {result} audio files") bot.send_message(uid, "Удалено %d файлов." % result)
def remove_audio_files(uid, file_list): file_list = sorted(list(set(file_list))) result = dbfuncs.remove_audio_files(uid, file_list) logger.info(f"{uid}: removed {result} audio files") bot.send_message(uid, "Удалено %d файлов." % result)