904118851 před 3 týdny
rodič
revize
8f8e537048

+ 62 - 2
0_RECEIVE_FACTORY/RECEIVE_FACTORY.js

@@ -590,7 +590,7 @@ CMD.hy_topUpTemplate = async function(res,accountId) {
 
 
 
- CMD.get_match_book_info = async function(res,book_id,platform) {
+ CMD.get_match_book_info = async function(res,book_id,platform,book_name) {
     let book_info = null
     if(platform==config.platform_fanqie){
         book_info = await require('../src/api/fq/fq_search_book').根据番茄付费ID查询免费书籍(book_id)
@@ -600,6 +600,22 @@ CMD.hy_topUpTemplate = async function(res,accountId) {
         book_info = await require('../src/api/qm_mf/qm_mf_search_book').根据七猫付费ID查询免费书籍(book_id)
     }else if(platform==config.platform_qmmf){
         book_info = await require('../src/api/qm/qm_search_book').根据七猫免费D查询付费书籍(book_id)
+    }else if(platform==config.platform_zy){
+        let iaa_book_info = await require('../src/api/zy_mf/zy_mf_search_book').new_search_name(book_name)
+        if(iaa_book_info!=null){
+            iaa_book_info = await require('../src/api/zy_mf/zy_mf_search_book').new_search_id(iaa_book_info.book_id)
+            if(iaa_book_info!=null){
+                book_info = iaa_book_info
+            }
+        }
+    }else if(platform==config.platform_zymf){
+        let iap_book_info = await require('../src/api/zy/zy_search_book').new_search_name(book_name)
+        if(iap_book_info!=null){
+            iap_book_info = await require('../src/api/zy/zy_search_book').new_search_id(iap_book_info.book_id)
+            if(iap_book_info!=null){
+                book_info = iap_book_info
+            }
+        }
     }
     res.writeHead(200, {'Content-Type': 'application/json'});
     if(book_info==null){
@@ -629,6 +645,42 @@ CMD.hy_topUpTemplate = async function(res,accountId) {
     res.end(JSON.stringify({ message:"成功!",data:list,code:10000}));
  }
 
+
+
+
+ CMD.get_zy_mf_account_list = async function(res) {
+    let token = await require('../src/api/zy_mf/get_zy_mf_token').get_token()
+    console.log("token:",token)
+    let clinet = tools.getOneNewClinet()
+    let response = await clinet.get(`https://openapi-gaia.zhangyue.com/opendata/reseller/info?access_token=${token}`)
+    let list = null
+    if(response.data.code!=0){
+        console.error("get_zy_account_list error:",response)
+    }else{
+        list = response.data.body.users
+    }
+    res.writeHead(200, {'Content-Type': 'application/json'});
+    res.end(JSON.stringify({ message:"成功!",data:list,code:10000}));
+ }
+
+ CMD.get_zy_mf_callback_template = async function(res,owner,page,size) {
+    let token = await require('../src/api/zy_mf/get_zy_mf_token').get_token()
+    let clinet = tools.getOneNewClinet()
+    let response = await clinet.post(`https://openapi-gaia.zhangyue.com/opendata/reseller/free/book/callback/list`,{
+        access_token:token,
+        owner:parseInt(owner),
+        page:page,
+        size:size
+    })
+    let list = null
+    if(response.data.code!=0){
+        console.error("get_zy_account_list error:",response)
+    }else{
+        list = response.data.body.list
+    }
+    res.writeHead(200, {'Content-Type': 'application/json'});
+    res.end(JSON.stringify({ message:"成功!",data:list,code:10000}));
+ }
 var server = http.createServer(function(req,res){
 
     res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有域的请求,注意:在生产环境中应该限制为特定的域
@@ -786,10 +838,18 @@ var server = http.createServer(function(req,res){
                         CMD.get_zy_callback_template(res,owner,page,size) 
                     }else if(jsonData['fun']=="get_zy_account_list"&&jsonData['cmd']=="zy_link"){
                         CMD.get_zy_account_list(res) 
+                    }else if(jsonData['fun']=="get_zy_mf_callback_template"&&jsonData['cmd']=="zy_mf_link"){
+                        let owner = jsonData['data']['owner']
+                        let page = jsonData['data']['page']==undefined?1:jsonData['data']['page']
+                        let size = jsonData['data']['size']==undefined?100:jsonData['data']['size']
+                        CMD.get_zy_mf_callback_template(res,owner,page,size) 
+                    }else if(jsonData['fun']=="get_zy_mf_account_list"&&jsonData['cmd']=="zy_mf_link"){
+                        CMD.get_zy_mf_account_list(res) 
                     }else if(jsonData['fun']=="get_match_book_info"&&jsonData['cmd']=="match"){
                         let book_id = jsonData['data']['book_id']
                         let platform = parseInt(jsonData['data']['platform'])
-                        await CMD.get_match_book_info(res,book_id,platform) 
+                        let book_name = jsonData['data']['book_name']
+                        await CMD.get_match_book_info(res,book_id,platform,book_name) 
                     } else{
                         res.writeHead(200, {'Content-Type': 'application/json'});
                         res.end(JSON.stringify({ message: 'fun 错误',code:100}));

+ 3 - 1
2_PRODUCT_FACTORY/dz_batch_factory.js

@@ -326,7 +326,9 @@ CMD.insert_product = async function(data){
         product_name:data.book_name,
         genre:data.genre,
         product_id:data.book_id,
-        words:data.words
+        words:data.words,
+        author:data.author,
+        publish_time:data.publish_time
     })
 }
 

+ 3 - 1
2_PRODUCT_FACTORY/qm_batch_factory.js

@@ -388,7 +388,9 @@ CMD.insert_product = async function(data){
             genre:data.genre,
             product_id:data.book_id,
             words:data.words,
-            match_book:match_book
+            match_book:match_book,
+            author:data.author,
+            publish_time:data.publish_time
         })
     }catch(e){
         console.error("insert_product:",e)

+ 6 - 4
2_PRODUCT_FACTORY/qm_mf_batch_factory.js

@@ -363,11 +363,13 @@ CMD.insert_product = async function(data){
         if(!product_info.success){//如果没有这本付费的书
             await video_product_controllers.createProductData({
                 book_platform:config.platform_qimao,
-                product_name:data.book_name,
-                genre:data.genre,
+                product_name:iap_book_info.book_name,
+                genre:iap_book_info.genre,
                 product_id:product_parent_id,
-                words:data.words,
-                match_book:data.book_id
+                words:iap_book_info.words,
+                match_book:data.book_id,
+                author:iap_book_info.author,
+                publish_time:iap_book_info.publish_time
             })
         }
     }

+ 3 - 1
2_PRODUCT_FACTORY/zh_batch_factory.js

@@ -330,7 +330,9 @@ CMD.insert_product = async function(data){
         product_name:data.book_name,
         genre:data.genre,
         product_id:data.book_id,
-        words:data.words
+        words:data.words,
+        author:data.author,
+        publish_time:data.publish_time
     })
 }
 

+ 27 - 3
2_PRODUCT_FACTORY/zy_batch_factory.js

@@ -316,8 +316,6 @@ CMD.update_filter_data = async function(FilterConfig,data) {
             }
         }
 
-        
-        
     }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})
