获取微信公众号文章内视频真实地址

article/2025/10/6 16:31:30

PHP获取微信公众号文章内视频与音频真实地址


微信公众号的文章的爬取可以看到这个项目:github 基于QueryList的微信公众号文章获取工具


有任何问题可以留言。

返回数据:

  1. 包含音频和视频包含音频和视频,按照音频格式和视频格式返回。
  2. 包含多个视频 包含多个视频

原有找到的文章 如何抓取微信公众号文章里面的视频 中间只有原本的公众号文章内的腾讯视频的获取,本方案增加了微信视频素材的获取和音频的获取。优化了腾讯视频获取的方案。

  • 文章内腾讯视频的真实地址获取
  • 文章内的视频素材的真实地址获取
  • 文章内的音频的获取
  • 文章资源下载

请求

<?php//var_dump($_GET);
$con = new Con();
$url = $_GET['url'];
$res = $con->actionGetwx($url);
var_dump($res);
die;

获取资源

/*** Class con* @author Fawkes* @time 2020-10-28*/
class con {/*** 抓取微信公众号的文章和里面的视频 url* @param $url* @return array|bool*/public function actionGetwx($url) {if (empty($url)) {echo '请输入公众号文章地址';return false;}$info_id_arr = $this->getChatInfoId($url);//获取真实地址链接$info_arr = [];foreach ($info_id_arr as $key=>$value){//获取视频switch ($key){case 'video':$info_arr['video'] = [];if(!empty($value)){foreach ($value as $vid){$video_json = Tools::getVqqInfo($vid);if(!empty($video_json['msg']) && $video_json['msg'] == 'vid is wrong'){//检测微视$return = $this->weishiQQCom($vid);}else{//腾讯视频的真是地址获取$return = $this->vQQCom($video_json);}$info_arr['video'][] = $return;};}break;case 'voice':$info_arr['voice'] = [];if(!empty($value)){foreach ($value as $vid){$return = $this->voiceInfo($vid);$info_arr['voice'][] = $return;};}break;default:break;}}return $info_arr;}/*** 获取公众号中的资源  音频和视频* @param $url* @return array*/public function getChatInfoId($url){//微信的链接有长链和短链,以下为长链//$url ='http://mp.weixin.qq.com/s?__biz=MzI0NTc1MTczNA==&mid=2247485130&idx=1&sn=945cfb8b0cfdd99f1b730889de0216e2&chksm=e9488c13de3f05057be6c6b065f8e44d43c566cb9ee3a4f35cf8084382742159181ea480b935&scene=27';if (stripos($url, '?')) {if (stripos($url, '#wechat_redirect')) {$url = str_replace('#wechat_redirect', '', $url);}$json = $url . '&f=json';} else {$json = $url . '?f=json';}$data = Tools::curl_request($json);$data = json_decode($data, 1);$chat_info_id = [];//获取json中的得到视频vid$vid_arr = $data['video_ids'] ?? [];//获取json中的得到音频的mid$voice_arr = array_column($data['voice_in_appmsg'],'voice_id') ?? [];if(empty($vid_arr)){//data 为文章的详情$html = $data['content_noencode'];preg_match_all('/<iframe (.*?)data-src="(.*?)">/', $html, $matchs);//没有视频脚本退出if (empty($matchs[2])) {echo '没有视频匹配到,不采集';die;}//判断是否是url地址  而后解析得出 vid的值$url = current($matchs[2]);if(!filter_var($url,FILTER_VALIDATE_URL)){echo '视频地址异常:'.$url;die;}$url = str_replace('&amp;','&',$url);//https://v.qq.com/iframe/preview.html?vid=i1324786hv8&width=500&height=375&auto=0$url_arr = parse_url($url);$query = $url_arr['query'] ?? '';$vidArray = explode("&vid=",$query);//获取到vid$vid_arr = [$vidArray[1]] ?? '';if(empty($vid_arr)){echo '视频参数异常:'.$query;die;}}$chat_info_id['video'] = $vid_arr;$chat_info_id['voice'] = $voice_arr;return $chat_info_id;}/*** 腾讯微视获取真实地址*/private function weishiQQCom($vid){$url = 'https://mp.weixin.qq.com/mp/videoplayer?action=get_mp_video_play_url&vid='.$vid;$data = Tools::curl_request($url);$data = json_decode($data,1);//得到数据的json 组装成功url$format_id = $data['url_info'][0]['format_id'];$title = $data['title'];$url = $data['url_info'][0]['url']."&vid=$vid&format_id=$format_id";return ['vid' => $vid,'type' => '公众号素材视频','title' => $title,'url' => $url];}/*** 腾讯视频的处理url* @param array $video_json 腾讯视频数据* @return array*/private function vQQCom(array $video_json){$title = $video_json['vl']['vi'][0]['ti'];$vid = $video_json['vl']['vi'][0]['vid'];//高质量视频$fn_pre = $video_json['vl']['vi'][0]['lnk'];$host = $video_json['vl']['vi'][0]['ul']['ui'][0]['url'];$streams = $video_json['fl']['fi'];$seg_cnt = $video_json['vl']['vi'][0]['cl']['fc'];$best_quality = end($streams)['name'];$part_format_id = end($streams)['id'];$part_urls = [];for ($part = 1; $part <= $seg_cnt + 1; $part++) {$filename = $fn_pre . '.p' . ($part_format_id % 10000) . '.' . $part . '.mp4';$key_api = "http://vv.video.qq.com/getkey?otype=json&platform=11&format=". $part_format_id . "&vid=" . $vid . "&filename=" . $filename . "&appver=3.2.19.333";$part_info = Tools::curl($key_api);preg_match('/QZOutputJson=(.*);$/Uis', $part_info, $key_json);$key_json = json_decode($key_json[1], 1);if (empty($key_json['key'])) {$vkey = $video_json['vl']['vi'][0]['fvkey'];$url = $video_json['vl']['vi'][0]['ul']['ui'][0]['url'] . $fn_pre . '.mp4?vkey=' . $vkey;} else {$vkey = $key_json['key'];$url = $host . $filename . "?vkey=" . $vkey;}$part_urls[] = $url;}//真实的地址if (empty($part_urls)) {//获取的视频质量低if (!empty($video_json['vl']['vi'])) {$keys = [];foreach ($video_json['vl']['vi'] as $key => $value) {$fvkey = $value['fvkey'];$fn = $value['fn'];$self_host = $value['ul']['ui'][$key]['url'];$keys['fvkey'] = $fvkey;$keys['fn'] = $fn;$keys['self_host'] = $self_host;$keys['lnk'] = $value['lnk'];}$part_urls[0] = $keys['self_host'] . $keys['fn'] . '?vkey=' . $keys['fvkey'];}}return ['vid' => $vid,'type' => '腾讯视频','title' => $title,'url' => current($part_urls)];}/*** 获取音频真实地址* @param string $vid*/private function voiceInfo(string $vid){$url = 'https://res.wx.qq.com/voice/getvoice?mediaid='.$vid;return ['vid' => $vid,'type' => '音频资料','url' => $url];}
}

使用的工具类

class Tools {public  static function httpcopy($url, $file="", $timeout=60) {$file = empty($file) ? pathinfo($url,PATHINFO_BASENAME) : $file;$dir = pathinfo($file,PATHINFO_DIRNAME);!is_dir($dir) && @mkdir($dir,0755,true);$url = str_replace(" ","%20",$url);if(function_exists('curl_init')) {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);$temp = curl_exec($ch);if(@file_put_contents($file, $temp) && !curl_error($ch)) {return $file;} else {return false;}} else {$opts = array("http"=>array("method"=>"GET","header"=>"","timeout"=>$timeout));$context = stream_context_create($opts);if(@copy($url, $file, $context)) {return $file;} else {return false;}}}public static function curl_request($url, $post = '',$header = [], $cookie = '', $returnCookie = 0) {$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $url);curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)');curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($curl, CURLOPT_AUTOREFERER, 1);curl_setopt($curl, CURLOPT_REFERER, "http://XXX");if ($post) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post));}if($header){curl_setopt($curl,CURLOPT_HTTPHEADER,$header);}if ($cookie) {curl_setopt($curl, CURLOPT_COOKIE, $cookie);}curl_setopt($curl, CURLOPT_HEADER, $returnCookie);curl_setopt($curl, CURLOPT_TIMEOUT, 60);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);$data = curl_exec($curl);if (curl_errno($curl)) {return curl_error($curl);}curl_close($curl);if ($returnCookie) {list($header, $body) = explode("\r\n\r\n", $data, 2);preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches);$info['cookie'] = substr($matches[1][0], 1);$info['content'] = $body;return $info;} else {return $data;}}public static function getVqqInfo($vid) {//    $json_type = 'json';//    $platform = '11001';//    $guid = 'ba7f7fab8f8aef2c4ae45883f221c04d';//    $sdtfrom = 'v1010';//    $_qv_rmt = '703hXQMOA1937593I%3D';//    $_qv_rmt2 = 'egp3C2aj149060UUA%3D';//    $url = sprintf('http://vv.video.qq.com/getinfo?vid=%s&otype=%s&guid=%s&platform=%s&sdtfrom=%s&_qv_rmt=%s&_qv_rmt2=%s', $vid, $json_type, $guid, $platform, $sdtfrom, $_qv_rmt, $_qv_rmt2);$infourl = 'https://vv.video.qq.com/getinfo?otype=json&appver=3.2.19.333&platform=11&defnpayver=1&vid=' . $vid;$data = self::curl($infourl);preg_match('/QZOutputJson=(.*);$/Uis', $data, $info);return json_decode($info[1], 1);}public static function getExt($url) {$urlinfo = parse_url($url);$file = basename($urlinfo['path']);if (strpos($file, '.') !== false) {$ext = explode('.', $file);return $ext[count($ext) - 1];}return 'no extension';}public static function strFilter($str) {$str = str_replace('  ', '', $str);$str = str_replace(' ', '', $str);$str = str_replace('`', '', $str);$str = str_replace('·', '', $str);$str = str_replace('~', '', $str);$str = str_replace('!', '', $str);$str = str_replace('!', '', $str);$str = str_replace('@', '', $str);$str = str_replace('#', '', $str);$str = str_replace('$', '', $str);$str = str_replace('¥', '', $str);$str = str_replace('%', '', $str);$str = str_replace('^', '', $str);$str = str_replace('……', '', $str);$str = str_replace('&', '', $str);$str = str_replace('*', '', $str);$str = str_replace('(', '', $str);$str = str_replace(')', '', $str);$str = str_replace('(', '', $str);$str = str_replace(')', '', $str);$str = str_replace('-', '', $str);$str = str_replace('_', '', $str);$str = str_replace('——', '', $str);$str = str_replace('+', '', $str);$str = str_replace('=', '', $str);$str = str_replace('|', '', $str);$str = str_replace('\\', '', $str);$str = str_replace('[', '', $str);$str = str_replace(']', '', $str);$str = str_replace('【', '', $str);$str = str_replace('】', '', $str);$str = str_replace('{', '', $str);$str = str_replace('}', '', $str);$str = str_replace(';', '', $str);$str = str_replace(';', '', $str);$str = str_replace(':', '', $str);$str = str_replace(':', '', $str);$str = str_replace('\'', '', $str);$str = str_replace('"', '', $str);$str = str_replace('“', '', $str);$str = str_replace('”', '', $str);$str = str_replace(',', '', $str);$str = str_replace(',', '', $str);$str = str_replace('<', '', $str);$str = str_replace('>', '', $str);$str = str_replace('《', '', $str);$str = str_replace('》', '', $str);$str = str_replace('.', '', $str);$str = str_replace('。', '', $str);$str = str_replace('/', '', $str);$str = str_replace('、', '', $str);$str = str_replace('?', '', $str);$str = str_replace('?', '', $str);return trim($str);}public static function curl($url, $option = []) {$split = explode('/', $url);$cookiejar = str_replace('\\', '/', dirname(__FILE__)) . '/' . $split[2] . '.cookie';$ch = curl_init();$options = $option?$option:[CURLOPT_URL => $url,CURLOPT_HTTPHEADER => ["Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8","Accept-Charset: UTF-8,*;q=0.5","Accept-Encoding': 'gzip,deflate,sdch","Accept-Language': 'en-US,en;q=0.8","User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0",],CURLOPT_RETURNTRANSFER => 1,CURLOPT_FOLLOWLOCATION => 1,CURLOPT_SSL_VERIFYPEER => false,CURLOPT_SSL_VERIFYHOST => false,CURLOPT_CONNECTTIMEOUT => 5,CURLOPT_TIMEOUT => 5,CURLOPT_COOKIEJAR => $cookiejar,CURLOPT_COOKIEFILE => $cookiejar,];curl_setopt_array($ch, $options);$response = curl_exec($ch);curl_close($ch);return $response;}
}

