904118851 5 сар өмнө
parent
commit
febe9a6925

+ 33 - 0
0_RECEIVE_FACTORY/RECEIVE_FACTORY.js

@@ -487,6 +487,28 @@ CMD.hy_topUpTemplate = async function(res,accountId) {
     }
  }
 
+
+ CMD.get_qm_mf_callback_template = async function(res,mini_program_platform_id,qm_id) {
+    let data = await require('../src/api/qm_mf/get_qm_mf_call_back_template').get_callback_template(mini_program_platform_id,qm_id)
+    console.log('get_qm_mf_callback_template:', data);
+    res.writeHead(200, {'Content-Type': 'application/json'});
+    res.end(JSON.stringify({ message:"成功!",data:data,code:10000}));
+ }
+ 
+ CMD.get_qm_mf_recharge_template = async function(res,category,mini_program_platform_id,qm_id) {
+     let data = await require('../src/api/qm_mf/get_qm_mf_recharge_template').get_recharge_template(category,mini_program_platform_id,qm_id)
+     console.log('get_qm_mf_recharge_template:', data);
+     res.writeHead(200, {'Content-Type': 'application/json'});
+     res.end(JSON.stringify({ message:"成功!",data:data,code:10000}));
+ }
+ 
+ CMD.get_qm_mf_account_list = async function(res) {
+     let data = await require('../src/api/qm_mf/get_qm_mf_account_list').get_qm_account_list()
+     console.log('get_qm_mf_account_list:', data);
+     res.writeHead(200, {'Content-Type': 'application/json'});
+     res.end(JSON.stringify({ message:"成功!",data:data,code:10000}));
+ }
+
 var server = http.createServer(function(req,res){
 
     res.setHeader('Access-Control-Allow-Origin', '*'); // 允许所有域的请求,注意:在生产环境中应该限制为特定的域
@@ -609,6 +631,17 @@ var server = http.createServer(function(req,res){
                     }else if(jsonData['fun']=="hy_topUpTemplate"&&jsonData['cmd']=="hy_link"){
                         let accountId = jsonData['data']['accountId']
                         CMD.hy_topUpTemplate(res,accountId) 
+                    }else if(jsonData['fun']=="get_qm_mf_recharge_template"&&jsonData['cmd']=="qm_link"){
+                        let category = jsonData['data']['category']
+                        let qm_id = jsonData['data']['qm_id']
+                        let mini_program_platform_id = jsonData['data']['mini_program_platform_id']
+                        CMD.get_qm_mf_recharge_template(res,category,mini_program_platform_id,qm_id) 
+                    }else if(jsonData['fun']=="get_qm_mf_callback_template"&&jsonData['cmd']=="qm_link"){
+                        let mini_program_platform_id = jsonData['data']['mini_program_platform_id']
+                        let qm_id = jsonData['data']['qm_id']
+                        CMD.get_qm_mf_callback_template(res,mini_program_platform_id,qm_id) 
+                    }else if(jsonData['fun']=="get_qm_mf_account_list"&&jsonData['cmd']=="qm_link"){
+                        CMD.get_qm_mf_account_list(res) 
                     }else{
                         res.writeHead(200, {'Content-Type': 'application/json'});
                         res.end(JSON.stringify({ message: 'fun 错误',code:100}));

+ 14 - 0
1_FILTER_FACTORY/FILTER_FACTORY.js

@@ -208,6 +208,14 @@ function filter_and_insert(origin_data,tg_config,PlatformConfig){
             if(params['bookId'].length>6){
                 return null
             }
+        }else if(parent_platform_id==config.platform_fanqiemf){
+            params['bookId'] = getId(url);
+            if(params['bookId']==undefined||params['bookId']==null){
+                return null
+            }
+            if(params['bookId'].length>6){
+                return null
+            }
         }else if(parent_platform_id==config.platform_yuewen){
             params['bookId'] = getCBID(url);
             if(params['bookId']==undefined||params['bookId']==null){
@@ -276,6 +284,12 @@ function filter_and_insert(origin_data,tg_config,PlatformConfig){
         if(obj.book_id==undefined||obj.book_id==null){
             return null
         }
+    }else if(obj.channel==19){ //"知乎"
+        tg_platform_id = 19
+        if(obj.id==undefined||obj.id==null){
+            return null
+        }
+        obj.book_id = obj.id
     }
     // console.log("评论数正确")
     return {video_id:origin_data.video_id,book_id:obj.book_id,channel:obj.channel,source:obj.source.substring(0,obj.source.length>64?64:obj.source.length),key:obj.key,video_link:origin_data.video_link,

+ 325 - 0
2_PRODUCT_FACTORY/qm_mf_batch_factory.js

@@ -0,0 +1,325 @@
+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 time_count = 1000;
+const task_queue = []
+
+function getProductById(product_list,product_id){
+    for (let index = 0; index < product_list.length; index++) {
+        const product_item = product_list[index];
+        if(product_item.product_id==product_id){
+            return product_item
+        }
+    }
+    return null
+}
+
+async function processTask(){
+    let result = null
+    try{
+        let isPauseTask =  await redis_help.getKeyValue("isPauseTask")
+        if(isPauseTask=="true"){
+            return
+        }
+        let FilterConfig = await redis_help.getKeyValue("FilterConfig")
+        FilterConfig = JSON.parse(FilterConfig)
+        result = await filter_data_controllers.getFilterDataByStatusAndLimit({ status: 0 , tg_platform_id: config.platform_qmmf },500);
+        if(result.success){
+            let ProductIds = []
+            let FilterList = []
+            let Ids = []
+            if(result.data.length<=0){
+                throw '没有数据可处理!'
+            }
+            for (let index = 0; index < result.data.length; index++) {
+                let filter_item = result.data[index];
+                ProductIds.push(filter_item.book_id)
+                FilterList[filter_item.book_id] = filter_item
+            }
+
+            let product_list_result = await video_product_controllers.findNonExistentProductIds(ProductIds);
+            if(product_list_result.success){
+                for (let index = 0; index < result.data.length; index++) {
+                    let filter_item = result.data[index];
+                    if(product_list_result.data.existingProductIds.has(filter_item.book_id)){
+                        let info = filter_item;
+                        let product_item = getProductById(product_list_result.data.existingRecords,filter_item.book_id)
+                        if (!info) {
+                            throw `No filter info found for book_id: ${filter_item.book_id}`
+                        }
+                        if (!product_item) {
+                            throw `product_item is null: ${filter_item.book_id}`
+                        }
+                        info.words = product_item.words
+                        info.genre =  product_item.genre
+                        info.book_id = product_item.product_id
+                        info.book_name = product_item.product_name
+                        await CMD.update_filter_data(FilterConfig,info)
+                        await new Promise(resolve => setTimeout(resolve,100));
+                    } else{
+                        Ids.push(filter_item.id)
+                    }
+                }
+
+                let remove_product_list = []
+
+                for (let index = 0; index < product_list_result.data.nonExistentIds.length; index++) {
+                    const product_id = product_list_result.data.nonExistentIds[index];
+                    if(remove_product_list[product_id]==true){
+          
+                    }else{
+                        remove_product_list[product_id] = true
+                        task_queue.push({result:{data:FilterList[product_id]}})
+                    }
+                }
+                // if(Ids.length>0){
+                //     console.log("Ids:",Ids)
+                //     await filter_data_controllers.updateFilterDataByIds({ids:Ids},{status:1})
+                // }
+              
+            }
+            
+        }
+    }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_qmmf){ //七猫
+                    let qm_book_data = await require('../src/api/qm_mf/qm_mf_search_book').search_id(result.data.book_id)
+                    if(qm_book_data==null){
+                        result.data.genre = 999
+                    }else{
+                        qm_book_data.tg_platform_id = result.data.tg_platform_id
+                        // if(CMD.isGenre(FilterConfig,qm_book_data.genre)){
+                        //     await CMD.insert_product(qm_book_data)
+                        // }
+                        await CMD.insert_product(qm_book_data)
+                        result.data.words = qm_book_data.words
+                        result.data.genre = qm_book_data.genre
+                        result.data.book_id = qm_book_data.book_id
+                        result.data.book_name = qm_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){
+    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
+        }
+    }
+    // if(genre==3||genre==1){
+    //     return true
+    // }
+    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)
+    let isGenre = true
+    if(isGenre){
+        console.log("data:",data)
+        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})
+        //创建一个小程序    
+
+        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_qmmf)
+
+
+        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
+                    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 material_platform_id = main_info.material_platform_id
+                        if(!CMD.isBlackBook(black_books,data.book_id)&&mian_genre==book_genre){
+                            //符合标准进行创建表
+                            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_qmmf,
+                                    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
+                                })
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }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.init()

+ 122 - 0
5_CREATE_LINK_FACTORY/qm_mf_create_link.js

@@ -0,0 +1,122 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../tools');
+const helper = require('../src/helper');
+const config = require('../etc/config.json')
+const CMD = {}
+CMD.runTask = async function (data,main_info,PlatformInfo,call_back) {
+    let timestamp = helper.getCurrentUnixTimestamp()
+    let tg_link_config = JSON.parse(main_info.tg_link_config)
+    let huichuan_id = tg_link_config['huichuan_id']
+    let huichuan_list = JSON.parse(PlatformInfo.huichuan)
+
+    let call_back_template_id = ""
+
+    let app_id = main_info.app_id
+
+    for (let index = 0; index < huichuan_list.length; index++) {
+        const hc_obj = huichuan_list[index];
+        if(hc_obj.id==huichuan_id){
+          call_back_template_id = hc_obj.value
+          break
+        }
+    }
+
+
+    const url = 'https://new-media-iaa-fx.qimao.com/api/promotion/create';
+
+    let postData = {
+        media_id: '1', //今日头条
+        postback_rule_id: call_back_template_id, //# 回传规则 value
+        book_id:data.product_id,
+        book_name:data.product_name,
+        chapter_num:1,
+        // repeated_panel_id:f_recharge_template_id, //# 复充模板id
+        batch_num:1,
+        promotion_name:`${data.product_name}_${timestamp}_${main_info.id}`,
+        env: '',
+        t: timestamp  // 当前时间戳
+    }
+    
+    console.log("postData:",postData)
+    // 请求参数
+    const params = new URLSearchParams(postData);
+    let param_list = main_info.qm_id.split(',')
+    // let app_external_id = param_list[1]
+    let target_id = param_list[0]
+    // 请求头
+    var dy_headers = {
+        'accept': 'application/json, text/plain, */*',
+        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
+        "app-id": `${app_id}`,
+        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU',
+        'project': 'reader_free_dyminiapp',
+        "Content-Type": "application/json;charset=UTF-8",
+        'signature': '7387e151c84a34ed10a3d3580e89bb8280fcb058087ad8e5c7bae07e6f38f083',
+        'target-id': `${target_id}`,
+        'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-iaa-fx_qimao_com=%7B%22distinct_id%22%3A%22195a243a180505-022ff8224617bd2-4c657b58-921600-195a243a1815e0%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk1YTI0M2ExODA1MDUtMDIyZmY4MjI0NjE3YmQyLTRjNjU3YjU4LTkyMTYwMC0xOTVhMjQzYTE4MTVlMCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47318117422869658617238e00c50400e0d073060f4b030334140762ab3f',
+    };
+
+    var wx_headers = {
+        'accept': 'application/json, text/plain, */*',
+        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
+        "app-id": `${app_id}`,
+        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU',
+        'project': 'reader_free_dyminiapp',
+        "Content-Type": "application/json;charset=UTF-8",
+        'signature': '7387e151c84a34ed10a3d3580e89bb8280fcb058087ad8e5c7bae07e6f38f083',
+        'target-id': `${target_id}`,
+        'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-iaa-fx_qimao_com=%7B%22distinct_id%22%3A%22195a243a180505-022ff8224617bd2-4c657b58-921600-195a243a1815e0%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk1YTI0M2ExODA1MDUtMDIyZmY4MjI0NjE3YmQyLTRjNjU3YjU4LTkyMTYwMC0xOTVhMjQzYTE4MTVlMCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47318117422869658617238e00c50400e0d073060f4b030334140762ab3f',
+    };
+
+    let headers = ""
+    if(PlatformInfo.mini_program_platform_id==config.wx){
+        headers = wx_headers
+    }else if(PlatformInfo.mini_program_platform_id==config.dy){
+        headers = dy_headers
+    }
+
+    headers['authorization'] = await tools.getQMMFToken()
+    try {
+        const response = await fetch(`${url}?${params}`, {
+            method: 'Post',
+            headers: headers
+        });
+
+        const result = await response.json();
+        // { code: 200, data: {}, msg: 'ok' }
+        if(result.code!=200){
+            throw result
+        }
+        console.log('响应状态:', response.status);
+        console.log('响应数据:', result);
+        
+        let n_data = await require("../src/api/qm_mf/get_qm_mf_promotion").getPromotionList(app_id,target_id,postData.promotion_name,PlatformInfo.mini_program_platform_id)
+        console.log('n_data:', n_data);
+        if(n_data==null){
+            throw result
+        }
+
+        if(n_data.code!=200){
+            throw result
+        }
+        let promotion_id = n_data.promotion_id
+        let promotion_info = n_data.data
+        let t_params = promotion_info.promotion_url.split('?')
+        let start_page = t_params[0]
+        let start_param = t_params[1]
+        data.start_page = start_page
+        data.start_param = start_param
+        data.promotion_id = promotion_id
+        call_back(data,null)
+    } catch (error) {
+        call_back(data,error)
+        console.error('请求错误:', error);
+    }
+}
+
+// Node.js 18及以上版本可以直接运行
+// Node.js 18以下版本需要先安装 node-fetch:
+// npm install node-fetch@2
+
+module.exports = CMD;

+ 192 - 0
5_CREATE_LINK_FACTORY/qm_mf_create_link_factory.js

@@ -0,0 +1,192 @@
+const CMD = {}
+const time_count = 1000;
+const redis_help = require('../src/use_redis');
+const video_applet_product_controllers = require('../src/data_manager/Controllers/video_applet_product_controllers');
+var qm_create_link_task_list = []
+const config = require('../etc/config.json')
+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:1,
+                status:0
+            })
+        }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 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_qimao_info = CMD.getPlatformInfo(PlatformConfig,config.platform_qmmf)
+
+        let all_platform_list = CMD.getSharedPlatform(PlatformShared,platform_qimao_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
+            }
+        }
+
+        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 "平台配置错误:"
+            }
+  
+
+            qm_create_link_task_list.push({
+                n_data:result.data,
+                main_info:main_info,
+                PlatformInfo:PlatformInfo
+            })
+        }
+
+        console.log("qm_mf_create_link_task_list:",qm_create_link_task_list)
+        if(qm_create_link_task_list.length>0){
+            let qm_create_link_task = qm_create_link_task_list.pop()
+            require('./qm_mf_create_link').runTask(qm_create_link_task.n_data
+                ,qm_create_link_task.main_info,
+                qm_create_link_task.PlatformInfo,finish_call_back)
+            // require('./qm_new_create_link').runTask(qm_create_link_task.n_data
+            //     ,qm_create_link_task.main_info,
+            //     qm_create_link_task.PlatformInfo,finish_call_back)
+        }
+    }catch(e){
+        console.log("qm_mf_create_link_factory error:",e)
+        finish_call_back(null,{"MESSAGE":"qm_mf_create_link 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()

+ 121 - 0
5_CREATE_LINK_FACTORY/qm_mf_new_create_link.js

@@ -0,0 +1,121 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../tools');
+const helper = require('../src/helper');
+const config = require('../etc/config.json')
+const crypto = require('crypto');
+const CMD = {}
+CMD.runTask = async function (data,main_info,PlatformInfo,call_back) {
+    let timestamp = helper.getCurrentUnixTimestamp()
+    let tg_link_config = JSON.parse(main_info.tg_link_config)
+    let chongzhi_id = tg_link_config['chongzhi_id']
+    let huichuan_id = tg_link_config['huichuan_id']
+    let f_chongzhi_id = tg_link_config['f_chongzhi_id']
+    let chongzhi_list = JSON.parse(PlatformInfo.chongzhi)
+    let huichuan_list = JSON.parse(PlatformInfo.huichuan)
+    let f_chongzhi_list = JSON.parse(PlatformInfo.f_chongzhi)
+    let recharge_template_id = ""
+    let f_recharge_template_id = ""
+    let call_back_template_id = ""
+
+    for (let index = 0; index < chongzhi_list.length; index++) {
+        const cz_obj = chongzhi_list[index];
+        if(cz_obj.id==chongzhi_id){
+          recharge_template_id = cz_obj.value
+          break
+        }
+    }
+
+    for (let index = 0; index < huichuan_list.length; index++) {
+        const hc_obj = huichuan_list[index];
+        if(hc_obj.id==huichuan_id){
+          call_back_template_id = hc_obj.value
+          break
+        }
+    }
+
+    for (let index = 0; index < f_chongzhi_list.length; index++) {
+        const cz_obj = f_chongzhi_list[index];
+        if(cz_obj.id==f_chongzhi_id){
+            f_recharge_template_id = cz_obj.value
+          break
+        }
+    }
+
+    let param_list = main_info.qm_id.split(',')
+    let app_external_id = param_list[1]
+    let target_id = param_list[0]
+
+    let postData = {
+        admin_account_name:config.qimao_mf_config.admin_account_name,
+        account_id:target_id,
+        project:PlatformInfo.mini_program_platform_id==config.wx?8:6,     // 6 抖音小程序  8 微信小程序
+        appid:main_info.app_id,
+        book_id:data.product_id,
+        chapter_num:1,
+        name:`${data.product_name}_${timestamp}_${main_info.id}`,
+        media_id: '1', //1  巨量 2 广点通 3 百度 4 微博 5 B站
+        is_platform_postback:true,
+        postback_rule_id: call_back_template_id, //# 回传规则 value
+        // first_panel_id:recharge_template_id, //首充模板id
+        repeated_panel_id:f_recharge_template_id,
+        recharge_panel_id:recharge_template_id
+        // repeated_panel_id:f_recharge_template_id, //# 复充模板id
+    }
+    
+    console.log("postData:",postData)
+    
+    try{
+        let client = tools.getOneNewClinet()
+        let uuid = tools.generateCryptoNumericUUID()
+        // let params = `?access_key=${config.qimao_config.access_key}&random=${uuid}&timestamp=${timestamp}`
+        // let url = `${config.qimao_config.new_create_link_host}${params}`
+        // let sign = tools.generateQMSignature(url,config.qimao_config.access_key)
+        const baseUrl =config.qimao_mf_config.new_create_link_host;
+        const params = {
+          access_key: config.qimao_mf_config.access_key,
+          random: uuid,
+          timestamp: timestamp
+        };
+      
+        // 按参数名排序并拼接
+        const sortedParams = Object.keys(params)
+          .sort()
+          .map(key => `${key}=${params[key]}`)
+          .join('&');
+      
+        // 假设这是您的secret_key,请替换成实际的值
+        const secretKey = config.qimao_mf_config.secret_key;  // 这里需要替换成您的实际secret_key
+        
+        // 计算签名
+        const sign = crypto.createHash('md5')
+          .update(sortedParams + secretKey)
+          .digest('hex');
+      
+        // 构建最终URL
+        const finalUrl = `${baseUrl}?${sortedParams}&sign=${sign}`;
+        
+        console.log("finalUrl:",finalUrl)
+
+        let response =  await client.post(finalUrl,postData)
+        if(response.code!=0){
+            throw response
+        }
+        let n_data = response.data
+        console.log("n_data:",n_data)
+        let promotion_id = n_data.id
+        let promotion_info = n_data.link
+        let t_params = promotion_info.split('?')
+        let start_page = t_params[0]
+        let start_param = t_params[1]
+        data.start_page = start_page
+        data.start_param = start_param
+        data.promotion_id = promotion_id
+        // call_back(data,null)
+    } catch (error) {
+        call_back(data,error)
+        console.error('请求错误:', error);
+    }
+}
+
+module.exports = CMD;

+ 3 - 2
5_CREATE_LINK_FACTORY/qm_new_create_link.js

@@ -58,7 +58,8 @@ CMD.runTask = async function (data,main_info,PlatformInfo,call_back) {
         is_platform_postback:true,
         postback_rule_id: call_back_template_id, //# 回传规则 value
         // first_panel_id:recharge_template_id, //首充模板id
-        repeated_panel_id:recharge_template_id,
+        repeated_panel_id:f_recharge_template_id,
+        recharge_panel_id:recharge_template_id
         // repeated_panel_id:f_recharge_template_id, //# 复充模板id
     }
     
@@ -84,7 +85,7 @@ CMD.runTask = async function (data,main_info,PlatformInfo,call_back) {
           .join('&');
       
         // 假设这是您的secret_key,请替换成实际的值
-        const secretKey = config.qimao_config.access_key;  // 这里需要替换成您的实际secret_key
+        const secretKey = config.qimao_config.secret_key;  // 这里需要替换成您的实际secret_key
         
         // 计算签名
         const sign = crypto.createHash('md5')

+ 7 - 0
MESSAGE_DISPATCH/MESSAGE_DISPATCH.js

@@ -350,6 +350,13 @@ CMD.updateTimeConfig = function(){
         console.log("qi_mao_token:",headers['n-token'])
         redis_help.setKeyValue("qi_mao_token",headers['n-token'])
     })
+
+
+    let qm_mf_login = require('../src/api/qm_mf/qm_mf_login')
+    qm_mf_login.login((data,headers)=>{
+        console.log("qi_mao_mf_token:",headers['n-token'])
+        redis_help.setKeyValue("qi_mao_mf_token",headers['n-token'])
+    })
 }
 //定时更新配置
 CMD.updateConfig = function(){

+ 13 - 1
etc/config.json

@@ -60,6 +60,17 @@
         "callbacklist_hots":"https://new-media-fx.qimao.com/api/postback/rule/list?page=1&page_size=50&env=&t=",
         "recharge_list_host":"https://new-media-fx.qimao.com/api/charge-configure/recharge-panel/list?panel_name=&category=0&page=1&page_size=50&env=&t="
     },
+    "qimao_mf_config":{
+        "admin_account_name":"zhuoyue",
+        "access_key":"09ba094d2f70e0e5bc340cca365fabe3",
+        "secret_key":"36bb8183bf00a78dd55422156ee5b2dc",
+        "Appid":"tt79e30f5ee6d455b601",
+        "new_create_link_host":"https://new-media-mapi.qimao.com/mapi/v2/promotion-link/create",
+        "create_link_host":"https://new-media-mapi.qimao.com/mapi/v1/promotion-link/list", 
+        "login_host":"https://new-media-iaa-fx.qimao.com/api/account/login?t=",
+        "callbacklist_hots":"https://new-media-fx.qimao.com/api/postback/rule/list?page=1&page_size=50&env=&t=",
+        "recharge_list_host":"https://new-media-fx.qimao.com/api/charge-configure/recharge-panel/list?panel_name=&category=0&page=1&page_size=50&env=&t="
+    },
     "fanqie_mf_config":{
         "callbacklist_host": "https://www.changdunovel.com/novelsale/openapi/ad_callback_config/config_list/v1/",
         "create_link_host": "https://www.changdunovel.com/novelsale/openapi/promotion/create/v1",
@@ -146,5 +157,6 @@
     "platform_fanqiemf":7,
     "platform_yuewen":6,
     "platform_zhihu":15,
-    "platform_heiyanmf":18
+    "platform_heiyanmf":18,
+    "platform_qmmf":19
 }

+ 122 - 0
get_qm_all_iap_book.js

@@ -0,0 +1,122 @@
+const config = require("./etc/config.json");
+const helper = require("./src/helper");
+const HttpClient = require("./src/HttpClient");
+const redis_help = require('./src/use_redis');
+const mysql = require('mysql2/promise');
+const tools = require("./tools");
+const dbConfig = config.isDebug?config.debug_mysql:config.release_mysql
+const CMD = {}
+let page_index = 1;
+
+async function processTask(){
+    let connection  = null
+    let right_status = true
+    try{
+        const url = 'https://new-media-fx.qimao.com/api/content/book/list';
+    
+        // 请求参数
+        let params = new URLSearchParams({
+            page: page_index,
+            page_size: '200',
+            env: '',
+            t: Date.now()  // 当前时间戳
+        });
+
+        var headers = {
+            "accept": "application/json, text/plain, */*",
+            "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+            "app-external-id": "4c6e8d8709c14de9a4397b6cbb978f85",
+            "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgzOTA0LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM3MDMwNCwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgzOTA0LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.smEjQMawHRwsd8VGIGfvBthX67v6BjyPGAisPkQ9oBw",
+            "project": "reader_paid_dyminiapp",
+            "sec-ch-ua": "\"Chromium\";v=\"134\", \"Not:A-Brand\";v=\"24\", \"Microsoft Edge\";v=\"134\"",
+            "sec-ch-ua-mobile": "?0",
+            "sec-ch-ua-platform": "\"Windows\"",
+            "sec-fetch-dest": "empty",
+            "sec-fetch-mode": "cors",
+            "sec-fetch-site": "same-origin",
+            "signature": "80f85f7318aea80d5257d65e522c8c51c34f82a46ed5af2b03d1dc70ca9cb224",
+            "target-id": "544180064332673816",
+            "cookie": "sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-fx_qimao_com=%7B%22distinct_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkzYmRjMTI0NjQ1ZTItMGNiZWFlZTE3MmQ0Y2U4LTRjNjU3YjU4LTkyMTYwMC0xOTNiZGMxMjQ2NTU2NyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47314817422911429748370e00476f42aaf4f0543f9e1ce0bd6746886469",
+            "Referer": "https://new-media-fx.qimao.com/backend/book-manage/index?projectId=reader_paid_dyminiapp&appId=4c6e8d8709c14de9a4397b6cbb978f85&accountId=544180064332673816",
+            "Referrer-Policy": "strict-origin-when-cross-origin"
+        };
+        headers['authorization'] = await tools.getQMToken()
+        console.log("`${url}?${params}`:",`${url}?${params}`)
+        const response = await fetch(`${url}?${params}`, {
+                method: 'GET',
+                headers: headers
+            });
+        
+        const data = await response.json();
+
+        if(data.code!=200){
+            throw data
+        }
+
+        if(data.data.list.length<=0){
+            throw 0
+        }
+        connection = await mysql.createConnection({
+            ...dbConfig,
+            multipleStatements: true
+        });
+        const insertSQL = `
+        INSERT IGNORE INTO qm_iap_lib
+        (book_id, book_name, book_origin_name, book_author, 
+        book_type_text, book_word_count, book_serial_status_text, book_channel_text, 
+        book_category_text,
+        booklist_type_text, book_first_pay_chapter, book_paid_type, book_price_type,
+        free_ratio,price,total_price,book_type)
+        VALUES (?) 
+        `;
+        for (let index = 0; index < data.data.list.length; index++) {
+            const element = data.data.list[index];
+   
+            await connection.query(insertSQL, [[
+                element.book_id+"",
+                element.book_name,
+                element.book_origin_name,
+                element.book_author,
+                element.book_type_text,
+                element.book_word_count,
+                element.book_serial_status_text,
+                element.book_channel_text,
+                element.book_category_text,
+                element.booklist_type_text,
+                element.book_first_pay_chapter,
+                element.book_paid_type,
+                element.book_price_type,
+                element.free_ratio,
+                element.price,
+                element.total_price,
+                element.book_type
+            ]]);
+        }
+
+
+    }catch(e){
+        if(e==0){
+            right_status = false
+        }
+        console.error("processTask error:",e)
+    } finally{
+        if(right_status){
+            page_index++;
+            global.setTimeout(processTask, 1000);
+        }
+
+    }
+
+}
+
+
+CMD.init = async function(){
+    redis_help.connect((results)=>{
+        if(results){
+            processTask();
+        }
+    })
+
+}
+
+CMD.init()

+ 154 - 12
logs/combined.log

@@ -1,12 +1,154 @@
-<<<<<<< HEAD
-2025-03-13T11:57:05: 
-2025-03-13T11:57:05: > heiyan@1.0.0 start
-2025-03-13T11:57:05: > node tg_factory_main.js
-2025-03-13T11:57:05: 
-2025-03-13T11:57:10: Connected to Redis
-=======
-2025-03-08T23:26:36: 
-2025-03-08T23:26:36: > heiyan@1.0.0 start
-2025-03-08T23:26:36: > node tg_factory_main.js
-2025-03-08T23:26:36: 
->>>>>>> 96037d135aa700e0cfae431bc1a4555db7bad0f7
+2025-03-18T19:40:57: 
+2025-03-18T19:40:57: > heiyan@1.0.0 start
+2025-03-18T19:40:57: > node tg_factory_main.js
+2025-03-18T19:40:57: 
+2025-03-18T19:41:01: Connected to Redis
+2025-03-18T19:41:01: PlatformInfo: {
+2025-03-18T19:41:01:   chongzhi: '[{"id": 2452, "name": "49.9+复充49.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2452, "json_data": ""}, {"id": 2451, "name": "9.9+复冲模版9.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2451, "json_data": ""}, {"id": 2450, "name": "19.9+复冲模版19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2450, "json_data": ""}, {"id": 2449, "name": "29.9+复冲模版29.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2449, "json_data": ""}, {"id": 2448, "name": "89.9+复充89.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2448, "json_data": ""}, {"id": 2447, "name": "129+复充129 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2447, "json_data": ""}, {"id": 2446, "name": "79.9+复充79.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2446, "json_data": ""}, {"id": 2443, "name": "69.9充值模版+复充69.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2443, "json_data": ""}, {"id": 2442, "name": "59.9充值模版+复充59.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2442, "json_data": ""}, {"id": 1340, "name": "2.9+复充2.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1340, "json_data": ""}, {"id": 55, "name": "19.9充值模板+复冲19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 55, "json_data": ""}, {"id": 54, "name": "5.9元+5.9元 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 54, "json_data": ""}, {"id": 52, "name": "149充值模版+复充149 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 52, "json_data": ""}, {"id": 51, "name": "99充值模版+复充99 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 51, "json_data": ""}, {"id": 50, "name": "39.9充值模版+复充39.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 50, "json_data": ""}]',
+2025-03-18T19:41:01:   tg_platform_name: '七猫-付费-啊啊小说',
+2025-03-18T19:41:01:   tg_platform_id: 13,
+2025-03-18T19:41:01:   filter_guajian_logic: '',
+2025-03-18T19:41:01:   pay_type: 1,
+2025-03-18T19:41:01:   parent_platform_id: 3,
+2025-03-18T19:41:01:   id: 28,
+2025-03-18T19:41:01:   f_chongzhi: '[{"id": 1, "name": "复充2.9", "value": 3522}]',
+2025-03-18T19:41:01:   mini_program_platform_id: 1,
+2025-03-18T19:41:01:   platform_shared_id: 3,
+2025-03-18T19:41:01:   huichuan: '[{"id": 3280, "name": "七猫2.9-锐可第七分-啊啊 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 3280, "json_data": ""}, {"id": 1879, "name": "首充回传 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1879, "json_data": ""}]',
+2025-03-18T19:41:01:   filter_guajian_logic_list: '[""]',
+2025-03-18T19:41:01:   material_platform_id: 0
+2025-03-18T19:41:01: }
+2025-03-18T19:41:01: main_info: {
+2025-03-18T19:41:01:   infra_status: 1,
+2025-03-18T19:41:01:   daily_new_limit: 99999,
+2025-03-18T19:41:01:   pay_type: 1,
+2025-03-18T19:41:01:   butler_id: 21,
+2025-03-18T19:41:01:   channelId: '',
+2025-03-18T19:41:01:   qm_id: '549124667291906201,14f237fdbb7711ef93f90293e6ac97a2',
+2025-03-18T19:41:01:   valid_timer_like_num: 1,
+2025-03-18T19:41:01:   platform_shared_id: 3,
+2025-03-18T19:41:01:   material_platform_id: 3,
+2025-03-18T19:41:01:   running_status: 1,
+2025-03-18T19:41:01:   sync_database: '',
+2025-03-18T19:41:01:   yw_id: '',
+2025-03-18T19:41:01:   distributor_id: '',
+2025-03-18T19:41:01:   cpa_bid: 3000,
+2025-03-18T19:41:01:   is_delete: 0,
+2025-03-18T19:41:01:   id: 119,
+2025-03-18T19:41:01:   source: '',
+2025-03-18T19:41:01:   yesterday_cost: 1676,
+2025-03-18T19:41:01:   app_id: 'tt83e6f55b1cd3f78601',
+2025-03-18T19:41:01:   valid_timer_number: 5,
+2025-03-18T19:41:01:   ad_act: 0,
+2025-03-18T19:41:01:   ad_quantity: 35,
+2025-03-18T19:41:01:   tg_platform_id: 13,
+2025-03-18T19:41:01:   update_time: '2025-03-13 11:35:53',
+2025-03-18T19:41:01:   valid_time: 0,
+2025-03-18T19:41:01:   is_open_create_link: 1,
+2025-03-18T19:41:01:   ql_bid: 3400,
+2025-03-18T19:41:01:   zh_id: '',
+2025-03-18T19:41:01:   bid_type: 0,
+2025-03-18T19:41:01:   parent_platform_id: 3,
+2025-03-18T19:41:01:   tg_link_config: '{"is_open": 1, "site_id": "", "kadian_id": "", "chongzhi_id": 50, "huichuan_id": 1879, "f_chongzhi_id": 4614}',
+2025-03-18T19:41:01:   oce_product_id: '1741275639269479516',
+2025-03-18T19:41:01:   no_bid_budget: 30000,
+2025-03-18T19:41:01:   ldy_template_site_id: '7468255698678906918',
+2025-03-18T19:41:01:   ad_convert_type: '[14]',
+2025-03-18T19:41:01:   group_id: '',
+2025-03-18T19:41:01:   create_time: '2025-02-06 19:25:50',
+2025-03-18T19:41:01:   valid_timer_time: 0,
+2025-03-18T19:41:01:   delivery_mode: 'MANUAL',
+2025-03-18T19:41:01:   genre: 3,
+2025-03-18T19:41:01:   stat_cost: 0,
+2025-03-18T19:41:01:   roi_goal: 0,
+2025-03-18T19:41:01:   oce_product_platform_id: '2726496330385178',
+2025-03-18T19:41:01:   template_bid: 3990,
+2025-03-18T19:41:01:   bid_ratio: '1:1',
+2025-03-18T19:41:01:   advertiser_id: '1821098975546553',
+2025-03-18T19:41:01:   aweme_id: '82040967890',
+2025-03-18T19:41:01:   custom_budget: 9999900,
+2025-03-18T19:41:01:   wx_miniapp_create_status: 1,
+2025-03-18T19:41:01:   valid_timer_filter_app_name: 0,
+2025-03-18T19:41:01:   main_name: '炫酷第四分DXAA',
+2025-03-18T19:41:01:   landing_page: 'https://www.chengzijianzhan.com/tetris/page/7468255698678906918',
+2025-03-18T19:41:01:   mini_program_platform_id: 1,
+2025-03-18T19:41:01:   tg_app_index: 102,
+2025-03-18T19:41:01:   max_ad_quantity: 40
+2025-03-18T19:41:01: }
+2025-03-18T19:41:50: 
+2025-03-18T19:41:50: > heiyan@1.0.0 start
+2025-03-18T19:41:50: > node tg_factory_main.js
+2025-03-18T19:41:50: 
+2025-03-18T19:41:54: Connected to Redis
+2025-03-18T19:41:54: PlatformInfo: {
+2025-03-18T19:41:54:   chongzhi: '[{"id": 2452, "name": "49.9+复充49.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2452, "json_data": ""}, {"id": 2451, "name": "9.9+复冲模版9.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2451, "json_data": ""}, {"id": 2450, "name": "19.9+复冲模版19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2450, "json_data": ""}, {"id": 2449, "name": "29.9+复冲模版29.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2449, "json_data": ""}, {"id": 2448, "name": "89.9+复充89.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2448, "json_data": ""}, {"id": 2447, "name": "129+复充129 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2447, "json_data": ""}, {"id": 2446, "name": "79.9+复充79.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2446, "json_data": ""}, {"id": 2443, "name": "69.9充值模版+复充69.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2443, "json_data": ""}, {"id": 2442, "name": "59.9充值模版+复充59.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2442, "json_data": ""}, {"id": 1340, "name": "2.9+复充2.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1340, "json_data": ""}, {"id": 55, "name": "19.9充值模板+复冲19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 55, "json_data": ""}, {"id": 54, "name": "5.9元+5.9元 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 54, "json_data": ""}, {"id": 52, "name": "149充值模版+复充149 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 52, "json_data": ""}, {"id": 51, "name": "99充值模版+复充99 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 51, "json_data": ""}, {"id": 50, "name": "39.9充值模版+复充39.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 50, "json_data": ""}]',
+2025-03-18T19:41:54:   tg_platform_name: '七猫-付费-啊啊小说',
+2025-03-18T19:41:54:   tg_platform_id: 13,
+2025-03-18T19:41:54:   filter_guajian_logic: '',
+2025-03-18T19:41:54:   pay_type: 1,
+2025-03-18T19:41:54:   parent_platform_id: 3,
+2025-03-18T19:41:54:   id: 28,
+2025-03-18T19:41:54:   f_chongzhi: '[{"id": 1, "name": "复充2.9", "value": 3522}]',
+2025-03-18T19:41:54:   mini_program_platform_id: 1,
+2025-03-18T19:41:54:   platform_shared_id: 3,
+2025-03-18T19:41:54:   huichuan: '[{"id": 3280, "name": "七猫2.9-锐可第七分-啊啊 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 3280, "json_data": ""}, {"id": 1879, "name": "首充回传 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1879, "json_data": ""}]',
+2025-03-18T19:41:54:   filter_guajian_logic_list: '[""]',
+2025-03-18T19:41:54:   material_platform_id: 0
+2025-03-18T19:41:54: }
+2025-03-18T19:41:54: main_info: {
+2025-03-18T19:41:54:   infra_status: 1,
+2025-03-18T19:41:54:   daily_new_limit: 99999,
+2025-03-18T19:41:54:   pay_type: 1,
+2025-03-18T19:41:54:   butler_id: 21,
+2025-03-18T19:41:54:   channelId: '',
+2025-03-18T19:41:54:   qm_id: '549124667291906201,14f237fdbb7711ef93f90293e6ac97a2',
+2025-03-18T19:41:54:   valid_timer_like_num: 1,
+2025-03-18T19:41:54:   platform_shared_id: 3,
+2025-03-18T19:41:54:   material_platform_id: 3,
+2025-03-18T19:41:54:   running_status: 1,
+2025-03-18T19:41:54:   sync_database: '',
+2025-03-18T19:41:54:   yw_id: '',
+2025-03-18T19:41:54:   distributor_id: '',
+2025-03-18T19:41:54:   cpa_bid: 3000,
+2025-03-18T19:41:54:   is_delete: 0,
+2025-03-18T19:41:54:   id: 119,
+2025-03-18T19:41:54:   source: '',
+2025-03-18T19:41:54:   yesterday_cost: 1676,
+2025-03-18T19:41:54:   app_id: 'tt83e6f55b1cd3f78601',
+2025-03-18T19:41:54:   valid_timer_number: 5,
+2025-03-18T19:41:54:   ad_act: 0,
+2025-03-18T19:41:54:   ad_quantity: 35,
+2025-03-18T19:41:54:   tg_platform_id: 13,
+2025-03-18T19:41:54:   update_time: '2025-03-13 11:35:53',
+2025-03-18T19:41:54:   valid_time: 0,
+2025-03-18T19:41:54:   is_open_create_link: 1,
+2025-03-18T19:41:54:   ql_bid: 3400,
+2025-03-18T19:41:54:   zh_id: '',
+2025-03-18T19:41:54:   bid_type: 0,
+2025-03-18T19:41:54:   parent_platform_id: 3,
+2025-03-18T19:41:54:   tg_link_config: '{"is_open": 1, "site_id": "", "kadian_id": "", "chongzhi_id": 50, "huichuan_id": 1879, "f_chongzhi_id": 4614}',
+2025-03-18T19:41:54:   oce_product_id: '1741275639269479516',
+2025-03-18T19:41:54:   no_bid_budget: 30000,
+2025-03-18T19:41:54:   ldy_template_site_id: '7468255698678906918',
+2025-03-18T19:41:54:   ad_convert_type: '[14]',
+2025-03-18T19:41:54:   group_id: '',
+2025-03-18T19:41:54:   create_time: '2025-02-06 19:25:50',
+2025-03-18T19:41:54:   valid_timer_time: 0,
+2025-03-18T19:41:54:   delivery_mode: 'MANUAL',
+2025-03-18T19:41:54:   genre: 3,
+2025-03-18T19:41:54:   stat_cost: 0,
+2025-03-18T19:41:54:   roi_goal: 0,
+2025-03-18T19:41:54:   oce_product_platform_id: '2726496330385178',
+2025-03-18T19:41:54:   template_bid: 3990,
+2025-03-18T19:41:54:   bid_ratio: '1:1',
+2025-03-18T19:41:54:   advertiser_id: '1821098975546553',
+2025-03-18T19:41:54:   aweme_id: '82040967890',
+2025-03-18T19:41:54:   custom_budget: 9999900,
+2025-03-18T19:41:54:   wx_miniapp_create_status: 1,
+2025-03-18T19:41:54:   valid_timer_filter_app_name: 0,
+2025-03-18T19:41:54:   main_name: '炫酷第四分DXAA',
+2025-03-18T19:41:54:   landing_page: 'https://www.chengzijianzhan.com/tetris/page/7468255698678906918',
+2025-03-18T19:41:54:   mini_program_platform_id: 1,
+2025-03-18T19:41:54:   tg_app_index: 102,
+2025-03-18T19:41:54:   max_ad_quantity: 40
+2025-03-18T19:41:54: }

+ 154 - 12
logs/out.log

@@ -1,12 +1,154 @@
-<<<<<<< HEAD
-2025-03-13T11:57:05: 
-2025-03-13T11:57:05: > heiyan@1.0.0 start
-2025-03-13T11:57:05: > node tg_factory_main.js
-2025-03-13T11:57:05: 
-2025-03-13T11:57:10: Connected to Redis
-=======
-2025-03-08T23:26:36: 
-2025-03-08T23:26:36: > heiyan@1.0.0 start
-2025-03-08T23:26:36: > node tg_factory_main.js
-2025-03-08T23:26:36: 
->>>>>>> 96037d135aa700e0cfae431bc1a4555db7bad0f7
+2025-03-18T19:40:57: 
+2025-03-18T19:40:57: > heiyan@1.0.0 start
+2025-03-18T19:40:57: > node tg_factory_main.js
+2025-03-18T19:40:57: 
+2025-03-18T19:41:01: Connected to Redis
+2025-03-18T19:41:01: PlatformInfo: {
+2025-03-18T19:41:01:   chongzhi: '[{"id": 2452, "name": "49.9+复充49.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2452, "json_data": ""}, {"id": 2451, "name": "9.9+复冲模版9.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2451, "json_data": ""}, {"id": 2450, "name": "19.9+复冲模版19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2450, "json_data": ""}, {"id": 2449, "name": "29.9+复冲模版29.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2449, "json_data": ""}, {"id": 2448, "name": "89.9+复充89.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2448, "json_data": ""}, {"id": 2447, "name": "129+复充129 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2447, "json_data": ""}, {"id": 2446, "name": "79.9+复充79.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2446, "json_data": ""}, {"id": 2443, "name": "69.9充值模版+复充69.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2443, "json_data": ""}, {"id": 2442, "name": "59.9充值模版+复充59.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2442, "json_data": ""}, {"id": 1340, "name": "2.9+复充2.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1340, "json_data": ""}, {"id": 55, "name": "19.9充值模板+复冲19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 55, "json_data": ""}, {"id": 54, "name": "5.9元+5.9元 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 54, "json_data": ""}, {"id": 52, "name": "149充值模版+复充149 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 52, "json_data": ""}, {"id": 51, "name": "99充值模版+复充99 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 51, "json_data": ""}, {"id": 50, "name": "39.9充值模版+复充39.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 50, "json_data": ""}]',
+2025-03-18T19:41:01:   tg_platform_name: '七猫-付费-啊啊小说',
+2025-03-18T19:41:01:   tg_platform_id: 13,
+2025-03-18T19:41:01:   filter_guajian_logic: '',
+2025-03-18T19:41:01:   pay_type: 1,
+2025-03-18T19:41:01:   parent_platform_id: 3,
+2025-03-18T19:41:01:   id: 28,
+2025-03-18T19:41:01:   f_chongzhi: '[{"id": 1, "name": "复充2.9", "value": 3522}]',
+2025-03-18T19:41:01:   mini_program_platform_id: 1,
+2025-03-18T19:41:01:   platform_shared_id: 3,
+2025-03-18T19:41:01:   huichuan: '[{"id": 3280, "name": "七猫2.9-锐可第七分-啊啊 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 3280, "json_data": ""}, {"id": 1879, "name": "首充回传 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1879, "json_data": ""}]',
+2025-03-18T19:41:01:   filter_guajian_logic_list: '[""]',
+2025-03-18T19:41:01:   material_platform_id: 0
+2025-03-18T19:41:01: }
+2025-03-18T19:41:01: main_info: {
+2025-03-18T19:41:01:   infra_status: 1,
+2025-03-18T19:41:01:   daily_new_limit: 99999,
+2025-03-18T19:41:01:   pay_type: 1,
+2025-03-18T19:41:01:   butler_id: 21,
+2025-03-18T19:41:01:   channelId: '',
+2025-03-18T19:41:01:   qm_id: '549124667291906201,14f237fdbb7711ef93f90293e6ac97a2',
+2025-03-18T19:41:01:   valid_timer_like_num: 1,
+2025-03-18T19:41:01:   platform_shared_id: 3,
+2025-03-18T19:41:01:   material_platform_id: 3,
+2025-03-18T19:41:01:   running_status: 1,
+2025-03-18T19:41:01:   sync_database: '',
+2025-03-18T19:41:01:   yw_id: '',
+2025-03-18T19:41:01:   distributor_id: '',
+2025-03-18T19:41:01:   cpa_bid: 3000,
+2025-03-18T19:41:01:   is_delete: 0,
+2025-03-18T19:41:01:   id: 119,
+2025-03-18T19:41:01:   source: '',
+2025-03-18T19:41:01:   yesterday_cost: 1676,
+2025-03-18T19:41:01:   app_id: 'tt83e6f55b1cd3f78601',
+2025-03-18T19:41:01:   valid_timer_number: 5,
+2025-03-18T19:41:01:   ad_act: 0,
+2025-03-18T19:41:01:   ad_quantity: 35,
+2025-03-18T19:41:01:   tg_platform_id: 13,
+2025-03-18T19:41:01:   update_time: '2025-03-13 11:35:53',
+2025-03-18T19:41:01:   valid_time: 0,
+2025-03-18T19:41:01:   is_open_create_link: 1,
+2025-03-18T19:41:01:   ql_bid: 3400,
+2025-03-18T19:41:01:   zh_id: '',
+2025-03-18T19:41:01:   bid_type: 0,
+2025-03-18T19:41:01:   parent_platform_id: 3,
+2025-03-18T19:41:01:   tg_link_config: '{"is_open": 1, "site_id": "", "kadian_id": "", "chongzhi_id": 50, "huichuan_id": 1879, "f_chongzhi_id": 4614}',
+2025-03-18T19:41:01:   oce_product_id: '1741275639269479516',
+2025-03-18T19:41:01:   no_bid_budget: 30000,
+2025-03-18T19:41:01:   ldy_template_site_id: '7468255698678906918',
+2025-03-18T19:41:01:   ad_convert_type: '[14]',
+2025-03-18T19:41:01:   group_id: '',
+2025-03-18T19:41:01:   create_time: '2025-02-06 19:25:50',
+2025-03-18T19:41:01:   valid_timer_time: 0,
+2025-03-18T19:41:01:   delivery_mode: 'MANUAL',
+2025-03-18T19:41:01:   genre: 3,
+2025-03-18T19:41:01:   stat_cost: 0,
+2025-03-18T19:41:01:   roi_goal: 0,
+2025-03-18T19:41:01:   oce_product_platform_id: '2726496330385178',
+2025-03-18T19:41:01:   template_bid: 3990,
+2025-03-18T19:41:01:   bid_ratio: '1:1',
+2025-03-18T19:41:01:   advertiser_id: '1821098975546553',
+2025-03-18T19:41:01:   aweme_id: '82040967890',
+2025-03-18T19:41:01:   custom_budget: 9999900,
+2025-03-18T19:41:01:   wx_miniapp_create_status: 1,
+2025-03-18T19:41:01:   valid_timer_filter_app_name: 0,
+2025-03-18T19:41:01:   main_name: '炫酷第四分DXAA',
+2025-03-18T19:41:01:   landing_page: 'https://www.chengzijianzhan.com/tetris/page/7468255698678906918',
+2025-03-18T19:41:01:   mini_program_platform_id: 1,
+2025-03-18T19:41:01:   tg_app_index: 102,
+2025-03-18T19:41:01:   max_ad_quantity: 40
+2025-03-18T19:41:01: }
+2025-03-18T19:41:50: 
+2025-03-18T19:41:50: > heiyan@1.0.0 start
+2025-03-18T19:41:50: > node tg_factory_main.js
+2025-03-18T19:41:50: 
+2025-03-18T19:41:54: Connected to Redis
+2025-03-18T19:41:54: PlatformInfo: {
+2025-03-18T19:41:54:   chongzhi: '[{"id": 2452, "name": "49.9+复充49.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2452, "json_data": ""}, {"id": 2451, "name": "9.9+复冲模版9.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2451, "json_data": ""}, {"id": 2450, "name": "19.9+复冲模版19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2450, "json_data": ""}, {"id": 2449, "name": "29.9+复冲模版29.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2449, "json_data": ""}, {"id": 2448, "name": "89.9+复充89.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2448, "json_data": ""}, {"id": 2447, "name": "129+复充129 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2447, "json_data": ""}, {"id": 2446, "name": "79.9+复充79.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2446, "json_data": ""}, {"id": 2443, "name": "69.9充值模版+复充69.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2443, "json_data": ""}, {"id": 2442, "name": "59.9充值模版+复充59.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 2442, "json_data": ""}, {"id": 1340, "name": "2.9+复充2.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1340, "json_data": ""}, {"id": 55, "name": "19.9充值模板+复冲19.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 55, "json_data": ""}, {"id": 54, "name": "5.9元+5.9元 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 54, "json_data": ""}, {"id": 52, "name": "149充值模版+复充149 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 52, "json_data": ""}, {"id": 51, "name": "99充值模版+复充99 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 51, "json_data": ""}, {"id": 50, "name": "39.9充值模版+复充39.9 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 50, "json_data": ""}]',
+2025-03-18T19:41:54:   tg_platform_name: '七猫-付费-啊啊小说',
+2025-03-18T19:41:54:   tg_platform_id: 13,
+2025-03-18T19:41:54:   filter_guajian_logic: '',
+2025-03-18T19:41:54:   pay_type: 1,
+2025-03-18T19:41:54:   parent_platform_id: 3,
+2025-03-18T19:41:54:   id: 28,
+2025-03-18T19:41:54:   f_chongzhi: '[{"id": 1, "name": "复充2.9", "value": 3522}]',
+2025-03-18T19:41:54:   mini_program_platform_id: 1,
+2025-03-18T19:41:54:   platform_shared_id: 3,
+2025-03-18T19:41:54:   huichuan: '[{"id": 3280, "name": "七猫2.9-锐可第七分-啊啊 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 3280, "json_data": ""}, {"id": 1879, "name": "首充回传 | 549124667291906201,14f237fdbb7711ef93f90293e6ac97a2", "value": 1879, "json_data": ""}]',
+2025-03-18T19:41:54:   filter_guajian_logic_list: '[""]',
+2025-03-18T19:41:54:   material_platform_id: 0
+2025-03-18T19:41:54: }
+2025-03-18T19:41:54: main_info: {
+2025-03-18T19:41:54:   infra_status: 1,
+2025-03-18T19:41:54:   daily_new_limit: 99999,
+2025-03-18T19:41:54:   pay_type: 1,
+2025-03-18T19:41:54:   butler_id: 21,
+2025-03-18T19:41:54:   channelId: '',
+2025-03-18T19:41:54:   qm_id: '549124667291906201,14f237fdbb7711ef93f90293e6ac97a2',
+2025-03-18T19:41:54:   valid_timer_like_num: 1,
+2025-03-18T19:41:54:   platform_shared_id: 3,
+2025-03-18T19:41:54:   material_platform_id: 3,
+2025-03-18T19:41:54:   running_status: 1,
+2025-03-18T19:41:54:   sync_database: '',
+2025-03-18T19:41:54:   yw_id: '',
+2025-03-18T19:41:54:   distributor_id: '',
+2025-03-18T19:41:54:   cpa_bid: 3000,
+2025-03-18T19:41:54:   is_delete: 0,
+2025-03-18T19:41:54:   id: 119,
+2025-03-18T19:41:54:   source: '',
+2025-03-18T19:41:54:   yesterday_cost: 1676,
+2025-03-18T19:41:54:   app_id: 'tt83e6f55b1cd3f78601',
+2025-03-18T19:41:54:   valid_timer_number: 5,
+2025-03-18T19:41:54:   ad_act: 0,
+2025-03-18T19:41:54:   ad_quantity: 35,
+2025-03-18T19:41:54:   tg_platform_id: 13,
+2025-03-18T19:41:54:   update_time: '2025-03-13 11:35:53',
+2025-03-18T19:41:54:   valid_time: 0,
+2025-03-18T19:41:54:   is_open_create_link: 1,
+2025-03-18T19:41:54:   ql_bid: 3400,
+2025-03-18T19:41:54:   zh_id: '',
+2025-03-18T19:41:54:   bid_type: 0,
+2025-03-18T19:41:54:   parent_platform_id: 3,
+2025-03-18T19:41:54:   tg_link_config: '{"is_open": 1, "site_id": "", "kadian_id": "", "chongzhi_id": 50, "huichuan_id": 1879, "f_chongzhi_id": 4614}',
+2025-03-18T19:41:54:   oce_product_id: '1741275639269479516',
+2025-03-18T19:41:54:   no_bid_budget: 30000,
+2025-03-18T19:41:54:   ldy_template_site_id: '7468255698678906918',
+2025-03-18T19:41:54:   ad_convert_type: '[14]',
+2025-03-18T19:41:54:   group_id: '',
+2025-03-18T19:41:54:   create_time: '2025-02-06 19:25:50',
+2025-03-18T19:41:54:   valid_timer_time: 0,
+2025-03-18T19:41:54:   delivery_mode: 'MANUAL',
+2025-03-18T19:41:54:   genre: 3,
+2025-03-18T19:41:54:   stat_cost: 0,
+2025-03-18T19:41:54:   roi_goal: 0,
+2025-03-18T19:41:54:   oce_product_platform_id: '2726496330385178',
+2025-03-18T19:41:54:   template_bid: 3990,
+2025-03-18T19:41:54:   bid_ratio: '1:1',
+2025-03-18T19:41:54:   advertiser_id: '1821098975546553',
+2025-03-18T19:41:54:   aweme_id: '82040967890',
+2025-03-18T19:41:54:   custom_budget: 9999900,
+2025-03-18T19:41:54:   wx_miniapp_create_status: 1,
+2025-03-18T19:41:54:   valid_timer_filter_app_name: 0,
+2025-03-18T19:41:54:   main_name: '炫酷第四分DXAA',
+2025-03-18T19:41:54:   landing_page: 'https://www.chengzijianzhan.com/tetris/page/7468255698678906918',
+2025-03-18T19:41:54:   mini_program_platform_id: 1,
+2025-03-18T19:41:54:   tg_app_index: 102,
+2025-03-18T19:41:54:   max_ad_quantity: 40
+2025-03-18T19:41:54: }

+ 14 - 0
pm2createlink.json

@@ -111,6 +111,20 @@
             "merge_logs": true,
             "exec_mode": "fork",
             "autorestart": true
+        },
+        {
+            "name": "qm_mf_create_link_factory",
+            "script": "./5_CREATE_LINK_FACTORY/qm_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/qm_mf_create_link_factory_error.log",
+            "out_file": "./logs/create_link/qm_mf_create_link_factory_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
         }
     ]
 }

