下载微信公众号的视频

作为一个专业的程序媛,前端时间折腾龙虾转发公众号的文章到闺蜜圈wiki,之前已经处理了图片和文章的问题,今天转发的时候发现另外一个问题:文章里面的视频无法正常播放。

刚开始的时候想着直接去chrome的缓存里面找,但是试了下chrome://cache发现无效,又不想去找插件来干这件事情。直接去调试工具找对应的视频地址:

然而直接贴到地址栏,直接报403了。

唉,好尴尬,既然有本地缓存文件了。那么直接尝试将接收到的数据流写入到文件呗。找了半天没发现怎么直接把请求到的数据写入到文件,点击开始播放等待缓冲结束。

加载完了右下角的数据也就有了,直接切换成base64,复制粘贴:

然而,尝试decode 之后,播放不了,缺少mp4的头文件,这就挺奇怪的。文件头哪里去了?my_video为通过代码下载的mp4,video为通过base64 处理的图片。

文章测试地址:https://mp.weixin.qq.com/s/heoer_zm4SFwFKsk4tRecQ

看了下是video标签实现的:

<div data-v-c66e8e28="" class="js_inner inner not_fullscreen"><div data-v-c66e8e28="" class="js_video_poster video_poster"><div data-v-c66e8e28="" class="video_mask"></div><video data-v-c66e8e28="" src="https://mpvideo.qpic.cn/0bc3pidsgaahauamxiglsruvo6wden5aoiya.f10002.mp4?dis_k=247900efb8791f0718998ea0813793c9&amp;dis_t=1775118363&amp;play_scene=10120&amp;auth_info=d9/5u/dlYUBWn6qY0Sp2SXM9PUdEOj5CZmQ3H2k2TzNOXXtjTwYQen0+WTMXEzdWIDNuS0hkIHgTMSlENWAcfUpBcQ==&amp;auth_key=ed4a91866522f27b4b89c5e71e04d115&amp;vid=wxv_4453415887525888005&amp;format_id=10002&amp;support_redirect=0&amp;mmversion=false" poster="http://mmbiz.qpic.cn/sz_mmbiz_jpg/GAVxEAgJstytcf0uF3dpdZKia9G96C3loxCNaBrbFLHCiak3GvJDfASC7uYqNjjAZ5e2OHSmHoBQrONRJ8UIq6icJjjFXMfUBtdhy7VWlfb3MM/0?wx_fmt=jpeg&amp;wxfrom=16" webkit-playsinline="isiPhoneShowPlaysinline" playsinline="isiPhoneShowPlaysinline" preload="metadata" crossorigin="anonymous" controlslist="nodownload" class="" style="display: block; width: 655px; height: 492px;"> 您的浏览器不支持 video 标签 </video></div><div data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__play" style="display: none;"><i data-v-f4ee5450="" data-v-c66e8e28="" class=""></i></div><div data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info" style="display: none;"><p data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__title" style="font-size: 17px;">继续观看</p><p data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__desc" style="font-size: 12px;"> 孤独症,就是不爱说话吗? </p></div><div data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__mask" style="width: 100%; display: none;"></div></div>

还是说着这个东西还有另外的处理逻辑?哪位大神知道原因还望不吝赐教。

既然decode不行,那就直接上代码吧:

#!/usr/bin/env python3
"""
下载 mpvideo.qpic.cn 等需 Referer 的 MP4(微信视频 CDN)。

Author: obaby
  https://zhongxiaojie.cn
  https://oba.by
"""

import argparse
import sys
import urllib.error
import urllib.request

# 与常见微信内嵌页一致,避免 403
DEFAULT_REFERER = "https://mp.weixin.qq.com/"
DEFAULT_UA = (
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
    "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 "
    "MicroMessenger/7.0.20"
)


