lecepin / WeChatVideoDownloader

超方便的微信视频号下载器
4.38k stars 704 forks source link

折腾3天了,没搞定!能否单独出个视频号url解密下载的小工具 #109

Open luochaolun opened 10 months ago

luochaolun commented 10 months ago

功能很简单,就是一个输入框,输入fiddlet等抓包抓到的视频号链接,一点按钮就解密并下载视频。

折腾3天了,一运行软件,电脑浏览器就打不开网页,视频号也无法打开。关掉软件,就正常了。

will-17173 commented 10 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

songyunbiao commented 10 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

will-17173 commented 10 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

弄好了。

方法如下:

  1. fork 一个本仓库,修改 App.jsx 文件: 在<div className="App">这一行下方加上以下代码,这个只是加了一个输入框和一个下载按钮,其它代码界面什么的我都不想动了。 然后运行 npm run start 运行。

      <textarea style={{ width: '1000px', height: '300px' }} id="info"></textarea>
      <Button
        icon={<DownloadOutlined />}
        type="primary"
        onClick={() => {
          const { url, decode_key: decodeKey, description } = JSON.parse(document.querySelector('#info').value)
          send({
            type: 'e_下载',
            url,
            decodeKey,
            description,
          });
        }}
        size="small"
      >
        解密下载
      </Button>
  2. 关键是拿到视频号的视频信息,我是用 whistlejs 来拦截的,推荐你也这样做 安装whistle就不说了,后面的操作需要你确保代理能成功。

在whistle 的 Rules 里加一条代理规则 : https://channels.weixin.qq.com/web/pages/feed jsAppend://{wechat}

然后在Values里新建一个名叫 wechat 的 key, 在右边窗口粘贴以下代码

  function send_response_if_is_video(response) {
    let value = JSON.parse(response["jsapi_resp"]["resp_json"]);
    // debug_wvds("send 2: " + JSON.stringify(value));
    if (value["object"] == undefined || value["object"]["object_desc"] == undefined  || value["object"]["object_desc"]["media"].length == 0) {
      return;
    }
    let media = value["object"]["object_desc"]["media"][0];
    // debug_wvds("send 3: " + JSON.stringify(media));
    let description = value["object"]["object_desc"]["description"].trim();

    let video_data = {
      "decode_key": media["decode_key"],
      "url": media["url"]+media["url_token"],
      "size": media["file_size"],
      "description":  description,
      "uploader": value["object"]["nickname"]
    };

    setTimeout(() => {
        alert(JSON.stringify(video_data))
        console.log(video_data)
    }, 1000)
  }

  function wrapper(name,origin) {
    return function() {
      let cmdName = arguments[0];
      if (arguments.length == 3) {
        let original_callback = arguments[2];
        arguments[2] = async function () {
          if (arguments.length == 1) {
            send_response_if_is_video(arguments[0]);
          }
          return await original_callback.apply(this, arguments);
        }
      }
      let result = origin.apply(this,arguments);
      return result;
    }
  }

  window.WeixinJSBridge.invoke = wrapper("WeixinJSBridge.invoke", window.WeixinJSBridge.invoke);
  window.wvds = true;

之后打开视频号的视频页面,如果正常的话,你会看到一个alert弹窗里面是视频信息,同时会console出来。我是用whistle注入了 vconsole来复制控制台里的视频信息。

  1. 接下来把复制的信息(js 对象)粘贴到前面新加的输入框里点击下载,正常的话就可以下载了。
songyunbiao commented 10 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

弄好了。

方法如下:

  1. fork 一个本仓库,修改 App.jsx 文件: 在<div className="App">这一行下方加上以下代码,这个只是加了一个输入框和一个下载按钮,其它代码界面什么的我都不想动了。 然后运行 npm run start 运行。
      <textarea style={{ width: '1000px', height: '300px' }} id="info"></textarea>
      <Button
        icon={<DownloadOutlined />}
        type="primary"
        onClick={() => {
          const { url, decode_key: decodeKey, description } = JSON.parse(document.querySelector('#info').value)
          send({
            type: 'e_下载',
            url,
            decodeKey,
            description,
          });
        }}
        size="small"
      >
        解密下载
      </Button>
  1. 关键是拿到视频号的视频信息,我是用 whistlejs 来拦截的,推荐你也这样做 安装whistle就不说了,后面的操作需要你确保代理能成功。

在whistle 的 Rules 里加一条代理规则 : https://channels.weixin.qq.com/web/pages/feed jsAppend://{wechat}

