决定实现用户在机器人(aiogram)中存储可执行文件的能力。首先,我得到一个文件,读取其所有位,将其编码为 base64,然后将其写入数据库。当用户请求文件时,我从数据库中获取 base64,对其进行解码,将位写入文件并将其发送给用户。问题:当我通过方法发送文件时,bot.send_document()文件损坏,即无法正常工作。我检查了所有阶段,并且在每个阶段文件都在工作,即使是从数据库中进行 base64 解码后生成的文件也可以工作,并且它也可以启动,但是发送的文件没有启动并且很可能是损坏的。
我还比较了接收时和从基中提取时的base64和位,它们是相同的!也就是说,我相信问题不在我这边,因为一切都对我有用。
以下是一些代码(python)和一个用于生成 base64 代码的库:
base64-链接
从base64创建文件的函数,输入:
name - 文件的名称
base-base64
def write_file_bit(self, name, base):
file = open(f'{name}', 'wb')
base64_string = base64.b64decode(base)
file.write(base64_string)
从字节创建base64的函数,输入:
bytes - 从文件接收到的字节数
def bytes_to_base(self, bytes):
base64_string = base64.b64encode(bytes)
return base64_string
获取文件并添加到数据库:
data = await state.get_data()
document_id = msg.document.file_id
file_info = await bot.get_file(document_id)
fi = file_info.file_path
name = msg.document.file_name
r = requests.get(f'https://api.telegram.org/file/bot{TOKEN}/{fi}', f'./{name}')
bytes = r.content
base = file_work.bytes_to_base(bytes)
try:
database.add_to_queue_exe(msg.from_user.id, base, name, data['name_service'])
create_buttons(['Вернуться на главную🔙'])
await bot.send_message(msg.from_user.id, f'Программа успешно добавлена,её можно посмотреть в личном кабинете', reply_markup=greet_kb)
except Exception as e:
print(e)
create_buttons(['Вернуться на главную🔙'])
await bot.send_message(msg.from_user.id, f'Неизвесная ошибка❌ Пожалуйста сообщите администрации', reply_markup=greet_kb)
从数据库中获取base64,创建文件并发送给用户:
base = database.get_base_file_user(exes[couter][3])[2:-1]
random_name = random.randint(1,157153717531753715371)
expansion = exes[couter][1][str(exes[couter][1]).rfind('.') + 1:]
file_work.write_file_bit(f'{random_name}.{expansion}', base)
await bot.send_document(user_msg.from_user.id, (exes[couter][1], f'{random_name}.{expansion}'))
#os.remove(f'{random_name}.{expansion}')
最后我注释掉了创建后删除文件的行,这个文件正在工作
如果我简单地重复该问题,则该文件无法正常工作,并且问题绝对不在我这边。在此先感谢您的帮助!
问题是
send_message()我在方法中插入了文件名,它的内容应该是。我希望每个人都比我更专心:)