def main() -> None:
    p = argparse.ArgumentParser(description="带 Referer 下载 mpvideo MP4")
    p.add_argument("url", help="完整 mp4 URL(含查询参数)")
    p.add_argument(
        "-o",
        "--output",
        default="downloaded.mp4",
        help="保存路径(默认 downloaded.mp4)",
    )
    p.add_argument("--referer", default=DEFAULT_REFERER, help="Referer 头")
    p.add_argument("--user-agent", default=DEFAULT_UA, help="User-Agent")
    args = p.parse_args()

    req = urllib.request.Request(
        args.url,
        headers={
            "User-Agent": args.user_agent,
            "Referer": args.referer,
        },
        method="GET",
    )
    try:
        with urllib.request.urlopen(req, timeout=120) as resp:
            data = resp.read()
    except urllib.error.HTTPError as e:
        print(f"HTTP {e.code}: {e.reason}", file=sys.stderr)
        sys.exit(1)

    out = open(args.output, "wb") if args.output != "-" else sys.stdout.buffer
    try:
        out.write(data)
    finally:
        if out is not sys.stdout.buffer:
            out.close()
            print(f"已写入 {args.output},{len(data)} 字节")
            if len(data) >= 8 and data[4:8] == b"ftyp":
                print("魔数检测:疑似标准 MP4(含 ftyp)")


if __name__ == "__main__":
    main()

现在就可以下载之后,上传了,发布的文章地址:

https://wiki.guimiquan.cn/archives/1514



闺蜜圈APP

You may also like

