这是下次要发的微信公众号文章音频下载工具2.0
昨天自己分析了一遍公众号的视频下载原理了,我的目的想把这个功能加入到音频下载器里,所以就先记录下分析得过程。
0x1 分析视频的播放文件
以它为例:https://mp.weixin.qq.com/s/43zcY8nMAuBUqj56hU1O-w 要找到播放的源地址,首先用浏览器的抓包工具,抓个数据分析分析。
关键点:
1、首先,电脑版是分片播放的,这种会麻烦很多,我们要利用浏览器模拟手机访问。
抓的信息里面有一些重要的数据出现了,首先看看这个getinfo的具体参数
数据是有点多,但是莫慌,分解下数据。
https://h5vv.video.qq.com/getinfo?
callback=txplayerJsonpCallBack_getinfo_820045
&&charge=0
&defaultfmt=auto
&otype=json
&guid=bc42e57ec105bc32e01ce4bf06684369
&flowid=aa4c1dec1cab49952d92025172daf134_11001
&platform=11001
&sdtfrom=v3010
&defnpayver=0
&appVer=3.3.513
&host=https%3A%2F%2Fmp.weixin.qq.com%2Fs%2F43zcY8nMAuBUqj56hU1O-w&ehost=https%3A%2F%2Fv.qq.com%2Ftxp%2Fiframe%2Fplayer.html%3Forigin%3Dhttps%253A%252F%252Fmp.weixin.qq.com%26vid%3Dg06827lmf9t%26autoplay%3Dfalse%26full%3Dtrue%26show1080p%3Dfalse
&sphttps=1
&_rnd=1528772323
&spwm=4
&unid=762fd1146deb11e89d19a042d42c850a
&vid=g06827lmf9t
&defn=auto
&fhdswitch=0
&show1080p=0
&isHLS=0
&fmt=auto
&defsrc=1
&_qv_rmt=U0lJnMZaA12722KdC%3D
&_qv_rmt2=xeZNd1CQ1587338Kg%3D
&_1528772323630=
经过测试,简化版(换电脑访问也是正常的,获取的链接也是可以下载的):
https://h5vv.video.qq.com/getinfo?
otype=json
&platform=11001
&appVer=3.3.513
&vid=g06827lmf9t
&guid=bc42e57ec105bc32e01ce4bf06684369
&defaultfmt=auto
哪些参数需要获取呢?
https://h5vv.video.qq.com/getinfo?
otype=json //返回结果的方式json格式 固定
&platform=11001 //固定
&appVer=3.3.513 //固定
&vid=g06827lmf9t //需要自己获取
&guid=bc42e57ec105bc32e01ce4bf06684369 //算法生成
&defaultfmt=auto //固定 可选
那么问题就来了,固定的参数简单,但是自己获取和算法生成的怎么获取呢?
0x2 参数获取
首先自己获取的这个vid,通过搜索,发现源码中就有。
guid没找到算法,我就用了另一个方式生成的32位的值来代替
伪造guid(正常使用)
我的思路时通过搜索guid来定位的,最后定位在这个js里,找到这个计算guid的算法(这个不是真正的guid的方法,我只是没找到,然后使用了这个也没问题)。
0x3 视频链接拼接
void CScript_demoDlg::GetTXGuid(CString &szRet) { //初始化 CoInitialize(NULL) CScriptControl js; if (js.CreateDispatch(TEXT("MSScriptControl.ScriptControl"))) { //设置当前使用的脚本语言 js.put_Language(TEXT("JScript")); //执行语句,执行完成后var中即包含了表达式的结果 //js.put_AllowUI(TRUE); js.put_AllowUI(TRUE); js.AddCode(TEXT("function createguid(a){a=a||32;for(var b=\"\",c=1;a>=c;c++){var d=Math.floor(16*Math.random()).toString(16);b+=d}return b}")); //js.a VARIANT var = js.Eval(TEXT("createguid(32)")); szRet = var; //释放接口 js.ReleaseDispatch(); } CoUninitialize(); }
guid结果:"87604c8048b221e32e651866580cee96"
最后拼接一下参数,得到下面的链接
https://h5vv.video.qq.com/getinfo?platform=11001&charge=0&otype=json&sphls=0&sb=1&nocache=0&appVer=V2.0Build9496&guid=87604c8048b221e32e651866580cee96&vids=g06827lmf9t&defaultfmt=auto
通过访问这个链接得到一段json数据(里面几个关键点标记了)
最后把所有参数拼接下,得到4个完整的播放地址:
地址一:
http://113.106.207.154/vhot2.qqvideo.tc.qq.com/AmBXeQSVIE_fc6T_HY4mM9XsEk3L0XSD2NXemoXrGcOE/g06827lmf9t.mp4?guid=87604c8048b221e32e651866580cee96&vkey=79D453D5CE1202ACF2B59050100C1FA294B7AEA8BEAD6CF52AC8368AF02F66F6C26E9FDD2719A7556AC7737969102C06F3F97947778D4B83DB3736F97B88303BAA254E2F253B74379DC46D4983F6A4E4A2C99B54577B61AB50377E3CC89835CC82851F2BA8ED8D99E300DFC6D2CB01DF8E4653F3A37482DE
地址二:
http://ugcws.video.gtimg.com/g06827lmf9t.mp4?guid=87604c8048b221e32e651866580cee96&vkey=79D453D5CE1202ACF2B59050100C1FA294B7AEA8BEAD6CF52AC8368AF02F66F6C26E9FDD2719A7556AC7737969102C06F3F97947778D4B83DB3736F97B88303BAA254E2F253B74379DC46D4983F6A4E4A2C99B54577B61AB50377E3CC89835CC82851F2BA8ED8D99E300DFC6D2CB01DF8E4653F3A37482DE
地址三:
http://ugcsjy.qq.com/g06827lmf9t.mp4?guid=87604c8048b221e32e651866580cee96&vkey=79D453D5CE1202ACF2B59050100C1FA294B7AEA8BEAD6CF52AC8368AF02F66F6C26E9FDD2719A7556AC7737969102C06F3F97947778D4B83DB3736F97B88303BAA254E2F253B74379DC46D4983F6A4E4A2C99B54577B61AB50377E3CC89835CC82851F2BA8ED8D99E300DFC6D2CB01DF8E4653F3A37482DE
地址四:
http://video.dispatch.tc.qq.com/g06827lmf9t.mp4?guid=87604c8048b221e32e651866580cee96&vkey=79D453D5CE1202ACF2B59050100C1FA294B7AEA8BEAD6CF52AC8368AF02F66F6C26E9FDD2719A7556AC7737969102C06F3F97947778D4B83DB3736F97B88303BAA254E2F253B74379DC46D4983F6A4E4A2C99B54577B61AB50377E3CC89835CC82851F2BA8ED8D99E300DFC6D2CB01DF8E4653F3A37482DE
注意:播放链接中的guid可以不用加,写到这里我才这么试了下,懒得编辑了。那么关键的就是怎么获取这个vkey值,琢磨了两天的结果。
简单的写了个demo