+ 14 - 0
pm2json.json

@@ -250,6 +250,20 @@
             "merge_logs": true,
             "exec_mode": "fork",
             "autorestart": true
+        },
+        {
+            "name": "qm_mf_batch_factory",
+            "script": "./2_PRODUCT_FACTORY/qm_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/qm_mf_batch_factory_error.log",
+            "out_file": "./logs/qm_mf_batch_factory_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
         }
     ]
 }

+ 225 - 0
qm_mf_book_async.js

@@ -0,0 +1,225 @@
+const config = require("../etc/config.json");
+const helper = require("../src/helper");
+const HttpClient = require("../src/HttpClient");
+const redis_help = require('../src/use_redis');
+const mysql = require('mysql2/promise');
+const tools = require("../tools");
+const get_fq_book_tab_controllers = require("../src/data_manager/Controllers/get_fq_book_tab_controllers");
+const dbConfig = config.isDebug?config.debug_mysql:config.release_mysql
+const CMD = {}
+function getCodeFromUrl(url) {
+    const codeMatch = url.match(/code=([^&]+)/);
+    if (codeMatch && codeMatch[1]) {
+        return codeMatch[1];
+    }
+    return null;
+}
+async function processTask(){
+    let connection  = null
+    try{
+        const today = helper.getLocalDate();
+        let date = today.replace(/-/g, '');
+        let table_name = `video_product`;
+        // 创建数据库连接
+        connection = await mysql.createConnection({
+            ...dbConfig,
+            multipleStatements: true
+        });
+
+        // 检查表是否存在
+        const [tableCheck] = await connection.execute(
+            `SELECT TABLE_NAME 
+            FROM information_schema.tables 
+            WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ?`,
+            [dbConfig.database, table_name]
+        );
+
+        if (tableCheck.length === 0) {
+            // 表不存在
+            console.error(`表 ${table_name} 不存在`);
+            throw new Error(`表 ${table_name} 不存在`);
+        } else {
+            const [rows] = await connection.execute(
+                `SELECT * FROM ${table_name} WHERE book_platform = 3  LIMIT 6498`
+            );
+    
+            if(rows.length<=0){
+                throw "没有数据处理!"
+            }
+
+
+    
+        //     let id_list = []
+    
+        //     let video_id_list = []
+        //     let video_data_list = []
+            // rows.forEach((row, index) => {
+            //     id_list.push(row.id)
+            //     video_id_list.push(row.video_id)
+            //     video_data_list[row.video_id] = row
+            // });
+    
+        //     const [filter_rows] = await connection.execute(
+        //         `SELECT * FROM filter_data WHERE video_id IN (${video_id_list.join(",")})`
+        //     );
+
+        //     function getFilterById(video_id){
+        //         for (let index = 0; index < filter_rows.length; index++) {
+        //             const element = filter_rows[index];
+        //             if(element.video_id==video_id){
+        //                 return element
+        //             }
+        //         }
+        //         return null
+        //     }
+    
+        //     let need_insert_list  = []
+
+        //     for (let index = 0; index < video_id_list.length; index++) {
+        //         const video_id = video_id_list[index];
+        //         let d = getFilterById(video_id)
+        //         if(d==null){
+        //             need_insert_list.push(video_data_list[video_id])
+        //         }
+        //     }
+
+        //     let client =  new HttpClient()
+        //     let values = []
+
+        //     let sid_tt_status = true
+        //     for (let index = 0; index < need_insert_list.length; index++) {
+        //         const row = need_insert_list[index];
+        //         if(helper.checkChannel(row.guajian_link,"pages/theatre/index")){
+        //             let key =  getCodeFromUrl(row.guajian_link)
+        //             let book_name =  ""
+        //             let book_id = ""
+        //             if(key!=null){
+           
+        //                 let fq_book_result = await get_fq_book_tab_controllers.getData({ book_id: key });
+        //                 if(fq_book_result.success){
+        //                     book_name =  JSON.parse(fq_book_result.data.info.info).book_name
+        //                     book_id = fq_book_result.data.book_id
+        //                 }else{
+        //                     let sid_tt = await tools.getFqSidtt()
+        //                     let {url,params,headers}  = helper.getFqRequestOpt(key,sid_tt)
+        //                     let response = await client.fqProxyGet(url, params,headers)
+        
+                            
+        //                     if(response.code==0){
+        //                         let obj = response['data']
+
+        //                         book_name =  obj['video_info'].book_name
+        //                         book_id = obj['video_info'].book_id
+        
+        //                         let fq_book = {} 
+        //                         fq_book.key = key
+        //                         let fq_book_data = {book_name:book_name,book_id:book_id,info:JSON.stringify(obj['video_info'])}
+        //                         await CMD.add_fq_book(fq_book,fq_book_data)
+        //                     }else{
+        //                         if(response==""){
+        //                             sid_tt_status = false
+        //                         }
+        //                         console.log("error response:",response)
+        //                     }
+        //                 }
+                    
+        //             }else{
+        //                 console.log("key = null:",row.guajian_link)
+        //             }
+                  
+        //             if(book_name!=""){
+        //                 values.push({video_id:row.video_id,
+        //                     video_link:row.video_link,
+        //                     title:row.title,
+        //                     book_name:book_name,
+        //                     book_id:book_id,
+        //                     tg_platform_id:config.platform_fanqie_dx,
+        //                     like_num:row.like_num,
+        //                     comment_num:row.comment_num,
+        //                     shared_num:row.shared_num,
+        //                     kepp_num:row.kepp_num,
+        //                     create_time:new Date(),
+        //                     create_day:date,
+        //                     status:0,
+        //                     data_source:2
+        //                 })
+        //             }
+        //         }
+        //     }
+        //    console.log("values:",values)
+          
+        //     if(values.length>0&&sid_tt_status){
+
+        //         const formattedValues = values.map(item => [
+        //             item.video_id,
+        //             item.video_link,
+        //             item.title,
+        //             item.book_name,
+        //             item.book_id,
+        //             item.tg_platform_id,
+        //             item.like_num,
+        //             item.comment_num,
+        //             item.shared_num,
+        //             item.kepp_num,
+        //             item.create_time,
+        //             item.create_day,
+        //             item.status,
+        //             item.data_source
+        //         ]);
+        //         // 插入数据
+        //         const insertSQL = `
+        //         INSERT IGNORE INTO filter_data
+        //         (video_id, video_link, title, book_name, 
+        //         book_id, tg_platform_id, like_num, comment_num, shared_num,
+        //         kepp_num, create_time, create_day, status,data_source)
+        //         VALUES ?
+        //         `;
+                
+        //         await connection.query(insertSQL, [formattedValues]);
+        //     }
+
+    
+        //     const updateSQL = `
+        //     UPDATE xs_origin_data 
+        //     SET sync_info_status = 1
+        //     WHERE FIND_IN_SET(id, ?)
+        //     `;
+        
+        //     await connection.query(updateSQL, [id_list.join(',')]);
+        }
+        
+    }catch(e){
+        console.error("processTask error:",e)
+    } finally{
+        global.setTimeout(processTask, 1000);
+        // if(connection!=null){
+        //     await connection.end();
+        // }
+    }
+
+}
+
+CMD.add_fq_book = async function(data,response){
+    let book_name =  response.book_name
+    let book_id = response.book_id
+
+    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)
+    }
+    return await get_fq_book_tab_controllers.createData( tab)
+}
+
+CMD.init = async function(){
+    redis_help.connect((results)=>{
+        if(results){
+            processTask();
+        }
+    })
+
+}
+
+CMD.init()