@@ -326,6 +324,31 @@ CMD.update_filter_data = async function(FilterConfig,data) {
 
 
 CMD.insert_product = async function(data){
+
+    let match_book = "NONE"
+    let iaa_book_info = await require('../src/api/zy_mf/zy_mf_search_book').new_search_name(data.book_name)
+    if(iaa_book_info!=null){
+        iaa_book_info= await require('../src/api/zy_mf/zy_mf_search_book').new_search_id(iaa_book_info.book_id)
+        if(iaa_book_info!=null){
+            match_book = iaa_book_info.book_id
+            let product_info = await video_product_controllers.getProductData({book_id:iaa_book_info.book_id}); 
+            if(!product_info.success){//如果没有这本付费的书
+                await video_product_controllers.createProductData({
+                    book_platform:config.platform_zymf,
+                    product_name:iaa_book_info.book_name,
+                    genre:iaa_book_info.genre,
+                    product_id:iaa_book_info.book_id,
+                    words:iaa_book_info.words,
+                    totalChapterNum:iaa_book_info.totalChapterNum,
+                    publish_time:iaa_book_info.publish_time,
+                    default_pay_section:iaa_book_info.default_pay_section,
+                    product_parent_id:data.book_id,
+                    match_book:data.book_id,
+                })
+            }
+        }
+    }
+
     if(data.fee_unit==20){
         data.default_price =data.default_price<0.9?0.9:data.default_price
     }
@@ -339,7 +362,8 @@ CMD.insert_product = async function(data){
         publish_time:data.publish_time,
         default_pay_section:data.default_pay_section,
         default_price:data.default_price,
-        fee_unit:data.fee_unit
+        fee_unit:data.fee_unit,
+        match_book:match_book
     })
 }
 

+ 313 - 0
2_PRODUCT_FACTORY/zy_mf_batch_factory.js

