欢迎光临
未来你我一起携手

一键解析火山视频用户所有视频地址 火山小视频无水印

今天实现的是火山小视频无水印的视频解析方法,并且会与大家分享如何批量获取火山用户上传的所有视频并且解析出无水印的视频地址出来。并且作者我编写了一款小工具供大家使用。下面是火山小视频的一些说明

火山小视频是一款15s原创生活小视频社区,由今日头条孵化,通过小视频帮助用户迅速获取内容,展示自我,获得粉丝,发现同好。

一般来说,因为给视频加水印之类处理过程较依赖服务器的处理能力。所有在一些视频量很大的情况下,都不会给视频加上真正的水印。而取而代之的一般都是通过JS之类得来进行控制。其中包括广告投放之类。下面请看一个火山小视频的分享【需要工具的请直接滑动至底部】。

https://www.huoshan.com/share/video/XXX/?tag=0&share_ht_uid=XXX&did=XXX&utm_medium=huoshan_android&tt_from=mobile_qq&iid=XXX&app=live_stream

关键部分我已经隐去。我们要分析的是源码,右键源代码查看,并且定位到这一段代码

<script>
    $(function(){
        __M.require('web:component/reflow_video/reflow_video').create({data:{"status":102,"create_time":1507085206,"video":{"url_list":["http:\/\/hotsoon.snssdk.com\/hotsoon\/item\/video\/_playback\/?video_id=c1a5a55e34dd43f8830769a960d78718\u0026line=0\u0026watermark=1\u0026app_id=1112","http:\/\/hotsoon.snssdk.com\/hotsoon\/item\/video\/_playback\/?video_id=c1a5a55e34dd43f8830769a960d78718\u0026line=1\u0026watermark=1\u0026app_id=1112"],"cover":{"url_list":["http:\/\/p3.pstatp.com\/large\/3d3700015003e47a367b.jpg","http:\/\/pb9.pstatp.com\/large\/3d3700015003e47a367b.jpg","http:\/\/pb3.pstatp.com\/large\/3d3700015003e47a367b.jpg"],"uri":"large\/3d3700015003e47a367b"},"uri":"c1a5a55e34dd43f8830769a960d78718","height":960,"width":540,"duration":15.0},"location":"\u6069\u65bd","media_type":4,"text":"","author":{"city":"\u6e58\u897f","fan_ticket_count":64100,"avatar_large":{"url_list":["http:\/\/p1.pstatp.com\/live\/1080x1080\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/1080x1080\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/1080x1080\/3b1f00072ab16d4b2c92.jpg"],"uri":"1080x1080\/3b1f00072ab16d4b2c92"},"short_id":147138771,"level":1,"gender":1,"app_id":1112,"id_str":"60565083574","avatar_medium":{"url_list":["http:\/\/p1.pstatp.com\/live\/720x720\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/720x720\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/720x720\/3b1f00072ab16d4b2c92.jpg"],"uri":"720x720\/3b1f00072ab16d4b2c92"},"signature":"\u539f\u521b\u641e\u7b11\u6b4c\u624b\uff1a\u6728\u4fa0\n\u6bcf\u592921:00\u201400:00\u76f4\u64ad\nV\ud83d\udc97\uff1agwmx666\uff08\u6ce8\u660e\u7c89\u4e1d\uff09\n\u641e\u7b11\u6211\u662f\u8ba4\u771f\u7684\uff01\u5531\u6b4c\u6211\u662f\u8ba4\u771f\u7684\uff01","avatar_thumb":{"url_list":["http:\/\/p1.pstatp.com\/live\/100x100\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/100x100\/3b1f00072ab16d4b2c92.jpg","http:\/\/pb3.pstatp.com\/live\/100x100\/3b1f00072ab16d4b2c92.jpg"],"uri":"100x100\/3b1f00072ab16d4b2c92"},"nickname":"\u6b4c\u738b\u6728\u4fa0\ud83d\udd25\u783410\u4e07","id":60565083574},"id":"6472880201427602701","stats":{"play_count":1460073,"share_count":3696,"ticket":2519,"digg_count":11373,"income":25190}}});
    });
</script>

这里的一段json里面就包含了真实的URL地址。也就是http:\/\/hotsoon.snssdk.com\/hotsoon\/item\/video\/_playback\/?video_id=c1a5a55e34dd43f8830769a960d78718\u0026line=0\u0026watermark=1\u0026app_id=1112这个啦。当然,这个从\u0026watermark后面的就不需要了。这时候真实地址就是http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=c1a5a55e34dd43f8830769a960d78718然后就可以快乐的下载啦。另外,如果我们需要批量解析一个用户的所有视频怎么办呢?其实流程也是非常简单的,逻辑上来分析其实就是获取源码,然后正则匹配网址,再用上面的方法来解析真实的URL地址。我们来看分享的网址一个例子。

https://www.huoshan.com/share/user/xxx/?share_ht_uid=xxx&did=xxx&utm_medium=huoshan_android&tt_from=mobile_qq&iid=xxx&app=live_stream

其实这个分享的网址可以缩短,精简过后是这样的https://www.huoshan.com/share/user/XXX。我们使用审查元素的NETWORK来监视一下请求,可以发现这样一个请求

火山小视频无水印

火山小视频无水印

他的返回是一段Json