BIN
src/api/hy/qr.gif


BIN
src/api/hy/qr_resized.gif


+ 55 - 0
src/api/qm_mf/get_qm_mf_account_list.js

@@ -0,0 +1,55 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const helper = require('../../helper');
+const config  = require('../../../etc/config.json')
+const CMD = {}
+CMD.get_qm_account_list = async function () {
+    const url = 'https://new-media-iaa-fx.qimao.com/api/account/optimizer/list';
+    // 请求参数
+    const params = new URLSearchParams({
+        page: '1',
+        page_size: '50',
+        env: '',
+        t: Date.now()  // 当前时间戳
+    });
+    // 请求头
+    var headers = {
+        'accept': 'application/json, text/plain, */*',
+        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
+        'app-external-id': '4c6e8d8709c14de9a4397b6cbb978f85',
+        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
+        'project': 'reader_free_dyminiapp',
+        'signature': '889e0e141a9e82d37d4611d130d16b277a09b88cd9d3ff0b117ecf616679bb0e',
+        'target-id': '558102575356793781',
+        'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-iaa-fx_qimao_com=%7B%22distinct_id%22%3A%22195a243a180505-022ff8224617bd2-4c657b58-921600-195a243a1815e0%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk1YTI0M2ExODA1MDUtMDIyZmY4MjI0NjE3YmQyLTRjNjU3YjU4LTkyMTYwMC0xOTVhMjQzYTE4MTVlMCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0aef832217422796109355798e009653b7fda67dfeeb3ff092f5d3dcf75e97',
+        'Referer': 'https://new-media-iaa-fx.qimao.com/backend/book-manage/index?projectId=reader_free_dyminiapp&appId=ttaeafd812319b128201&accountId=558102575356793781'
+    };
+
+
+    headers['authorization'] = await tools.getQMMFToken()
+    try {
+        const response = await fetch(`${url}?${params}`, {
+            method: 'GET',
+            headers: headers
+        });
+
+        const data = await response.json();
+
+        if(data.code!=200){
+            throw data
+        }
+        
+        console.log('响应状态:', response.status);
+        console.log('响应数据:', data);
+        return data.data;
+    } catch (error) {
+        console.error('请求错误:', error);
+        throw error;
+    }
+}
+
+// Node.js 18及以上版本可以直接运行
+// Node.js 18以下版本需要先安装 node-fetch:
+// npm install node-fetch@2
+
+module.exports = CMD;