@@ -0,0 +1,313 @@
+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 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 config = require('../etc/config.json');
+const tools = require('../tools');
+const time_count = 1000;
+const task_queue = []
+
+
+async function processTask(){
+    let result = null
+    try{
+
+        result = await filter_data_controllers.getZyFilterData({tg_platform_id:config.platform_zy,status:2})
+        
+        if(!result.success){
+            console.error("没数据了!")
+        }else{
+            let product_item = result.data
+            task_queue.push({result:{data:product_item}})
+        }
+
+    }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_zy){ //掌阅
+                    let zy_book_data = await require('../src/api/zy_mf/zy_mf_search_book').new_search_id(result.data.book_id)
+                    if(zy_book_data==null){
+                        result.data.genre = 999
+                    }else{
+                        zy_book_data.tg_platform_id = config.platform_zymf
+                        // if(CMD.isGenre(FilterConfig,zh_book_data.genre)){
+                        //     await CMD.insert_product(zh_book_data)
+                        // }
+                        await CMD.insert_product(zy_book_data)
+                        result.data.words = zy_book_data.words
+                        result.data.genre = zy_book_data.genre
+                        result.data.book_id = zy_book_data.book_id
+                        result.data.book_name = zy_book_data.book_name
+                    }
+                }
+            }else{
+                result.data.words = product.words
+                result.data.genre = product.genre
+                result.data.book_id = product.product_id
+                result.data.book_name = product.product_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.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){
+    return true
+    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.getPlatformInfo = function(PlatformConfig,tg_platform_id){
+    for (let index = 0; index < PlatformConfig.length; index++) {
+        const element = PlatformConfig[index];
+        if(element.tg_platform_id==tg_platform_id){
+            return element
+        }
+    }
+}
+CMD.getSharedPlatform = function(PlatformShared,platform_shared_id){
+    for (let index = 0; index < PlatformShared.length; index++) {
+        const element = PlatformShared[index];
+        if(element.id==platform_shared_id){
+            return JSON.parse(element.info)
+        }
+    }
+}
+
+CMD.update_filter_data = async function(FilterConfig,data) {
+    let isGenre = CMD.isGenre(FilterConfig,data.genre)
+    if(isGenre){
+        if(data.genre==999){
+            return await filter_data_controllers.updateFilterData({id:data.id},{status:3,book_id:data.book_id,book_name:data.book_name,genre:data.genre,words:data.words,material_sync_status:2})
+        }else{
+            await filter_data_controllers.updateFilterData({id:data.id},{tg_platform_id:config.platform_zymf,status:1,book_name:data.book_name})
+        }
+        //创建一个小程序    
+
+        let MainConfig = await redis_help.getKeyValue("MainConfig")
+
+        MainConfig = JSON.parse(MainConfig)
+
+        let AppConfig = await redis_help.getKeyValue("AppConfig")
+
+        AppConfig = JSON.parse(AppConfig)
+
+        let PlatformShared = await redis_help.getKeyValue("PlatformShared")
+
+        PlatformShared = JSON.parse(PlatformShared)
+        
+        let PlatformConfig = await redis_help.getKeyValue("PlatformConfig")
+
+        PlatformConfig = JSON.parse(PlatformConfig)
+
+        let PlatformInfo = CMD.getPlatformInfo(PlatformConfig,config.platform_zymf)
+
+
+        let all_platform_list = CMD.getSharedPlatform(PlatformShared,PlatformInfo.platform_shared_id)
+
+
+        for (let i = 0; i < all_platform_list.length; i++) {
+            const tg_platform_id = all_platform_list[i];
+
+            let AppInfoList = CMD.getAppInfoByPlatformId(AppConfig,tg_platform_id)
+
+
+            for (let j = 0; j < AppInfoList.length; j++) {
+                const AppInfo = AppInfoList[j];
+                data.app_id = AppInfo.app_id
+
+                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
+                    let butler_id = main_info.butler_id
+                    if(main_info.tg_link_config==undefined||main_info.tg_link_config==null){
+                        console.error("主体配置推广链接错误:",main_info)
+                    }else{
+                        let mian_genre = main_info.genre
+                        let book_genre = data.genre
+
+                        let min_book_word = main_info.min_book_word
+                        let max_book_word = main_info.max_book_word
+                        let word = data.words
+                        let material_platform_id = main_info.material_platform_id
+                        if(!CMD.isBlackBook(black_books,data.book_id)&&word>=min_book_word&&word<=max_book_word){
+                            //符合标准进行创建表
+                            let butler_video_applet_info = await tools.getAppletProductDataByButlerId(butler_id,data.book_id,data.main_id)
+                            if(butler_video_applet_info==null){
+                                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:config.platform_zymf,
+                                        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,
+                                        material_platform_id:material_platform_id,
+                                        butler_id:butler_id
+                                    })
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        
+        
+    }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){
+    //查找父id,如果找到就赋值,否则父id就是自己
+    let product_parent_id = data.book_id
+    let iap_book_info = await require('../src/api/zy/zy_search_book').new_search_name(data.book_name)
+    let match_book = "NONE"
+    if(iap_book_info!=null){
+        iap_book_info = await require('../src/api/zy/zy_search_book').new_search_id(iap_book_info.book_id)
+        product_parent_id = iap_book_info.book_id
+        match_book = product_parent_id
+    }
+
+    if(product_parent_id!=data.book_id){
+        //寻找父id的书
+        let product_info = await video_product_controllers.getProductData({book_id:product_parent_id}); 
+        if(!product_info.success){//如果没有这本付费的书
+            await video_product_controllers.createProductData({
+                book_platform:config.platform_zy,
+                product_name:iap_book_info.book_name,
+                genre:iap_book_info.genre,
+                product_id:product_parent_id,
+                words:iap_book_info.words,
+                match_book:data.book_id,
+                publish_time:iap_book_info.publish_time,
+                totalChapterNum:iap_book_info.totalChapterNum,
+                default_pay_section:iap_book_info.default_pay_section,
+                default_price:iap_book_info.default_price,
+                fee_unit:iap_book_info.fee_unit
+            })
+        }
+    }
+
+    return await video_product_controllers.createProductData({
+        book_platform:config.platform_zymf,
+        product_name:data.book_name,
+        genre:data.genre,
+        product_id:data.book_id,
+        words:data.words,
+        totalChapterNum:data.totalChapterNum,
+        publish_time:data.publish_time,
+        default_pay_section:data.default_pay_section,
+        default_price:data.default_price,
+        fee_unit:data.fee_unit,
+        product_parent_id:product_parent_id,
+        match_book:match_book,
+    })
+}
+
+CMD.init()

+ 60 - 0
5_CREATE_LINK_FACTORY/zy_mf_create_link.js

@@ -0,0 +1,60 @@
+//执行一个创建掌阅链接任务
+const axios = require('axios');
+const helper = require('../src/helper');
+const config = require('../etc/config.json');
+const video_product_controllers = require('../src/data_manager/Controllers/video_product_controllers');
+const tools = require('../tools');
+const CMD = {}
+
+CMD.runTask = async function(t_data,main_info,PlatformInfo,call_back){
+    // let recharge =  await get_recharge_template()
+    let  zy_conifg = JSON.parse(main_info.zy_conifg)
+    try {
+        let token = await require('../src/api/zy_mf/get_zy_mf_token').get_token()
+        console.log("token:",token)
+        let clinet = tools.getOneNewClinet()
+        let book_info = await video_product_controllers.getProductData({book_id:t_data.product_id})
+        if(book_info.success==false){
+            throw "没有找到这本书:"+t_data.product_id
+        }
+        let unlock_gradients = zy_conifg.unlock_gradients
+        let free_word_count = zy_conifg.free_word_count
+        let start_pay_section = zy_conifg.start_pay_section!=0?zy_conifg.start_pay_section:book_info.data.default_pay_section
+        let response = await clinet.post(`https://openapi-gaia.zhangyue.com/opendata/reseller/free/book/link/create`,{
+            access_token:token,
+            name:`${t_data.product_name}_${main_info.id}`,
+            source:"toutiao2",        //媒体 - 抖音小程序 只能使用 "toutiao2" - 微信小程序可选项如下   - bili B站/   - toutiao2 头条2.0   - gdt3 广点通3.0
+            start_pay_section:start_pay_section, //开始付费章节
+            book_chapter:zy_conifg.book_chapter, //调起章节
+            book_id:parseInt(t_data.product_id),
+            callback_conf_reseller_id:zy_conifg.callback_conf_reseller_id, //回传策略ID
+            owner:zy_conifg.owner, //创建用户id
+            app_key:zy_conifg.app_key, //应用Key
+            free_word_count:free_word_count, //超短篇免费字数
+            unlock_gradients:unlock_gradients //[{"end_unlock_count":999,"start_unlock_count":0,"unlock_word_count":80}] //超短篇单本书解锁次数
+        })
+        let promotion_info = null
+        if(response.data.code!=0){
+            console.error("get_zy_account_list error:",response)
+        }else{
+            promotion_info = response.data.body
+        }
+        if(promotion_info==null){
+            console.error("promotion_info==null")
+            throw response.data
+        }
+        let start_page = promotion_info.start_page
+        let start_param = promotion_info.start_params
+        t_data.promotion_id = promotion_info.channel_id
+        t_data.start_page = start_page
+        t_data.start_param = start_param
+        console.log('t_data:',t_data)
+        await call_back(t_data,null)
+    } catch (error) {
+        await call_back(t_data,error)
+        return null;
+    }
+
+}
+
+module.exports = CMD;

+ 220 - 0
5_CREATE_LINK_FACTORY/zy_mf_create_link_factory.js

@@ -0,0 +1,220 @@
+const CMD = {}
+const time_count = 2000;
+const redis_help = require('../src/use_redis');
+const video_applet_product_controllers = require('../src/data_manager/Controllers/video_applet_product_controllers');
+var zy_create_link_task_list = []
+const config = require('../etc/config.json');
+const tools = require('../tools');
+let finish_call_back = async function(new_data,error_info=null){
+    try{
+        if(new_data.start_page != null && error_info==null){
+            const result = await video_applet_product_controllers.updateData({id:new_data.id},{
+                    dy_small_program_start:new_data.start_page,
+                    dy_small_program_start_data:new_data.start_param,
+                    promotion_id:new_data.promotion_id,
+                    wait_status:2,
+                    status:1,
+                    check_url:"https://n8-adv-ocean.s6kuwan.com"
+            })
+        }else{
+            const result = await video_applet_product_controllers.updateData({id:new_data.id},{
+                status:2,
+                wait_status:2,
+                error_info:JSON.stringify(error_info)
+            })
+        }
+  
+    }catch(e){
+        console.log("finish_call_back error:",e)
+    }
+   
+}
+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.getPlatformInfo = function(PlatformConfig,tg_platform_id){
+    for (let index = 0; index < PlatformConfig.length; index++) {
+        const element = PlatformConfig[index];
+        if(element.tg_platform_id==tg_platform_id){
+            return element
+        }
+    }
+}
+CMD.getSharedPlatform = function(PlatformShared,platform_shared_id){
+    for (let index = 0; index < PlatformShared.length; index++) {
+        const element = PlatformShared[index];
+        if(element.id==platform_shared_id){
+            return JSON.parse(element.info)
+        }
+    }
+}
+
+async function getAppletProduct(tg_platform_id) {
+    let temp_result = await video_applet_product_controllers.getAppletProductByBookPlatformAndLimit({status:0,wait_status:0,book_platform:tg_platform_id,weight:4},1)
+    if(temp_result.success){
+        return temp_result.data
+    }
+    temp_result = await video_applet_product_controllers.getAppletProductByBookPlatformAndLimit({status:0,wait_status:0,book_platform:tg_platform_id,weight:2},1)
+    if(temp_result.success){
+        return temp_result.data
+    }
+    temp_result = await video_applet_product_controllers.getAppletProductByBookPlatformAndLimit({status:0,wait_status:0,book_platform:tg_platform_id,weight:1},1)
+    if(temp_result.success){
+        return temp_result.data
+    }
+    temp_result = await video_applet_product_controllers.getAppletProductByBookPlatformAndLimit({status:0,wait_status:0,book_platform:tg_platform_id,weight:0},1)
+    if(temp_result.success){
+        return temp_result.data
+    }
+    return []
+}
+
+async function processTask(){
+    try{
+        let MainConfig = await redis_help.getKeyValue("MainConfig")
+        MainConfig = JSON.parse(MainConfig)
+        let PlatformConfig = await redis_help.getKeyValue("PlatformConfig")
+        PlatformConfig = JSON.parse(PlatformConfig)
+        let black_books = await redis_help.getKeyValue("all_black_books")
+        if(black_books!=null){
+            black_books = JSON.parse(black_books)
+        }
+
+        let PlatformShared = await redis_help.getKeyValue("PlatformShared")
+
+        PlatformShared = JSON.parse(PlatformShared)
+
+        let platform_zy_info = CMD.getPlatformInfo(PlatformConfig,config.platform_zymf)
+
+        let all_platform_list = CMD.getSharedPlatform(PlatformShared,platform_zy_info.platform_shared_id)
+
+        let result = null
+        
+        for (let index = 0; index < all_platform_list.length; index++) {
+            const tg_platform_id = all_platform_list[index];
+            // let temp_result = await video_applet_product_controllers.getAppletProductDataByStatus({status:0,wait_status:0,book_platform:tg_platform_id})
+            // if(temp_result.success){
+            //     result = temp_result
+            //     break
+            // }
+            let temp_result = await getAppletProduct(tg_platform_id)
+            if(temp_result.length>0){
+                result = {
+                    success:true,
+                    data: temp_result[0]
+                }
+                break
+            }
+        }
+
+        if(result==null){
+            return
+        }
+
+        if(result.success){
+            if(CMD.isBlackBook(black_books,result.data.product_id)){
+                await video_applet_product_controllers.updateData({id:result.data.id},{
+                    status:2,
+                    wait_status:2,
+                    error_info:JSON.stringify({msg:"当前书在黑名单"})
+                    ,error_type:1
+                })
+                throw "当前书在黑名单"
+            }
+            let main_info = CMD.getMainInfoById(MainConfig,result.data.main_id)
+
+            
+            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,result.data.main_id)
+            }
+
+            if(main_info==null){
+                await video_applet_product_controllers.updateData({id:result.data.id},{
+                    status:2,
+                    wait_status:2,
+                    error_info:JSON.stringify({msg:"主体配置错误:"})
+                })
+                console.error("主体配置错误:",result)
+                throw "主体配置错误:"
+            }
+            
+            let PlatformInfo = null
+            
+            PlatformInfo = CMD.getPlatformInfoById(PlatformConfig,main_info.tg_platform_id)
+
+            if(PlatformInfo==null){
+                await video_applet_product_controllers.updateData({id:result.data.id},{
+                    status:2,
+                    wait_status:2,
+                    error_info:JSON.stringify({msg:"平台配置错误:"})
+                })
+                console.error("平台配置错误:",result)
+                throw "平台配置错误:"
+            }
+  
+
+            zy_create_link_task_list.push({
+                n_data:result.data,
+                main_info:main_info,
+                PlatformInfo:PlatformInfo
+            })
+        }
+
+        console.log("zy_create_link_task_list:",zy_create_link_task_list)
+
+        if(zy_create_link_task_list.length>0){
+            let zy_create_link_task = zy_create_link_task_list.pop()
+            await require('./zy_mf_create_link').runTask(zy_create_link_task.n_data
+                ,zy_create_link_task.main_info,
+                zy_create_link_task.PlatformInfo,finish_call_back)
+        }
+    }catch(e){
+        console.log("zh_create_link_factory error:",e)
+        finish_call_back(null,{"MESSAGE":"yw_create_link_factory error:"})
+    } finally{
+        global.setTimeout(processTask,time_count)
+    }
+}
+CMD.init = function(){
+    redis_help.connect((results)=>{
+        if(results){
+        }
+    })
+    processTask()
+}
+
+
+
+CMD.getPlatformInfoById = function(PlatformConfig,tg_platform_id){
+    for (let index = 0; index < PlatformConfig.length; index++) {
+        const element = PlatformConfig[index];
+        if(element.tg_platform_id==tg_platform_id){
+            return element
+        }
+    }
+    return null
+}
+
+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
+}
+CMD.init()

+ 9 - 0
MESSAGE_DISPATCH/MESSAGE_DISPATCH.js

@@ -363,6 +363,15 @@ CMD.updateTimeConfig = async function(){
         await redis_help.setKeyValue("zy_token",zy_token)
     }
 
+
+    let zy_mf_token = await require('../src/api/zy_mf/zy_mf_login').zy_login()
+
+    if(zy_mf_token!=null){
+        console.log("zy_token:",zy_mf_token)
+        await redis_help.setKeyValue("zy_mf_token",zy_mf_token)
+    }
+
+
 }
 //定时更新配置
 CMD.updateConfig = function(){

binární
dump.rdb


+ 2 - 1
etc/config.json

@@ -190,5 +190,6 @@
     "platform_zhihu":15,
     "platform_heiyanmf":18,
     "platform_qmmf":19,
-    "platform_zy":20
+    "platform_zy":20,
+    "platform_zymf":24
 }