然后在Values里新建一个名叫 wechat 的 key, 在右边窗口粘贴以下代码

  function send_response_if_is_video(response) {
    let value = JSON.parse(response["jsapi_resp"]["resp_json"]);
    // debug_wvds("send 2: " + JSON.stringify(value));
    if (value["object"] == undefined || value["object"]["object_desc"] == undefined  || value["object"]["object_desc"]["media"].length == 0) {
      return;
    }
    let media = value["object"]["object_desc"]["media"][0];
    // debug_wvds("send 3: " + JSON.stringify(media));
    let description = value["object"]["object_desc"]["description"].trim();

    let video_data = {
      "decode_key": media["decode_key"],
      "url": media["url"]+media["url_token"],
      "size": media["file_size"],
      "description":  description,
      "uploader": value["object"]["nickname"]
    };

    setTimeout(() => {
        alert(JSON.stringify(video_data))
      console.log(video_data)
    }, 1000)
  }

  function wrapper(name,origin) {
    return function() {
      let cmdName = arguments[0];
      if (arguments.length == 3) {
        let original_callback = arguments[2];
        arguments[2] = async function () {
          if (arguments.length == 1) {
            send_response_if_is_video(arguments[0]);
          }
          return await original_callback.apply(this, arguments);
        }
      }
      let result = origin.apply(this,arguments);
      return result;
    }
  }

  window.WeixinJSBridge.invoke = wrapper("WeixinJSBridge.invoke", window.WeixinJSBridge.invoke);
  window.wvds = true;

之后打开视频号的视频页面,如果正常的话,你会看到一个alert弹窗里面是视频信息,同时会console出来。我是用whistle注入了 vconsole来复制控制台里的视频信息。

  1. 接下来把复制的信息(js 对象)粘贴到前面新加的输入框里点击下载,正常的话就可以下载了。

感谢大佬提供。

will-17173 commented 9 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

弄好了。 方法如下:

  1. fork 一个本仓库,修改 App.jsx 文件: 在<div className="App">这一行下方加上以下代码,这个只是加了一个输入框和一个下载按钮,其它代码界面什么的我都不想动了。 然后运行 npm run start 运行。
      <textarea style={{ width: '1000px', height: '300px' }} id="info"></textarea>
      <Button
        icon={<DownloadOutlined />}
        type="primary"
        onClick={() => {
          const { url, decode_key: decodeKey, description } = JSON.parse(document.querySelector('#info').value)
          send({
            type: 'e_下载',
            url,
            decodeKey,
            description,
          });
        }}
        size="small"
      >
        解密下载
      </Button>
  1. 关键是拿到视频号的视频信息,我是用 whistlejs 来拦截的,推荐你也这样做 安装whistle就不说了,后面的操作需要你确保代理能成功。

在whistle 的 Rules 里加一条代理规则 : https://channels.weixin.qq.com/web/pages/feed jsAppend://{wechat} 然后在Values里新建一个名叫 wechat 的 key, 在右边窗口粘贴以下代码

  function send_response_if_is_video(response) {
    let value = JSON.parse(response["jsapi_resp"]["resp_json"]);
    // debug_wvds("send 2: " + JSON.stringify(value));
    if (value["object"] == undefined || value["object"]["object_desc"] == undefined  || value["object"]["object_desc"]["media"].length == 0) {
      return;
    }
    let media = value["object"]["object_desc"]["media"][0];
    // debug_wvds("send 3: " + JSON.stringify(media));
    let description = value["object"]["object_desc"]["description"].trim();

    let video_data = {
      "decode_key": media["decode_key"],
      "url": media["url"]+media["url_token"],
      "size": media["file_size"],
      "description":  description,
      "uploader": value["object"]["nickname"]
    };

    setTimeout(() => {
        alert(JSON.stringify(video_data))
        console.log(video_data)
    }, 1000)
  }

  function wrapper(name,origin) {
    return function() {
      let cmdName = arguments[0];
      if (arguments.length == 3) {
        let original_callback = arguments[2];
        arguments[2] = async function () {
          if (arguments.length == 1) {
            send_response_if_is_video(arguments[0]);
          }
          return await original_callback.apply(this, arguments);
        }
      }
      let result = origin.apply(this,arguments);
      return result;
    }
  }

  window.WeixinJSBridge.invoke = wrapper("WeixinJSBridge.invoke", window.WeixinJSBridge.invoke);
  window.wvds = true;

