|
发表于 2024-12-25 00:21:09
|
显示全部楼层
- 问题分析:
- JavaScript 部分:
- 本地运行成功,网络运行失败: 这通常是由于跨域问题引起的。你本地运行时,直接打开 HTML 文件,没有跨域问题。但是,当你将 HTML 文件上传到服务器上后,JavaScript 代码会尝试从 api.juyun.tv 这个不同的域名获取数据,浏览器会阻止这种跨域请求,从而导致无法获取数据。
- 播放地址 ? 号后数据丢失: 这是因为 location.href 会对 URL 中的特殊字符(例如 ? )进行编码,这会导致部分数据丢失。
- PHP 部分:
- 可以获取 JSON 数据: 你使用 file_get_contents 从 API 获取 JSON 数据是正确的。
- JSON 解析和数据提取: 你使用 json_decode 和对象属性访问来提取 address 是正确的。
- openssl_decrypt 解密失败: 这是因为,正如我们之前讨论的,API 返回的 address 数据本身是经过 AES 加密的,在 客户端(JavaScript) 使用 CryptoJS.AES.decrypt 解密,而不是在 服务端(PHP) 解密。
- JavaScript 代码中解密逻辑正确:
- decryptByAES 函数使用 CryptoJS 的逻辑是正确的,可以解密 address 数据。
- 解决方案:
- 1. 解决 JavaScript 跨域问题:
- JSONP: 你在代码中使用了 dataType:"jsonp",这意味着你已经使用了 JSONP 来解决跨域问题。JSONP 的原理是利用 <script> 标签的 src 属性不受同源策略限制的特性,通过动态创建 <script> 标签来跨域获取数据。
- * 确保 API 支持 JSONP: 检查 http://api.juyun.tv/juxian/api/is_pay_tv.jsp 接口是否支持 JSONP 回调,并且在响应中返回正确的 JSONP 数据格式(通常是 callback({"data":"value"}) 格式)。你可以尝试在浏览器直接访问该接口,看看返回的数据格式。
- * 设置 callback 参数: 如果 API 需要一个特定的回调函数名作为参数,可以在 url 中设置 callback 参数: url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n[vid] + "&callback=myCallback", 同时修改 success 回调函数。
- $.ajax({
- type:"get",
- url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n[vid] + "&callback=myCallback",
- dataType:"jsonp",
- jsonpCallback: 'myCallback',
- success:function(data){
- address = data.address;
- address= decryptByAES(address,secretKey)
- location.href = "http://dsk.cc/p/video.html?id=http:"+address;
- }
- });
- Use code with caution.
- JavaScript
- 2. 解决 JavaScript 播放地址 ? 号后数据丢失问题:
- 使用 encodeURIComponent(): 使用 encodeURIComponent() 对 address 进行编码,这样 ? 等特殊字符就不会被浏览器转义,从而导致数据丢失。
- location.href = "http://dsk.cc/p/video.html?id=http:"+encodeURIComponent(address);
- Use code with caution.
- JavaScript
- 3. PHP 代码中解密逻辑:
- 移除 openssl_decrypt: openssl_decrypt 解密应该在客户端(JavaScript)进行,你已经在 JavaScript 代码中正确地实现了 AES 解密。 PHP 代码只需要获取原始的 address 数据。
- * 增加 id 参数判断: 在获取数据之前判断 id 的有效性,避免错误的 id 导致错误,或未定义错误。
- <?php
- $id = isset($_GET['id']) ? $_GET['id'] : 'xyzh';
- $n = [
- 'xyzh' => 157309, // 咸阳综合
- 'xygg' => 157314, // 咸阳公共
- ];
- if (isset($n[$id])) {
- $url = "http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=" . $n[$id];
- $d = file_get_contents($url);
- if ($d !== false) {
- $data = json_decode(str_replace(["(", ")"], "", $d), true);
- if (isset($data['address'])) {
- $address = $data['address'];
- echo $address;
- } else {
- echo "Error: address data not found";
- }
- } else {
- echo "Error: Failed to fetch data from API";
- }
- } else {
- echo "Error: Invalid ID provided";
- }
- ?>
- Use code with caution.
- PHP
- 修改后的代码:
- JavaScript:
- <script type="text/javascript" src="http://www.xybtv.com/js/jquery-1.11.1.min.js"></script>
- <script type="text/javascript" src="http://www.xybtv.com/js/pc/crypto-js.js"></script>
- <script>
- vid = 'xyzh';//location.href.split('html?id=')[1];;
- n=[];
- n['xyzh'] = 157309; //咸阳综合
- n['xygg'] = 157314; //咸阳公共
- secretKey = 'ji0e3G8RR/JrBULhyaJUdg==';
- $.ajax({
- type:"get",
- url:"http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id="+n[vid] + "&callback=myCallback",
- dataType:"jsonp",
- jsonpCallback: 'myCallback',
- success:function(data){
- address = data.address;
- address= decryptByAES(address,secretKey)
- location.href = "http://dsk.cc/p/video.html?id=http:"+encodeURIComponent(address);
- }
- });
- function decryptByAES(cipherText,keyInBase64Str) {
- let key = CryptoJS.enc.Base64.parse(keyInBase64Str);
- let decrypted = CryptoJS.AES.decrypt(cipherText, key, {
- mode: CryptoJS.mode.ECB,
- });
- return decrypted.toString(CryptoJS.enc.Utf8);
- }
- </script>
- Use code with caution.
- Html
- PHP:
- <?php
- $id = isset($_GET['id']) ? $_GET['id'] : 'xyzh';
- $n = [
- 'xyzh' => 157309, // 咸阳综合
- 'xygg' => 157314, // 咸阳公共
- ];
- if (isset($n[$id])) {
- $url = "http://api.juyun.tv/juxian/api/is_pay_tv.jsp?id=" . $n[$id];
- $d = file_get_contents($url);
- if ($d !== false) {
- $data = json_decode(str_replace(["(", ")"], "", $d), true);
- if (isset($data['address'])) {
- $address = $data['address'];
- echo $address;
- } else {
- echo "Error: address data not found";
- }
- } else {
- echo "Error: Failed to fetch data from API";
- }
- } else {
- echo "Error: Invalid ID provided";
- }
- ?>
- Use code with caution.
- PHP
- 总结:
- JavaScript:
- 确保使用 JSONP 来处理跨域问题。
- 使用 encodeURIComponent() 对 URL 参数进行编码。
- PHP:
- PHP 代码仅用于获取未解密的原始 address 数据。
- 增加 id 参数判断,防止错误。
复制代码
|
|