http://chatgpt.dhexx.cn/article/rf8M9WOs.shtml

相关文章

Python爬取微信公众号文章、点赞数

代码还是热乎的&#xff0c;只要你细心一步步的慢慢调试&#xff0c;绝壁没问题 前期准备 订阅号&#xff1b;Python&#xff1b;Fiddler&#xff1b;微信账号&#xff1b; 流程 使用用微信公众号生成cookie使用Fiddler抓取微信公众号数据&#xff0c; 获取阅读数通过cooki…

如何爬取微信公众号文章(二)

在如何爬取微信公众号&#xff08;一&#xff09;中完成了将爬取公众号文章的元数据存入数据库&#xff0c;其中包括文章的连接、标题、发布时间、摘要和封面图片等信息。下面介绍如何根据文章链接来爬取文章内容。 开发环境 windows 7 x64python3.7 (Anaconda)vscode 编辑器…

如何爬取微信公众号文章(一)

微信公众号是目前最为流行的自媒体之一&#xff0c;上面有大量的内容&#xff0c;如何将自己感兴趣的公众号内容爬取下来&#xff0c;离线浏览&#xff0c;或者作进一步的分析呢&#xff1f; 下面我们讨论一下微信公众号文章的爬取。 环境搭建 windows 7 x64python3.7 (Anac…

