标题: 【php源码】看小姐姐唱歌,来自52pj某网友发帖挨删了
时间: 2023-05-08发布,2023-05-09修改
源码是一个看小姐姐唱歌的短视频,无水印。貌似原理是一个名叫Joyful.php
的php负责提供url相关参数,html的<video>标签负责播放。
原帖源码我用不了,就拜托GPT帮改了,虽然还是很难用!但至少能用
。
难用:
目前我只能用 以及没有下一个视频的控件,首次打开貌似需要手动播放,然后等播放完,它自动播放下一个视频。而且有概率在某个视频循环多次,离谱的是它居然能自己跳过去,这个应该不算bug,按我的理解就是数组里有多条重复数据吧Microsoft Edge
播放,手机浏览器和谷歌浏览器都不能播放。
这贴超过3个评论就奉上源码
源码:视频效果在3楼,源码在5楼
『回复列表(44|隐藏机器人聊天)』
源码:Joyful.zip(2.24 KB) 不是我有意转载不留作者名,实在是帖子删太快了,我也不知道作者是谁?
新源码:Joyful.zip(2.95 KB)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>心情愉悦</title>
<meta name="renderer" content="webkit">
<meta name="referrer" content="never">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<script src="https://cdn.bootcdn.net/ajax/libs/js-cookie/3.0.1/js.cookie.js"></script>
</head>
<body>
<div class="container" id="player">
<video id="video" controls autoplay style="width: 100%;"></video>
</div>
<button id="start">开始运行</button>
<script>
const cookiesMap = new Map(document.cookie.split('; ').map(cookie => cookie.split('=')).map(([name, value]) => [decodeURIComponent(name), decodeURIComponent(value)]));
if (!cookiesMap.has('next')) {
const nextValue = '{"play_addr":"https://v11-cold.douyinvod.com/d63bb47ebac366828348c6ef6b914a45/6458cfe0/video/tos/cn/tos-cn-ve-15/ok3EDlbrgEW9AI1kjDUKOrejAoAtNXbcBzQfno/?a=1128&ch=0&cr=0&dr=0&cd=0%7C0%7C0%7C0&cv=1&br=1586&bt=1586&cs=0&ds=3&ft=nK5C30071u7vpihBH6xRf4pHT4BO5.DQqhdz7tG&mime_type=video_mp4&qs=0&rc=ZTo7NGU1N2lpNDw7aGRoM0BpanNlPGU6ZmdxaDMzNGkzM0AxX2IvM2BiX18xNWFiMWNeYSNzNW82cjRvL2pgLS1kLWFzcw%3D%3D&l=2023050817324680B3BA69F50CC900CB44&btag=e00090000","video_id":"v0d00fg10000cemn2drc77ub99rb8pvg","run_time":"1,024.2","new_play_addr":"blob:https://xiaojiejie.tlip.cn/aa9ca169-de30-4865-8947-b0b4bf17b9e5"}';
setCookie('next', nextValue, 60);
}
function setCookie(name, value, expireSeconds, path='/') {
const expires = new Date();
expires.setTime(expires.getTime() + expireSeconds * 1000);
const cookieValue = encodeURIComponent(name) + '=' + encodeURIComponent(value) + (expires ? '; expires=' + expires.toUTCString() : '') + '; path=' + path;
cookiesMap.set(name, cookieValue);
document.cookie = cookieValue;
}
let data;
function startVideo() {
var result = JSON.parse(Cookies.get('next'));
$('#player').show();
$('#start').hide();
$('#video').attr('src', result.play_addr);
load();
}
let video = document.getElementById('video');
video.style.width = window.innerWidth + 'px';
video.style.height = window.innerHeight + 'px';
video.onended = function() {
var result = JSON.parse(Cookies.get('next'));
$('#video').attr('src', result.new_play_addr);
load();
}
function downloadBlobFile(_method, _url) {
const request = new XMLHttpRequest();
request.open(_method, _url);
request.send();
request.responseType = 'blob';
return request;
}
function load() {
$.ajax({
type: 'get',
url: 'Joyful.php',
async: true,
success: function(result) {
downloadBlobFile('GET', result.play_addr).onreadystatechange = res => {
if (res.currentTarget.readyState == 4 && res.currentTarget.status == 200) {
result.new_play_addr = window.URL.createObjectURL(res.currentTarget.response);
result = JSON.stringify(result);
Cookies.set('next', result, 60);
var video = $('#video');
video.attr('src', result.play_addr);
video[0].onended = function() {
var result = JSON.parse(Cookies.get('next'));
$('#video').attr('src', result.new_play_addr);
load();
};
$('#player').show();
}
}
},
error: function() {
//layer.msg('加载失败,等待下一次加载...');
}
});
}
$(document).ready(function() {
startVideo();
});
</script>
</body>
</html>
<?php
if ((isset($_SERVER["HTTP_X_REQUESTED_WITH"]) && strtolower($_SERVER["HTTP_X_REQUESTED_WITH"]) == "xmlhttprequest") || isset($_GET['jump'])) {
$starttime = microtime(1);
$result['run_time'] = number_format((microtime(1) - $starttime) * 1000, 1);
$listApi = 'https://gitee.com/QQ-2731371/codes/nxe5yoirc9l8s70dzvawh50/raw?blob_name=JoyfulList'; // 可自己进行收集整理,这不算推广地址吧?
$video_id = get_video_id($listApi);
$result = array();
$result['play_addr'] = getRedirect('https://aweme.snssdk.com/aweme/v1/play/?video_id=' . $video_id);
$result['video_id'] = $video_id;
$result['run_time'] = number_format((microtime(1) - $starttime) * 1000, 1);
if (isset($_GET['jump'])) {
header('Location: ' . $result['play_addr']);
}
header("Content-Type: application/json");
echo json_encode($result);
exit('');
}
function get_video_id($Api)
{
$cache = __DIR__ . '/Joyful.txt';
if (is_file($cache)) {
$Data = unserialize(file_get_contents($cache));
if (count($Data) == 0) {
$Data = json_decode(file_get_contents($cache), true);
}
} else {
$Data = json_decode(file_get_contents($Api), true);
}
$key = rand(0, count($Data) - 1);
$video_id = $Data[$key];
unset($Data[$key]);
file_put_contents($cache, serialize(array_values($Data)));
return $video_id;
}
function getRedirect($Url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $Url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Accept: */*',
'Accept-Encoding: gzip',
'Connection: Keep-Alive',
'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)'
));
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$ret = curl_exec($ch);
curl_close($ch);
preg_match("/Location: (.*?)\r\n/iU", $ret, $location);
if (isset($location[1])) {
return $location[1];
}
return false;
}
?>
@没落的情绪,你试试把这段代码写进浏览器中的Cookies,说不定能用哦,我就是这么解决的。
Cookies:
next:
{%22play_addr%22:%22https://v11-cold.douyinvod.com/d63bb47ebac366828348c6ef6b914a45/6458cfe0/video/tos/cn/tos-cn-ve-15/ok3EDlbrgEW9AI1kjDUKOrejAoAtNXbcBzQfno/?a=1128&ch=0&cr=0&dr=0&cd=0%257C0%257C0%257C0&cv=1&br=1586&bt=1586&cs=0&ds=3&ft=nK5C30071u7vpihBH6xRf4pHT4BO5.DQqhdz7tG&mime_type=video_mp4&qs=0&rc=ZTo7NGU1N2lpNDw7aGRoM0BpanNlPGU6ZmdxaDMzNGkzM0AxX2IvM2BiX18xNWFiMWNeYSNzNW82cjRvL2pgLS1kLWFzcw%253D%253D&l=2023050817324680B3BA69F50CC900CB44&btag=e00090000%22%2C%22video_id%22:%22v0d00fg10000cemn2drc77ub99rb8pvg%22%2C%22run_time%22:%221%2C024.2%22%2C%22new_play_addr%22:%22blob:https://xiaojiejie.tlip.cn/aa9ca169-de30-4865-8947-b0b4bf17b9e5%22}
注意next
是key,{%22play_addr**17b9e5%22}才是value。
解码后长这样,末尾有个域名(替换成你自己的,虽然不放根目录也可以用,但当我第一次看到这个字符串结构的时候(我之前放在二级目录的),我还是考虑新建个站点给它用)
// 不要复制这个,仅供参考
{"play_addr":"https://v11-cold.douyinvod.com/d63bb47ebac366828348c6ef6b914a45/6458cfe0/video/tos/cn/tos-cn-ve-15/ok3EDlbrgEW9AI1kjDUKOrejAoAtNXbcBzQfno/?a=1128&ch=0&cr=0&dr=0&cd=0%7C0%7C0%7C0&cv=1&br=1586&bt=1586&cs=0&ds=3&ft=nK5C30071u7vpihBH6xRf4pHT4BO5.DQqhdz7tG&mime_type=video_mp4&qs=0&rc=ZTo7NGU1N2lpNDw7aGRoM0BpanNlPGU6ZmdxaDMzNGkzM0AxX2IvM2BiX18xNWFiMWNeYSNzNW82cjRvL2pgLS1kLWFzcw%3D%3D&l=2023050817324680B3BA69F50CC900CB44&btag=e00090000","video_id":"v0d00fg10000cemn2drc77ub99rb8pvg","run_time":"1,024.2","new_play_addr":"blob:https://xiaojiejie.tlip.cn/aa9ca169-de30-4865-8947-b0b4bf17b9e5"}
如图,我新建这个Cookies
之后,刷新就能用了
还有可能需要上个免费的域名证书ssl
[Default (GPT-3.5)] [新会话] @TabKey9,以下是一个简单的前端JS代码片段,它会检查浏览器的Cookie是否具有名为"next"的值。如果该值不存在,则将一个名为"next"、值为{%22play_addr%22:%22&mime_type=video_mp4%22}}
的Cookie添加到浏览器中:
// 检查浏览器Cookies中是否存在名为"next"的Cookie
if (!getCookie("next")) {
// 如果不存在,则创建一个名为"next",值为"{%22play_addr%22:%22&mime_type=video_mp4%22}}"的Cookie
setCookie("next", "{%22play_addr%22:%22&mime_type=video_mp4%22}}");
}
// 获取指定名称的Cookie的值
function getCookie(name) {
const cookies = document.cookie.split(';');
for(let i=0; i<cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.indexOf(name) === 0) {
return cookie.substring(name.length+1, cookie.length);
}
}
return null;
}
// 设置Cookie
function setCookie(name, value) {
document.cookie = name + "=" + value + "; path=/";
}
请注意,此代码仅为演示用途,并且可能需要根据您的特定需求进行修改。例如,您可能需要更改Cookie的过期时间或域名。
@TabKey9,下面是修改后的代码,它在创建Cookie时将过期时间设置为60秒:
if (!getCookie("next")) {
const value = encodeURIComponent('{"play_addr":"&mime_type=video_mp4"}');
setCookie("next", value, 60);
}
function getCookie(name) {
const cookies = document.cookie.split(';');
for(let i=0; i<cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.indexOf(name) === 0) {
return decodeURIComponent(cookie.substring(name.length+1, cookie.length));
}
}
return null;
}
function setCookie(name, value, expireSeconds) {
const expires = new Date();
expires.setTime(expires.getTime() + expireSeconds * 1000);
const cookieValue = encodeURIComponent(value) + (expires ? "; expires=" + expires.toUTCString() : '') + "; path=/";
document.cookie = name + "=" + cookieValue;
}
注意,我们在setCookie()
函数中添加了一个名为expireSeconds
的新参数,并将其用于设置Cookie的过期时间。我们还使用encodeURIComponent()
函数对值进行编码,并使用decodeURIComponent()
函数对其进行解码以防止出现特殊字符。在setCookie()
函数中,我们使用expires
变量创建一个新的Date对象,并将其设置为当前时间加上指定的秒数。最后,我们使用新的变量cookieValue
来设置Cookie,并将过期时间添加到Cookie的字符串中。