+ 91 - 0
src/api/qm_mf/get_qm_mf_call_back_template.js

@@ -0,0 +1,91 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const helper = require('../../helper');
+const config  = require('../../../etc/config.json')
+const CMD = {}
+CMD.get_callback_template = async function (mini_program_platform_id=config.dy,qm_id) {
+    const url = 'https://new-media-iaa-fx.qimao.com/api/postback/rule/list';
+    
+    // 请求参数
+    const params = new URLSearchParams({
+        page: '1',
+        page_size: '50',
+        env: '',
+        t: Date.now()  // 当前时间戳
+    });
+    let param_list = qm_id.split(',')
+    let app_external_id = param_list[1]
+    let target_id = param_list[0]
+    // 请求头
+    var dy_headers = {
+        "accept": "application/json, text/plain, */*",
+        "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+        "app-id": "ttaeafd812319b128201",
+        "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU",
+        "project": "reader_free_dyminiapp",
+        "sec-ch-ua": "\"Chromium\";v=\"134\", \"Not:A-Brand\";v=\"24\", \"Microsoft Edge\";v=\"134\"",
+        "sec-ch-ua-mobile": "?0",
+        "sec-ch-ua-platform": "\"Windows\"",
+        "sec-fetch-dest": "empty",
+        "sec-fetch-mode": "cors",
+        "sec-fetch-site": "same-origin",
+        "signature": "1a0ace44e3187f9f6729fcf83aa0ccb357815d3ce56d744c6f28ff9efc1f4d88",
+        "target-id": `${target_id}`,
+        "cookie": "sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-iaa-fx_qimao_com=%7B%22distinct_id%22%3A%22195a243a180505-022ff8224617bd2-4c657b58-921600-195a243a1815e0%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk1YTI0M2ExODA1MDUtMDIyZmY4MjI0NjE3YmQyLTRjNjU3YjU4LTkyMTYwMC0xOTVhMjQzYTE4MTVlMCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47314f17422851558435810e0143dcd26df2a491694d1aabf9dfaa71e07d",
+        "Referer": "https://new-media-iaa-fx.qimao.com/backend/postback-configuration/index?projectId=reader_free_dyminiapp&appId=ttaeafd812319b128201&accountId=558102575356793781",
+        "Referrer-Policy": "strict-origin-when-cross-origin"
+    };
+
+    var wx_headers = {
+        "accept": "application/json, text/plain, */*",
+        "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+        "app-id": "ttaeafd812319b128201",
+        "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU",
+        "project": "reader_free_dyminiapp",
+        "sec-ch-ua": "\"Chromium\";v=\"134\", \"Not:A-Brand\";v=\"24\", \"Microsoft Edge\";v=\"134\"",
+        "sec-ch-ua-mobile": "?0",
+        "sec-ch-ua-platform": "\"Windows\"",
+        "sec-fetch-dest": "empty",
+        "sec-fetch-mode": "cors",
+        "sec-fetch-site": "same-origin",
+        "signature": "1a0ace44e3187f9f6729fcf83aa0ccb357815d3ce56d744c6f28ff9efc1f4d88",
+        "target-id": `${target_id}`,
+        "cookie": "sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-iaa-fx_qimao_com=%7B%22distinct_id%22%3A%22195a243a180505-022ff8224617bd2-4c657b58-921600-195a243a1815e0%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTk1YTI0M2ExODA1MDUtMDIyZmY4MjI0NjE3YmQyLTRjNjU3YjU4LTkyMTYwMC0xOTVhMjQzYTE4MTVlMCJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47314f17422851558435810e0143dcd26df2a491694d1aabf9dfaa71e07d",
+        "Referer": "https://new-media-iaa-fx.qimao.com/backend/postback-configuration/index?projectId=reader_free_dyminiapp&appId=ttaeafd812319b128201&accountId=558102575356793781",
+        "Referrer-Policy": "strict-origin-when-cross-origin"
+    };
+
+    let headers = ""
+    if(mini_program_platform_id==config.wx){
+        headers = wx_headers
+    }else if(mini_program_platform_id==config.dy){
+        headers = dy_headers
+    }
+
+    headers['authorization'] = await tools.getQMMFToken()
+    try {
+        const response = await fetch(`${url}?${params}`, {
+            method: 'GET',
+            headers: headers
+        });
+
+        const data = await response.json();
+
+        if(data.code!=200){
+            throw data
+        }
+        
+        console.log('响应状态:', response.status);
+        console.log('响应数据:', data);
+        return data.data;
+    } catch (error) {
+        console.error('请求错误:', error);
+        throw error;
+    }
+}
+
+// Node.js 18及以上版本可以直接运行
+// Node.js 18以下版本需要先安装 node-fetch:
+// npm install node-fetch@2
+
+module.exports = CMD;