Python 爬虫之微信公众号

Python 爬虫之微信公众号 源代码放在文末。 本次爬虫需要的工具如下: selenium 驱动器对应浏览器的 webdriver一个微信订阅号在 2017 年 6 月左右,微信官方发布一篇文章 https://mp.weixin.qq.com/s/67sk-uKz9Ct4niT-f4u1KA,大致意思就是以后发布文章的时候可以插入其他公…

公网访问局域网家用nas

提到外网访问不得不说说家里局域网的搭建结构了&#xff0c;就拿大众最常用的方式举例&#xff0c;网络运营商的光纤入户&#xff0c;通过运营商提供的光猫直接pppoe进行拨号&#xff0c;再连接自己的路由器&#xff0c;分配至各网口。 自从上次充当灵魂画手被嘲笑了以后就改用…

外网访问群晖NAS VMM搭建Openwrt的admin界面

偶然在网上看到很多的帖子使用群晖搭建openwrt搭建旁路由,心血来潮体验了一把,记录一下自己的搭建的整个过程,并最终实现外网访问Openwrt的admin界面。 本人使用的群晖nas DS220+,其他品牌未尝试。 一、前期配置 1、先在套件中心下载VMM(Virtaul Machine Manager) 2、下…

2022年10月 cpolar软件实现内网穿透连接群晖NAS