之后打开视频号的视频页面,如果正常的话,你会看到一个alert弹窗里面是视频信息,同时会console出来。我是用whistle注入了 vconsole来复制控制台里的视频信息。

  1. 接下来把复制的信息(js 对象)粘贴到前面新加的输入框里点击下载,正常的话就可以下载了。

感谢大佬提供。

我把这个功能做成 uTools 插件了,在 uTools 插件市场搜索 '微信视频号下载器' 可以找到

songyunbiao commented 9 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

弄好了。 方法如下:

  1. fork 一个本仓库,修改 App.jsx 文件: 在<div className="App">这一行下方加上以下代码,这个只是加了一个输入框和一个下载按钮,其它代码界面什么的我都不想动了。 然后运行 npm run start 运行。
      <textarea style={{ width: '1000px', height: '300px' }} id="info"></textarea>
      <Button
        icon={<DownloadOutlined />}
        type="primary"
        onClick={() => {
          const { url, decode_key: decodeKey, description } = JSON.parse(document.querySelector('#info').value)
          send({
            type: 'e_下载',
            url,
            decodeKey,
            description,
          });
        }}
        size="small"
      >
        解密下载
      </Button>
  1. 关键是拿到视频号的视频信息,我是用 whistlejs 来拦截的,推荐你也这样做 安装whistle就不说了,后面的操作需要你确保代理能成功。

在whistle 的 Rules 里加一条代理规则 : https://channels.weixin.qq.com/web/pages/feed jsAppend://{wechat} 然后在Values里新建一个名叫 wechat 的 key, 在右边窗口粘贴以下代码

  function send_response_if_is_video(response) {
    let value = JSON.parse(response["jsapi_resp"]["resp_json"]);
    // debug_wvds("send 2: " + JSON.stringify(value));
    if (value["object"] == undefined || value["object"]["object_desc"] == undefined  || value["object"]["object_desc"]["media"].length == 0) {
      return;
    }
    let media = value["object"]["object_desc"]["media"][0];
    // debug_wvds("send 3: " + JSON.stringify(media));
    let description = value["object"]["object_desc"]["description"].trim();

    let video_data = {
      "decode_key": media["decode_key"],
      "url": media["url"]+media["url_token"],
      "size": media["file_size"],
      "description":  description,
      "uploader": value["object"]["nickname"]
    };

    setTimeout(() => {
        alert(JSON.stringify(video_data))
      console.log(video_data)
    }, 1000)
  }

  function wrapper(name,origin) {
    return function() {
      let cmdName = arguments[0];
      if (arguments.length == 3) {
        let original_callback = arguments[2];
        arguments[2] = async function () {
          if (arguments.length == 1) {
            send_response_if_is_video(arguments[0]);
          }
          return await original_callback.apply(this, arguments);
        }
      }
      let result = origin.apply(this,arguments);
      return result;
    }
  }

  window.WeixinJSBridge.invoke = wrapper("WeixinJSBridge.invoke", window.WeixinJSBridge.invoke);
  window.wvds = true;

之后打开视频号的视频页面,如果正常的话,你会看到一个alert弹窗里面是视频信息,同时会console出来。我是用whistle注入了 vconsole来复制控制台里的视频信息。

  1. 接下来把复制的信息(js 对象)粘贴到前面新加的输入框里点击下载,正常的话就可以下载了。

感谢大佬提供。

我把这个功能做成 uTools 插件了,在 uTools 插件市场搜索 '微信视频号下载器' 可以找到

咋运转的啊,我把链接丢进去,咋没反应呢?

will-17173 commented 9 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

弄好了。 方法如下:

  1. fork 一个本仓库,修改 App.jsx 文件: 在<div className="App">这一行下方加上以下代码,这个只是加了一个输入框和一个下载按钮,其它代码界面什么的我都不想动了。 然后运行 npm run start 运行。
      <textarea style={{ width: '1000px', height: '300px' }} id="info"></textarea>
      <Button
        icon={<DownloadOutlined />}
        type="primary"
        onClick={() => {
          const { url, decode_key: decodeKey, description } = JSON.parse(document.querySelector('#info').value)
          send({
            type: 'e_下载',
            url,
            decodeKey,
            description,
          });
        }}
        size="small"
      >
        解密下载
      </Button>
  1. 关键是拿到视频号的视频信息,我是用 whistlejs 来拦截的,推荐你也这样做 安装whistle就不说了,后面的操作需要你确保代理能成功。