+ 126 - 0
src/api/qm_mf/get_qm_mf_promotion.js

@@ -0,0 +1,126 @@
+const fetch = require('node-fetch');
+const tools = require('../../../tools');
+const config =  require('../../../etc/config.json')
+async function getPromotionInfo(app_id,target_id,promotion_id,mini_program_platform_id=config.dy) {
+    try {
+        const url = new URL('https://new-media-iaa-fx.qimao.com/api/promotion/info');
+        url.searchParams.append('promotion_id', promotion_id);
+        url.searchParams.append('env', '');
+        url.searchParams.append('t', Date.now());
+
+        // 请求头
+        const dy_headers = {
+            'accept': 'application/json, text/plain, */*',
+            "app-id": app_id,
+            'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU',
+            'project': 'reader_free_dyminiapp',
+            'signature': '27f1c6bd848f65d15f3454b05872b789b1b8357f16ea2d2aead044780d371e11',
+            'target-id': target_id
+        };
+
+        // const wx_headers = {
+        //     'accept': 'application/json, text/plain, */*',
+        //     'app-external-id': '9a2737aabb8f11ef93f90293e6ac97a2',
+        //     'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0NDI1MjU5LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0NTExNjU5LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQ0MjUyNTksIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.KFEAi-QJcMXzSYokQmtF2-RsdfjiSEIRBM34hBuDjLY',
+        //     'project': 'reader_paid_wxminiapp',
+        //     'signature': '5aeeeff44f700540bb47ed41301fcbceefc342101818c1157cf7ef9331973d6e',
+        //     'target-id': '544180064332673816'
+        // };
+        let headers = ""
+        if(mini_program_platform_id==config.wx){
+            headers = wx_headers
+        }else if(mini_program_platform_id==config.dy){
+            headers = dy_headers
+        }
+        headers['authorization'] = await tools.getQMMFToken()
+        const response = await fetch(url.toString(), {
+            method: 'GET',
+            headers:headers
+        });
+
+        if (response.status === 401) {
+            throw new Error('Unauthorized: Token may be expired or invalid');
+        }
+
+        if (!response.ok) {
+            throw new Error(`HTTP error! status: ${response.status}`);
+        }
+
+        var data = await response.json();
+        return data;
+    } catch (error) {
+        console.error('Error:', error);
+        throw error;
+    }
+}
+
+async function getPromotionList(app_id,target_id,promotion_name,mini_program_platform_id=config.dy) {
+    try {
+        const url = new URL('https://new-media-iaa-fx.qimao.com/api/promotion/list');
+        url.searchParams.append('promotion_name', promotion_name);
+        url.searchParams.append('page', '1');
+        url.searchParams.append('page_size', '50');
+        url.searchParams.append('env', '');
+        url.searchParams.append('t', Date.now());
+   
+        // 请求头
+        const dy_headers = {
+            'accept': 'application/json, text/plain, */*',
+            "app-id": `${app_id}`,
+            'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU',
+            'project': 'reader_free_dyminiapp',
+            'signature': 'b49d6c4b5797ce670bc99848d444e93ef5d77b8208f0fd9623e873328130e109',
+            'target-id': `${target_id}`
+        };
+
+
+        // const wx_headers = {
+        //     'accept': 'application/json, text/plain, */*',
+        //     'app-external-id': `${app_external_id}`,
+        //     'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0NDI1MjU5LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0NTExNjU5LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQ0MjUyNTksIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.KFEAi-QJcMXzSYokQmtF2-RsdfjiSEIRBM34hBuDjLY',
+        //     'project': 'reader_free_dyminiapp',
+        //     'signature': '545831eb8ed618a0d16a04f9553c6285e896eda5ff7b01df5e4e9ba6715fe149',
+        //     'target-id': `${target_id}`
+        // };
+
+        let headers = ""
+        if(mini_program_platform_id==config.wx){
+            headers = wx_headers
+        }else if(mini_program_platform_id==config.dy){
+            headers = dy_headers
+        }
+        headers['authorization'] = await tools.getQMMFToken()
+
+        const response = await fetch(url.toString(), {
+            method: 'GET',
+            headers:headers
+        });
+
+
+        if (!response.ok) {
+            throw new Error(`HTTP error! status: ${response.status}`);
+        }
+
+        const data = await response.json();
+
+        if(data.code!=200){
+            throw data
+        }
+        if(data.data.list.length<=0){
+            throw data
+        }
+
+        let promotion_id = data.data.list[0].promotion_id
+
+        console.log("response:",data)
+        let info = await getPromotionInfo(app_id,target_id,promotion_id,mini_program_platform_id)
+        console.log("response:",info)
+        info.promotion_id = promotion_id
+        return info;
+    } catch (error) {
+        console.error('Error:', error);
+        return null;
+    }
+}
+
+module.exports = { getPromotionList };

