904118851 8 luni în urmă
părinte
comite
3c154ca76e

+ 24 - 0
0_RECEIVE_FACTORY/RECEIVE_FACTORY.js

@@ -100,6 +100,19 @@ CMD.test_fq_book_sid_tt = async function(book_id,sid_tt){
 
 }
 
+CMD.test_fq_mf_book_sid_tt = async function(book_id,sid_tt){
+    try{
+        let client =new HttpClient()
+        let response =  await client.proxyGet( helper.getMfFqRequestOpt(book_id,sid_tt))
+        console.log("response:",response)
+        let obj = response['data']
+        return obj['book_info']
+    }catch(e){
+        // return {"error_book_id":book_id,"error_sid_tt":sid_tt}
+        return null
+    }
+
+}
 CMD.get_group_mapping = function(res){
     let get_hy_group_mapping = require('../src/api/hy/get_hy_group_mapping');
     get_hy_group_mapping.get_group_mapping((data)=>{
@@ -287,6 +300,17 @@ var server = http.createServer(function(req,res){
                             res.end(JSON.stringify({ message:"成功!",data:info,code:10000}));
                         }
                       
+                    }else if(jsonData['fun']=="test_fq_mf_book_sid_tt"&&jsonData['cmd']=="fq_mf_book"){
+                        let book_id = jsonData['data']['book_id']
+                        let sid_tt = jsonData['data']['sid_tt']
+                        let info = await CMD.test_fq_mf_book_sid_tt(book_id,sid_tt) 
+                        res.writeHead(200, {'Content-Type': 'application/json'});
+                        if(info==null){
+                            res.end(JSON.stringify({ message:"失败",code:10001}));
+                        }else{
+                            res.end(JSON.stringify({ message:"成功!",data:info,code:10000}));
+                        }
+                      
                     }else if(jsonData['fun']=="groupMapping"&&jsonData['cmd']=="hy_link"){
                          CMD.get_group_mapping(res) 
                     }else if(jsonData['fun']=="rechargeTemplate"&&jsonData['cmd']=="hy_link"){

+ 321 - 0
2_PRODUCT_FACTORY/fq_mf_factory.js

@@ -0,0 +1,321 @@
+const CMD = {}
+const video_product_controllers = require('../src/data_manager/Controllers/video_product_controllers');
+const filter_data_controllers = require('../src/data_manager/Controllers/filter_data_controllers');
+const get_fq_mf_book_tab_controllers = require('../src/data_manager/Controllers/get_fq_mf_book_tab_controllers');
+const video_applet_product_controllers = require('../src/data_manager/Controllers/video_applet_product_controllers');
+const other_book_controllers = require('../src/data_manager/Controllers/other_book_controllers');
+const redis_help = require('../src/use_redis');
+const axios = require('axios');
+const config = require('../etc/config.json');
+const HttpClient = require('../src/HttpClient');
+const helper = require('../src/helper');
+const tools = require('../tools');
+const time_count = 2000;
+const task_queue = []
+
+async function processTask(){
+    let result = null
+    try{
+        let isPauseTask =  await redis_help.getKeyValue("isPauseTask")
+        if(isPauseTask=="true"){
+            return
+        }
+        let isInsertTask = false
+        let FilterConfig = await redis_help.getKeyValue("FilterConfig")
+        FilterConfig = JSON.parse(FilterConfig)
+        result = await filter_data_controllers.getFilterDataByStatus({ status: 0 ,tg_platform_id:config.platform_fanqie});
+        if(result.success){
+            let tg_platform_id = result.data.tg_platform_id
+            //判断是否存在这本书
+            if(tg_platform_id==config.platform_fanqie){ //番茄
+                //获取番茄书库的书
+                let fq_book_result = await get_fq_mf_book_tab_controllers.getData({ book_id: result.data.book_id });
+                if(fq_book_result.success){//如果番茄书库里有这本书
+    
+                    result.data.genre = fq_book_result.data.info.genre
+                    result.data.book_id = fq_book_result.data.book_id
+                    result.data.book_name = fq_book_result.data.info.book_name
+                    result.data.words = fq_book_result.data.info.word_number
+                    //获取商品库的商品
+                    let product_result = await video_product_controllers.getProductData({ book_id: fq_book_result.data.book_id });
+                    //如果商品库没有这个商品
+                    if(!product_result.success){ //如果只是 get_fq_book 有, 书库里没有
+                        fq_book_result.data.tg_platform_id = result.data.tg_platform_id
+                        //如果是长篇短篇符合
+                        if(CMD.isGenre(FilterConfig,result.data.genre)){
+                            await CMD.insert_product(result.data)
+                        }
+                    }
+                }else{
+                    isInsertTask = true
+              
+                }
+            }
+            if(!isInsertTask){
+                await CMD.update_filter_data(FilterConfig,result.data)
+            }else{
+                await filter_data_controllers.updateFilterData({id:result.data.id},{status:1,material_sync_status:2})
+                task_queue.push({result:result})
+            }
+        }
+    }catch(e){
+        console.error("processTask error:",e)
+        if(result!=null&&result!=undefined){
+            await filter_data_controllers.updateFilterData({id:result.data.id},{status:2})
+        }
+    } finally{
+        global.setTimeout(processTask, 100);
+    }
+
+}
+
+async function processCreateTask(){
+    let result = null
+    try{
+        if(task_queue.length>0){
+            let task_queue_item = task_queue.pop()
+            result = task_queue_item.result
+            let other_book = await other_book_controllers.getData({product_id:task_queue_item.result.data.book_id})
+            if(other_book.success){
+                await filter_data_controllers.updateFilterData({id:result.data.id},{status:2,book_id:other_book.data.product_id,book_name:other_book.data.product_name,material_sync_status:2})
+                throw "处理了一条长篇或者筛选不要的书"
+            }
+            let product = await video_product_controllers.getProductData({ book_id: task_queue_item.result.data.book_id });
+            let FilterConfig = await redis_help.getKeyValue("FilterConfig")
+            FilterConfig = JSON.parse(FilterConfig)
+            if(!product.success){
+                let tg_platform_id = result.data.tg_platform_id
+                if(tg_platform_id==config.platform_fanqie){
+                    let client =  new HttpClient()
+                    let sid_tt = await tools.getFqSidtt()
+                    let response =  await client.proxyRequest( helper.getFqRequestOpt(result.data.book_id,sid_tt))
+                    let obj = response['data']
+                    if (Object.keys(obj['novel_data']).length === 0) {
+                        result.data.words = 0
+                        result.data.genre = 999
+                        result.data.book_id = result.data.book_id
+                        result.data.book_name = "没有找到这本书"
+                    }else{
+                        let book_name =  obj['novel_data'].book_name
+                        let book_id = obj['novel_data'].book_id
+                        let genre = CMD.getFqGenre(obj['novel_data'].genre)
+                        let words = obj['novel_data'].word_number
+                        let fq_book_data = {book_name:book_name,book_id:book_id,genre:genre,words:words,info:JSON.stringify(obj['novel_data'])}
+                        let fq_book = {} 
+                        fq_book.key = result.data.book_id
+                        // console.log("response:",obj,sid_tt)
+                        await CMD.add_fq_book(fq_book,fq_book_data)
+                        let product_result = await video_product_controllers.getProductData({ book_id: fq_book_data.book_id });
+                        if(!product_result.success){ //如果书库也没有
+                            fq_book.tg_platform_id = result.data.tg_platform_id
+                        
+                            if(CMD.isGenre(FilterConfig,fq_book_data.genre)){
+                                fq_book_data.tg_platform_id = result.data.tg_platform_id
+                                await CMD.insert_product(fq_book_data)
+                            }
+                        }
+                        result.data.words = words
+                        result.data.genre = fq_book_data.genre
+                        result.data.book_id = fq_book_data.book_id
+                        result.data.book_name = fq_book_data.book_name
+                    }
+              
+                }
+            }
+            await CMD.update_filter_data(FilterConfig,result.data)
+        }
+    }catch(e){
+        console.log("error::",e)
+        // if(result!=null){
+        //     await filter_data_controllers.updateFilterData({id:result.data.id},{status:2})
+        // }
+        console.log("processCreateTask:",e)
+    } finally{
+        global.setTimeout(processCreateTask, time_count);
+    }
+}
+CMD.init = async function(){
+    redis_help.connect((results)=>{
+        if(results){
+        }
+    })
+    processTask();
+    processCreateTask();
+}
+CMD.getFqGenre = function(genre){
+    if(genre=="0"){
+        return 1;
+    }
+    if(genre=="8"){
+        return 3;
+    }
+
+    if(genre=="202"){
+        return 202;
+    }
+    return 999;
+}
+
+CMD.getAppInfoByPlatformId = function(AppConfig,tg_platform_id){
+    let temp = []
+    for (let index = 0; index < AppConfig.length; index++) {
+        const element = AppConfig[index];
+        if(element.tg_platform_id==tg_platform_id){
+            temp.push(element)
+        }
+    }
+    return temp
+}
+CMD.isBlackBook = function(all_black_books,book_id){
+    if(all_black_books==null){
+        return false
+    }
+    for (let index = 0; index < all_black_books.length; index++) {
+        const black_book = all_black_books[index];
+        if(black_book.product_id==book_id){
+            return true
+        }
+    }
+    return false
+}
+CMD.getMainInfoByAppid = function(MainConfig,app_id){
+    let list = []
+    for (let index = 0; index < MainConfig.length; index++) {
+        const element = MainConfig[index];
+        if(element.app_id==app_id){
+            list.push(element)
+        }
+    }
+    return list
+}
+CMD.isGenre = function(FilterConfig,genre){
+    let is_need  = false
+    //判断长篇短篇是否是要的数据
+    for (let index = 0; index < FilterConfig.genre.length; index++) {
+        const element = FilterConfig.genre[index];
+        if(genre==element){
+            is_need = true
+            break
+        }
+    }
+    return is_need
+}
+
+CMD.update_filter_data = async function(FilterConfig,data) {
+    let isGenre = CMD.isGenre(FilterConfig,data.genre)
+    // console.log("data.genre:",data.genre,data,isGenre)
+    if(isGenre){
+        await filter_data_controllers.updateFilterData({id:data.id},{status:1,book_id:data.book_id,book_name:data.book_name,genre:data.genre,words:data.words,material_sync_status:0})
+        //创建一个小程序    
+        let AppConfig = await redis_help.getKeyValue("AppConfig")
+
+        AppConfig = JSON.parse(AppConfig)
+
+        let AppInfoList = CMD.getAppInfoByPlatformId(AppConfig,data.tg_platform_id)
+
+        for (let j = 0; j < AppInfoList.length; j++) {
+            const AppInfo = AppInfoList[j];
+            data.app_id = AppInfo.app_id
+
+            let PlatformInfo = await redis_help.getKeyValue("PlatformConfig")
+
+            PlatformInfo = JSON.parse(PlatformInfo)
+
+            if(PlatformInfo==null){
+                return console.error("平台配置错误:",data)
+            }
+
+            let MainConfig = await redis_help.getKeyValue("MainConfig")
+
+            MainConfig = JSON.parse(MainConfig)
+
+            let list = CMD.getMainInfoByAppid(MainConfig,data.app_id)
+
+            if(list.length<0){
+                return console.error("获取主体错误:",data)
+            }
+
+            let black_books = await redis_help.getKeyValue("all_black_books")
+            
+            if(black_books!=null){
+                black_books = JSON.parse(black_books)
+            }
+       
+            for (let index = 0; index < list.length; index++) {
+                const main_info = list[index];
+                data.main_id = main_info.id
+                data.main_name = main_info.main_name
+                if(main_info.tg_link_config==undefined||main_info.tg_link_config==null){
+                    console.error("主体配置推广链接错误:",main_info)
+                }else{
+                    if(!CMD.isBlackBook(black_books,data.book_id)){
+                        //符合标准进行创建表
+                        const result = await video_applet_product_controllers.getAppletProductData({book_id:data.book_id,main_id:data.main_id})
+                        if(!result.success){
+                            //没有找到 可以创建
+                            await video_applet_product_controllers.createAppletProductData({
+                                book_platform:data.tg_platform_id,
+                                product_name:data.book_name,
+                                product_id:data.book_id,
+                                dy_small_program_start:"",
+                                dy_small_program_start_data:"",
+                                dy_small_applet_app_id:data.app_id,
+                                status:0,
+                                main_id:data.main_id,
+                                promotion_id:"",
+                                wait_status:0,
+                            })
+                        }
+                    }
+                }
+            }
+        }
+    }else{
+        await other_book_controllers.createData({product_id:data.book_id,product_name:data.book_name,tg_platform_id:data.tg_platform_id})
+        await filter_data_controllers.updateFilterData({id:data.id},{status:2,book_id:data.book_id,book_name:data.book_name,genre:data.genre,material_sync_status:2})
+    }
+}
+
+
+CMD.insert_product = async function(data){
+    return await video_product_controllers.createProductData({
+        book_platform:data.tg_platform_id,
+        product_name:data.book_name,
+        genre:data.genre,
+        product_id:data.book_id,
+        words:data.words
+    })
+}
+CMD.add_fq_book = async function(data,response){
+    let book_name =  response.book_name
+    let book_id = response.book_id
+    let genre = response.genre
+    let words = response.word_number
+    data.genre = 0
+    if(genre=="0"){
+        data.genre = 1;
+    }
+    if(genre=="8"){
+        data.genre = 3;
+    }
+
+    if(genre=="202"){
+        data.genre = 202;
+    }
+    data.words = words
+    data.book_name = book_name
+    data.book_id = book_id
+    let tab = {
+        book_key:data.key,
+        book_id:data.book_id,
+        info:JSON.stringify(response)
+    }
+    if(tab.book_id==undefined){
+        throw "tab.book_id==undefined"
+    }
+    // console.log("tab:",tab,data)
+    return await get_fq_mf_book_tab_controllers.createData( tab)
+}
+
+
+CMD.init()

+ 128 - 11
7_CHECK_AND_CREATE_URL_FACTORY/CHECK_AND_CREATE_URL_FACTORY.js

@@ -1,24 +1,141 @@
 const CMD = {}
+const video_applet_product_controllers = require('../src/data_manager/Controllers/video_applet_product_controllers');
 const sql_task_help = require('./use_task_mysql');
 const axios = require('axios');
 const time_count = 2000;
+const redis_help = require('../src/use_redis');
+const works_controllers = require('../src/data_manager/Controllers/works_controllers');
+const checks_products_controllers = require('../src/data_manager/Controllers/checks_products_controllers');
+const spreads_controllers = require('../src/data_manager/Controllers/spreads_controllers');
+
+// const cp_type = new Map()
+// cp_type.set('CD','常读')
+// cp_type.set('YW','阅文')
+// cp_type.set('WD','文鼎')
+// cp_type.set('HY','黑岩')
+// cp_type.set('JDY','绝顶云')
+// cp_type.set('YG','阳光')
+// cp_type.set('QM','七猫')
+
+const buildCheckUrl = (info) => {
+    return `https://n8-adv-ocean.s6kuwan.com/open/click/report?spread_id=${info.id}&project_id=__PROJECT_ID__&promotion_id=__PROMOTION_ID__&request_id=__REQUEST_ID__&adv_click_id=__CLICK_ID__&csite=__CSITE__&convert_id=__CONVERT_ID__&imei=__IMEI__&idfa=__IDFA__&android_id=__ANDROIDID__&oaid=__OAID__&oaid_md5=__OAID_MD5__&os=__OS__&ip=__IPV4__&ip6=__IPV6__&ua=__UA__&click_at=__TS__&callback_param=__CALLBACK_PARAM__&model=__MODEL__&union_site=__UNION_SITE__&mid1=__MID1__&mid2=__MID2__&mid3=__MID3__&sign=d9a814d4bccfb06b84fe4d4ba6bce6f4`;
+}
+
+CMD.getMainInfoById = function(MainConfig,main_id){
+    // console.log("MainConfig:",MainConfig)
+    for (let index = 0; index < MainConfig.length; index++) {
+        const element = MainConfig[index];
+        if(element.id==main_id){
+            return element
+        }
+    }
+    return null
+}
+
+async function processTask() {
+    try {
+       let result = await video_applet_product_controllers.getAppletProductByStatusAndLimit({status:0,wait_status:1},100)
+       if(result.success){
+            let video_applet_product_data_list = result.data
+            if(video_applet_product_data_list.length<=0){
+                throw "no data!"
+            }
+            let MainConfig = await redis_help.getKeyValue("MainConfig")
+            MainConfig = JSON.parse(MainConfig)
+
+            for (let index = 0; index < video_applet_product_data_list.length; index++) {
+                const video_applet_product_item = video_applet_product_data_list[index];
+                let main_id = video_applet_product_item.main_id
+                let main_info = CMD.getMainInfoById(MainConfig,main_id)
+                let product_id = video_applet_product_item.product_id
+                let product_name = video_applet_product_item.product_name
+                let promotion_id = video_applet_product_item.promotion_id
+                let dy_small_program_start = video_applet_product_item.dy_small_program_start
+                let dy_small_program_start_data = video_applet_product_item.dy_small_program_start_data
+                if(main_info==null&&result.data.is_close_execution==1){
+                    let CloseMainConfig = await redis_help.getKeyValue("CloseMainConfig")
+                    CloseMainConfig = JSON.parse(CloseMainConfig)
+                    main_info = CMD.getMainInfoById(CloseMainConfig,main_id)
+                }
+
+                if(main_info!=null){
+                    let checks_products_item = await checks_products_controllers.getData({main_id:main_id})
+                    if(checks_products_item.success){
+                        let cp_type = checks_products_item.data.cp_type
+                        let works_item = await works_controllers.getData({product_id:product_id})
+                        let id = -1
+                        if(!works_item.success){
+                            let works_result =  await works_controllers.createData({cp_work_id:product_id,cp_type:cp_type,name:product_name})
+                            if(works_result.success){
+                                id = works_result.data.id
+                            }
+                        }else{
+                            id = works_item.data.id
+                        }
+                        if(id!=-1){
+                            let tableData = {
+                                product_id:checks_products_item.data.id,
+                                name:product_name,
+                                cp_type:cp_type,
+                                cp_spread_id:promotion_id,
+                                work_id:id,
+                                chapter_id:1,
+                                adv_alias:"OCEAN",
+                                link_type:"CG",
+                                status:"ENABLE",
+                                admin_id:1,
+                                hap_url:"",
+                                h5_url:"",
+                                http_url:"",
+                                apk_url:"",
+                                convert_callback_strategy_id:0,
+                                page_path:`${dy_small_program_start}?${dy_small_program_start_data}`
+                            }
+                            let spreads_result =  await spreads_controllers.createData(tableData)
+                            if(spreads_result.success){
+                                 let check_url = buildCheckUrl({id:spreads_result.data.id})
+                                 CMD.update_video_applet_product({promotion_id:promotion_id,
+                                    product_id:product_id,check_url:check_url
+                                })
+                            }
+                        }
+
+                    }
+                }
+    
+
+            }
+
+       }
+    } catch (e) {
+        console.log("暂无监测链接创建",e)
+    }finally{
+        global.setTimeout(processTask,time_count)
+    }
+}
+
 CMD.init = function(){
     sql_task_help.connect((results)=>{
         if(results){
             console.log("send_data_server:sql_task_help")
         }
     })
-    let sql = `SELECT * FROM video_applet_product WHERE TIMESTAMPDIFF(HOUR, create_at, NOW()) < 24 AND status = 0 AND wait_status = 1 ORDER BY create_at DESC LIMIT 1;`
-    setInterval(() => {
-        sql_task_help.get(sql,(is_right,data)=>{
-            if(is_right){
-                // console.log("sql:",data)
-                if(data.length>0){
-                    CMD.build_check_url( data[0])
-                }
-            }
-        })
-    }, time_count);
+    redis_help.connect((results)=>{
+        if(results){
+        }
+    })
+    processTask()
+    // let sql = `SELECT * FROM video_applet_product WHERE TIMESTAMPDIFF(HOUR, create_at, NOW()) < 24 AND status = 0 AND wait_status = 1 ORDER BY create_at DESC LIMIT 1;`
+    // setInterval(() => {
+    //     sql_task_help.get(sql,(is_right,data)=>{
+    //         if(is_right){
+    //             // console.log("sql:",data)
+    //             if(data.length>0){
+    //                 CMD.build_check_url( data[0])
+    //             }
+    //         }
+    //     })
+    // }, time_count);
 }
 
 CMD.build_check_url = function(data){

+ 2 - 2
MESSAGE_DISPATCH/MESSAGE_DISPATCH.js

@@ -25,7 +25,7 @@ CMD.updateFilterConfig = async function(){
 CMD.updateCloseMainConfig = async function(){
     const postData = {
         cmd:"tg_main",
-        fun:"getCloseMainList",
+        fun:"getCloseCreateLinkMainList",
         data:{}
     };
     let client = tools.getOneNewClinet()
@@ -41,7 +41,7 @@ CMD.updateCloseMainConfig = async function(){
 CMD.updateMainConfig = async function(){
     const postData = {
         cmd:"tg_main",
-        fun:"getOpenMainList",
+        fun:"getOpenCreateLinkMainList",
         data:{}
     };
     let client = tools.getOneNewClinet()

BIN
dump.rdb


+ 14 - 0
etc/config.json

@@ -78,6 +78,20 @@
         "password":"p0LTZh&CjMl2023",
         "database":"ml_oceanengine"
     },
+    "debug_check_mysql":{
+        "host":"127.0.0.1",
+        "user":"root",
+        "port":3306,
+        "password":"p0LTZh&CjMl2023",
+        "database":"n8_union"
+    },
+    "release_chekc_mysql":{
+        "host":"mr-dsq824ev2pqxbr6rhw.rwlb.rds.aliyuncs.com",
+        "user":"zdroot",
+        "port":3306,
+        "password":"p0LTZh&CjMl2023",
+        "database":"n8_union"
+    },
     "debug_supdate_config":{
         "host":"https://clipvideoup.hainanmlwl.com"
     },

+ 63 - 0
logs/combined.log

@@ -1,4 +1,66 @@
 <<<<<<< HEAD
+2024-12-30T19:27:46: 
+2024-12-30T19:27:46: > heiyan@1.0.0 start
+2024-12-30T19:27:46: > node tg_factory_main.js
+2024-12-30T19:27:46: 
+2024-12-30T19:27:49: Connected to Redis
+2024-12-30T19:33:40: 
+2024-12-30T19:33:40: > heiyan@1.0.0 start
+2024-12-30T19:33:40: > node tg_factory_main.js
+2024-12-30T19:33:40: 
+2024-12-30T19:33:43: Connected to Redis
+2024-12-30T19:35:37: 
+2024-12-30T19:35:37: > heiyan@1.0.0 start
+2024-12-30T19:35:37: > node tg_factory_main.js
+2024-12-30T19:35:37: 
+2024-12-30T19:35:40: Connected to Redis
+2024-12-30T19:36:47: 
+2024-12-30T19:36:47: > heiyan@1.0.0 start
+2024-12-30T19:36:47: > node tg_factory_main.js
+2024-12-30T19:36:47: 
+2024-12-30T19:36:50: Connected to Redis
+2024-12-30T19:38:52: 
+2024-12-30T19:38:52: > heiyan@1.0.0 start
+2024-12-30T19:38:52: > node tg_factory_main.js
+2024-12-30T19:38:52: 
+2024-12-30T19:38:55: Connected to Redis
+2024-12-30T19:40:11: 
+2024-12-30T19:40:11: > heiyan@1.0.0 start
+2024-12-30T19:40:11: > node tg_factory_main.js
+2024-12-30T19:40:11: 
+2024-12-30T19:40:14: Connected to Redis
+2024-12-30T19:41:42: 
+2024-12-30T19:41:42: > heiyan@1.0.0 start
+2024-12-30T19:41:42: > node tg_factory_main.js
+2024-12-30T19:41:42: 
+2024-12-30T19:41:45: Connected to Redis
+2024-12-30T19:43:02: 
+2024-12-30T19:43:02: > heiyan@1.0.0 start
+2024-12-30T19:43:02: > node tg_factory_main.js
+2024-12-30T19:43:02: 
+2024-12-30T19:43:05: Connected to Redis
+2024-12-30T19:46:54: 
+2024-12-30T19:46:54: > heiyan@1.0.0 start
+2024-12-30T19:46:54: > node tg_factory_main.js
+2024-12-30T19:46:54: 
+2024-12-30T19:46:57: Connected to Redis
+2024-12-30T19:47:55: 
+2024-12-30T19:47:55: > heiyan@1.0.0 start
+2024-12-30T19:47:55: > node tg_factory_main.js
+2024-12-30T19:47:55: 
+2024-12-30T19:47:57: Connected to Redis
+2024-12-30T19:49:02: 
+2024-12-30T19:49:02: > heiyan@1.0.0 start
+2024-12-30T19:49:02: > node tg_factory_main.js
+2024-12-30T19:49:02: 
+2024-12-30T19:49:05: Connected to Redis
+2024-12-30T19:53:26: 
+2024-12-30T19:53:26: > heiyan@1.0.0 start
+2024-12-30T19:53:26: > node tg_factory_main.js
+2024-12-30T19:53:26: 
+2024-12-30T19:53:29: Connected to Redis
+=======
+<<<<<<< HEAD
 2024-12-27T11:55:03: 
 2024-12-27T11:55:03: > heiyan@1.0.0 start
 2024-12-27T11:55:03: > node tg_factory_main.js
@@ -195,3 +257,4 @@
 2024-12-27T17:40:52: > heiyan@1.0.0 start
 2024-12-27T17:40:52: > node tg_factory_main.js
 2024-12-27T17:40:52: 
+>>>>>>> 3301ca202b99d2d2e13ea80b67bb15d623adfbe2

+ 63 - 0
logs/out.log

@@ -1,4 +1,66 @@
 <<<<<<< HEAD
+2024-12-30T19:27:46: 
+2024-12-30T19:27:46: > heiyan@1.0.0 start
+2024-12-30T19:27:46: > node tg_factory_main.js
+2024-12-30T19:27:46: 
+2024-12-30T19:27:49: Connected to Redis
+2024-12-30T19:33:40: 
+2024-12-30T19:33:40: > heiyan@1.0.0 start
+2024-12-30T19:33:40: > node tg_factory_main.js
+2024-12-30T19:33:40: 
+2024-12-30T19:33:43: Connected to Redis
+2024-12-30T19:35:37: 
+2024-12-30T19:35:37: > heiyan@1.0.0 start
+2024-12-30T19:35:37: > node tg_factory_main.js
+2024-12-30T19:35:37: 
+2024-12-30T19:35:40: Connected to Redis
+2024-12-30T19:36:47: 
+2024-12-30T19:36:47: > heiyan@1.0.0 start
+2024-12-30T19:36:47: > node tg_factory_main.js
+2024-12-30T19:36:47: 
+2024-12-30T19:36:50: Connected to Redis
+2024-12-30T19:38:52: 
+2024-12-30T19:38:52: > heiyan@1.0.0 start
+2024-12-30T19:38:52: > node tg_factory_main.js
+2024-12-30T19:38:52: 
+2024-12-30T19:38:55: Connected to Redis
+2024-12-30T19:40:11: 
+2024-12-30T19:40:11: > heiyan@1.0.0 start
+2024-12-30T19:40:11: > node tg_factory_main.js
+2024-12-30T19:40:11: 
+2024-12-30T19:40:14: Connected to Redis
+2024-12-30T19:41:42: 
+2024-12-30T19:41:42: > heiyan@1.0.0 start
+2024-12-30T19:41:42: > node tg_factory_main.js
+2024-12-30T19:41:42: 
+2024-12-30T19:41:45: Connected to Redis
+2024-12-30T19:43:02: 
+2024-12-30T19:43:02: > heiyan@1.0.0 start
+2024-12-30T19:43:02: > node tg_factory_main.js
+2024-12-30T19:43:02: 
+2024-12-30T19:43:05: Connected to Redis
+2024-12-30T19:46:54: 
+2024-12-30T19:46:54: > heiyan@1.0.0 start
+2024-12-30T19:46:54: > node tg_factory_main.js
+2024-12-30T19:46:54: 
+2024-12-30T19:46:57: Connected to Redis
+2024-12-30T19:47:55: 
+2024-12-30T19:47:55: > heiyan@1.0.0 start
+2024-12-30T19:47:55: > node tg_factory_main.js
+2024-12-30T19:47:55: 
+2024-12-30T19:47:57: Connected to Redis
+2024-12-30T19:49:02: 
+2024-12-30T19:49:02: > heiyan@1.0.0 start
+2024-12-30T19:49:02: > node tg_factory_main.js
+2024-12-30T19:49:02: 
+2024-12-30T19:49:05: Connected to Redis
+2024-12-30T19:53:26: 
+2024-12-30T19:53:26: > heiyan@1.0.0 start
+2024-12-30T19:53:26: > node tg_factory_main.js
+2024-12-30T19:53:26: 
+2024-12-30T19:53:29: Connected to Redis
+=======
+<<<<<<< HEAD
 2024-12-27T11:55:03: 
 2024-12-27T11:55:03: > heiyan@1.0.0 start
 2024-12-27T11:55:03: > node tg_factory_main.js
@@ -195,3 +257,4 @@
 2024-12-27T17:40:52: > heiyan@1.0.0 start
 2024-12-27T17:40:52: > node tg_factory_main.js
 2024-12-27T17:40:52: 
+>>>>>>> 3301ca202b99d2d2e13ea80b67bb15d623adfbe2

+ 14 - 0
src/HttpClient.js

@@ -106,6 +106,20 @@ class HttpClient {
         }
     }
 
+    async proxyGet(options){
+        try{
+            const proxyService = new ProxyService();
+            const result = await  proxyService.proxyRequestWithRetry({
+                url: options.url,
+                method: "get",
+                headers: options.headers
+            })
+            return result 
+        }catch(error){
+            this.handleError(error);
+            throw error;
+        }
+    }
     async proxyRequest(options){
         try{
             const proxyService = new ProxyService();

+ 1 - 0
src/ProxyService.js

@@ -21,6 +21,7 @@ class ProxyService {
         });
     }
 
+
     async proxyRequest(options) {
         try {
             const response = await this.client({

+ 132 - 0
src/data_manager/CheckDbBaseModel.js

@@ -0,0 +1,132 @@
+// ml_oceanengine
+const db = require('./DataBaseCheck');
+const QueryBuilder = require('./QueryBuilder');
+
+class CheckDbBaseModel {
+    constructor(tableName) {
+        this.tableName = tableName;
+        this.queryBuilder = new QueryBuilder();
+    }
+
+    async query(sql, params) {
+        return await db.query(sql, params);
+    }
+    async findByDateRange(conditions = {}, dateField, startDate, endDate, limit = null, offset = 0, orderBy = null) {
+        this.queryBuilder.clear();
+        
+        // 先构建基础条件
+        let sql = `SELECT * FROM ${this.tableName} WHERE 1=1`;
+        let params = [];
+        
+        // 添加其他条件
+        for(const [key, value] of Object.entries(conditions)) {
+            sql += ` AND ${key} = ?`;
+            params.push(value);
+        }
+        
+        // 添加时间范围条件
+        sql += ` AND ${dateField} >= ? AND ${dateField} <= ?`;
+        params.push(startDate, endDate);
+        
+        // 添加排序
+        if (orderBy) {
+            sql += ` ORDER BY ${orderBy}`;
+        }
+        
+        // 添加分页
+        if (limit) {
+            sql += ` LIMIT ${limit}`;
+            if (offset) {
+                sql += ` OFFSET ${offset}`;
+            }
+        }
+        
+        // 执行查询前打印SQL和参数用于调试
+        console.log('SQL:', sql);
+        console.log('Params:', params);
+        
+        return await db.query(sql, params);
+    }
+
+    async findOne(conditions) {
+        this.queryBuilder.clear()
+        const { sql, params } = this.queryBuilder
+            .select()
+            .from(this.tableName)
+            .where(conditions)
+            .limit(1)
+            .getQuery();
+        
+        const results = await db.query(sql, params);
+        return results[0] || null;
+    }
+
+    async findDataByLimit(conditions,limit=1,orderBy="") {
+        this.queryBuilder.clear()
+        let { sql, params } = this.queryBuilder
+            .select()
+            .from(this.tableName)
+            .where(conditions)
+            .orderBy('id',orderBy)
+            .limit(limit)
+            .getQuery();
+        const results = await db.query(sql, params);
+        return results || null;
+    }
+
+    async findAll(conditions = {}, limit = null, offset = 0, orderBy = null) {
+        this.queryBuilder.clear()
+        let builder = this.queryBuilder
+            .select()
+            .from(this.tableName)
+            .where(conditions);
+
+        if (orderBy) {
+            builder.orderBy(orderBy);
+        }
+
+        if (limit) {
+            builder.limit(limit, offset);
+        }
+
+        const { sql, params } = builder.getQuery();
+        return await db.query(sql, params);
+    }
+
+    async create(data) {
+        this.queryBuilder.clear()
+        const { sql, params } = this.queryBuilder
+            .insert(this.tableName, data)
+            .getQuery();
+
+        const result = await db.query(sql, params);
+        return result.insertId;
+    }
+
+    async update(conditions, data) {
+        this.queryBuilder.clear()
+        const { sql, params } = this.queryBuilder
+            .update(this.tableName, data)
+            .where(conditions)
+            .getQuery();
+        const result = await db.query(sql, params);
+        return result.affectedRows;
+    }
+
+    async delete(conditions) {
+        this.queryBuilder.clear()
+        const { sql, params } = this.queryBuilder
+            .delete(this.tableName)
+            .where(conditions)
+            .getQuery();
+
+        const result = await db.query(sql, params);
+        return result.affectedRows;
+    }
+
+    async transaction(callback) {
+        return await db.transaction(callback);
+    }
+}
+
+module.exports = CheckDbBaseModel;

+ 66 - 0
src/data_manager/Controllers/checks_products_controllers.js

@@ -0,0 +1,66 @@
+
+const checks_products_model =  require('../Model/checks_products_model');
+class checks_products_controllers {
+
+    async getData(params) {
+        try {
+            // 参数验证
+            if (!params?.main_id) {
+                throw  'checks_products_controllers:main_id ID is required';
+            }
+            const filterData = await checks_products_model.findOne({ main_id: params.main_id });
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
+
+
+    async createData(tableData) {
+        try {
+            // 数据验证
+            if (!tableData || Object.keys(tableData).length === 0) {
+                throw 'Invalid table data';
+            }
+
+            // 检查必要字段
+            const requiredFields = ['product_id', 'product_name', 'tg_platform_id']; 
+            for (const field of requiredFields) {
+                if (tableData[field]==null||tableData[field]==undefined) {
+                    throw `Missing required field: ${field}${JSON.stringify(tableData)}`;
+                }
+            }
+
+            // 添加创建时间戳
+            // const dataToCreate = {
+            //     ...tableData
+            //     // created_at: new Date(),
+            //     // updated_at: new Date()
+            // };
+
+            const id = await checks_products_model.createData(tableData);
+
+
+            return {
+                success: true,
+                data: { id }
+            };
+        } catch (error) {
+            throw error;
+        }
+    }
+}
+
+module.exports =  new checks_products_controllers();

+ 113 - 0
src/data_manager/Controllers/get_fq_mf_book_tab_controllers.js

@@ -0,0 +1,113 @@
+
+const get_fq_mf_book_tab_model =  require('../Model/get_fq_mf_book_tab_model');
+class get_fq_mf_book_tab_controllers {
+    async getData(params) {
+        try {
+            // 参数验证
+            if (!params?.book_id) {
+                throw  'get_fq_book_tab_controllers:book_id ID is required';
+            }
+            const book_id = params.book_id;
+            const filterData = await get_fq_mf_book_tab_model.findOne({ book_key: book_id });
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
+
+
+     async findNonExistentProductIds(ProductIds) {
+        try {
+            if (!Array.isArray(ProductIds) || ProductIds.length === 0) {
+                throw 'materialIds must be a non-empty array';
+            }
+
+            // 限制最大处理数量为500
+            const maxIds = ProductIds.slice(0, 500);
+
+            // 构建 IN 查询条件
+            const placeholders = maxIds.map(() => '?').join(',');
+            const sql = `SELECT * FROM ${get_fq_mf_book_tab_model.tableName} WHERE book_key IN (${placeholders})`;
+            
+            // 执行查询
+            const existingRecords = await get_fq_mf_book_tab_model.query(sql, maxIds);
+
+            // 获取已存在的ProductIds集合
+            const existingProductIds = new Set(
+                existingRecords.map(record => record.book_id)
+            );
+
+            // 找出不存在的ProductIds
+            const nonExistentProductIds = maxIds.filter(
+                id => !existingProductIds.has(id)
+            );
+
+            return {
+                success: true,
+                data: {
+                    total: maxIds.length,
+                    existing: existingProductIds.size, //存在
+                    existingProductIds:existingProductIds,
+                    existingRecords:existingRecords,
+                    nonExistent: nonExistentProductIds.length,
+                    nonExistentIds: nonExistentProductIds
+                }
+            };
+
+        } catch (error) {
+            console.error('Error in findNonExistentProductIds:', error);
+            return {
+                success: false,
+                error: error.message || error
+            };
+        }
+    }
+
+    async createData(tableData) {
+        try {
+            // 数据验证
+            if (!tableData || Object.keys(tableData).length === 0) {
+                throw 'Invalid table data';
+            }
+
+            // 检查必要字段
+            const requiredFields = ['book_key', 'book_id', 'info']; // 替换为实际必要字段
+            for (const field of requiredFields) {
+                if (tableData[field]==null||tableData[field]==undefined) {
+                    throw `Missing required field: ${field}${tableData}`;
+                }
+            }
+
+            // 添加创建时间戳
+            // const dataToCreate = {
+            //     ...tableData
+            //     // created_at: new Date(),
+            //     // updated_at: new Date()
+            // };
+
+            const id = await get_fq_mf_book_tab_model.createData(tableData);
+
+
+            return {
+                success: true,
+                data: { id }
+            };
+        } catch (error) {
+            throw error;
+        }
+    }
+}
+
+module.exports =  new get_fq_mf_book_tab_controllers();

+ 68 - 0
src/data_manager/Controllers/spreads_controllers.js

@@ -0,0 +1,68 @@
+
+const spreads_model =  require('../Model/spreads_model');
+class spreads_controllers {
+
+    async getData(params) {
+        try {
+            // 参数验证
+            if (!params?.product_id) {
+                throw  'get_fq_book_tab_controllers:book_id ID is required';
+            }
+
+            const product_id = params.product_id;
+            const filterData = await spreads_model.findOne({ product_id: product_id });
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
+
+
+    async createData(tableData) {
+        try {
+            // 数据验证
+            if (!tableData || Object.keys(tableData).length === 0) {
+                throw 'Invalid table data';
+            }
+
+            // 检查必要字段
+            const requiredFields = ['product_id', 'name', 'cp_type', 'cp_spread_id', 'work_id']; 
+            for (const field of requiredFields) {
+                if (tableData[field]==null||tableData[field]==undefined) {
+                    throw `Missing required field: ${field}${JSON.stringify(tableData)}`;
+                }
+            }
+
+            // 添加创建时间戳
+            // const dataToCreate = {
+            //     ...tableData
+            //     // created_at: new Date(),
+            //     // updated_at: new Date()
+            // };
+
+            const id = await spreads_model.createData(tableData);
+
+
+            return {
+                success: true,
+                data: { id }
+            };
+        } catch (error) {
+            throw error;
+        }
+    }
+}
+
+module.exports =  new spreads_controllers();

+ 27 - 0
src/data_manager/Controllers/video_applet_product_controllers.js

@@ -125,6 +125,33 @@ class video_applet_product_controllers {
             throw error;
         }
     }
+
+    async getAppletProductByStatusAndLimit(params,limit=1) {
+        try {
+            // 参数验证
+            if (params.status==undefined||params.status==null) {
+                throw  'getAppletProductByStatusAndLimit:status is required';
+            }
+
+            const status = params.status;
+            const filterData = await video_applet_product_model.findDataByLimit({ status: status,wait_status :params.wait_status},limit);
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
 }
 
 module.exports =  new video_applet_product_controllers();

+ 68 - 0
src/data_manager/Controllers/works_controllers.js

@@ -0,0 +1,68 @@
+
+const works_model =  require('../Model/works_model');
+class works_controllers {
+
+    async getData(params) {
+        try {
+            // 参数验证
+            if (!params?.product_id) {
+                throw  'works_controllers:product_id ID is required';
+            }
+
+            const product_id = params.product_id;
+            const filterData = await works_model.findOne({ cp_work_id: product_id });
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
+
+
+    async createData(tableData) {
+        try {
+            // 数据验证
+            if (!tableData || Object.keys(tableData).length === 0) {
+                throw 'Invalid table data';
+            }
+
+            // 检查必要字段
+            const requiredFields = ['cp_work_id', 'cp_type', 'name']; 
+            for (const field of requiredFields) {
+                if (tableData[field]==null||tableData[field]==undefined) {
+                    throw `Missing required field: ${field}${JSON.stringify(tableData)}`;
+                }
+            }
+
+            // 添加创建时间戳
+            // const dataToCreate = {
+            //     ...tableData
+            //     // created_at: new Date(),
+            //     // updated_at: new Date()
+            // };
+
+            const id = await works_model.createWorkData(tableData);
+
+
+            return {
+                success: true,
+                data: { id }
+            };
+        } catch (error) {
+            throw error;
+        }
+    }
+}
+
+module.exports =  new works_controllers();

+ 71 - 0
src/data_manager/DataBaseCheck.js

@@ -0,0 +1,71 @@
+const mysql = require('mysql2/promise');
+const tools = require('../../tools');
+const config = tools.getCheckDataBaseConfig();
+
+class DataBaseCheck {
+    constructor() {
+        this.pool = null;
+    }
+
+    // 初始化连接池
+    init() {
+        try {
+            this.pool = mysql.createPool({
+                host: config.host,
+                user: config.user,
+                password: config.password,
+                database: config.database,
+                port: config.port,
+                waitForConnections: true,
+                connectionLimit: 10,
+                queueLimit: 0,
+                enableKeepAlive: true,
+                keepAliveInitialDelay: 0
+            });
+            
+            console.log('MySQL pool initialized');
+            return this.pool;
+        } catch (error) {
+            console.error('MySQL pool initialization error:', error);
+            throw error;
+        }
+    }
+
+    // 获取连接池实例
+    getInstance() {
+        if (!this.pool) {
+            this.init();
+        }
+        return this.pool;
+    }
+
+    // 执行查询
+    async query(sql, params) {
+        const connection = await this.getInstance().getConnection();
+        try {
+            const [results] = await connection.query(sql, params);
+            return results;
+        } finally {
+            connection.release();
+        }
+    }
+
+    // 执行事务
+    async transaction(callback) {
+        const connection = await this.getInstance().getConnection();
+        await connection.beginTransaction();
+
+        try {
+            const result = await callback(connection);
+            await connection.commit();
+            return result;
+        } catch (error) {
+            await connection.rollback();
+            throw error;
+        } finally {
+            connection.release();
+        }
+    }
+}
+
+module.exports = new DataBaseCheck();

+ 25 - 0
src/data_manager/Model/checks_products_model.js

@@ -0,0 +1,25 @@
+
+const CheckDbBaseModel = require('../CheckDbBaseModel')
+
+class checks_products_model extends CheckDbBaseModel {
+    constructor() {
+        super('products'); //表名
+    }
+
+    async findByMainId(MainId) {
+        return await this.findOne({ MainId });
+    }
+
+    async createOriginData(tableData) {
+        return await this.transaction(async (connection) => {
+            const id = await this.create(tableData);
+            return id;
+        });
+    }
+
+    async updateOriginData(id, profileData) {
+        return await this.update({ id: id }, profileData);
+    }
+}
+
+module.exports = new checks_products_model();

+ 18 - 0
src/data_manager/Model/get_fq_mf_book_tab_model.js

@@ -0,0 +1,18 @@
+
+const BaseModel = require('../BaseModel')
+
+class get_fq_mf_book_tab_model extends BaseModel {
+    constructor() {
+        super('get_fq_book_tab'); //表名
+    }
+
+    async createData(tableData) {
+        return await this.transaction(async (connection) => {
+            const id = await this.create(tableData);
+            return id;
+        });
+    }
+
+}
+
+module.exports =  new get_fq_mf_book_tab_model();

+ 25 - 0
src/data_manager/Model/spreads_model.js

@@ -0,0 +1,25 @@
+
+const CheckDbBaseModel = require('../CheckDbBaseModel')
+
+class spreads_model extends CheckDbBaseModel {
+    constructor() {
+        super('spreads'); //表名
+    }
+
+    async findByMainId(MainId) {
+        return await this.findOne({ MainId });
+    }
+
+    async createData(tableData) {
+        return await this.transaction(async (connection) => {
+            const id = await this.create(tableData);
+            return id;
+        });
+    }
+
+    async updateOriginData(id, profileData) {
+        return await this.update({ id: id }, profileData);
+    }
+}
+
+module.exports = new spreads_model();

+ 25 - 0
src/data_manager/Model/works_model.js

@@ -0,0 +1,25 @@
+
+const CheckDbBaseModel = require('../CheckDbBaseModel')
+
+class works_model extends CheckDbBaseModel {
+    constructor() {
+        super('works'); //表名
+    }
+
+    async findBycp_work_id(cp_work_id) {
+        return await this.findOne({ cp_work_id });
+    }
+
+    async createWorkData(tableData) {
+        return await this.transaction(async (connection) => {
+            const id = await this.create(tableData);
+            return id;
+        });
+    }
+
+    async updateWorkData(id, profileData) {
+        return await this.update({ id: id }, profileData);
+    }
+}
+
+module.exports = new works_model();

+ 36 - 0
src/helper.js

@@ -230,6 +230,42 @@ helper.getFqRequestOpt = function(key,sid_tt='b0390e26648a71801795b3b13c9d7d20')
       };
     return options
 }
+
+helper.getMfFqRequestOpt = function(key,sid_tt='85486acb04e1918afbee91a9466a9fdc'){
+    const options = {
+        url: `https://sdksaleapi.hubeidehuic.com/open_sdk/reader/directory/list/v1?novelsale_aid=40017686&novelsdk_aid=638505&novelsdk_version_code=230&novelsdk_device_type=V2049A&promotion_code=${key}&novelsdk_device_platform=android&version_code=290400&device_type=V2049A&sale_app_id=40017686&book_id&force_no_user_id=true&novelsdk_app_name=undefined&app_name=aweme&device_brand=vivo&device_platform=android&aid=1128&mini_app_version=2.3.0&iid=2936130190182979&device_id=825067091580075&ac=wifi&channel=douyin-huidu-gw-huidu-2940&version_name=29.4.0&os=android&ssmix=a&language=zh&os_api=31&os_version=12&manifest_version_code=290400&resolution=1080*2193&dpi=480&update_version_code=29400100&_rticket=1735289341306&first_launch_timestamp=1733382087&last_deeplink_update_version_code=0&cpu_support64=true&host_abi=arm64-v8a&is_guest_mode=0&app_type=normal&minor_status=0&appTheme=light&is_preinstall=0&need_personal_recommend=1&is_android_pad=0&is_android_fold=0&ts=1735289340&cdid=623fd2d5-5680-4aa4-95e8-78378a2ac7c5`,
+        headers: {
+            'Connection': 'keep-alive',
+            'Cookie': `sid_tt=${sid_tt};ssid_ucp_v1=1.0.0-KDVhZTIzM2QyOGFlMGE1MWRhMGIzNmI1MzFmZjlmMTVlODhjYmJiOTkKFQjr19Cz7syDAxC9zrm7Bhip_CY4CBoCbGYiIDg1NDg2YWNiMDRlMTkxOGFmYmVlOTFhOTQ2NmE5ZmRj;is_staff_user=false;sid_ucp_v1=1.0.0-KDVhZTIzM2QyOGFlMGE1MWRhMGIzNmI1MzFmZjlmMTVlODhjYmJiOTkKFQjr19Cz7syDAxC9zrm7Bhip_CY4CBoCbGYiIDg1NDg2YWNiMDRlMTkxOGFmYmVlOTFhOTQ2NmE5ZmRj;sessionid=${sid_tt};sessionid_ss=${sid_tt};uid_tt=88e8f06afa51aef4fac18f5d77607921;sid_guard=${sid_tt}%7C1735288637%7C5184000%7CTue%2C+25-Feb-2025+08%3A37%3A17+GMT;passport_csrf_token=08c2b9062233b43ce0e2dd24171203b1;odin_tt=9783bbcf8f09663820810574a01f08b307b6e74c90aa3d8a3b4a80faa9a7d4b197d7e807043c111dcbabde8551e1111145cc87c65fce067f3c532bd796b3681a;uid_tt_ss=88e8f06afa51aef4fac18f5d77607921;passport_csrf_token_default=08c2b9062233b43ce0e2dd24171203b1;store-region=cn-gd;store-region-src=uid;n_mh=9-mIeuD4wZnlYrrOvfzG3MuT6aQmCUtmr8FxV8Kl8xY`,
+            'User-Agent': 'Mozilla/5.0 (Linux; Android 12; V2049A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.6099.193 Mobile Safari/537.36 aweme/29.4.0 ToutiaoMicroApp/3.21.0 PluginVersion/29409006',
+            'bdp-sec-uid': 'MS4wLjABAAAA1M_29BGiEjsgNHMP-bmblk-9qGkx5vN7Y3HgltXiFghmy1mfPlH3eonnTWpXANjE',
+            'bdp-did': '825067091580075',
+            'bdp-channel': 'douyin-huidu-gw-huidu-2940',
+            'bdp-device-timezone-offset': '28800',
+            'bdp-os-version': '12',
+            'bdp-os-name': 'Android',
+            'bdp-uid': '1788263942327546',
+            'bdp-version-code': '290400',
+            'bdp-device-platform': 'Android',
+            'bdp-aid': '1128',
+            'bdp-device-manufacturer': 'vivo',
+            'bdp-app-id': 'tt26e45059b9d1239401',
+            'bdp-device-model': 'V2049A',
+            'Content-Type': 'application/json',
+            'activity_now_client': '0',
+            'x-bd-kmsv': '1',
+            'x-tt-request-tag': 's=-1;p=1',
+            'x-tt-trace-id': '00-074e072b0d2ee64e6e8d4abbf55d0468-074e072b0d2ee64e-01',
+            'X-Argus': '/WluZw==',
+            'X-Gorgon': '8404f06a00014b0d761b864b2932a41f362b9276f3488e7700de',
+            'X-Helios': 'AkKvNQvLH57rNKMEdZDNQPlc89Q1Zrs974uhRy+IDcTR/y8Z',
+            'X-Khronos': '1735289341',
+            'X-Ladon': 'Z25p/Q==',
+            'X-Medusa': '/mluZwqBMZ0qvrJcK0OmF6qmD3/QqgABDTUpyT1IA9+MOFfCQlYXoNnb+C/rkhLwH0AzGIam8DGpfzu3MFDs3fD3Jx12yo1AKxmV8ar5cQEJ+yz2srKfjMWVZhnlSHsA8UOdYdeclol6hoyOKCcvD9k+84icb0lW39sUS4b+3c/ZdQ2g/VnINn0Bpn+V99xK211ut9hvj+pP6zAVmrqx+c86fuUyOPwBgmLtJdoya9Z5ChWFBUpxgDZiurbYqGWHG1vDjIJSnKdKLRBhRNCmsvXf7lPifdINI8I3UOlRrZJW4m/sbQ46JlozT8Dza62mFCUJaMXSVXxrPdVxq9C06cZiwamtMQw6cnQZxcI0B2R2i65Ct45ohgrJE2g4z+nZRVrpBO9ApgIXQ/sp6jPKfbkSXHFzykdk75Ktwz67Vji7puQOOUUlyeMkaBGvEaq9EZnwOyJ3VxggUaqaH5CtKfYD7lnAM4TbjtLE3SMfZZNviajoNh7ouLeyNLUab/Qd9+MBMbWsTN49BwVlOUHKn9hp56XqRNWIWyrA55jDqL6iicuXtb8Xx//kvkccyUByLEde72oGf2/IRBIAgCvfVXH/hP6wJy1f6XjL0Or6I1qX98gWSGvN9HYObpKNGm/64vtoSpHDC1JWtcuf5ZzlsA4R8XbZKS/Tn0Y9kC89pmPnHYLscWtOFoirIRJ0DXqF/PM3kB4jilEe5Y26cvQK2LaSYcuKX7iL4rWLlVrWIh7EkoFH9Un4f8hruVSbhJMWbN+dXZyNn5BHq/+rASd0pCts3fz05xX4dYlfawDeX74MhFxnKcPZu9pS2hjqDZAPmuqKo/DWWDcsO2wT0R0Fd5k/rwtXFOxQgH07cDVkeIDpLjlT3jBdxQ6X9eDfC/EP+nQv+9WgwKkeG5FXDiIbd1++iS6Mb9V4OHmUowZDopiRFqCD5GeBQTkwEe8w05QJ4Dhdu5a5l1y3CzpS/hGgwr9Sos0QrrVXJI7x6Ah1+U05c4TNHXRe8lBUPJNWUHWBXgKznDKBh1+O+Y+jqKxTyIldTfkfXP/5H13/3Hk='
+        }
+      };
+    return options
+}
 helper.getHyCreateLinkOpt = function(token){
     const options = {
         url: `https://ms.zhangwenpindu.cn/manage/distribution/createLink`,

+ 68 - 0
tg_factory_main.js

@@ -8,6 +8,8 @@ const redis_help = require('./src/use_redis');
 const tools = require('./tools');
 const config = require('./etc/config.json')
 const hy_search_book = require('./src/api/hy/hy_search_book'); 
+
+const axios = require('axios');
 // function getPlatformInfoByI(PlatformConfig,tg_platform_id){
 //     for (let index = 0; index < PlatformConfig.length; index++) {
 //         const element = PlatformConfig[index];
@@ -34,6 +36,18 @@ if(config.isDebug){
     redis_help.connect( async (results)=>{
         if(results){
             isInit = true
+
+            
+                // let response =  helper.resolveDomain("sdksaleapi.hubeidehuic.com")
+                // console.log("response:",response)
+            // try {
+            //     const response = await makeRequest('PHWYF50CPI3');
+            //     console.log("response:",response)
+          
+            // } catch (error) {
+            //     console.error('Error in main execution:', error);
+            // }
+
             // main()
             // let hy_book_data = await require('./2_PRODUCT_FACTORY/collect_hy_book').runTask({book_id:"1869900926728654850"})
             // console.log("hy_book_data:",hy_book_data)
@@ -41,6 +55,60 @@ if(config.isDebug){
     })
 }
 
+
+
+
+async function makeRequest(key = '') {
+    const url = `https://sdksaleapi.hubeidehuic.com/open_sdk/reader/directory/list/v1?novelsale_aid=40017686&novelsdk_aid=638505&novelsdk_version_code=230&novelsdk_device_type=V2049A&promotion_code=${key}&novelsdk_device_platform=android&version_code=290400&device_type=V2049A&sale_app_id=40017686&book_id&force_no_user_id=true&novelsdk_app_name=undefined&app_name=aweme&device_brand=vivo&device_platform=android&aid=1128&mini_app_version=2.3.0&iid=2936130190182979&device_id=825067091580075&ac=wifi&channel=douyin-huidu-gw-huidu-2940&version_name=29.4.0&os=android&ssmix=a&language=zh&os_api=31&os_version=12&manifest_version_code=290400&resolution=1080*2193&dpi=480&update_version_code=29400100&_rticket=1735289341306&first_launch_timestamp=1733382087&last_deeplink_update_version_code=0&cpu_support64=true&host_abi=arm64-v8a&is_guest_mode=0&app_type=normal&minor_status=0&appTheme=light&is_preinstall=0&need_personal_recommend=1&is_android_pad=0&is_android_fold=0&ts=1735289340&cdid=623fd2d5-5680-4aa4-95e8-78378a2ac7c5`;
+
+    const headers = {
+        'Connection': 'keep-alive',
+        'Cookie': 'sid_tt=85486acb04e1918afbee91a9466a9fdc;ssid_ucp_v1=1.0.0-KDVhZTIzM2QyOGFlMGE1MWRhMGIzNmI1MzFmZjlmMTVlODhjYmJiOTkKFQjr19Cz7syDAxC9zrm7Bhip_CY4CBoCbGYiIDg1NDg2YWNiMDRlMTkxOGFmYmVlOTFhOTQ2NmE5ZmRj;is_staff_user=false;sid_ucp_v1=1.0.0-KDVhZTIzM2QyOGFlMGE1MWRhMGIzNmI1MzFmZjlmMTVlODhjYmJiOTkKFQjr19Cz7syDAxC9zrm7Bhip_CY4CBoCbGYiIDg1NDg2YWNiMDRlMTkxOGFmYmVlOTFhOTQ2NmE5ZmRj;sessionid=85486acb04e1918afbee91a9466a9fdc;sessionid_ss=85486acb04e1918afbee91a9466a9fdc;uid_tt=88e8f06afa51aef4fac18f5d77607921;sid_guard=85486acb04e1918afbee91a9466a9fdc%7C1735288637%7C5184000%7CTue%2C+25-Feb-2025+08%3A37%3A17+GMT;passport_csrf_token=08c2b9062233b43ce0e2dd24171203b1;odin_tt=9783bbcf8f09663820810574a01f08b307b6e74c90aa3d8a3b4a80faa9a7d4b197d7e807043c111dcbabde8551e1111145cc87c65fce067f3c532bd796b3681a;uid_tt_ss=88e8f06afa51aef4fac18f5d77607921;passport_csrf_token_default=08c2b9062233b43ce0e2dd24171203b1;store-region=cn-gd;store-region-src=uid;n_mh=9-mIeuD4wZnlYrrOvfzG3MuT6aQmCUtmr8FxV8Kl8xY',
+        'User-Agent': 'Mozilla/5.0 (Linux; Android 12; V2049A Build/SP1A.210812.003; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/120.0.6099.193 Mobile Safari/537.36 aweme/29.4.0 ToutiaoMicroApp/3.21.0 PluginVersion/29409006',
+        'bdp-sec-uid': 'MS4wLjABAAAA1M_29BGiEjsgNHMP-bmblk-9qGkx5vN7Y3HgltXiFghmy1mfPlH3eonnTWpXANjE',
+        'bdp-did': '825067091580075',
+        'bdp-channel': 'douyin-huidu-gw-huidu-2940',
+        'bdp-device-timezone-offset': '28800',
+        'bdp-os-version': '12',
+        'bdp-os-name': 'Android',
+        'bdp-uid': '1788263942327546',
+        'bdp-version-code': '290400',
+        'bdp-device-platform': 'Android',
+        'bdp-aid': '1128',
+        'bdp-device-manufacturer': 'vivo',
+        'bdp-app-id': 'tt26e45059b9d1239401',
+        'bdp-device-model': 'V2049A',
+        'Content-Type': 'application/json',
+        'activity_now_client': '0',
+        'x-bd-kmsv': '1',
+        'x-tt-request-tag': 's=-1;p=1',
+        'x-tt-trace-id': '00-074e072b0d2ee64e6e8d4abbf55d0468-074e072b0d2ee64e-01',
+        'X-Argus': '/WluZw==',
+        'X-Gorgon': '8404f06a00014b0d761b864b2932a41f362b9276f3488e7700de',
+        'X-Helios': 'AkKvNQvLH57rNKMEdZDNQPlc89Q1Zrs974uhRy+IDcTR/y8Z',
+        'X-Khronos': '1735289341',
+        'X-Ladon': 'Z25p/Q==',
+        'X-Medusa': '/mluZwqBMZ0qvrJcK0OmF6qmD3/QqgABDTUpyT1IA9+MOFfCQlYXoNnb+C/rkhLwH0AzGIam8DGpfzu3MFDs3fD3Jx12yo1AKxmV8ar5cQEJ+yz2srKfjMWVZhnlSHsA8UOdYdeclol6hoyOKCcvD9k+84icb0lW39sUS4b+3c/ZdQ2g/VnINn0Bpn+V99xK211ut9hvj+pP6zAVmrqx+c86fuUyOPwBgmLtJdoya9Z5ChWFBUpxgDZiurbYqGWHG1vDjIJSnKdKLRBhRNCmsvXf7lPifdINI8I3UOlRrZJW4m/sbQ46JlozT8Dza62mFCUJaMXSVXxrPdVxq9C06cZiwamtMQw6cnQZxcI0B2R2i65Ct45ohgrJE2g4z+nZRVrpBO9ApgIXQ/sp6jPKfbkSXHFzykdk75Ktwz67Vji7puQOOUUlyeMkaBGvEaq9EZnwOyJ3VxggUaqaH5CtKfYD7lnAM4TbjtLE3SMfZZNviajoNh7ouLeyNLUab/Qd9+MBMbWsTN49BwVlOUHKn9hp56XqRNWIWyrA55jDqL6iicuXtb8Xx//kvkccyUByLEde72oGf2/IRBIAgCvfVXH/hP6wJy1f6XjL0Or6I1qX98gWSGvN9HYObpKNGm/64vtoSpHDC1JWtcuf5ZzlsA4R8XbZKS/Tn0Y9kC89pmPnHYLscWtOFoirIRJ0DXqF/PM3kB4jilEe5Y26cvQK2LaSYcuKX7iL4rWLlVrWIh7EkoFH9Un4f8hruVSbhJMWbN+dXZyNn5BHq/+rASd0pCts3fz05xX4dYlfawDeX74MhFxnKcPZu9pS2hjqDZAPmuqKo/DWWDcsO2wT0R0Fd5k/rwtXFOxQgH07cDVkeIDpLjlT3jBdxQ6X9eDfC/EP+nQv+9WgwKkeG5FXDiIbd1++iS6Mb9V4OHmUowZDopiRFqCD5GeBQTkwEe8w05QJ4Dhdu5a5l1y3CzpS/hGgwr9Sos0QrrVXJI7x6Ah1+U05c4TNHXRe8lBUPJNWUHWBXgKznDKBh1+O+Y+jqKxTyIldTfkfXP/5H13/3Hk='
+    };
+
+    try {
+        const response = await axios({
+            method: 'get',
+            url: url,
+            headers: headers,
+            httpsAgent: new (require('https').Agent)({
+                rejectUnauthorized: false
+            })
+        });
+        
+        console.log(response.data);
+        return response.data;
+    } catch (error) {
+        console.error('Error:', error.message);
+        throw error;
+    }
+}
+
 // let data = await hy_search_book.search_id("1868479666362478594")
 // console.log("data:",data)
 

+ 4 - 0
tools.js

@@ -99,6 +99,10 @@ class tools {
         return config.isDebug?config.debug_supdate_config:config.release_supdate_config
     }
 
+    getCheckDataBaseConfig(){
+        return config.isDebug?config.debug_check_mysql:config.release_chekc_mysql
+    }
+
     getDataBaseConfig(){
         return config.isDebug?config.debug_mysql:config.release_mysql
     }