【php源码】看小姐姐唱歌,来自52pj某网友发帖挨删了

@Ta 2023-05-08发布,2023-05-09修改 909点击

源码是一个看小姐姐唱歌的短视频,无水印。貌似原理是一个名叫Joyful.php的php负责提供url相关参数,html的<video>标签负责播放。

演示:(25楼解决了一个BUG,貌似现在可以在任何浏览器中使用了,也包括手机浏览器)

飞机 >> 心情愉悦

原帖源码我用不了,就拜托GPT帮改了,虽然还是很难用!但至少能用

难用:
目前我只能用Microsoft Edge播放,手机浏览器和谷歌浏览器都不能播放。 以及没有下一个视频的控件,首次打开貌似需要手动播放,然后等播放完,它自动播放下一个视频。而且有概率在某个视频循环多次,离谱的是它居然能自己跳过去,这个应该不算bug,按我的理解就是数组里有多条重复数据吧

这贴超过3个评论就奉上源码
源码:视频效果在3楼,源码在5楼

回复列表(44|隐藏机器人聊天)
  • @Ta / 2023-05-08 / /

    via无法播放,我想知道干嘛的?循环观看小姐姐?

  • @Ta / 2023-05-08 / /
    @艾木友尔尔巴,是的,循环播放某音随机小姐姐唱歌的,一分钟以内那种短视频,不知道哪个环节出问题了,目前无法解析JSON,可能是我的IP被禁了
  • @Ta / 2023-05-08 / /

    这不是超过三个评论了吗
    小米11PRO(黑)

  • @Ta / 2023-05-09 / /

    效果在3楼,源码在5楼

    源码: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;
    }
    ?>
    
  • @Ta / 2023-05-08 / /
    效果在3楼,源码在5楼,@没落的情绪@艾木友尔尔巴
  • @Ta / 2023-05-08 / /

    @TabKey9,你的效果是没法用了吗?
    小米11PRO(黑)

  • @Ta / 2023-05-08 / /

    @TabKey9,丢到服务器,效果和你的一样
    小米11PRO(黑)

  • @Ta / 2023-05-08 / /
    @没落的情绪,指望不上了,拿去得改的,还不如你重写算了,代码中,有一个列表:https://gitee.com/QQ-2731371/codes/nxe5yoirc9l8s70dzvawh50/raw?blob_name=JoyfulList

    每一个值代表一个视频id,然后拼到解析url上,会得到一个无水印的视频源,'https://aweme.snssdk.com/aweme/v1/play/?video_id=' . $video_id

    可以直接浏览器中播放或者放<video>标签上播放,大致就是这么回事!!!
  • @Ta / 2023-05-08 / /
    @没落的情绪,虽然很难用,但我还是能勉强用Edge浏览器访问的!(前提是不删Cookies)
  • @Ta / 2023-05-09 / /

    @没落的情绪,你试试把这段代码写进浏览器中的Cookies,说不定能用哦,我就是这么解决的。
    微信截图_20230509162445.png(837.46 KB)
    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

  • @Ta / 2023-05-09 / /

    @TabKey9,确实可以,在火狐浏览器上面试了,谷歌浏览器和Edge浏览器不知道咋添加Cookies
    小米11PRO(黑)

  • @Ta / 2023-05-09 / /

    @ChatGPT,帮我写一段前端js代码:检查客户端浏览器Cookies中一个叫next的值,如果不存在,则创建该值,key是next,value是{%22play_addr%22:%22&mime_type=video_mp4%22}}

  • @Ta / 2023-05-09 / /

    [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的过期时间或域名。

  • @Ta / 2023-05-09 / /
    @ChatGPT,加上过期时间60
  • @Ta / 2023-05-09 / /

    @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的字符串中。

  • @Ta / 2023-05-09 / /
    被锁定
    层主 @TabKey9 于 2023-05-09 18:35 删除了该楼层。
  • @Ta / 2023-05-09 / /
    被锁定
    楼主 @TabKey9 于 2023-05-09 18:35 删除了该楼层,理由如下:

    无关回复

  • @Ta / 2023-05-09 / /
    被锁定
    层主 @TabKey9 于 2023-05-09 18:35 删除了该楼层。
添加新回复
回复需要登录