前言 1.cpolar简介 cpolar是一款拥有远程控制和内网穿透功能的软件。而且还可以监控端口的HTTP请求&#xff0c;利用实时的cpolar Web UI开发者工具&#xff0c;让您调试代码更容易。您可以监听所有隧道上的HTTP消息包&#xff0c;分析消息包的结构内容&#xff0c;找出问题点…

群晖内网穿透 实现外网快速访问 无需公网

有群晖的情况下&#xff0c;在内网我们可以通过ip正常访问我们的群晖/NAS;但是我们想要在外网访问的时候该怎么办&#xff0c;没有公网ip&#xff0c;扯专线太贵&#xff0c;自己搭建太麻烦。这无疑是个难题&#xff1b; 今天&#xff0c;小编找到了一款免费的内网穿透工具来实…

通过公网+域名访问家里的群晖服务器

公网域名访问群晖服务器 前言准备的东西如何判断你家里的宽带是公网IP通过公网IP网访群晖&#xff0c;端口映射申请域名和DDNS添加DDNS映射写在最后 前言 最近换了个工作&#xff0c;然后有代码的托管需求。想想用GitHub太卡了&#xff0c;国内的开源托管网站因为一些国人的素…

猫盘群晖外部网络访问的三种方法:公网IP、内网穿透、qc的实际评测

