python-telegram-bot 不支持 url 协议
a python-telegram-bot Unsupported url protocol
因此,我尝试创建一个 Telegram 机器人,它使用 PyTube 模块将视频下载到我的计算机,然后通过 send_document 函数将其发送给用户。
我的问题是当我需要发送视频时,出现此错误:
telegram.error.BadRequest: Invalid file http url specified: unsupported url protocol
我已经在普通文本文件上试过了,得到了相同的结果。
我认为这是因为文件的 Url 违反了一些关于它应该是什么样子的规则,但我不知道如何修复它...
还有我的代码:
import telegram.ext
import telegram
from telegram.ext.messagehandler import MessageHandler
from telegram.ext.commandhandler import CommandHandler
from telegram.ext.filters import Filters
import time
import pytube
import os
with open('C:/Users/EvilTwin/Desktop/stuff/Python/API/Telegram/Download Youtube Videos Bot/token.txt')as file:
API_KEY = file.read()
updater = telegram.ext.Updater(token=API_KEY, use_context=True)
def start(update, context):
update.message.reply_text(f'Hello {update.effective_user.first_name}, I\'m Roee\'s Video Downloader!')
time.sleep(1)
update.message.reply_text(
f'''
To Download Videos Please Enter:
/download + Video URL + Format
''')
def download(update, context):
URL = context.args[0]
FORMAT = context.args[1]
VIDEO = pytube.YouTube(URL)
FILE = VIDEO.streams.filter(progressive=True, file_extension=FORMAT).order_by('resolution').desc().first()
VD = 'C:/Users/EvilTwin/Desktop/stuff/Python/API/Telegram/Download Youtube Videos Bot/Videos'
FILE.download(VD)
banned = ['/', '/-\', ':', '?', '!', '*', '>', '<', '"', '|']
for ban in banned:
VIDEO.title = VIDEO.title.replace(ban, '')
time.sleep(1)
DOC = f'{VD}/{VIDEO.title}.{FORMAT}'
chat_id=update.effective_chat.id
context.bot.send_document(chat_id = chat_id ,document=DOC, filename = f'video.{FORMAT}')
os.remove(DOC)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('download', download))
updater.start_polling()
updater.idle()
如果有人知道如何修复它,请帮助我....
对于本地文件,您必须使用 file object
(file handler
) 而不是 file name
所以你必须打开它 document=open(DOC, 'rb')
context.bot.send_document(chat_id=chat_id, document=open(DOC, 'rb'), filename=f'video.{FORMAT}')
文档还显示您可以使用 pathlib.Path
或 bytes
(因此它需要读取它 document=open(DOC, 'rb').read()
),但我没有测试它。
参见文档:send_document()
因此,我尝试创建一个 Telegram 机器人,它使用 PyTube 模块将视频下载到我的计算机,然后通过 send_document 函数将其发送给用户。
我的问题是当我需要发送视频时,出现此错误:
telegram.error.BadRequest: Invalid file http url specified: unsupported url protocol
我已经在普通文本文件上试过了,得到了相同的结果。
我认为这是因为文件的 Url 违反了一些关于它应该是什么样子的规则,但我不知道如何修复它...
还有我的代码:
import telegram.ext
import telegram
from telegram.ext.messagehandler import MessageHandler
from telegram.ext.commandhandler import CommandHandler
from telegram.ext.filters import Filters
import time
import pytube
import os
with open('C:/Users/EvilTwin/Desktop/stuff/Python/API/Telegram/Download Youtube Videos Bot/token.txt')as file:
API_KEY = file.read()
updater = telegram.ext.Updater(token=API_KEY, use_context=True)
def start(update, context):
update.message.reply_text(f'Hello {update.effective_user.first_name}, I\'m Roee\'s Video Downloader!')
time.sleep(1)
update.message.reply_text(
f'''
To Download Videos Please Enter:
/download + Video URL + Format
''')
def download(update, context):
URL = context.args[0]
FORMAT = context.args[1]
VIDEO = pytube.YouTube(URL)
FILE = VIDEO.streams.filter(progressive=True, file_extension=FORMAT).order_by('resolution').desc().first()
VD = 'C:/Users/EvilTwin/Desktop/stuff/Python/API/Telegram/Download Youtube Videos Bot/Videos'
FILE.download(VD)
banned = ['/', '/-\', ':', '?', '!', '*', '>', '<', '"', '|']
for ban in banned:
VIDEO.title = VIDEO.title.replace(ban, '')
time.sleep(1)
DOC = f'{VD}/{VIDEO.title}.{FORMAT}'
chat_id=update.effective_chat.id
context.bot.send_document(chat_id = chat_id ,document=DOC, filename = f'video.{FORMAT}')
os.remove(DOC)
updater.dispatcher.add_handler(CommandHandler('start', start))
updater.dispatcher.add_handler(CommandHandler('download', download))
updater.start_polling()
updater.idle()
如果有人知道如何修复它,请帮助我....
对于本地文件,您必须使用 file object
(file handler
) 而不是 file name
所以你必须打开它 document=open(DOC, 'rb')
context.bot.send_document(chat_id=chat_id, document=open(DOC, 'rb'), filename=f'video.{FORMAT}')
文档还显示您可以使用 pathlib.Path
或 bytes
(因此它需要读取它 document=open(DOC, 'rb').read()
),但我没有测试它。
参见文档:send_document()