+ 28 - 0
match_book.json

@@ -55,6 +55,34 @@
             "merge_logs": true,
             "exec_mode": "fork",
             "autorestart": true
+        },
+        {
+            "name": "run_zy_iaa_match_7day",
+            "script": "./task_script/run_zy_iaa_match_7day.js",
+            "node_args": "--max-old-space-size=8192 --expose-gc",
+            "max_memory_restart": "4G",
+            "args": ["--type=data"],
+            "cwd": "/home/tg_factory",
+            "log_date_format": "YYYY-MM-DD HH:mm:ss",
+            "error_file": "./logs/MATCH_BOOK/run_zy_iaa_match_7day_error.log",
+            "out_file": "./logs/MATCH_BOOK/run_zy_iaa_match_7day_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
+        },
+        {
+            "name": "run_zy_iap_match_7day",
+            "script": "./task_script/run_zy_iap_match_7day.js",
+            "node_args": "--max-old-space-size=8192 --expose-gc",
+            "max_memory_restart": "4G",
+            "args": ["--type=data"],
+            "cwd": "/home/tg_factory",
+            "log_date_format": "YYYY-MM-DD HH:mm:ss",
+            "error_file": "./logs/MATCH_BOOK/run_zy_iap_match_7day_error.log",
+            "out_file": "./logs/MATCH_BOOK/run_zy_iap_match_7day_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
         }
     ]
 }