+ 80 - 0
src/api/qm_mf/get_qm_mf_recharge_template.js

@@ -0,0 +1,80 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json')
+const CMD = {}
+//  "category": "1" 复充充值模板
+//  "category": "0" 首充充值模板
+CMD.get_recharge_template = async function (category,mini_program_platform_id=config.dy,qm_id) {
+    const url = 'https://new-media-fx.qimao.com/api/charge-configure/panel-group/list';
+    // 请求参数
+    const params = new URLSearchParams({
+        page: '1',
+        page_size: '50',
+        env: '',
+        name:'',
+        category:category,
+        t: Date.now()  // 当前时间戳
+    });
+
+    let param_list = qm_id.split(',')
+    let app_external_id = param_list[1]
+    let target_id = param_list[0]
+    // 请求头
+    const dy_headers = {
+        'accept': 'application/json, text/plain, */*',
+        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
+        'app-external-id': `${app_external_id}`,
+        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
+        'project': 'reader_paid_dyminiapp',
+        'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
+        'target-id': `${target_id}`,
+        
+        'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-fx_qimao_com=%7B%22distinct_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkzYmRjMTI0NjQ1ZTItMGNiZWFlZTE3MmQ0Y2U4LTRjNjU3YjU4LTkyMTYwMC0xOTNiZGMxMjQ2NTU2NyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47329d17393406161785226e003325543a1cc53c490ed7b4e24f2bfb2387',
+        'Referer': `https://new-media-fx.qimao.com/backend/recharge-configuration/index?projectId=reader_paid_dyminiapp&appId=${app_external_id}&accountId=${target_id}`
+    };
+
+    const wx_headers = {
+        'accept': 'application/json, text/plain, */*',
+        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
+        'app-external-id': `${app_external_id}`,
+        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
+        'project': 'reader_paid_wxminiapp',
+        'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
+        'target-id': `${target_id}`,
+        'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sa_jssdk_2015_new-media-fx_qimao_com=%7B%22distinct_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%2C%22first_id%22%3A%22%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E5%BC%95%E8%8D%90%E6%B5%81%E9%87%8F%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC%22%2C%22%24latest_referrer%22%3A%22http%3A%2F%2F120.79.128.142%3A4999%2F%22%7D%2C%22identities%22%3A%22eyIkaWRlbnRpdHlfY29va2llX2lkIjoiMTkzYmRjMTI0NjQ1ZTItMGNiZWFlZTE3MmQ0Y2U4LTRjNjU3YjU4LTkyMTYwMC0xOTNiZGMxMjQ2NTU2NyJ9%22%2C%22history_login_id%22%3A%7B%22name%22%3A%22%22%2C%22value%22%3A%22%22%7D%7D; acw_tc=0a47329d17393406161785226e003325543a1cc53c490ed7b4e24f2bfb2387',
+        'Referer': `https://new-media-fx.qimao.com/backend/recharge-configuration/index?projectId=reader_paid_wxminiapp&appId=${app_external_id}&accountId=${target_id}`
+    };
+    let headers = ""
+    if(mini_program_platform_id==config.wx){
+        headers = wx_headers
+    }else if(mini_program_platform_id==config.dy){
+        headers = dy_headers
+    }
+    headers['authorization'] = await tools.getQMMFToken()
+    try {
+        const response = await fetch(`${url}?${params}`, {
+            method: 'GET',
+            headers: headers
+        });
+
+        const data = await response.json();
+
+        if(data.code!=200){
+            throw data
+        }
+        
+        console.log('响应状态:', response.status);
+        console.log('响应数据:', data);
+        return data.data;
+    } catch (error) {
+        console.error('请求错误:', error);
+        throw error;
+    }
+}
+
+// Node.js 18及以上版本可以直接运行
+// Node.js 18以下版本需要先安装 node-fetch:
+// npm install node-fetch@2
+
+module.exports = CMD;