目录 具体过程概述内网穿透公网IPQuickconnect(QC&#xff09;结语 具体过程 概述 最近想入手一个NAS&#xff0c;由于我是新手入门&#xff0c;就选择入手了便宜的猫盘。我的猫盘是白群晖系统所以支持QC的功能&#xff0c;因此对目前猫盘群晖的DiskStation Manager&#xff…

特征值和特征矩阵

写一点对矩阵特征值和特征矩阵的理解 1. A是一个矩阵&#xff0c;它作用在向量v上。如果A是2阶对角阵的话&#xff0c;它起到的作用是将向量v在横纵方向拉伸 2. 当A是一个普通2阶矩阵时&#xff0c;它对v的拉伸不再是横纵方向&#xff0c;而是任意方向的&#xff0c;这取决于实…

三阶矩阵求特征值的快速算法

一般的三阶矩阵求特征值其实是解析不了的&#xff0c;因为特征方程对应的是三次方程&#xff0c;对于一般的三次方程&#xff0c;是很难求解的。要想方程有三个整数根&#xff0c;并且能够不用完全暴力展开三阶行列式这样的矩阵实际是很特殊的。 1.某一行有两个0的情况是最好算…

用R求矩阵的特征值和特征向量

最近在学习多元统计分析的主成分分析时&#xff0c;发现需要经常计算矩阵的特征值和特征向量&#xff0c;自己就找了下用R来做计算的函数。 我们可以用sigen()函数来计算特征对。 #创建一个矩阵 a <- matrix(c(11,sqrt(3)/2,3/2,sqrt(3)/2,21/4,5*sqrt(3)/4,3/2,5*sqrt(3)/…

怎么算特征值和特征矩阵?

怎样更通俗的理解特征值和特征矩阵&#xff1f; 设A是一个n阶矩阵&#xff0c;若数和n维非零列向量满足&#xff0c;数称为A的特征值&#xff0c;x称为A对应于特征值的特征向量。此时叫做特征多项式&#xff0c;若特征多项式为0则称为A的特征方程&#xff08;齐次线性方程组&a…

矩阵特征值和特征向量的求取

最近项目中有一个模块需要求矩阵的最大特征值和特征值对应的特征向量&#xff0c;无奈&#xff0c;又重新将以前学习的这方面的知识重新温习了一遍&#xff0c;感觉还是当时学的不够深&#xff0c;所以谢谢感悟&#xff0c;顺便对知识点进行一个总结。 首先特征值和特征向量的…

matlab如何求矩阵特征值

根据线性代数理论&#xff0c;特征值与特征向量只存在于方阵。如下所示为一方阵A&#xff1a; 在matlab输入矩阵&#xff1a; A [1 2 4; 4 0 7 9 1 3]; 查阅matlab help可以知道&#xff0c;利用eig函数可以快速求解矩阵的特征值与特征向量。 格式&#xff1a;[V,D] eig(A) 说…

delphi 连接轻量级数据库 sqlite3

环境: windows7-64, delphi7, sqlite3 最近搞个小工具&#xff0c;要用到轻量级数据库。以前小型数据库是用mdb的&#xff0c;但连接mdb 需要odbc的支持。 对环境依赖性很大&#xff0c;于是换了一种传说中的轻量级数据库。 sqlite 很小巧&#xff0c;delphi 7 连接sqlite…

轻量级数据库sqlite,spring boot+sqlite的配置详解 (一)

spring bootsqlite的配置&#xff0c;及成功运行详解 sqlite数据库的安装与调试 首先&#xff0c;通过sqlite官方地址下载对应的安装包 https://www.sqlite.org/download.html 下载对应版本的安装包和工具包 解压后会得到这几个文件&#xff0c;将这几个文件放在同一目录下 …

腾讯云——轻量数据库服务

轻量数据库服务采用腾讯云自研的新一代云原生数据TDSQL-C&#xff0c;融合了传统数据库、云计算与新硬件技术的优势&#xff0c;100%兼容 MySQL&#xff0c;实现超百万级 QPS 的高吞吐&#xff0c;128TB 海量分布式智能存储&#xff0c;保障数据安全可靠。 定制内核&#xff1…

轻量级关系数据库SQLite的安装和SpringBoot整合

简介 SQLite是轻量级的关系型数据库&#xff0c;适用于中小型应用场景&#xff1a;如安卓、网站、终端设备。并且轻量&#xff08;服务端1M&#xff09;、方便移植&#xff08;只需要移动*.db文件到另外一台电脑&#xff09; 安装 官网链接&#xff1a;https://www.sqlite.o…