+ 14 - 0
pm2createlink.json

@@ -139,6 +139,20 @@
             "merge_logs": true,
             "exec_mode": "fork",
             "autorestart": true
+        },
+        {
+            "name": "zy_mf_create_link_factory",
+            "script": "./5_CREATE_LINK_FACTORY/zy_mf_create_link_factory.js",
+            "node_args": "--max-old-space-size=8192 --expose-gc",
+            "max_memory_restart": "4G",
+            "args": ["--type=data"],
+            "cwd": "/home/tg_factory",
+            "log_date_format": "YYYY-MM-DD HH:mm:ss",
+            "error_file": "./logs/create_link/zy_mf_create_link_factory_error.log",
+            "out_file": "./logs/create_link/zy_mf_create_link_factory_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
         }
     ]
 }

+ 14 - 0
pm2json.json

@@ -265,6 +265,20 @@
             "exec_mode": "fork",
             "autorestart": true
         },
+        {
+            "name": "zy_mf_batch_factory",
+            "script": "./2_PRODUCT_FACTORY/zy_mf_batch_factory.js",
+            "cwd": "/home/tg_factory",
+            "node_args": "--max-old-space-size=8192 --expose-gc",
+            "max_memory_restart": "4G",
+            "args": ["--type=data"],
+            "log_date_format": "YYYY-MM-DD HH:mm:ss",
+            "error_file": "./logs/zy_mf_batch_factory_error.log",
+            "out_file": "./logs/zy_mf_batch_factory_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
+        },
         {
             "name": "find_have_350_book",
             "script": "./QM_SCRIPT/find_have_350_book.js",

binární
src/api/hy/qr.gif


binární
src/api/hy/qr_resized.gif


+ 37 - 0
src/api/zy/zy_search_book.js

@@ -88,7 +88,44 @@ CMD.new_search_id = async function(bookId) {
         return info;
 
     }catch(e){
+        return null
+    }
+}
+
+
+CMD.new_search_name = async function(bookName) {
+    try{
+        let authorization = await redis_help.getKeyValue("zy_token")
+        console.log("authorization:",authorization)
+        let clinet = tools.getOneNewClinet({
+            // "cookie":"acw_tc=1a0c639417498037411406820e006fb57d572ffdc9c83cd8a46aaf8d19ca00",
+            "authorization": authorization,
+        })
+
+        let list = null
+
+        let response =  await clinet.get(`https://gaia.zhangyue.com/gaia/v1/open_api/search/pay/book/channel/price/getBookNameList?application_uniq_id=zhuyunstory_mini&name=${encodeURIComponent(bookName)}&page=1&size=10&scheme_id=39`)
+
+        if(response.data.code!=0){
+            console.error("new_search_id error:",response)
+            throw response.data
+        }else{
+            list = response.data.body.items
+        }
+
 
+        if(list.length<0){
+            throw response.data
+        }
+
+        let book_info = list[0]
+        let info = {}
+        info.book_name =  book_info.name
+        info.book_id =  book_info.id
+        return info;
+
+    }catch(e){
+        return null
     }
 }
 module.exports = CMD;