在whistle 的 Rules 里加一条代理规则 : https://channels.weixin.qq.com/web/pages/feed jsAppend://{wechat} 然后在Values里新建一个名叫 wechat 的 key, 在右边窗口粘贴以下代码

  function send_response_if_is_video(response) {
    let value = JSON.parse(response["jsapi_resp"]["resp_json"]);
    // debug_wvds("send 2: " + JSON.stringify(value));
    if (value["object"] == undefined || value["object"]["object_desc"] == undefined  || value["object"]["object_desc"]["media"].length == 0) {
      return;
    }
    let media = value["object"]["object_desc"]["media"][0];
    // debug_wvds("send 3: " + JSON.stringify(media));
    let description = value["object"]["object_desc"]["description"].trim();

    let video_data = {
      "decode_key": media["decode_key"],
      "url": media["url"]+media["url_token"],
      "size": media["file_size"],
      "description":  description,
      "uploader": value["object"]["nickname"]
    };

    setTimeout(() => {
        alert(JSON.stringify(video_data))
        console.log(video_data)
    }, 1000)
  }

  function wrapper(name,origin) {
    return function() {
      let cmdName = arguments[0];
      if (arguments.length == 3) {
        let original_callback = arguments[2];
        arguments[2] = async function () {
          if (arguments.length == 1) {
            send_response_if_is_video(arguments[0]);
          }
          return await original_callback.apply(this, arguments);
        }
      }
      let result = origin.apply(this,arguments);
      return result;
    }
  }

  window.WeixinJSBridge.invoke = wrapper("WeixinJSBridge.invoke", window.WeixinJSBridge.invoke);
  window.wvds = true;

之后打开视频号的视频页面,如果正常的话,你会看到一个alert弹窗里面是视频信息,同时会console出来。我是用whistle注入了 vconsole来复制控制台里的视频信息。

  1. 接下来把复制的信息(js 对象)粘贴到前面新加的输入框里点击下载,正常的话就可以下载了。

感谢大佬提供。

我把这个功能做成 uTools 插件了,在 uTools 插件市场搜索 '微信视频号下载器' 可以找到

咋运转的啊,我把链接丢进去,咋没反应呢?

你是怎样的链接丢进去,要像下面这样的一段对象:

{"decode_key": "82561733", "url":
  "https://finder.video.qq.com/251/20302/stodownload?encfilekey=6xykWLEnztKcKCJZcV0rWCM8ua7DibZkibPSZaIgeFjxE7UUwEyXBfLqiaMpEOwAkcxPlKicyibfLewIVQsFDWGhCibF8s5NLmtTDAgicd9g5gTJDIEia1tAcZ5YevrG29dF21RzKCMh6r7ctxJjicRBS5gUGBt2oJeD5jC91hsibaUWJrCfQ&a=1&bizid=1023&dotrans=0&hy=SZ&idx=1&m=19a08096a73f2a274bc857de3c2fbed5&upid=500220&web=1&token=Cvvj5Ix3eew5xyibexEnJ54AzfqIN02vFXTxU5bO53PQv0q3xFj5hcIicGwAYfg6noc9haCdlx8eelMEqQ34FBKRujhZEicWVKJEicZrbgjYceBlUStD5gjg67ALRbTGKOdU&ctsc=141&extg=10f002e&ftype=107&svrbypass=AAuL%2FQsFAAABAAAAAABC%2Bf6w4%2B8SLaByxbenZRAAAADnaHZTnGbFfAj9RgZXfw6V7VV5vqsuT5zyW0EYtSrmHCiP5Ka%2BlRP8n%2BS8r0F3VYalT%2FYO%2Ba2%2F&svrnonce=1705490373",
  "size": 132966833, "description": "#好剧推荐 爱她那就多陪陪她", "uploader": "指尖追剧"}
songyunbiao commented 9 months ago

我也是想要个这样的,抓包的事情我自己可以干。 等我来搞一个。

搞出来,cue我一下,大佬。

