You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 13:24:56