+ 26 - 0
src/api/zy_mf/get_zy_mf_token.js

@@ -0,0 +1,26 @@
+
+const tools = require('../../../tools');
+const redis_help = require('../../use_redis');
+const crypto = require('crypto')
+const CMD = {}
+CMD.get_token = async function () {
+    let clinet = tools.getOneNewClinet()
+
+    let timestamp = tools.getCurrentUnixTimestamp()
+    const tmpValue = `${"7c37946b8817a4dbaa74052e0e8ece09"}_${timestamp}`;
+    const sign = crypto.createHash('md5').update(`${"f4171294137aa62d1625d9ff33c331d5"}_${tmpValue}`).digest('hex');
+
+    let response = await clinet.post("https://openapi-gaia.zhangyue.com/zauth/open/token/oauth",{
+        access_key:"7c37946b8817a4dbaa74052e0e8ece09",
+        signature:sign,
+        timestamp:timestamp
+    })
+
+    if(response.data.code==0){
+        return response.data.body.access_token
+    }
+    console.error("response:",response)
+    return null
+}
+
+module.exports = CMD;

+ 38 - 0
src/api/zy_mf/zy_mf_login.js

@@ -0,0 +1,38 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const helper = require('../../helper');
+const CMD = {}
+CMD.zy_login = async function() {
+    try{
+
+        let clinet = tools.getOneNewClinet({
+           
+        })
+
+        let token = null
+
+        let response =  await clinet.post(`https://gaia.zhangyue.com/gaia/v1/open_api/user/login`,{
+            account: 'gzzywz003@163.com',
+            passwd: 'Zy@123456'
+        })
+
+        if(response.data.code!=0){
+            console.error("zy_login error:",response)
+            throw response.data
+        }else{
+            token = `Bearer ${response.data.body.token}` 
+        }
+        if(token==null){
+            throw response.data
+        }
+        console.log("登录成功!")
+        return token;
+
+    }catch(e){
+        console.error("zy_login response:",e)
+        return null
+    }
+}
+module.exports = CMD;

+ 133 - 0
src/api/zy_mf/zy_mf_search_book.js

