找回密码
 立即注册
搜索
热搜: 活动 交友
楼主: asyph

指动枣庄

[复制链接]

0

主题

15

回帖

42

积分

新手上路

积分
42
发表于 2025-11-1 05:32:58 来自手机 | 显示全部楼层
看看

0

主题

74

回帖

240

积分

中级会员

积分
240
发表于 2025-11-3 11:46:55 | 显示全部楼层
谢谢,非常感谢

0

主题

12

回帖

42

积分

新手上路

积分
42
发表于 2025-11-3 21:39:59 来自手机 | 显示全部楼层
看看学习学习

0

主题

179

回帖

473

积分

中级会员

积分
473
发表于 2025-11-6 16:47:46 来自手机 | 显示全部楼层
感谢

0

主题

19

回帖

113

积分

注册会员

积分
113
发表于 2025-11-29 12:39:13 | 显示全部楼层
谢谢分享

0

主题

45

回帖

141

积分

注册会员

积分
141
发表于 2026-1-11 22:00:21 | 显示全部楼层
感谢分享

0

主题

108

回帖

243

积分

中级会员

积分
243
发表于 2026-1-23 19:27:28 | 显示全部楼层
看看

0

主题

5

回帖

14

积分

新手上路

积分
14
发表于 2026-1-24 20:34:39 来自手机 | 显示全部楼层
感谢分享

0

主题

89

回帖

112

积分

注册会员

积分
112
发表于 2026-1-24 22:29:50 | 显示全部楼层
<?php

class Parser {
    private $session;
    private $cacheDir = __DIR__ . '/cache/';
   
    public function __construct() {
        $this->session = curl_init();
        curl_setopt_array($this->session, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false,
            CURLOPT_TIMEOUT => 10,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36',
            CURLOPT_ENCODING => 'gzip, deflate',
        ]);
        
