1
0

8 کامیت‌ها 2a7c6f76d3 ... 58584ff29d

نویسنده SHA1 پیام تاریخ
  hjdhnx 58584ff29d 修复海阔可用 2 ماه پیش
  hjdhnx 0b4d76928f 新增源 2 ماه پیش
  hjdhnx 1b574e797a 新增源 2 ماه پیش
  hjdhnx b9a1d64b00 t4二级返回源类型 2 ماه پیش
  hjdhnx 4f4063e5e6 t4接口分类页增加源类型返回 2 ماه پیش
  hjdhnx 1ff2b17299 t4接口分类页增加源类型返回 2 ماه پیش
  晚风拂柳颜 cb42f04158 老白故事更新。发现疑似壳子bug。修复t4的body处理 2 ماه پیش
  晚风拂柳颜 f4e0d4f96d 老白故事更新支持海阔播放 2 ماه پیش

+ 12 - 0
app/apps/vod/vod_views.py

@@ -336,6 +336,12 @@ def vod_generate(*, api: str = "", request: Request,
         try:
             id_list = ids.split(',')
             data = vod.detailContent(id_list)
+            try:
+                _type = vod.getRule('类型')
+                data.update({"type": _type})
+            except Exception as e:
+                if is_drpy:
+                    logger.error(f'二级尝试获取源类型发生错误:{e}')
             return respVodJson(data)
         except Exception as e:
             error_msg = f"detailContent执行发生内部服务器错误:{e}"
@@ -352,6 +358,12 @@ def vod_generate(*, api: str = "", request: Request,
 
     home_data = vod.homeContent(filterable) or {}
     home_video_data = vod.homeVideoContent() or {}
+    try:
+        _type = vod.getRule('类型')
+        home_data.update({"type": _type})
+    except Exception as e:
+        if is_drpy:
+            logger.error(f'首页尝试获取源类型发生错误:{e}')
     home_data.update(home_video_data)
 
     if debug:

+ 67 - 0
app/t4/files/drpy_js/世纪DJ音乐网[听].js

@@ -0,0 +1,67 @@
+var rule = {
+    类型: '影视',//影视|听书|漫画|小说
+    title: '世纪DJ音乐网[听]',
+    host: 'http://m.dj0898.com',
+    url: '/dance/lists/id/fyclass/fypage',
+    homeUrl: '/dance/lists/id/10/1',
+    searchUrl: '/index.php/dance/so/key?key=**&cid=0&p=fypage',
+    searchable: 2,
+    quickSearch: 0,
+    filterable: 0,
+    filter: '',
+    filter_url: '',
+    filter_def: {},
+    headers: {
+        'User-Agent': 'MOBILE_UA',
+    },
+    timeout: 5000,
+    class_parse: $js.toString(() => {
+        let _classes = [{type_id: 1, type_name: "🎧串烧舞曲"}, {type_id: 2, type_name: "🎧外文舞曲"}, {
+            type_id: 3,
+            type_name: "🎧早场暖场"
+        }, {type_id: 4, type_name: "🎧中文舞曲"}, {type_id: 5, type_name: "🎧其他舞曲"}, {
+            type_id: 6,
+            type_name: "🎧国外电音"
+        }, {type_id: 8, type_name: "🎧慢歌连版"}, {type_id: 9, type_name: "🎧酒吧潮歌"}, {
+            type_id: 10,
+            type_name: "🎧中文串烧"
+        }, {type_id: 11, type_name: "🎧外文串烧"}, {type_id: 12, type_name: "🎧中外串烧"}, {
+            type_id: 13,
+            type_name: "🎧车载串烧"
+        }, {type_id: 14, type_name: "🎧越鼓串烧"}, {type_id: 40, type_name: "🎧3D/环绕"}, {
+            type_id: 45,
+            type_name: "🎧口水旋律"
+        }, {type_id: 46, type_name: "🎧精品收藏"}, {type_id: 47, type_name: "🎧开场舞曲"}, {
+            type_id: 48,
+            type_name: "🎧印度舞曲"
+        }, {type_id: 49, type_name: "🎧编排套曲"}, {type_id: 20, type_name: "🎧DuTch"}, {
+            type_id: 21,
+            type_name: "🎧Mash up"
+        }, {type_id: 22, type_name: "🎧ClubHouse"}, {type_id: 23, type_name: "🎧ElectroHouse"}, {
+            type_id: 24,
+            type_name: "🎧越南鼓Dj"
+        }, {type_id: 30, type_name: "🎧Funky"}, {type_id: 31, type_name: "🎧Reggae"}, {
+            type_id: 32,
+            type_name: "🎧Rnb"
+        }, {type_id: 33, type_name: "🎧Hip Hop"}, {type_id: 34, type_name: "🎧Dubstep"}, {
+            type_id: 8017,
+            type_name: "🎧Hardstyle"
+        }, {type_id: 8018, type_name: "🎧Hands Up"}];
+        input = _classes;
+    }),
+    cate_exclude: '',
+    play_parse: true,
+    lazy: $js.toString(() => {
+        log(input);
+        let html = request(input);
+        let src = pd(html, 'body&&audio[src*=http]&&src', input);
+        if (src) {
+            input = {parse: 0, url: src};
+        }
+    }),
+    double: false,
+    推荐: '*',
+    一级: 'ul.djddv_djList li;strong&&Text;img&&src;font:eq(5)&&Text;a:eq(1)&&href',
+    二级: '*',
+    搜索: '*',
+}

+ 24 - 14
app/t4/files/drpy_js/老白故事[听].js

@@ -107,7 +107,10 @@ var rule = {
     play_parse: true,
     预处理: $js.toString(() => {
         device = getItem('device', '{}');
-        device = JSON.parse(device);
+        if (typeof device == "string") {
+            device = JSON.parse(device);
+        }
+        // device = JSON.parse(device);
         if (!device.id) {
             device = randDeviceWithId(32);
             device.id = device.id.toLowerCase();
@@ -124,7 +127,8 @@ var rule = {
             // log(content.data);
             var datas = content.data.split('$6c1cef78ae=');
             var json = '';
-            for (const d of datas) {
+            for (let d of datas) {
+                // json += pk.decryptPublic(d, 'utf8').replace(/^\s*\n|\s*$/gm, '');
                 json += pk.decryptPublic(d, 'utf8');
             }
             appData = JSON.parse(json);
@@ -147,19 +151,19 @@ var rule = {
         let datas = content.data;
         let classes = [];
         let filterObj = {};
-        for (const data of datas) {
+        for (let data of datas) {
             let name = data.title.replace('分类', '');
 
             let type = {
                 key: 'type',
                 name: '类型',
             };
-            var values = data.types.reduce((result, t) => {
+            var cvalues = data.types.reduce((result, t) => {
                 result.push({n: t.name, v: t.type_id});
                 return result;
             }, []);
-            type['init'] = values[0]['v'];
-            type['value'] = values;
+            type['init'] = cvalues[0]['v'];
+            type['value'] = cvalues;
             let sort = {
                 key: 'sort',
                 name: '排序',
@@ -192,7 +196,7 @@ var rule = {
         let content = JSON.parse(html);
         let datas = content.data;
         let books = [];
-        for (const book of datas.books) {
+        for (let book of datas.books) {
             books.push({
                 vod_id: book.book_id,
                 vod_name: book.name,
@@ -203,9 +207,9 @@ var rule = {
         VODS = books;
     }),
     二级: $js.toString(() => {
-        const ids = [orId];
-        const books = [];
-        for (const id of ids) {
+        let ids = [orId];
+        let books = [];
+        for (let id of ids) {
             let html = request(appData.json_url + 'cont/' + id + '.json', {headers: rule.headers});
             let content = JSON.parse(html);
             let data = content.data;
@@ -243,16 +247,18 @@ var rule = {
             pid: 0,
             key: KEY,
         };
+        // var params = pk.encrypt(JSON.stringify(data), 'base64').replace(/^\s*\n|\s*$/gm, '');
         var params = pk.encrypt(JSON.stringify(data), 'base64');
+        log('params长度:' + params.length);
         let post_obj = {
             params: params,
             version: appVersion,
         };
-        let post_data = buildUrl('', post_obj).slice(1);
+        let post_data = `params=${params}&version=${appVersion}`;
         // log('post_data:' + post_data);
         log('api_url:' + appData.api_url);
         let headers = JSON.parse(JSON.stringify(rule.headers));
-        headers['Accept'] = 'application/json, text/plain, */*';
+        // headers['Accept'] = 'application/json, text/plain, */*';
         headers['Content-Type'] = 'application/x-www-form-urlencoded';
         let html = post(appData.api_url, {
             headers: headers,
@@ -261,7 +267,7 @@ var rule = {
         let content = JSON.parse(html);
         var datas = content.data;
         let books = [];
-        for (const book of datas.books) {
+        for (let book of datas.books) {
             books.push({
                 vod_id: book.book_id,
                 vod_name: book.name,
@@ -282,17 +288,21 @@ var rule = {
             aid: info[0],
             pid: info[1],
         };
+        // var params = pk.encrypt(JSON.stringify(data), 'base64').replace(/^\s*\n|\s*$/gm, '');
         var params = pk.encrypt(JSON.stringify(data), 'base64');
         // log('params:' + params);
+        // log([params]);
+        log('params长度:' + params.length);
         let post_obj = {
             params: params,
             version: appVersion,
         };
         let post_data = buildUrl('', post_obj).slice(1);
+        // let post_data = `params=${params}&version=${appVersion}`;
         // log('post_data:' + post_data);
         log('api_url:' + appData.api_url);
         let headers = JSON.parse(JSON.stringify(rule.headers));
-        headers['Accept'] = 'application/json, text/plain, */*';
+        // headers['Accept'] = 'application/json, text/plain, */*';
         headers['Content-Type'] = 'application/x-www-form-urlencoded';
         let html = post(appData.api_url, {
             headers: headers,

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2067 - 0
app/t4/files/drpy_libs/node-rsa-new.js


+ 5 - 0
app/t4/qjs_drpy/qjs_drpy.py

@@ -88,6 +88,8 @@ class Drpy:
 
     @staticmethod
     def toDict(_object):
+        if isinstance(_object, (type(None), str, bool, float, int)):
+            return _object
         return ujson.loads(_object.json())
 
     @staticmethod
@@ -114,6 +116,9 @@ class Drpy:
     def init(self, extend=""):
         self.call('init', extend)
 
+    def getRule(self, key=None):
+        return self.toDict(self.call('getRule', key))
+
     def homeContent(self, filter=None, home_html=None, class_parse=None):
         return self.setDict(self.call('home', filter, home_html, class_parse))
 

+ 5 - 3
app/t4/qjs_drpy/qjs_drpy_test.py

@@ -36,13 +36,14 @@ if __name__ == '__main__':
     # with open('../files/drpy_js/无插件直播.js', encoding='utf-8') as f:
     # with open('../files/drpy_js/最新4K.js', encoding='utf-8') as f:
     # with open('../files/drpy_js/分享短视频.js', encoding='utf-8') as f:
-    with open('../files/drpy_js/采集之王[合].js', encoding='utf-8') as f:
+    # with open('../files/drpy_js/采集之王[合].js', encoding='utf-8') as f:
+    with open('../files/drpy_js/老白故事[听].js', encoding='utf-8') as f:
         # with open('../files/drpy_js/耐看.js', encoding='utf-8') as f:
         code = f.read()
     code = code.replace('$nmjx_url', 'http://127.0.0.1:5708/nm?all=&url=')
     drpy.init(code)
     drpy.setDebug(1)
-    print(drpy.homeContent())
+    # print(drpy.homeContent())
     # print(drpy.homeVideoContent())
     # print(drpy.categoryContent('1', 1, False, {}))
     # print(drpy.detailContent('https://myd02.com/voddetail/21258.html'))
@@ -70,7 +71,7 @@ if __name__ == '__main__':
     # print(drpy.playerContent("量子资源", "https://nkvod.com/play/185851-2-1.html", []))
     # print(drpy.playerContent("优质", "https://yzzy.play-cdn21.com/20240329/13829_b63e7c01/index.m3u8", []))
     # print(drpy.searchContent("斗罗大陆", False, 1))
-    print(drpy.searchContent("玫瑰的故事", False, 1))
+    # print(drpy.searchContent("玫瑰的故事", False, 1))
     # print(drpy.searchContent("完美世界", False, 1))
     # print(drpy.detailContent("https://001.pm/index
     # print(drpy.detailContent("https://001.pm/index.php/vod/detail/id/118802.html"))
@@ -79,3 +80,4 @@ if __name__ == '__main__':
     # print(drpy.playerContent("1", "magnet://https://001.pm/index.php/vod/play/id/118802/sid/1/nid/14.html", []))
     # print(drpy.playerContent("1", "https://001.pm/index.php/vod/play/id/118802/sid/1/nid/14.html", []))
     # print(drpy.playerContent("1", "https://www.1080.ee/vodplay/124404-2-5.html", []))
+    print(drpy.playerContent("1", "40948-1", []))

+ 2 - 2
app/utils/vod_tool.py

@@ -64,7 +64,8 @@ def base_request(_url, _object, _js_type=0, cloudfare=False):
     if body and not data:
         if '&' in body:
             for p in body.split('&'):
-                k, v = p.split('=')
+                k = p.split('=')[0]
+                v = '='.join(p.split('=')[1:])
                 data[k] = v
             # 修复pythonmonkey没有自动把 JSObjectProxy 转为python的dict导致的后续错误
             data = dict(data)
@@ -84,7 +85,6 @@ def base_request(_url, _object, _js_type=0, cloudfare=False):
 
         if isinstance(data, dict):
             data = ujson.dumps(data, ensure_ascii=False)
-
     encoding = _object.get('encoding') or 'utf-8'
     buffer = _object.get('buffer') or 1
     redirect = False if _object.get('redirect') == 0 or _object.get('redirect') == False else True

+ 6 - 0
box_bug/bug描述.md

@@ -52,6 +52,7 @@ let data = batchFetch([{
 }, {url: 'http://www.b.cn'}]);
 log(data[0] + '=====' + data[1]);
 ```
+
 [解决方案](./batchFetch解决方案.md)
 
 5.壳子hipy兼容drpy源传参问题  
@@ -59,6 +60,10 @@ log(data[0] + '=====' + data[1]);
 ext属性里不在开头出现的./或着../应该保持不变或着按照ext的完整路径来进行相对处理。  
 目前大部分壳子都是按照api的路径来全局替换的,非常不合理
 
+6.疑似bug  
+除了zyplayer和海阔视界之外所有box的req进行post提交行为的时候,表单参数是base64且长度超过一定值的时候貌似会表现异常。
+疑似是壳子的req不能对这种content-type正确的进行编码提交。海阔、zy、hipy-t4都是正常的。不需要手动去编码提交参数
+
 ### 已解决问题的壳子
 
 | 问题\壳子 | BOX[黑白] | 影视仓 | easybox | 影视/ok | 海阔视界 | zyplayer | 装逼壳子/影图 | 爱佬版TV盒子 |
@@ -68,3 +73,4 @@ ext属性里不在开头出现的./或着../应该保持不变或着按照ext的
 | 3     | ❌       | ❌   | ❌       | ✅     | ✅    | ✅        | ✅       | ❌       |
 | 4     | ❌       | ❌   | ❌       | ❌     | ✅    | ❌        | ✅       | ❌       |
 | 5     | ❌       | ❌   | ✅       | ❌     | ✅    | ✅        | ✅       | ✅       |
+| 6     | ❌       | ❌   | ❌       | ❌     | ✅    | ✅        | ❌       | ❌       |

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است