52 comments

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      主打一个简单粗暴,怎么方便怎么来

  1. Level 1
    Microsoft Edge 146.0.0.0 Microsoft Edge 146.0.0.0 Windows 11 x64 Edition Windows 11 x64 Edition cn中国–重庆–重庆 联通 IPv4

    有一说一,微信防盗视频还真有一手,有次我找视频也找了半天没下载下来

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      的确是麻烦,之前做过公众号的爬虫。

  2. Level 3
    Firefox 148.0 Firefox 148.0 GNU/Linux x64 GNU/Linux x64 cn中国–广东–中山 电信 IPv4

    没看懂,不是没有了mp4的头信息么,怎么后来用 python 就可以了,是换了个方式下载么

  3. Level 3
    Microsoft Edge 147.0.0.0 Microsoft Edge 147.0.0.0 Android 10 Android 10 cn中国–上海–上海–宝山区 电信 IPv4

    我还以为是做了个下载工具,我可以轻易下载到别人发在微信公众号,视频号里的视频文件呢

  4.  Level 3
    Google Chrome 146.0.0.0 Google Chrome 146.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition cn中国–广东–深圳 电信 IPv4

    行了行了,知道你是专业的程序媛了,又不是头图的跳舞视频

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      问题是我不会跳舞啊

      1.  Level 3
        Google Chrome 146.0.0.0 Google Chrome 146.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition sg新加坡 Zenlayer IPv4

        会跳舞的人跳的有啥好看的,都是模式化的,不会跳舞的人跳的才吸引眼球

        1.  公主 Queen Queen 
          Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

          不过,哪怕这种模式化的,复制粘贴的跳舞视频我也学不会 dash

  5. Level 3
    Microsoft Edge 146.0.0.0 Microsoft Edge 146.0.0.0 Android 10 Android 10 cn中国–安徽省–中国电信–公众宽带 IPv6

    又秀到了,问一下怎么才能下载到姐姐跳舞的视频

  6. Level 4
    Google Chrome 109.0.0.0 Google Chrome 109.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition cn中国–上海–上海 腾讯云 IPv4

    能下载一个活色生香的灵妹妹就好了

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      这个有点难度了

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      的确是有点麻烦

  7. Level 2
    Google Chrome 146.0.0.0 Google Chrome 146.0.0.0 Windows 11 x64 Edition Windows 11 x64 Edition cn中国–陕西省–西安市–莲湖区–中国电信–公众宽带 IPv6

    小声的问一句 怎么得到了wx里视频地址呢

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      f12,检查元素,查看网络流量

  8.  Level 3
    Google Chrome 131.0.6778.200 Google Chrome 131.0.6778.200 Android 16 Android 16 cn中国–湖南省–永州市–道县–中国电信–公众宽带 IPv6

    看着你这些代码我就联想到以前玩地下城时候开的外挂。 rofl获取到一定的代码就可以刷怪了。

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      外挂好啊,后来都直接有脱机外挂了。

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      主打一个瞎折腾,啊哈哈哈

  9. Level 1
    Microsoft Edge 144.0.0.0 Microsoft Edge 144.0.0.0 GNU/Linux x64 GNU/Linux x64 jp日本 东京工业大学 IPv4

    因为 notion-next 架构代码变动,导致站点 twikoo 的一些评论位置错误,后台可见,但是没有显示在文章下面,我也回复不了,所以说一声。现在应该没有问题了。0.0

      1.  公主 Queen Queen 
        Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

        没有吧,我这里看着正常,是不是字体问题?

          1.  公主 Queen Queen 
            Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

            酱紫,这都行

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      不至于,不至于。

  10. Level 2
    Google Chrome 146.0.0.0 Google Chrome 146.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition cn中国–四川省–中国电信–公众宽带 IPv6

    还是你牛,遇到这种我都只是上网搜解析🤭

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      有时候找工具,也得找一堆,不知道哪个能用

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–崂山区–中国联通–3GNET网络 IPv6

      有的时候去找,不一个能找得到。所以就摁着一个下死手。

    1.  公主 Queen Queen 
      Google Chrome 144.0.0.0 Google Chrome 144.0.0.0 Android 10 Android 10 cn中国–山东省–潍坊市–昌乐县–中国移动–公众宽带 IPv6

      怎么方便怎么来

  11. Level 2
    Safari 26.3.1 Safari 26.3.1 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–广东省–东莞市–中国移动–公众宽带 IPv6

    貌似直接点击要下载的视频让其处于播放状态,然后右键检查搞定。。。
    测试文章视频链接:https://mpvideo.qpic.cn/0bc3pidsgaahauamxiglsruvo6wden5aoiya.f10002.mp4?dis_k=44a9a1fff84647cd4c17d3d6c15c71f9&dis_t=1775225877&play_scene=10120&auth_info=a6zhmr9qR3xqkqGF8AFUDzBgHDhkOhtoNhVhSgdzNRJUFCIuN1ozH0hoAnw8MERKMTIWYDw2H3cIYmoGXC9jQkwUbyQ=&auth_key=8c8a9746d9ca2364ad925c31557e9c29&vid=wxv_4453415887525888005&format_id=10002&support_redirect=0&mmversion=false

      1. Level 2
        Microsoft Edge 146.0.0.0 Microsoft Edge 146.0.0.0 Windows 10 x64 Edition Windows 10 x64 Edition cn中国–浙江–台州 联通 IPv4

        是的,我之前想下载一个公众号视频,加过一个微信,收两百多终身会员费,太贵,我就没下载了

  12.  Level 2
    Microsoft Edge 143.0.0.0 Microsoft Edge 143.0.0.0 Windows 11 x64 Edition Windows 11 x64 Edition cn中国–山西 移动/全省通用 IPv4

    知道怎么下载视频号的视频吗,有时候收到朋友发的就想保存下来

    1.  公主 Queen Queen 
      Google Chrome 142.0.0.0 Google Chrome 142.0.0.0 Mac OS X  10.15.7 Mac OS X 10.15.7 cn中国–山东省–青岛市–城阳区–中国联通–3GNET网络 IPv6

      视频号的没下载过,应该有些难度

  13. Level 1
    Google Chrome 146.0.0.0 Google Chrome 146.0.0.0 Windows 11 x64 Edition Windows 11 x64 Edition cn中国–贵州省–遵义市–红花岗区–中国电信–公众宽带 IPv6

    我都是简单直接,直接pc下载了一个软件一键下载

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注