@@ -0,0 +1,133 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const helper = require('../../helper');
+const { urlencoded } = require('express');
+const CMD = {}
+CMD.search_id = async function(bookId) {
+    try{
+        let timestamp = helper.getCurrentUnixTimestamp()
+        let token = await require('../zy_mf/get_zy_mf_token').get_token()
+        let app_key = "shiyuestory_mini"
+        let user_id = 7850
+        let clinet = tools.getOneNewClinet()
+        let param = `access_token=${token}&app_key=${app_key}&user_id=${user_id}&book_id=${bookId}&page=1&size=10`
+        let response = await clinet.get(`https://openapi-gaia.zhangyue.com/opendata/reseller/free/book/list?${param}`)
+        let list = null
+        if(response.data.code!=0){
+            console.error("search_id error:",response)
+            throw response.data
+        }else{
+            list = response.data.body.list
+        }
+
+
+        if(list.length<=0){
+            throw list
+        }
+        console.log('知乎书籍::响应状态:', response.status);
+        let book_info = list[0]
+        let info = {}
+        info.words =  book_info.word_count
+        info.book_name =  book_info.book_name
+        info.book_id =  book_info.book_id
+        info.publish_time = book_info.create_time
+        info.genre = 3;
+        return info;
+    }catch(error){
+        console.error('掌阅书籍::请求错误:', error);
+        return null;
+    }
+
+}
+
+CMD.new_search_id = async function(bookId) {
+    try{
+
+        let authorization = await redis_help.getKeyValue("zy_mf_token")
+        console.log("authorization:",authorization)
+        let clinet = tools.getOneNewClinet({
+            // "cookie":"acw_tc=1a0c639417498037411406820e006fb57d572ffdc9c83cd8a46aaf8d19ca00",
+            "authorization": authorization,
+        })
+
+        let list = null
+
+        let response =  await clinet.get(`https://gaia.zhangyue.com/gaia/v1/open_api/pay/book/getBookInfoList?reseller_id=9886&application_key=shiyuestory_mini&book_ids=${bookId}&book_content_type=&author=&copyright_type=&category_sex=&is_complete=&total=0&page=1&size=10&sort=&order=&psize=10&scheme_id=38`)
+
+        if(response.data.code!=0){
+            console.error("new_search_id error:",response)
+            throw response.data
+        }else{
+            list = response.data.body.list
+        }
+
+
+        if(list.length<0){
+            throw response.data
+        }
+
+        let book_info = list[0]
+        let info = {}
+
+        // console.log("book_info:",book_info)
+        info.words =  book_info.word_count
+        info.book_name =  book_info.book_name
+        info.book_id =  book_info.book_id
+        info.publish_time = book_info.create_time
+        info.totalChapterNum = book_info.chapter_count
+        info.default_pay_section = book_info.default_pay_section //默认付费章节
+        info.default_price = book_info.default_price // 加个
+        info.fee_unit = book_info.fee_unit //10 = 整本, 20 = 千字
+        info.author = book_info.author
+        if(book_info.word_count<100000){
+            info.genre = 3;
+        }else{
+            info.genre = 1;
+        }
+        return info;
+
+    }catch(e){
+        return null;
+    }
+}
+
+
+
+CMD.new_search_name = async function(bookName) {
+    try{
+        let authorization = await redis_help.getKeyValue("zy_mf_token")
+        console.log("authorization:",authorization)
+        let clinet = tools.getOneNewClinet({
+            // "cookie":"acw_tc=1a0c639417498037411406820e006fb57d572ffdc9c83cd8a46aaf8d19ca00",
+            "authorization": authorization,
+        })
+
+        let list = null
+
+        let response =  await clinet.get(`https://gaia.zhangyue.com/gaia/v1/open_api/search/pay/book/channel/price/getBookNameList?application_uniq_id=shiyuestory_mini&name=${encodeURIComponent(bookName)}&page=1&size=10&scheme_id=38&business_model=free`)
+
+        if(response.data.code!=0){
+            console.error("new_search_id error:",response)
+            throw response.data
+        }else{
+            list = response.data.body.items
+        }
+
+
+        if(list.length<0){
+            throw response.data
+        }
+
+        let book_info = list[0]
+        let info = {}
+        info.book_name =  book_info.name
+        info.book_id =  book_info.id
+        return info;
+
+    }catch(e){
+        return null
+    }
+}
+module.exports = CMD;

+ 33 - 0
src/data_manager/Controllers/filter_data_controllers.js

@@ -111,6 +111,39 @@ class filter_data_controllers {
         }
     }
 
