// ==UserScript==
// @name 获取网页版抖音直播流地址、视频地址,获取网页版快手视频地址
// @namespace http://tampermonkey.net/
// @version 1.9.0
// @description 获取网页版抖音直播流地址,可直接使用VLC播放器播放,在VLC内选择Open Network,粘贴地址打开即可,本脚本参考了@xiaozhuai的虎牙直播流获取脚本
// @author nefer pitou
// @match *.douyin.com/*
// @match *.kuaishou.com/*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
var url = window.location.href; /* 获取完整URL */
function heredoc(fn) {
return fn.toString().split('\n').slice(1,-1).join('\n') + '\n'
}
var boxHtml = '暂无资源';
var render_data = '';
//(https|http)(://live\.douyin\.com/)(\w+)
//直播模块
var reg_live = /(https:\/\/live\.douyin\.com\/)([A-Za-z0-9]+)/;
if (reg_live.test(url)){
//console.log('***************');
render_data = decodeURIComponent(document.getElementById('RENDER_DATA').innerHTML);
//console.log(render_data);
render_data = JSON.parse(render_data);
var stream_url = render_data.initialState.roomStore.roomInfo.room.stream_url;
//未开播
if (stream_url == null){
boxHtml = '状态: 未开播<br>';
}else{
boxHtml = '状态: 正在直播<br>';
var flv_urls = stream_url.flv_pull_url;
var hls_urls = stream_url.hls_pull_url_map;
//console.log(flv_urls);
//console.log(hls_urls);
/*
原画FULL_HD1,超清HD1,高清SD1,标清SD2
*/
try{
var data = [];
//console.log(flv_urls);
if (flv_urls.FULL_HD1 != undefined){
data.push({
label: '(flv) 原画',
url: flv_urls.FULL_HD1,
});
}
if (flv_urls.HD1 != undefined){
data.push({
label: '(flv) 超清',
url: flv_urls.HD1,
});
}
if (flv_urls.SD1 != undefined){
data.push({
label: '(flv) 高清',
url: flv_urls.SD1,
});
}
if (flv_urls.SD2 != undefined){
data.push({
label: '(flv) 标清',
url: flv_urls.SD2,
});
}
//console.log(hls_urls);
if (hls_urls.FULL_HD1 != undefined){
data.push({
label: '(m3u8) 原画',
url: hls_urls.FULL_HD1,
});
}
if (hls_urls.HD1 != undefined){
data.push({
label: '(m3u8) 超清',
url: hls_urls.HD1,
});
}
if (hls_urls.SD1 != undefined){
data.push({
label: '(m3u8) 高清',
url: hls_urls.SD1,
});
}
if (hls_urls.SD2 != undefined){
data.push({
label: '(m3u8) 标清',
url: hls_urls.SD2,
});
}
for(var j=0; j<data.length; j++) {
boxHtml += '<div class="flv-url-item"><label>'+data[j].label+'</label><input id="flv-url-'+j+'" value="'+data[j].url+'"/><a onclick="copyFlvUrl('+j+')">复制</a></div>';
}
}catch(e){
boxHtml += '解析流数据错误';
console.error(e);
}
}
}
window.toggleFlvUrlBox = function() {
var flvUrlBoxBtn = document.getElementById('flv-url-box-btn');
var flvUrlBox = document.getElementById('flv-url-box');
if(flvUrlBox.style.display==='none'){
//主页推荐或关注页,由于页面延迟加载的关系,所以这里点击了按钮再解析页面
url = window.location.href;
console.log('111',url);
//#######################
//***********快手************
//快手短视频
//www.kuaishou.com/short-video/3xq4ragn6i4prki
var reg_kuaishou_short_video = /(https:\/\/www\.kuaishou\.com\/short-video\/)([A-Za-z0-9]+)/;
//快手长视频
//https://www.kuaishou.com/video/3xbp249kb66qniy
var reg_kuaishou_long_video = /(https:\/\/www\.kuaishou\.com\/video\/)([A-Za-z0-9]+)/;
if (reg_kuaishou_short_video.test(url) || reg_kuaishou_long_video.test(url)){
let video_url = document.getElementsByClassName('kwai-player-container-video')[0].getElementsByClassName('player-video')[0].getAttribute('src');
console.log('video_url=',video_url)
let k = 0;
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = "";
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '视频地址:';
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value',video_url);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
//快手电影
//https://www.kuaishou.com/movie/video/3x9754j2vm2piq6
/*
var reg_kuaishou_movie = /(https:\/\/www\.kuaishou\.com\/movie\/video\/)([A-Za-z0-9]+)/;
if (reg_kuaishou_movie.test(url)){
let video_url = document.getElementsByClassName('kwai-player-container-video')[0].getElementsByClassName('player-video')[0].getAttribute('src');
console.log('video_url=',video_url)
let k = 0;
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = "";
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '视频地址:';
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value',video_url);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
*/
//快手直播
//https://live.kuaishou.com/u/du907432053
//var reg_kuaishou_live = /(https:\/\/live\.kuaishou\.com\/u\/)([A-Za-z0-9_]+)/;
//if (reg_kuaishou_live.test(url)){
//}
//***********快手************
//#######################
if (url == 'https://www.douyin.com/' || url == 'https://www.douyin.com/follow' || url == 'https://www.douyin.com/?enter=guide'){
console.log(url);
console.log('嘻嘻');
let swiper_slide_active = document.getElementsByClassName('swiper-slide-active')[0];
//console.log('swiper_slide_active=',swiper_slide_active);
let video = swiper_slide_active.getElementsByTagName('video')[0];
if (video != undefined){//处理出现直播的情况
let src = video.getAttribute('src');
console.log('src:',src);
if (src == null){
let sources = video.getElementsByTagName('source');
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = "";
for(let k=0; k<sources.length-1; k++){
let src = sources[k].getAttribute('src');
console.log('src:',src);
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '线路'+(k+1);
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value','https:'+src);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
}else {
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = "";
let k=0;
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '线路'+(k+1);
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value','https:'+src);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
}
}
//视频详情页模块
let reg_video = /(https|http)(:\/\/www\.douyin\.com\/video\/)(\w+)/;
if (reg_video.test(url)){
url = window.location.href;
let video_wrap = document.getElementsByClassName('videoWrap')[0];
let video = video_wrap.getElementsByTagName('video')[0];
let src = video.getAttribute('src');
console.log('src:',src);
if (src == null){
let sources = video.getElementsByTagName('source');
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = "";
for(let k=0; k<sources.length-1; k++){
let src = sources[k].getAttribute('src');
console.log('src:',src);
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '线路'+(k+1);
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value','https:'+src);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
}else {
let url_box = document.getElementById('flv-url-box');
let k=0;
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '线路'+(k+1);
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value','https:'+src);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
}
//视频发现页模块、用户主页或喜欢页点开的视频、热点
//用户主页或喜欢页点开的视频 //https://www.douyin.com/user/MS4wLjABAAAA-Yr3RycEW3nCC0pTk9bAutYIpw3TrWKhQtdoAAEa_E8?modal_id=7097518943178427685
let reg_video_like_or_user_main_page = /(https|http)(:\/\/www\.douyin\.com\/user\/)([A-Za-z0-9_-]+)(\?modal_id=)(\d+)/;
//热点 //https://www.douyin.com/hot?modal_id=7095634337827278116
let reg_video_hot = /(https|http)(:\/\/www\.douyin\.com\/hot)(\?modal_id=)(\d+)/;
//视频发现页模块 https://www.douyin.com/discover
let reg_discover = /(https|http)(:\/\/www\.douyin\.com\/discover\?)(\w+)/;
//在follow页点开喜欢或私信里的视频
//https://www.douyin.com/follow?modal_id=7121889142207728904
let reg_follow_click = /(https:\/\/www\.douyin\.com\/follow\?modal_id=)(\d+)/;
if (reg_discover.test(url) || reg_video_like_or_user_main_page.test(url) || reg_video_hot.test(url) || reg_follow_click.test(url)){
url = window.location.href;
console.log('url=',url);
let video_wrap = document.getElementsByClassName('xg-video-container')[0];
let video = video_wrap.getElementsByTagName('video')[0];
let sources = video.getElementsByTagName('source');
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = "";
for(let k=0; k<sources.length-1; k++){
let src = sources[k].getAttribute('src');
console.log('src:',src);
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = '线路'+(k+1);
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+k);
input.setAttribute('value','https:'+src);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+k+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
}
//综艺视频详情页 //https://www.douyin.com/vsdetail/7088599135993353253
let reg_vsdetail = /(https:\/\/www\.douyin\.com\/vsdetail\/)([A-Za-z0-9]+)/;
if (reg_vsdetail.test(url)){
//console.log('***************');
render_data = decodeURIComponent(document.getElementById('RENDER_DATA').innerHTML);
//console.log(render_data);
render_data = JSON.parse(render_data);
let firstDisplayData = render_data['65'].firstDisplayData;
//标题 //袁娅维强力助阵热歌 杨宗纬唱跳初舞台引争议
let title = firstDisplayData.videoTitle;
console.log(title);
//节目当前期数 //第2期
let videoCurrentPeriod = firstDisplayData.videoCurrentPeriod;
console.log(videoCurrentPeriod);
//节目名+季数 //为歌而赞第二季
let showName = firstDisplayData.showName;
console.log(showName);
//视频信息数组
let videoPlayInfo = firstDisplayData.videoPlayInfo;
console.log(videoPlayInfo);
//历遍
let url_box = document.getElementById('flv-url-box');
url_box.innerHTML = showName+videoCurrentPeriod+':'+title+'<br>';
for (let len=videoPlayInfo.length,i=0; i<len-1; i=i+1){
//清晰度 //1080p
let definition = videoPlayInfo[i].definition
console.log(definition);
let video_main_url = videoPlayInfo[i].main
console.log(video_main_url);
let video_backup_url = videoPlayInfo[i].backup
console.log(video_backup_url);
let div = document.createElement("div");
div.setAttribute('class','flv-url-item');
let label = document.createElement("label");
label.innerText = definition;
div.appendChild(label);
let input = document.createElement("input");
input.setAttribute('id', 'flv-url-'+i);
input.setAttribute('value',video_main_url);
div.appendChild(input);
let a = document.createElement("a");
a.setAttribute('onclick','copyFlvUrl('+i+')');
a.innerText = '复制';
div.appendChild(a);
url_box.appendChild(div);
}
}
flvUrlBox.style.display='block';
}else{
flvUrlBox.style.display='none';
if (reg_live.test(url) == false){
let parent_node = document.getElementById('flv-url-box');
let tags = document.getElementsByClassName('flv-url-item');
for (let len=tags.length; len>0; len=len-1){
parent_node.removeChild(tags[0]);
}
parent_node.innerHTML = "暂无资源";
}
}
}
window.copyFlvUrl = function(index) {
var input = document.getElementById('flv-url-'+index);
input.select();
document.execCommand("Copy");
var flvUrlBox = document.getElementById('flv-url-box');
flvUrlBox.style.display='none';
}
var wrapper = document.createElement("div");
wrapper.style.display = 'inline-block';
wrapper.innerHTML = heredoc(function(){/*
<style>
#flv-url-box-btn {
width: 32px;
height: 32px;
cursor: pointer;
background-color: #ffffff;
top: 70px;
right: 70px;
position: fixed;
z-index: 1000000;
border-radius: 4px;
border: 1px solid #cccccc;
}
#flv-url-box-btn:hover{
box-shadow: 0 0 8px #0ca4d4;
}
#flv-url-box {
top: 115px;
right: 40px;
border: 1px solid #808080;
border-radius: 6px;
background-color: #ffffff;
padding: 8px;
position: fixed;
z-index: 1000000;
}
#flv-url-box .flv-url-item{
margin: 4px 0;
}
#flv-url-box .flv-url-item>*{
border: 1px solid #808080;
margin-left: -1px;
vertical-align: top;
}
#flv-url-box .flv-url-item>*:first-child{
border-top-left-radius: 6px;
border-bottom-left-radius: 6px;
margin-left: 0;
}
#flv-url-box .flv-url-item>*:last-child{
border-top-right-radius: 6px;
border-bottom-right-radius: 6px;
}
#flv-url-box .flv-url-item input{
top: 0;
width: 240px;
height: 24px;
padding: 0 4px;
}
#flv-url-box .flv-url-item input:focus{
outline: none;
border-color: #0ca4d4;
}
#flv-url-box .flv-url-item a{
user-select: none;
padding: 0 4px;
cursor: pointer;
font-size: 12px;
line-height: 24px;
height: 24px;
display: inline-block;
background-color: #ffffff;
color: #333;
}
#flv-url-box .flv-url-item label{
user-select: none;
text-align: left;
padding-left: 12px;
width: 100px;
font-size: 12px;
line-height: 24px;
height: 24px;
display: inline-block;
background-color: #ffffff;
color: #333;
}
#flv-url-box .flv-url-item a:hover{
border-color: #0ca4d4;
color: #0ca4d4;
}
</style>
<div>
<img id="flv-url-box-btn" onclick="toggleFlvUrlBox()" src="data:image/png;base64,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ZW1hZ2ljay9zaGFyZS9kb2MvSW1hZ2VNYWdpY2stNy8vaW5kZXguaHRtbL21eQoAAABjdEVYdHN2Zzpjb21tZW50ACBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE5LjAuMCwgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIM5IkAsAAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAYdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADc3NUQ3tcoAAAAXdEVYdFRodW1iOjpJbWFnZTo6V2lkdGgAODgzsmEbUAAAABl0RVh0VGh1bWI6Ok1pbWV0eXBlAGltYWdlL3BuZz+yVk4AAAAXdEVYdFRodW1iOjpNVGltZQAxNDg5OTM1NzUz3MRh0wAAABJ0RVh0VGh1bWI6OlNpemUAMjU4NzdCDe2HSgAAAF90RVh0VGh1bWI6OlVSSQBmaWxlOi8vL2hvbWUvd3d3cm9vdC9zaXRlL3d3dy5lYXN5aWNvbi5uZXQvY2RuLWltZy5lYXN5aWNvbi5jbi9zcmMvMTIwNzcvMTIwNzcxMS5wbmcp913KAAAAAElFTkSuQmCC" />
<div id="flv-url-box" style="display: none;">__box_html__</div>
<div>
*/}).replace('__box_html__', boxHtml);
document.body.append(wrapper);
console.log('####### end ######');
})();