{
    "status_code": 0,
    "data": {
        "items": [
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=9e4ad50afef547dd84381288326d0832&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=9e4ad50afef547dd84381288326d0832&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p1.pstatp.com/large/3d5f0011f93017828cda.jpg",
                            "http://pb3.pstatp.com/large/3d5f0011f93017828cda.jpg",
                            "http://pb3.pstatp.com/large/3d5f0011f93017828cda.jpg"
                        ],
                        "uri": "large/3d5f0011f93017828cda"
                    },
                    "uri": "9e4ad50afef547dd84381288326d0832",
                    "height": 960,
                    "width": 540,
                    "duration": 14.878
                },
                "id": "6473436884646235405"
            },
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=60839016314c42f08a830055c6cc2dbd&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=60839016314c42f08a830055c6cc2dbd&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p3.pstatp.com/large/3d53000f723fc9a1767b.jpg",
                            "http://pb9.pstatp.com/large/3d53000f723fc9a1767b.jpg",
                            "http://pb3.pstatp.com/large/3d53000f723fc9a1767b.jpg"
                        ],
                        "uri": "large/3d53000f723fc9a1767b"
                    },
                    "uri": "60839016314c42f08a830055c6cc2dbd",
                    "height": 960,
                    "width": 540,
                    "duration": 14.512
                },
                "id": "6473329244683373837"
            },
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=900439866a5346369df3a3d3347c2eca&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=900439866a5346369df3a3d3347c2eca&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p3.pstatp.com/large/3d53000e32ba9d10f4a1.jpg",
                            "http://pb9.pstatp.com/large/3d53000e32ba9d10f4a1.jpg",
                            "http://pb3.pstatp.com/large/3d53000e32ba9d10f4a1.jpg"
                        ],
                        "uri": "large/3d53000e32ba9d10f4a1"
                    },
                    "uri": "900439866a5346369df3a3d3347c2eca",
                    "height": 960,
                    "width": 540,
                    "duration": 12.772
                },
                "id": "6473326070073396493"
            },
            {
                "video": {
                    "url_list": [
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=d0ff8774756b4f8ea6e3ec7865b7ca9e&line=0&watermark=1&app_id=1112",
                        "http://hotsoon.snssdk.com/hotsoon/item/video/_playback/?video_id=d0ff8774756b4f8ea6e3ec7865b7ca9e&line=1&watermark=1&app_id=1112"
                    ],
                    "cover": {
                        "url_list": [
                            "http://p3.pstatp.com/large/3d36000ceb535fb8b56d.jpg",
                            "http://pb9.pstatp.com/large/3d36000ceb535fb8b56d.jpg",
                            "http://pb3.pstatp.com/large/3d36000ceb535fb8b56d.jpg"
                        ],
                        "uri": "large/3d36000ceb535fb8b56d"
                    },
                    "uri": "d0ff8774756b4f8ea6e3ec7865b7ca9e",
                    "height": 960,
                    "width": 540,
                    "duration": 14.97
                },
                "id": "6472941336277290253"
            }
        ]
    },
    "extra": {
        "has_more": true,
        "max_time": 1507099123
    }
}

我裁剪了一大段Json。然后我们分析一下这个请求https://www.huoshan.com/share/load_videos/?offset=0&count=21&user_id=xxx。其实这个offset就是开始的值。比如说要从0开始获取 则offset=0.然后这个count是取到少值。比如offset=0 count=20则代表着取从0个到第20个视频。但是在这里我们需要注意的是,第一次请求是这样的没错。但是第二次请求就稍稍有些变化了。我们尝试在视频栏上进行一下加载更多。这时候有了一个新的请求

批量解析火山小视频

批量解析火山小视频

相信大家都看到了 这里多了一个max_time的参数。这个max_time是个时间戳。这里不转换成北京时间。其实这里就需要注意一下了。因为你会发现,在变换了offset值时 并且没设定正确的max_time时候。返回的内容是不会变的。就好比你https://www.huoshan.com/share/load_videos/?offset=21&count=21&user_id=xxx&max_time=1507099123和https://www.huoshan.com/share/load_videos/?offset=51&count=21&user_id=xxx&max_time=1507099123的时候。返回是一样的。所以这里就涉及到如何取这个max_time的值。其实吧,这个max_time只要从上一次取到的json里就可以得到这个值了。还记得我们第一次请求时候用到的API嘛?这个时候是不带max_time的。但是json里包含了这个的值。所以大致流程是这样的

第一次请求->获取max_time来构造第二次请求->从第二次请求获取max_time来构造第三次请求

那么代码该如何编写呢?写一个伪代码给大家看一下

int count=400
for(int i=0;i<=count/20;i++)
{
       Cstirng aa.format("url......%s",i*20);
       
}

哈哈  有些丑。不继续写了。其实意思就是。我们取整,得到循环多少次。这里的count代表的是视频的总个数。这个可以从用户首页的那个json里得到。然后这里除以20是我一次只请求20条。然后这个cstrign的一个format是为了构造请求。然后我们获取返回的Json并且解析就可以了。

火山小视频批量解析工具

火山小视频批量解析工具

另外附上PHP写得单条URL解析源码

<?php
	function get_between($input, $start, $end){
	$substr = substr($input, strlen($start)+strpos($input, $start),
	(strlen($input) - strpos($input, $end))*(-1));
	return $substr;}
	if(isset($_GET['u'])){
		$res=file_get_contents($_GET['u']);
		$res=str_replace("\/","/",$res);
		//file_put_contents("huoshan.txt",$res);
		$realurl=get_between($res,"{\"url_list\":[\"","\u0026line=0");
		echo "地址为:".$realurl;
	}else
	{	echo "URL为空"; }
?>

代码写得有些丑,请见谅。

未经允许不得转载:卧栏听雨 » 一键解析火山视频用户所有视频地址
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址