+
+    async getZyFilterData(params) {
+        try {
+            // 参数验证
+            if (!params?.tg_platform_id) {
+                throw  'tg_platform_id is required';
+            }
+
+            if (!params?.status) {
+                throw  'status is required';
+            }
+
+            const status = params.status;
+            const tg_platform_id = params.tg_platform_id;
+            const filterData = await filter_data_model.findOne({ status: status,tg_platform_id:tg_platform_id });
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
+
     async getFilterDataByBookIdAndLimit(params,limit=1) {
         try {
             // 参数验证

+ 97 - 0
task_script/run_zy_iaa_match_7day.js

@@ -0,0 +1,97 @@
+//同步掌阅免费的匹配书籍
+const config = require("../etc/config.json");
+const mysql = require('mysql2/promise');
+const taskdbConfig = config.isDebug?config.debug_task_mysql:config.release_task_mysql
+const redis_help = require('../src/use_redis');
+const video_product_controllers = require('../src/data_manager/Controllers/video_product_controllers');
+const helper = require("../src/helper");
+const schedule = require('node-schedule');
+const CMD = {}
+async function processTask(){
+    let right_status = true
+    let connection  = null
+    try{
+        connection = await mysql.createConnection({
+            ...taskdbConfig,
+            multipleStatements: true
+        });
+
+        const [records] = await connection.execute(
+            `SELECT * FROM video_product WHERE create_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND create_at <= CURDATE()
+             AND book_platform = ${config.platform_zymf} AND match_book = "NONE" LIMIT 1000 ;`
+         );
+
+         if(records.length<=0){
+             console.log("完成所有七猫免费的匹配")
+             throw 0
+         }
+         for (let index = 0; index < records.length; index++) {
+            const element = records[index];
+            let iap_book_info = await require('../src/api/zy/zy_search_book').new_search_name(element.product_name)
+            if(iap_book_info!=null){
+                iap_book_info = await require('../src/api/zy/zy_search_book').new_search_id(iap_book_info.book_id)
+                if(iap_book_info!=null){
+                    let book_info = await video_product_controllers.getProductData({book_id:iap_book_info.book_id})
+                    if(!book_info.success){
+                        //创建一个付费书籍
+                        await video_product_controllers.createProductData({
+                            book_platform:config.platform_zy,
+                            product_name:iap_book_info.book_name,
+                            genre:iap_book_info.genre,
+                            product_id:iap_book_info.book_id,
+                            words:iap_book_info.words,
+                            totalChapterNum:iap_book_info.totalChapterNum,
+                            publish_time:iap_book_info.publish_time,
+                            default_pay_section:iap_book_info.default_pay_section,
+                            default_price:iap_book_info.default_price,
+                            fee_unit:iap_book_info.fee_unit,
+                            match_book:element.product_id
+                        })
+                    }else{
+                        await video_product_controllers.updateData({id:book_info.data.id},{
+                            match_book:element.product_id
+                        })
+                    }
+    
+                    await connection.execute(
+                        `UPDATE video_product 
+                        SET match_book = ?, 
+                            product_parent_id = ? 
+                        WHERE id = ?`,
+                        [iap_book_info.book_id, iap_book_info.book_id, element.id]
+                    );
+                }
+                
+            }
+        }
+
+
+    }catch(e){
+        if(e==0){
+            right_status = false
+        }
+        console.error("processTask error:",e)
+    } finally{
+        if(connection!=null){
+            connection.end()
+        }
+        if(right_status){
+            global.setTimeout(processTask, 2000);
+        }
+    }
+
+}
+
+
+CMD.init = async function(){
+    redis_help.connect((results)=>{
+        if(results){
+            const job = schedule.scheduleJob('0 03,15 * * *', async function() {
+                await  processTask();
+            });
+        }
+    })
+
+}
+
+CMD.init()

+ 95 - 0
task_script/run_zy_iap_match_7day.js

@@ -0,0 +1,95 @@
+//同步掌阅付费的匹配书籍
+const config = require("../etc/config.json");
+const mysql = require('mysql2/promise');
+const taskdbConfig = config.isDebug?config.debug_task_mysql:config.release_task_mysql
+const redis_help = require('../src/use_redis');
+const video_product_controllers = require('../src/data_manager/Controllers/video_product_controllers');
+const helper = require("../src/helper");
+const schedule = require('node-schedule');
+const CMD = {}
+async function processTask(){
+    let right_status = true
+    let connection  = null
+    try{
+        connection = await mysql.createConnection({
+            ...taskdbConfig,
+            multipleStatements: true
+        });
+
+        const [records] = await connection.execute(
+            `SELECT * FROM video_product WHERE create_at >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND create_at <= CURDATE()
+             AND book_platform = ${config.platform_zy} AND match_book = "NONE" LIMIT 1000 ;`
+         );
+
+         if(records.length<=0){
+             console.log("完成所有七猫付费的匹配")
+             throw 0
+         }
+         for (let index = 0; index < records.length; index++) {
+            const element = records[index];
+            let iaa_book_info = await require('../src/api/zy_mf/zy_mf_search_book').new_search_name(element.product_name)
+            if(iaa_book_info!=null){
+                iaa_book_info = await require('../src/api/zy_mf/zy_mf_search_book').new_search_id(iaa_book_info.book_id)
+                if(iaa_book_info!=null){
+                    let book_info = await video_product_controllers.getProductData({book_id:iaa_book_info.book_id})
+                    if(!book_info.success){
+                        //创建一个免费书籍
+                        await video_product_controllers.createProductData({
+                            book_platform:config.platform_zymf,
+                            product_name:iaa_book_info.book_name,
+                            genre:iaa_book_info.genre,
+                            product_id:iaa_book_info.book_id,
+                            words:iaa_book_info.words,
+                            totalChapterNum:iaa_book_info.totalChapterNum,
+                            publish_time:iaa_book_info.publish_time,
+                            default_pay_section:iaa_book_info.default_pay_section,
+                            default_price:iaa_book_info.default_price,
+                            fee_unit:iaa_book_info.fee_unit,
+                            product_parent_id:element.product_id,
+                            match_book:element.product_id,
+                        })
+                    }else{
+                        await video_product_controllers.updateData({id:book_info.data.id},{
+                            match_book:element.product_id
+                        })
+                    }
+    
+                    await connection.execute(
+                        `UPDATE video_product 
+                        SET match_book = ? WHERE id = ?`,
+                        [iaa_book_info.book_id, element.id]
+                    );
+                }
+            }
+        }
+
+
+    }catch(e){
+        if(e==0){
+            right_status = false
+        }
+        console.error("processTask error:",e)
+    } finally{
+        if(connection!=null){
+            connection.end()
+        }
+        if(right_status){
+            global.setTimeout(processTask, 2000);
+        }
+    }
+
+}
+
+
+CMD.init = async function(){
+    redis_help.connect((results)=>{
+        if(results){
+            const job = schedule.scheduleJob('0 09,21 * * *', async function() {
+                await  processTask();
+            });
+        }
+    })
+
+}
+
+CMD.init()

+ 22 - 7
tg_factory_main.js

@@ -61,15 +61,30 @@ if(config.isDebug){
             // console.log("data:",data)
 
 
-    // let zy_token = await require('./src/api/zy/zy_login').zy_login()
 
-    // if(zy_token!=null){
-    //     console.log("zy_token:",zy_token)
-    //     await redis_help.setKeyValue("zy_token",zy_token)
-    //         let data = await require('./src/api/zy/zy_search_book').new_search_id("13359333")
-    //         console.log("data:",data)
-    // }
+            // let zy_token = await require('./src/api/zy_mf/zy_mf_login').zy_login()
 
+            // if(zy_token!=null){
+            //     console.log("zy_token:",zy_token)
+            //     await redis_help.setKeyValue("zy_token",zy_token)
+            //         let data = await require('./src/api/zy/zy_search_book').new_search_name("《重生后,老公放弃小青梅和我在一起了》")
+            //         console.log("data:",data)
+            //    }
+
+
+        // let zy_mf_token = await require('./src/api/zy_mf/zy_mf_login').zy_login()
+
+        // if(zy_mf_token!=null){
+        //     console.log("zy_mf_token:",zy_mf_token)
+        //     await redis_help.setKeyValue("zy_mf_token",zy_mf_token)
+        //         let data = await require('./src/api/zy_mf/zy_mf_search_book').new_search_name("《明月夜,短松冈》")
+        //         console.log("data:",data)
+        //    }
+
+
+
+        // let data = await require('./src/api/zy_mf/zy_mf_search_book').new_search_id("13424605")
+        // console.log("data:",data)
             // let publish_time = helper.getDate7DaysBefore("2025-04-27",null,'YYYY-MM-DD')
             // console.log("publish_time:",publish_time)