+ 22 - 0
src/api/qm_mf/qm_mf_login.js

@@ -0,0 +1,22 @@
+const CMD = {}
+const HttpClient = require('../../HttpClient')
+const config = require('../../../etc/config.json')
+const helper = require('../../helper')
+const dns = require('dns').promises;
+
+// 获取七猫充值模板
+CMD.login = async function(call_back){
+    let clinet = new HttpClient()
+    let timestamp = helper.getCurrentUnixTimestamp()
+    let {data,headers} = await clinet.postAndGetHeaders(config.qimao_mf_config.login_host+timestamp+"&env=&qm_csrf_backend=undefined",{
+        account_name:"zhuoyue",
+        password:helper.base64("Zywz03963"),
+        env:""
+    },{
+        headers:{
+            "target-id": ""
+        }
+    })
+    call_back(data,headers)
+}
+module.exports = CMD;

+ 66 - 0
src/api/qm_mf/qm_mf_search_book.js

@@ -0,0 +1,66 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const helper = require('../../helper');
+const CMD = {}
+CMD.search_id = async function (bookId) {
+    const url = 'https://new-media-iaa-fx.qimao.com/api/content/book/list';
+    
+    // 请求参数
+    const params = new URLSearchParams({
+        book_id: bookId,
+        page: '1',
+        page_size: '50',
+        env: '',
+        t: Date.now()  // 当前时间戳
+    });
+
+    // 请求头
+    var headers = {
+        'accept': 'application/json, text/plain, */*',
+        "app-id": "ttaeafd812319b128201",
+        'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU1NzcwMjIxODI2MzQ0OTYxMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzQyMjgwNDU1LCJDbGllbnRJUCI6IjIxOS4xMzYuMTMwLjEwNyIsIkJ1ZmZlclRpbWUiOjAsImV4cCI6MTc0MjM2Njg1NSwiaXNzIjoicW1fbmV3X21lZGlhX2Z4IiwibmJmIjoxNzQyMjgwNDU1LCJFbnYiOiJyZWxlYXNlIiwiSXNTaW11bGF0aW9uTG9naW4iOmZhbHNlfQ.nUn5QkVnC-oQ6qwjc8Bh5jRTsTKqwzPS5cphBIiaBvU',
+        'project': 'reader_free_dyminiapp',
+        'signature': '27f1c6bd848f65d15f3454b05872b789b1b8357f16ea2d2aead044780d371e11',
+        'target-id': '558102575356793781'
+    };
+
+    headers['authorization'] = await tools.getQMMFToken()
+    try {
+        const response = await fetch(`${url}?${params}`, {
+            method: 'GET',
+            headers: headers
+        });
+
+        const data = await response.json();
+
+        if(data.code!=200){
+            throw data
+        }
+        // console.log('响应状态:', response.status);
+        // console.log('响应数据:', data.data.list[0]);
+        if(data.data.list.length<=0){
+            return null
+        }
+        let book_info = data.data.list[0]
+        console.error("data:",data.data.list[0])
+        let info = {}
+        info.words =  0
+        info.book_name =  book_info.book_name
+        info.book_id =  book_info.book_id
+        info.genre = 999;
+        if(book_info.book_type==2){  //七猫只有长或者短
+            info.genre = 3;
+        }else{
+            info.genre = 1;
+        }
+        return info;
+    } catch (error) {
+        return null
+    }
+}
+
+// Node.js 18及以上版本可以直接运行
+// Node.js 18以下版本需要先安装 node-fetch:
+// npm install node-fetch@2
+
+module.exports = CMD;