        // 创建缓存目录
        if (!file_exists($this->cacheDir)) {
            mkdir($this->cacheDir, 0755, true);
        }
    }
   
    private function getStringMd5($s) {
        return md5($s);
    }
   
    private function getDateString($date) {
        return $date->format('Ym') . str_pad($date->format('d'), 2, '0', STR_PAD_LEFT);
    }
   
    private function getDdCalcu720p($puData, $programId) {
        $keys = "0123456789";
        $ddCalcu = [];
        
        for ($i = 0; $i < floor(strlen($puData) / 2); $i++) {
            $ddCalcu[] = $puData[strlen($puData) - $i - 1];
            $ddCalcu[] = $puData[$i];
            
            if ($i == 1) {
                $ddCalcu[] = "e";
            } elseif ($i == 2) {
                $dateStr = $this->getDateString(new DateTime());
                if (strlen($dateStr) > 6) {
                    $ddCalcu[] = $keys[intval($dateStr[6])];
                } else {
                    $ddCalcu[] = "0";
                }
            } elseif ($i == 3) {
                if (strlen($programId) > 2) {
                    $ddCalcu[] = $keys[intval($programId[2])];
                } else {
                    $ddCalcu[] = "0";
                }
            } elseif ($i == 4) {
                $ddCalcu[] = "0";
            }
        }
        
        return implode('', $ddCalcu);
    }
   
    private function getDdCalcuUrl720p($puDataUrl, $programId) {
        $urlParts = parse_url($puDataUrl);
        
        if (!isset($urlParts['query'])) {
            return $puDataUrl;
        }
        
        parse_str($urlParts['query'], $queryParams);
        
        if (!isset($queryParams['puData']) || empty($queryParams['puData'])) {
            return $puDataUrl;
        }
        
        $puData = $queryParams['puData'];
        $ddCalcu = $this->getDdCalcu720p($puData, $programId);
        $queryParams['ddCalcu'] = $ddCalcu;
        $newQuery = http_build_query($queryParams);
        
        return $urlParts['scheme'] . '://' . $urlParts['host'] . $urlParts['path'] . '?' . $newQuery;
    }
   
    private function getAndroidUrl720p($pid) {
        $timestamp = round(microtime(true) * 1000);
        $appVersion = "26000009";
        
        $headers = [
            "AppVersion: 2600000900",
            "TerminalId: android",
            "X-UP-CLIENT-CHANNEL-ID: 2600037000-99000-200300220100002",
            "Accept: application/json",
            "Accept-Language: zh-CN,zh;q=0.9,en;q=0.8",
            "Connection: keep-alive"
        ];
        
        $strToHash = $timestamp . $pid . $appVersion;
        $md5Hash = $this->getStringMd5($strToHash);
        
        $salt = 66666601;
        $suffix = "770fafdf5ba04d279a59ef1600baae98migu6666";
        $sign = $this->getStringMd5($md5Hash . $suffix);
        
        $rateType = 3;
        if ($pid == "608831231") {
            $rateType = 2;
        }
        
        $baseUrl = "https://play.miguvideo.com/playurl/v1/play/playurl";
        $params = "?sign=" . $sign . "&rateType=" . $rateType . "&contId=" . $pid . "&timestamp=" . $timestamp . "&salt=" . $salt;
        $fullUrl = $baseUrl . $params;
        
        curl_setopt($this->session, CURLOPT_URL, $fullUrl);
        curl_setopt($this->session, CURLOPT_HTTPHEADER, $headers);
        
        $response = curl_exec($this->session);
        
        if (curl_errno($this->session) || !$response) {
            return null;
        }
        
        $respData = json_decode($response, true);
        
        if (!$respData) {
            return null;
        }
        
        if ((isset($respData['code']) && $respData['code'] != '200') ||
            (isset($respData['resultCode']) && $respData['resultCode'] != '200')) {
            return null;
        }
        
        if (isset($respData['data']['url'])) {
            $url = $respData['data']['url'];
        } elseif (isset($respData['body']['urlInfo']['url'])) {
            $url = $respData['body']['urlInfo']['url'];
        } elseif (isset($respData['url'])) {
            $url = $respData['url'];
        } else {
            return null;
        }
        
        if (empty($url)) {
            return null;
        }
        
        return $this->getDdCalcuUrl720p($url, $pid);
    }
   
    // 获取缓存键名
    private function getCacheKey($pid, $playseek = null) {
        return 'video_' . md5($pid . ($playseek ? '_' . $playseek : ''));
    }
   
    // 从缓存获取URL
    private function getFromCache($pid, $playseek = null) {
        $cacheFile = $this->cacheDir . $this->getCacheKey($pid, $playseek);
        
        if (file_exists($cacheFile)) {
            return file_get_contents($cacheFile);
        }
        
        return null;
    }
   
    // 保存URL到缓存
    private function saveToCache($pid, $playseek = null, $url) {
        $cacheFile = $this->cacheDir . $this->getCacheKey($pid, $playseek);
        file_put_contents($cacheFile, $url);
    }
   
    // 删除缓存
    private function deleteCache($pid, $playseek = null) {
        $cacheFile = $this->cacheDir . $this->getCacheKey($pid, $playseek);
        if (file_exists($cacheFile)) {
            unlink($cacheFile);
        }
    }
   
    // 检查URL是否有效
    private function isUrlValid($url) {
        if (empty($url)) {
            return false;
        }
        
        // 创建一个新的cURL会话来检查URL有效性
        $ch = curl_init($url);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_NOBODY => true, // 只获取头部信息,不下载内容
            CURLOPT_HEADER => true,
            CURLOPT_TIMEOUT => 5,
            CURLOPT_FOLLOWLOCATION => true,
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Linux; Android 10; SM-G975F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Mobile Safari/537.36',
        ]);
        
        $response = curl_exec($ch);
        $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        
        // HTTP状态码为2xx或3xx表示URL有效
        return ($httpCode >= 200 && $httpCode < 400);
    }
   
    public function parse($params) {
        $pid = $params['id'] ?? "641886683";
        $playseek = $params['playseek'] ?? null;
        $forceRefresh = $params['refresh'] ?? false;
        
        // 如果强制刷新,删除缓存
        if ($forceRefresh) {
            $this->deleteCache($pid, $playseek);
        }
        
        // 尝试从缓存获取
        $cachedUrl = $this->getFromCache($pid, $playseek);
        
        if ($cachedUrl && !$forceRefresh) {
            // 检查缓存的URL是否仍然有效
            if ($this->isUrlValid($cachedUrl)) {
                return $cachedUrl;
            } else {
                // URL失效,删除缓存
                $this->deleteCache($pid, $playseek);
            }
        }
        
        // 重新获取URL
        $finalUrl = $this->getAndroidUrl720p($pid);
        
        if ($finalUrl && $playseek) {
            $parts = explode('-', $playseek);
            if (count($parts) == 2) {
                list($starttime, $endtime) = $parts;
                $separator = (strpos($finalUrl, '?') !== false) ? '&' : '?';
                $finalUrl .= $separator . "playbackbegin=" . $starttime . "&playbackend=" . $endtime;
            }
        }
        
        if ($finalUrl) {
            // 保存到缓存
            $this->saveToCache($pid, $playseek, $finalUrl);
        }
        
        return $finalUrl;
    }
   
    public function __destruct() {
        if ($this->session) {
            curl_close($this->session);
        }
    }
}

// 主程序
if (isset($_GET['id'])) {
    $parser = new Parser();
    $url = $parser->parse([
        'id' => $_GET['id'],
        'refresh' => isset($_GET['refresh']) // 可选:强制刷新参数
    ]);
   
    if ($url) {
        // 直接重定向到获取的URL
        header("Location: " . $url);
        exit;
    } else {
        http_response_code(500);
        echo "获取视频链接失败";
    }
} else {
    echo "示例: ?id=641886683<br>";
    echo "示例: ?id=641886683&refresh=1 (强制刷新缓存)";
}

0

主题

79

回帖

574

积分

高级会员

积分
574
发表于 2026-1-30 15:17:57 | 显示全部楼层
指动枣庄瞧瞧
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋| 吾看

GMT+8, 2026-5-15 00:57 Powered by Discuz! X3.5

本站以兴趣爱好为宗旨,非经营性质,不以任何形式收取任何费用,请勿相信一切有偿信息。 免责声明:本站上述内容来自网络,不得用于商业或非法用途,您必须在下载后24小时内,从设备中删除,否则后果自负。如内容侵犯您的版权、著作权,请联系我,第一时间处理。