弄好了。 方法如下:

  1. fork 一个本仓库,修改 App.jsx 文件: 在<div className="App">这一行下方加上以下代码,这个只是加了一个输入框和一个下载按钮,其它代码界面什么的我都不想动了。 然后运行 npm run start 运行。
      <textarea style={{ width: '1000px', height: '300px' }} id="info"></textarea>
      <Button
        icon={<DownloadOutlined />}
        type="primary"
        onClick={() => {
          const { url, decode_key: decodeKey, description } = JSON.parse(document.querySelector('#info').value)
          send({
            type: 'e_下载',
            url,
            decodeKey,
            description,
          });
        }}
        size="small"
      >
        解密下载
      </Button>
  1. 关键是拿到视频号的视频信息,我是用 whistlejs 来拦截的,推荐你也这样做 安装whistle就不说了,后面的操作需要你确保代理能成功。

在whistle 的 Rules 里加一条代理规则 : https://channels.weixin.qq.com/web/pages/feed jsAppend://{wechat} 然后在Values里新建一个名叫 wechat 的 key, 在右边窗口粘贴以下代码

  function send_response_if_is_video(response) {
    let value = JSON.parse(response["jsapi_resp"]["resp_json"]);
    // debug_wvds("send 2: " + JSON.stringify(value));
    if (value["object"] == undefined || value["object"]["object_desc"] == undefined  || value["object"]["object_desc"]["media"].length == 0) {
      return;
    }
    let media = value["object"]["object_desc"]["media"][0];
    // debug_wvds("send 3: " + JSON.stringify(media));
    let description = value["object"]["object_desc"]["description"].trim();

    let video_data = {
      "decode_key": media["decode_key"],
      "url": media["url"]+media["url_token"],
      "size": media["file_size"],
      "description":  description,
      "uploader": value["object"]["nickname"]
    };

    setTimeout(() => {
        alert(JSON.stringify(video_data))
      console.log(video_data)
    }, 1000)
  }

  function wrapper(name,origin) {
    return function() {
      let cmdName = arguments[0];
      if (arguments.length == 3) {
        let original_callback = arguments[2];
        arguments[2] = async function () {
          if (arguments.length == 1) {
            send_response_if_is_video(arguments[0]);
          }
          return await original_callback.apply(this, arguments);
        }
      }
      let result = origin.apply(this,arguments);
      return result;
    }
  }

  window.WeixinJSBridge.invoke = wrapper("WeixinJSBridge.invoke", window.WeixinJSBridge.invoke);
  window.wvds = true;

之后打开视频号的视频页面,如果正常的话,你会看到一个alert弹窗里面是视频信息,同时会console出来。我是用whistle注入了 vconsole来复制控制台里的视频信息。

  1. 接下来把复制的信息(js 对象)粘贴到前面新加的输入框里点击下载,正常的话就可以下载了。

感谢大佬提供。

我把这个功能做成 uTools 插件了,在 uTools 插件市场搜索 '微信视频号下载器' 可以找到

咋运转的啊,我把链接丢进去,咋没反应呢?

你是怎样的链接丢进去,要像下面这样的一段对象:

{"decode_key": "82561733", "url":
  "https://finder.video.qq.com/251/20302/stodownload?encfilekey=6xykWLEnztKcKCJZcV0rWCM8ua7DibZkibPSZaIgeFjxE7UUwEyXBfLqiaMpEOwAkcxPlKicyibfLewIVQsFDWGhCibF8s5NLmtTDAgicd9g5gTJDIEia1tAcZ5YevrG29dF21RzKCMh6r7ctxJjicRBS5gUGBt2oJeD5jC91hsibaUWJrCfQ&a=1&bizid=1023&dotrans=0&hy=SZ&idx=1&m=19a08096a73f2a274bc857de3c2fbed5&upid=500220&web=1&token=Cvvj5Ix3eew5xyibexEnJ54AzfqIN02vFXTxU5bO53PQv0q3xFj5hcIicGwAYfg6noc9haCdlx8eelMEqQ34FBKRujhZEicWVKJEicZrbgjYceBlUStD5gjg67ALRbTGKOdU&ctsc=141&extg=10f002e&ftype=107&svrbypass=AAuL%2FQsFAAABAAAAAABC%2Bf6w4%2B8SLaByxbenZRAAAADnaHZTnGbFfAj9RgZXfw6V7VV5vqsuT5zyW0EYtSrmHCiP5Ka%2BlRP8n%2BS8r0F3VYalT%2FYO%2Ba2%2F&svrnonce=1705490373",
  "size": 132966833, "description": "#好剧推荐 爱她那就多陪陪她", "uploader": "指尖追剧"}

那就是我打开的姿势不对,我就只是把url丢进去了,丢的一个字符串。

aylitat commented 9 months ago

w2 监听开始成功了,但是后来不知道怎么又不管用了。