+ 23 - 17
tg_factory_main.js

@@ -35,10 +35,10 @@ let isInit = false
 if(config.isDebug){
     redis_help.connect( async (results)=>{
         if(results){
-            if(isInit){
-                return
-            }
-            isInit = true
+            // if(isInit){
+            //     return
+            // }
+            // isInit = true
             // let yw_login = await require('./src/api/yw/yw_login').get_captcha()
             // let zh_book_data = await require('./src/api/zh/zh_search_book').search_id("1864355654438887424")
             // console.log("zh_book_data:",zh_book_data)
@@ -48,27 +48,32 @@ if(config.isDebug){
 
             // await require('./src/api/yw/getActiveInfo').getActiveInfo()
 
-            // let MainConfig = await redis_help.getKeyValue("MainConfig")
-            // MainConfig = JSON.parse(MainConfig)
-            // let PlatformConfig = await redis_help.getKeyValue("PlatformConfig")
-            // PlatformConfig = JSON.parse(PlatformConfig)
+            let MainConfig = await redis_help.getKeyValue("MainConfig")
+            MainConfig = JSON.parse(MainConfig)
+            let PlatformConfig = await redis_help.getKeyValue("PlatformConfig")
+            PlatformConfig = JSON.parse(PlatformConfig)
 
-            // let PlatformInfo =  getPlatformInfoByI(PlatformConfig,config.platform_yuewen)
+            let PlatformInfo =  getPlatformInfoByI(PlatformConfig,13)
 
-            // let main_info = getMainInfoById(MainConfig,178) //180
+            let main_info = getMainInfoById(MainConfig,119) //180
 
-            // let data = {
-            //     product_id:"27524924504527406",
-            //     product_name:"为爱冲锋的勇士"
-            // }
-            // // console.log("PlatformInfo:",PlatformInfo)
-            // // console.log("main_info:",main_info)
+            let data = {
+                product_id:"422500",
+                product_name:"花花花花花花花"
+            }
+            console.log("PlatformInfo:",PlatformInfo)
+            console.log("main_info:",main_info)
             // await require("./5_CREATE_LINK_FACTORY/yw_create_link").runTask(data,main_info,PlatformInfo,()=>{
 
             // })
 
 
-            
+            //    await  require('./5_CREATE_LINK_FACTORY/qm_new_create_link').runTask(data,main_info,PlatformInfo,()=>{
+
+            //     })
+
+
+
             // let {promotion_name} = await require("./5_CREATE_LINK_FACTORY/qm_create_link").runTask(data,main_info,PlatformInfo,()=>{
 
             // })
@@ -96,6 +101,7 @@ 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`;
 

+ 4 - 0
tools.js

@@ -118,6 +118,10 @@ class tools {
         return await this.redis_help.getKeyValue("qi_mao_token")
     }
 
+    async getQMMFToken (){
+        return await this.redis_help.getKeyValue("qi_mao_mf_token")
+    }
+
     getSupdate(){ //插入素材域名
         return config.isDebug?config.debug_supdate_config:config.release_supdate_config
     }