Telegram Bot实现无服务器存储转发TikTok视频的技术问题
问题
我开发了一个Telegram Bot,功能是接收TikTok视频链接后,从第三方网站下载视频并转发给用户。现在想实现无需将视频存储在服务器上直接转发给用户,但尝试直接传入第三方生成的视频下载链接时,出现报错:FileNotFoundError: [Errno 2] No such file or directory:。
当前报错的代码:
video_link = downloadVideo(video_url, 'index') bot.send_video(message.chat.id, video=open(video_link, 'rb'))
downloadVideo函数原本逻辑是生成下载链接并保存为.mp4文件,我修改了函数结尾使其返回下载链接。原本可正常运行(会存储视频)的代码如下:
def downloadVideo(link, id): # ... 省略其他逻辑 downloadSoup = BeautifulSoup(response.text, "html.parser") downloadLink = downloadSoup.a["href"] mp4File = urlopen(downloadLink) with open(f"{id}.mp4", "wb") as output: while True: data = mp4File.read(4096) if data: output.write(data) else: break downloadVideo(video_url, 'index') bot.send_video(message.chat.id, video=open(f'index.mp4', 'rb'))
解决方案
报错原因是open()只能读取本地文件路径,无法处理远程URL。Telegram Bot的send_video方法支持直接传入远程URL或网络流对象,不需要先下载到本地。
方法一:直接传入远程视频URL
如果第三方生成的downloadLink是公开可访问的直接视频地址,直接传给send_video即可:
def downloadVideo(link, id): # ... 省略其他逻辑 downloadSoup = BeautifulSoup(response.text, "html.parser") downloadLink = downloadSoup.a["href"] return downloadLink # 返回直接可访问的视频URL video_link = downloadVideo(video_url, 'index') bot.send_video(message.chat.id, video=video_link)
方法二:传入网络字节流对象
如果第三方链接有防盗链限制,无法直接作为URL传入,可以直接传递网络流对象,跳过本地存储步骤:
from urllib.request import urlopen def downloadVideo(link, id): # ... 省略其他逻辑 downloadSoup = BeautifulSoup(response.text, "html.parser") downloadLink = downloadSoup.a["href"] return urlopen(downloadLink) # 返回网络文件流对象 video_stream = downloadVideo(video_url, 'index') bot.send_video(message.chat.id, video=video_stream)
注意事项
- 确认第三方视频链接是直接指向.mp4文件的有效地址,而非跳转链接或需要Cookie验证的链接;
- 若遇到
403 Forbidden错误,可添加模拟浏览器的请求头绕过防盗链:from urllib.request import Request, urlopen req = Request(downloadLink, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'}) video_stream = urlopen(req)
内容的提问来源于stack exchange,提问作者Ernesto Dagalano
相关产品推荐
相关产品推荐

