904118851 7 luni în urmă
părinte
comite
6add2c62a8

+ 18 - 6
0_RECEIVE_FACTORY/RECEIVE_FACTORY.js

@@ -246,15 +246,15 @@ CMD.get_dz_recharge_template = async function(channelId,res) {
     })
 }
 
-CMD.get_qm_callback_template = async function(res,mini_program_platform_id) {
-   let data = await require('../src/api/qm/get_qm_call_back_template').get_callback_template(mini_program_platform_id)
+CMD.get_qm_callback_template = async function(res,mini_program_platform_id,qm_id) {
+   let data = await require('../src/api/qm/get_qm_call_back_template').get_callback_template(mini_program_platform_id,qm_id)
    console.log('get_qm_callback_template:', data);
    res.writeHead(200, {'Content-Type': 'application/json'});
    res.end(JSON.stringify({ message:"成功!",data:data,code:10000}));
 }
 
-CMD.get_qm_recharge_template = async function(res,category,mini_program_platform_id) {
-    let data = await require('../src/api/qm/get_qm_recharge_template').get_recharge_template(category,mini_program_platform_id)
+CMD.get_qm_recharge_template = async function(res,category,mini_program_platform_id,qm_id) {
+    let data = await require('../src/api/qm/get_qm_recharge_template').get_recharge_template(category,mini_program_platform_id,qm_id)
     console.log('get_qm_recharge_template:', data);
     res.writeHead(200, {'Content-Type': 'application/json'});
     res.end(JSON.stringify({ message:"成功!",data:data,code:10000}));
@@ -262,6 +262,13 @@ CMD.get_qm_recharge_template = async function(res,category,mini_program_platform
 
 
 
+CMD.get_yw_recharge_template = async function(res,yw_id) {
+    let data = await require('../src/api/yw/get_yw_recharge_template').get_recharge_template(yw_id)
+    console.log('get_yw_recharge_template:', 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', '*'); // 允许所有域的请求,注意:在生产环境中应该限制为特定的域
@@ -338,14 +345,19 @@ var server = http.createServer(function(req,res){
                         CMD.get_dz_recharge_template(channelId,res) 
                     }else if(jsonData['fun']=="get_qm_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_recharge_template(res,category,mini_program_platform_id) 
+                        CMD.get_qm_recharge_template(res,category,mini_program_platform_id,qm_id) 
                     }else if(jsonData['fun']=="get_qm_callback_template"&&jsonData['cmd']=="qm_link"){
                         let mini_program_platform_id = jsonData['data']['mini_program_platform_id']
-                        CMD.get_qm_callback_template(res,mini_program_platform_id) 
+                        let qm_id = jsonData['data']['qm_id']
+                        CMD.get_qm_callback_template(res,mini_program_platform_id,qm_id) 
                     }else if(jsonData['fun']=="get_fq_callback_template"&&jsonData['cmd']=="fq_link"){
                         let distributor_id = jsonData['data']['distributor_id']
                         CMD.get_fq_callback_template(res,distributor_id) 
+                    }else if(jsonData['fun']=="get_yw_recharge_template"&&jsonData['cmd']=="yw_link"){
+                        let yw_id = jsonData['data']['yw_id']
+                        CMD.get_yw_recharge_template(res,yw_id) 
                     } else{
                         res.writeHead(200, {'Content-Type': 'application/json'});
                         res.end(JSON.stringify({ message: 'fun 错误',code:100}));

+ 5 - 16
2_PRODUCT_FACTORY/fq_mf_factory.js

@@ -32,6 +32,9 @@ async function processTask(){
             if(tg_platform_id==config.platform_fanqiemf){ //番茄
                 //获取番茄书库的书
                 let fq_book_result = await get_fq_mf_book_tab_controllers.getData({ book_id: result.data.book_id });
+                if(!fq_book_result.success){
+                    fq_book_result = await get_fq_mf_book_tab_controllers.getDataByBookId({ book_id: result.data.book_id });
+                }
                 if(fq_book_result.success){//如果番茄书库里有这本书
     
                     result.data.genre = fq_book_result.data.info.genre
@@ -43,10 +46,7 @@ async function processTask(){
                     //如果商品库没有这个商品
                     if(!product_result.success){ //如果只是 get_fq_book 有, 书库里没有
                         fq_book_result.data.tg_platform_id = result.data.tg_platform_id
-                        //如果是长篇短篇符合
-                        if(CMD.isGenre(FilterConfig,result.data.genre)){
-                            await CMD.insert_product(result.data)
-                        }
+                        await CMD.insert_product(result.data)
                     }
                 }else{
                     isInsertTask = true
@@ -190,18 +190,7 @@ CMD.getMainInfoByAppid = function(MainConfig,app_id){
     }
     return list
 }
-CMD.isGenre = function(FilterConfig,genre){
-    let is_need  = false
-    //判断长篇短篇是否是要的数据
-    for (let index = 0; index < FilterConfig.genre.length; index++) {
-        const element = FilterConfig.genre[index];
-        if(genre==element){
-            is_need = true
-            break
-        }
-    }
-    return is_need
-}
+
 
 CMD.update_filter_data = async function(FilterConfig,data) {
 

+ 323 - 0
2_PRODUCT_FACTORY/yw_batch_factory.js

@@ -0,0 +1,323 @@
+const CMD = {}
+const video_product_controllers = require('../src/data_manager/Controllers/video_product_controllers');
+const filter_data_controllers = require('../src/data_manager/Controllers/filter_data_controllers');
+const get_fq_book_tab_controllers = require('../src/data_manager/Controllers/get_fq_book_tab_controllers');
+const video_applet_product_controllers = require('../src/data_manager/Controllers/video_applet_product_controllers');
+const other_book_controllers = require('../src/data_manager/Controllers/other_book_controllers');
+const redis_help = require('../src/use_redis');
+const axios = require('axios');
+const config = require('../etc/config.json');
+const HttpClient = require('../src/HttpClient');
+const helper = require('../src/helper');
+const tools = require('../tools');
+const time_count = 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_yuewen },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_qimao){ //七猫
+                    let yw_book_data = await require('../src/api/yw/yw_search_book').search_id(result.data.book_id)
+                    if(yw_book_data==null){
+                        result.data.genre = 999
+                    }else{
+                        yw_book_data.tg_platform_id = result.data.tg_platform_id
+                        if(CMD.isGenre(FilterConfig,yw_book_data.genre)){
+                            await CMD.insert_product(yw_book_data)
+                        }
+                        result.data.words = yw_book_data.words
+                        result.data.genre = yw_book_data.genre
+                        result.data.book_id = yw_book_data.book_id
+                        result.data.book_name = yw_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
+        }
+    }
+    return is_need
+}
+
+CMD.getPlatformInfo = function(PlatformConfig,tg_platform_id){
+    for (let index = 0; index < PlatformConfig.length; index++) {
+        const element = PlatformConfig[index];
+        if(element.tg_platform_id==tg_platform_id){
+            return element
+        }
+    }
+}
+CMD.getSharedPlatform = function(PlatformShared,platform_shared_id){
+    for (let index = 0; index < PlatformShared.length; index++) {
+        const element = PlatformShared[index];
+        if(element.id==platform_shared_id){
+            return JSON.parse(element.info)
+        }
+    }
+}
+
+CMD.update_filter_data = async function(FilterConfig,data) {
+    let isGenre = CMD.isGenre(FilterConfig,data.genre)
+    if(isGenre){
+        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_qimao)
+
+
+        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{
+                        if(!CMD.isBlackBook(black_books,data.book_id)){
+                            //符合标准进行创建表
+                            const result = await video_applet_product_controllers.getAppletProductData({book_id:data.book_id,main_id:data.main_id})
+                            if(!result.success){
+                                //没有找到 可以创建
+                                await video_applet_product_controllers.createAppletProductData({
+                                    book_platform:config.platform_yuewen,
+                                    product_name:data.book_name,
+                                    product_id:data.book_id,
+                                    dy_small_program_start:"",
+                                    dy_small_program_start_data:"",
+                                    dy_small_applet_app_id:data.app_id,
+                                    status:0,
+                                    main_id:data.main_id,
+                                    promotion_id:"",
+                                    wait_status:0,
+                                })
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        
+        
+    }else{
+        await other_book_controllers.createData({product_id:data.book_id,product_name:data.book_name,tg_platform_id:data.tg_platform_id})
+        await filter_data_controllers.updateFilterData({id:data.id},{status:2,book_id:data.book_id,book_name:data.book_name,genre:data.genre,material_sync_status:2})
+    }
+}
+
+
+CMD.insert_product = async function(data){
+    return await video_product_controllers.createProductData({
+        book_platform:data.tg_platform_id,
+        product_name:data.book_name,
+        genre:data.genre,
+        product_id:data.book_id,
+        words:data.words
+    })
+}
+
+CMD.init()

+ 9 - 7
5_CREATE_LINK_FACTORY/qm_create_link.js

@@ -59,32 +59,34 @@ CMD.runTask = async function (data,main_info,PlatformInfo,call_back) {
     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-external-id': '4c6e8d8709c14de9a4397b6cbb978f85',
+        'app-external-id': `${app_external_id}`,
         'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
         'project': 'reader_paid_dyminiapp',
             "Content-Type": "application/json;charset=UTF-8",
         'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
-        'target-id': '544180064332673816',
+        'target-id': `${target_id}`,
         'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sajssdk_2015_new_user_new-media-fx_qimao_com=1; acw_tc=1a0c380f17341043811111513e003f4b4a7b61bafaac1abb4e5d21e565003f; 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%E7%9B%B4%E6%8E%A5%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_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%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',
-        'Referer': 'https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=4c6e8d8709c14de9a4397b6cbb978f85&accountId=544180064332673816'
+        'Referer': `https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=${app_external_id}&accountId=${target_id}`
     };
 
     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-external-id': '9a2737aabb8f11ef93f90293e6ac97a2',
+        'app-external-id': `${app_external_id}`,
         'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
         'project': 'reader_paid_wxminiapp',
         "Content-Type": "application/json;charset=UTF-8",
         'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
-        'target-id': '544180064332673816',
+        'target-id': `${target_id}`,
         'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sajssdk_2015_new_user_new-media-fx_qimao_com=1; acw_tc=1a0c380f17341043811111513e003f4b4a7b61bafaac1abb4e5d21e565003f; 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%E7%9B%B4%E6%8E%A5%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_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%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',
-        'Referer': 'https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=4c6e8d8709c14de9a4397b6cbb978f85&accountId=544180064332673816'
+        'Referer': `https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_wxminiapp&appId=${app_external_id}&accountId=${target_id}`
     };
 
     let headers = ""

+ 117 - 0
5_CREATE_LINK_FACTORY/yw_create_link.js

@@ -0,0 +1,117 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const helper = require('../src/helper');
+const config = require('../etc/config.json');
+const redis_help = require('../src/use_redis');
+const CMD = {}
+CMD.get_promotion_id_by_name = async function(name,yw_id) {
+    try {
+        await require('../src/api/yw/switchApp').switchApp(yw_id)
+        const response =  await fetch(`https://open.yuewen.com/api/miniappspread/getPromotionList?recycle=0&startdate=&enddate=&name=${name}&id=&content_type=0&page=1&channeltype=1&pagename=`, {
+            "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",
+                "priority": "u=1, i",
+                "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+                "sec-ch-ua-mobile": "?0",
+                "sec-ch-ua-platform": "\"Windows\"",
+                "sec-fetch-dest": "empty",
+                "sec-fetch-mode": "cors",
+                "sec-fetch-site": "same-origin",
+                "cookie": "Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; OPENSESSID=bb27eaeca83cc7d957c47178eb9e6643; yw_open_token=6784835e6c51a; is_read_notice=6784835e6c51a; sidebarStatus=1",
+                "Referer": "https://open.yuewen.com/new/library",
+                "Referrer-Policy": "strict-origin-when-cross-origin"
+            },
+            "body": null,
+            "method": "GET"
+        });
+
+        const data = await response.json();
+
+        if(data.code!=0){
+            throw data
+        }
+        
+        console.log('响应状态:', response.status);
+        console.log('响应数据:', data);
+        return data.data.list[0];
+    } catch (error) {
+        console.error('请求错误:', error);
+        return null
+    }
+}
+CMD.runTask = async function(t_data,main_info,PlatformInfo,call_back){
+    try{
+        await require('../src/api/yw/switchApp').switchApp(main_info.yw_id)
+        let timestamp = helper.getCurrentUnixTimestamp()
+        let tg_link_config = JSON.parse(main_info.tg_link_config)
+        let chongzhi_id = tg_link_config['chongzhi_id']
+        let chongzhi_list = JSON.parse(PlatformInfo.chongzhi)
+        let channel_charge_setting = ""
+ 
+        for (let index = 0; index < chongzhi_list.length; index++) {
+            const cz_obj = chongzhi_list[index];
+            if(cz_obj.id==chongzhi_id){
+                channel_charge_setting = cz_obj.value
+              break
+            }
+        }
+
+        let chapter_info = await require('../src/api/yw/get_book_tg_chapter_id').get_book_tg_chapter_id(t_data.product_id)
+        if(chapter_info==null){
+            throw {"error_info":"get_book_tg_chapter_id error!"}
+        }
+        let promotion_name = `${t_data.product_name}_${timestamp}`
+        let postData = {
+            cost:"0",
+            name:promotion_name,
+            cbid:t_data.product_id,
+            ccid:chapter_info.cbid,
+            page_name:`《${t_data.product_name}》第1章`,
+            channel_charge_setting:channel_charge_setting,
+            backup_book_status:"2",
+            channel_type:"1",
+            force_style:"1"
+        }
+        let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+        const response =   await fetch(`https://open.yuewen.com/api/miniappspread/addH5Spread`, {
+            "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",
+                "priority": "u=1, i",
+                "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+                "sec-ch-ua-mobile": "?0",
+                "sec-ch-ua-platform": "\"Windows\"",
+                "sec-fetch-dest": "empty",
+                "sec-fetch-mode": "cors",
+                "sec-fetch-site": "same-origin",
+                "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; OPENSESSID=${OPENSESSID}; yw_open_token=6784835e6c51a; is_read_notice=6784835e6c51a; sidebarStatus=0`,
+                "Referer": "https://open.yuewen.com/new/library",
+                "Referrer-Policy": "strict-origin-when-cross-origin"
+            },
+                "body": postData,
+                "method": "POST"
+            });
+    
+            const data = await response.json();
+    
+            if(data.code!=0){
+                throw null
+            }
+            let promotion_info = await CMD.get_promotion_id_by_name(promotion_name,main_info.yw_id)
+            let t_params = promotion_info.path.split('?')
+            let start_page = t_params[0]
+            let start_param = t_params[1]
+            t_data.promotion_id = promotion_info.id
+            t_data.start_page = start_page
+            t_data.start_param = start_param
+            console.log('响应状态:', response.status);
+            console.log('响应数据:', data);
+            call_back(t_data,null)
+
+    }catch(error){
+        console.error('请求错误:', error);
+        call_back(t_data,error)
+        return null;
+    }
+}
+module.exports = CMD;

+ 189 - 0
5_CREATE_LINK_FACTORY/yw_create_link_factory.js

@@ -0,0 +1,189 @@
+const CMD = {}
+const time_count = 2000;
+const redis_help = require('../src/use_redis');
+const video_applet_product_controllers = require('../src/data_manager/Controllers/video_applet_product_controllers');
+var yw_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_yuewen_info = CMD.getPlatformInfo(PlatformConfig,config.platform_yuewen)
+
+        let all_platform_list = CMD.getSharedPlatform(PlatformShared,platform_yuewen_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:"当前书在黑名单"})
+                })
+                throw "当前书在黑名单"
+            }
+            let main_info = CMD.getMainInfoById(MainConfig,result.data.main_id)
+
+            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 "平台配置错误:"
+            }
+  
+
+            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 "主体配置错误:"
+            }
+
+
+            qm_create_link_task_list.push({
+                n_data:result.data,
+                main_info:main_info,
+                PlatformInfo:PlatformInfo
+            })
+        }
+
+        console.log("yw_create_link_task_list:",yw_create_link_task_list)
+
+        if(yw_create_link_task_list.length>0){
+            let yw_create_link_task = yw_create_link_task_list.pop()
+            require('./yw_create_link').runTask(yw_create_link_task.n_data
+                ,yw_create_link_task.main_info,
+                yw_create_link_task.PlatformInfo,finish_call_back)
+        }
+    }catch(e){
+        console.log("qm_create_link_factory error:",e)
+        finish_call_back(null,{"MESSAGE":"qm_create_link_factory error:"})
+    } finally{
+        global.setTimeout(processTask,time_count)
+    }
+}
+CMD.init = function(){
+    redis_help.connect((results)=>{
+        if(results){
+        }
+    })
+    processTask()
+}
+
+
+
+CMD.getPlatformInfoById = function(PlatformConfig,tg_platform_id){
+    for (let index = 0; index < PlatformConfig.length; index++) {
+        const element = PlatformConfig[index];
+        if(element.tg_platform_id==tg_platform_id){
+            return element
+        }
+    }
+    return null
+}
+
+CMD.getMainInfoById = function(MainConfig,main_id){
+    // console.log("MainConfig:",MainConfig)
+    for (let index = 0; index < MainConfig.length; index++) {
+        const element = MainConfig[index];
+        if(element.id==main_id){
+            return element
+        }
+    }
+    return null
+}
+CMD.init()

+ 6 - 0
7_CHECK_AND_CREATE_URL_FACTORY/CHECK_AND_CREATE_URL_FACTORY.js

@@ -111,6 +111,12 @@ async function processTask() {
                   
                         }
 
+                    }else{
+                        let check_url = ""
+                        CMD.update_video_applet_product({promotion_id:promotion_id,
+                           product_id:product_id,check_url:check_url
+                        })
+                        await new Promise(resolve => setTimeout(resolve,100));
                     }
                 }
     

+ 5 - 1
MESSAGE_DISPATCH/MESSAGE_DISPATCH.js

@@ -19,7 +19,7 @@ CMD.updateFilterConfig = async function(){
     })
     .catch(error => {
       console.error('updateFilterConfig error!', error);
-  });
+    });
 }
 
 CMD.updateCloseMainConfig = async function(){
@@ -311,6 +311,10 @@ CMD.init = function(){
     })
     CMD.updateConfig()
     CMD.updateTimeConfig()
+
+    // setInterval(async () => {
+    //     await require('../src/api/yw/check_login').update_cookies()
+    // }, 3000*20);
 }
 
 CMD.updateTimeConfig = function(){

+ 28 - 0
MESSAGE_DISPATCH/ocr_script.py

@@ -39,6 +39,10 @@ class MyRequestHandler(BaseHTTPRequestHandler):
                 token = data.get('token')
                 create_link(name,bookId,topUpTemplateId,passBackTemplateId,paidPoint,token,self)
                 print("Command is empty.")
+            elif cmd == "chapterSpread":
+                if not all(k in data for k in ['cbid', 'OPENSESSID']):
+                    raise ValueError("Missing required parameters for chapterSpread")
+                response = chapterSpread(data)
             elif cmd == "get_fq_book":
                 key = data.get('key')
                 response = {
@@ -155,6 +159,30 @@ def getFqBook( key,post_data=None):
             'http_code': 0
         }
 
+def chapterSpread( data):
+    cookies = {
+        'Hm_lvt_990f9ab9737a266517417cc2949bb3f4': '1736394515',
+        'csrfToken': 'vN8OkvTZZfzerTHhodh7rc81',
+        'OPENSESSID': 'ada39ae2c1286d1be3bd32e300951fff',
+        'yw_open_token': '6785d8c2ec046',
+        'is_read_notice': '6785d8c2ec046',
+        'sidebarStatus': '0',
+    }
+
+    headers = {
+        'authority': 'open.yuewen.com',
+        'accept': 'application/json, text/plain, */*',
+        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36'
+    }
+
+    url = 'https://open.yuewen.com/api/wechatspread/chapterSpread'
+    params = {'cbid': data['cbid']}
+    response = requests.get(url, params=params, cookies=cookies, headers=headers)
+    print(cookies)
+    print(data['cbid'])
+    print(response.json())
+    return response.json()
+
 if __name__ == "__main__":
     import io  # 确保导入了 io 模块以处理内存中的图像
     run(port=8080)

+ 1 - 1
MESSAGE_DISPATCH/run_py.sh

@@ -1,3 +1,3 @@
 lsof -i :8080 | grep LISTEN | awk '{print $2}' | xargs sudo kill -9
 sleep 1
-nohup python3.8 ocr_script.py
+ python3.8 ocr_script.py

BIN
dump.rdb


+ 2 - 1
etc/config.json

@@ -132,5 +132,6 @@
     "platform_fanqie":2,
     "platform_qimao":3,
     "platform_dianzhong":4,
-    "platform_fanqiemf":7
+    "platform_fanqiemf":7,
+    "platform_yuewen":6
 }

+ 404 - 4
logs/combined.log

@@ -1,4 +1,404 @@
-2025-01-10T18:36:43: 
-2025-01-10T18:36:43: > heiyan@1.0.0 start
-2025-01-10T18:36:43: > node tg_factory_main.js
-2025-01-10T18:36:43: 
+2025-01-15T14:14:13: 
+2025-01-15T14:14:13: > heiyan@1.0.0 start
+2025-01-15T14:14:13: > node tg_factory_main.js
+2025-01-15T14:14:13: 
+2025-01-15T14:14:16: Connected to Redis
+2025-01-15T14:30:06: 
+2025-01-15T14:30:06: > heiyan@1.0.0 start
+2025-01-15T14:30:06: > node tg_factory_main.js
+2025-01-15T14:30:06: 
+2025-01-15T14:30:09: Connected to Redis
+2025-01-15T14:30:09: 请求错误: AxiosError: connect ECONNREFUSED 127.0.0.1:8080
+2025-01-15T14:30:09:     at AxiosError.from (/home/tg_factory/node_modules/axios/dist/node/axios.cjs:876:14)
+2025-01-15T14:30:09:     at RedirectableRequest.handleRequestError (/home/tg_factory/node_modules/axios/dist/node/axios.cjs:3156:25)
+2025-01-15T14:30:09:     at RedirectableRequest.emit (node:events:531:35)
+2025-01-15T14:30:09:     at eventHandlers.<computed> (/home/tg_factory/node_modules/follow-redirects/index.js:49:24)
+2025-01-15T14:30:09:     at ClientRequest.emit (node:events:519:28)
+2025-01-15T14:30:09:     at emitErrorEvent (node:_http_client:108:11)
+2025-01-15T14:30:09:     at Socket.socketErrorListener (node:_http_client:511:5)
+2025-01-15T14:30:09:     at Socket.emit (node:events:519:28)
+2025-01-15T14:30:09:     at emitErrorNT (node:internal/streams/destroy:169:8)
+2025-01-15T14:30:09:     at emitErrorCloseNT (node:internal/streams/destroy:128:3)
+2025-01-15T14:30:09:     at Axios.request (/home/tg_factory/node_modules/axios/dist/node/axios.cjs:4287:41)
+2025-01-15T14:30:09:     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+2025-01-15T14:30:09:     at async CMD.get_book_tg_chapter_id (/home/tg_factory/src/api/yw/get_book_tg_chapter_id.js:26:26)
+2025-01-15T14:30:09:     at async /home/tg_factory/tg_factory_main.js:42:13 {
+2025-01-15T14:30:09:   port: 8080,
+2025-01-15T14:30:09:   address: '127.0.0.1',
+2025-01-15T14:30:09:   syscall: 'connect',
+2025-01-15T14:30:09:   code: 'ECONNREFUSED',
+2025-01-15T14:30:09:   errno: -111,
+2025-01-15T14:30:09:   config: {
+2025-01-15T14:30:09:     transitional: {
+2025-01-15T14:30:09:       silentJSONParsing: true,
+2025-01-15T14:30:09:       forcedJSONParsing: true,
+2025-01-15T14:30:09:       clarifyTimeoutError: false
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     adapter: [ 'xhr', 'http', 'fetch' ],
+2025-01-15T14:30:09:     transformRequest: [ [Function: transformRequest] ],
+2025-01-15T14:30:09:     transformResponse: [ [Function: transformResponse] ],
+2025-01-15T14:30:09:     timeout: 30000,
+2025-01-15T14:30:09:     xsrfCookieName: 'XSRF-TOKEN',
+2025-01-15T14:30:09:     xsrfHeaderName: 'X-XSRF-TOKEN',
+2025-01-15T14:30:09:     maxContentLength: -1,
+2025-01-15T14:30:09:     maxBodyLength: -1,
+2025-01-15T14:30:09:     env: { FormData: [Function], Blob: [class Blob] },
+2025-01-15T14:30:09:     validateStatus: [Function: validateStatus],
+2025-01-15T14:30:09:     headers: Object [AxiosHeaders] {
+2025-01-15T14:30:09:       Accept: 'application/json, text/plain, */*',
+2025-01-15T14:30:09:       'Content-Type': 'application/json',
+2025-01-15T14:30:09:       'User-Agent': 'axios/1.7.7',
+2025-01-15T14:30:09:       'Content-Length': '98',
+2025-01-15T14:30:09:       'Accept-Encoding': 'gzip, compress, deflate, br'
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     httpAgent: Agent {
+2025-01-15T14:30:09:       _events: [Object: null prototype],
+2025-01-15T14:30:09:       _eventsCount: 2,
+2025-01-15T14:30:09:       _maxListeners: undefined,
+2025-01-15T14:30:09:       defaultPort: 80,
+2025-01-15T14:30:09:       protocol: 'http:',
+2025-01-15T14:30:09:       options: [Object: null prototype],
+2025-01-15T14:30:09:       requests: [Object: null prototype] {},
+2025-01-15T14:30:09:       sockets: [Object: null prototype],
+2025-01-15T14:30:09:       freeSockets: [Object: null prototype] {},
+2025-01-15T14:30:09:       keepAliveMsecs: 1000,
+2025-01-15T14:30:09:       keepAlive: true,
+2025-01-15T14:30:09:       maxSockets: 5,
+2025-01-15T14:30:09:       maxFreeSockets: 2,
+2025-01-15T14:30:09:       scheduling: 'lifo',
+2025-01-15T14:30:09:       maxTotalSockets: Infinity,
+2025-01-15T14:30:09:       totalSocketCount: 1,
+2025-01-15T14:30:09:       [Symbol(shapeMode)]: false,
+2025-01-15T14:30:09:       [Symbol(kCapture)]: false
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     method: 'post',
+2025-01-15T14:30:09:     url: 'http://127.0.0.1:8080',
+2025-01-15T14:30:09:     data: '{"cmd":"chapterSpread","cbid":"20879682908817006","OPENSESSID":"ada39ae2c1286d1be3bd32e300951fff"}'
+2025-01-15T14:30:09:   },
+2025-01-15T14:30:09:   request: <ref *1> Writable {
+2025-01-15T14:30:09:     _events: {
+2025-01-15T14:30:09:       close: undefined,
+2025-01-15T14:30:09:       error: [Function: handleRequestError],
+2025-01-15T14:30:09:       prefinish: undefined,
+2025-01-15T14:30:09:       finish: undefined,
+2025-01-15T14:30:09:       drain: undefined,
+2025-01-15T14:30:09:       response: [Function: handleResponse],
+2025-01-15T14:30:09:       socket: [Array],
+2025-01-15T14:30:09:       timeout: undefined,
+2025-01-15T14:30:09:       abort: undefined
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     _writableState: WritableState {
+2025-01-15T14:30:09:       highWaterMark: 16384,
+2025-01-15T14:30:09:       length: 0,
+2025-01-15T14:30:09:       corked: 0,
+2025-01-15T14:30:09:       onwrite: [Function: bound onwrite],
+2025-01-15T14:30:09:       writelen: 0,
+2025-01-15T14:30:09:       bufferedIndex: 0,
+2025-01-15T14:30:09:       pendingcb: 0,
+2025-01-15T14:30:09:       [Symbol(kState)]: 17580812,
+2025-01-15T14:30:09:       [Symbol(kBufferedValue)]: null
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     _maxListeners: undefined,
+2025-01-15T14:30:09:     _options: {
+2025-01-15T14:30:09:       maxRedirects: 21,
+2025-01-15T14:30:09:       maxBodyLength: Infinity,
+2025-01-15T14:30:09:       protocol: 'http:',
+2025-01-15T14:30:09:       path: '/',
+2025-01-15T14:30:09:       method: 'POST',
+2025-01-15T14:30:09:       headers: [Object: null prototype],
+2025-01-15T14:30:09:       agents: [Object],
+2025-01-15T14:30:09:       auth: undefined,
+2025-01-15T14:30:09:       family: undefined,
+2025-01-15T14:30:09:       beforeRedirect: [Function: dispatchBeforeRedirect],
+2025-01-15T14:30:09:       beforeRedirects: [Object],
+2025-01-15T14:30:09:       hostname: '127.0.0.1',
+2025-01-15T14:30:09:       port: '8080',
+2025-01-15T14:30:09:       agent: [Agent],
+2025-01-15T14:30:09:       nativeProtocols: [Object],
+2025-01-15T14:30:09:       pathname: '/'
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     _ended: false,
+2025-01-15T14:30:09:     _ending: true,
+2025-01-15T14:30:09:     _redirectCount: 0,
+2025-01-15T14:30:09:     _redirects: [],
+2025-01-15T14:30:09:     _requestBodyLength: 98,
+2025-01-15T14:30:09:     _requestBodyBuffers: [ [Object] ],
+2025-01-15T14:30:09:     _eventsCount: 3,
+2025-01-15T14:30:09:     _onNativeResponse: [Function (anonymous)],
+2025-01-15T14:30:09:     _currentRequest: ClientRequest {
+2025-01-15T14:30:09:       _events: [Object: null prototype],
+2025-01-15T14:30:09:       _eventsCount: 7,
+2025-01-15T14:30:09:       _maxListeners: undefined,
+2025-01-15T14:30:09:       outputData: [],
+2025-01-15T14:30:09:       outputSize: 0,
+2025-01-15T14:30:09:       writable: true,
+2025-01-15T14:30:09:       destroyed: false,
+2025-01-15T14:30:09:       _last: false,
+2025-01-15T14:30:09:       chunkedEncoding: false,
+2025-01-15T14:30:09:       shouldKeepAlive: true,
+2025-01-15T14:30:09:       maxRequestsOnConnectionReached: false,
+2025-01-15T14:30:09:       _defaultKeepAlive: true,
+2025-01-15T14:30:09:       useChunkedEncodingByDefault: true,
+2025-01-15T14:30:09:       sendDate: false,
+2025-01-15T14:30:09:       _removedConnection: false,
+2025-01-15T14:30:09:       _removedContLen: false,
+2025-01-15T14:30:09:       _removedTE: false,
+2025-01-15T14:30:09:       strictContentLength: false,
+2025-01-15T14:30:09:       _contentLength: '98',
+2025-01-15T14:30:09:       _hasBody: true,
+2025-01-15T14:30:09:       _trailer: '',
+2025-01-15T14:30:09:       finished: false,
+2025-01-15T14:30:09:       _headerSent: true,
+2025-01-15T14:30:09:       _closed: false,
+2025-01-15T14:30:09:       socket: [Socket],
+2025-01-15T14:30:09:       _header: 'POST / HTTP/1.1\r\n' +
+2025-01-15T14:30:09:         'Accept: application/json, text/plain, */*\r\n' +
+2025-01-15T14:30:09:         'Content-Type: application/json\r\n' +
+2025-01-15T14:30:09:         'User-Agent: axios/1.7.7\r\n' +
+2025-01-15T14:30:09:         'Content-Length: 98\r\n' +
+2025-01-15T14:30:09:         'Accept-Encoding: gzip, compress, deflate, br\r\n' +
+2025-01-15T14:30:09:         'Host: 127.0.0.1:8080\r\n' +
+2025-01-15T14:30:09:         'Connection: keep-alive\r\n' +
+2025-01-15T14:30:09:         '\r\n',
+2025-01-15T14:30:09:       _keepAliveTimeout: 0,
+2025-01-15T14:30:09:       _onPendingData: [Function: nop],
+2025-01-15T14:30:09:       agent: [Agent],
+2025-01-15T14:30:09:       socketPath: undefined,
+2025-01-15T14:30:09:       method: 'POST',
+2025-01-15T14:30:09:       maxHeaderSize: undefined,
+2025-01-15T14:30:09:       insecureHTTPParser: undefined,
+2025-01-15T14:30:09:       joinDuplicateHeaders: undefined,
+2025-01-15T14:30:09:       path: '/',
+2025-01-15T14:30:09:       _ended: false,
+2025-01-15T14:30:09:       res: null,
+2025-01-15T14:30:09:       aborted: false,
+2025-01-15T14:30:09:       timeoutCb: [Function: emitRequestTimeout],
+2025-01-15T14:30:09:       upgradeOrConnect: false,
+2025-01-15T14:30:09:       parser: null,
+2025-01-15T14:30:09:       maxHeadersCount: null,
+2025-01-15T14:30:09:       reusedSocket: false,
+2025-01-15T14:30:09:       host: '127.0.0.1',
+2025-01-15T14:30:09:       protocol: 'http:',
+2025-01-15T14:30:09:       _redirectable: [Circular *1],
+2025-01-15T14:30:09:       [Symbol(shapeMode)]: false,
+2025-01-15T14:30:09:       [Symbol(kCapture)]: false,
+2025-01-15T14:30:09:       [Symbol(kBytesWritten)]: 0,
+2025-01-15T14:30:09:       [Symbol(kNeedDrain)]: false,
+2025-01-15T14:30:09:       [Symbol(corked)]: 0,
+2025-01-15T14:30:09:       [Symbol(kOutHeaders)]: [Object: null prototype],
+2025-01-15T14:30:09:       [Symbol(errored)]: null,
+2025-01-15T14:30:09:       [Symbol(kHighWaterMark)]: 16384,
+2025-01-15T14:30:09:       [Symbol(kRejectNonStandardBodyWrites)]: false,
+2025-01-15T14:30:09:       [Symbol(kUniqueHeaders)]: null
+2025-01-15T14:30:09:     },
+2025-01-15T14:30:09:     _currentUrl: 'http://127.0.0.1:8080/',
+2025-01-15T14:30:09:     _timeout: null,
+2025-01-15T14:30:09:     [Symbol(shapeMode)]: true,
+2025-01-15T14:30:09:     [Symbol(kCapture)]: false
+2025-01-15T14:30:09:   },
+2025-01-15T14:30:09:   cause: Error: connect ECONNREFUSED 127.0.0.1:8080
+2025-01-15T14:30:09:       at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1607:16) {
+2025-01-15T14:30:09:     errno: -111,
+2025-01-15T14:30:09:     code: 'ECONNREFUSED',
+2025-01-15T14:30:09:     syscall: 'connect',
+2025-01-15T14:30:09:     address: '127.0.0.1',
+2025-01-15T14:30:09:     port: 8080
+2025-01-15T14:30:09:   }
+2025-01-15T14:30:09: }
+2025-01-15T14:32:20: 
+2025-01-15T14:32:20: > heiyan@1.0.0 start
+2025-01-15T14:32:20: > node tg_factory_main.js
+2025-01-15T14:32:20: 
+2025-01-15T14:32:21: Connected to Redis
+2025-01-15T14:32:21: 请求错误: AxiosError: socket hang up
+2025-01-15T14:32:21:     at AxiosError.from (/home/tg_factory/node_modules/axios/dist/node/axios.cjs:876:14)
+2025-01-15T14:32:21:     at RedirectableRequest.handleRequestError (/home/tg_factory/node_modules/axios/dist/node/axios.cjs:3156:25)
+2025-01-15T14:32:21:     at RedirectableRequest.emit (node:events:531:35)
+2025-01-15T14:32:21:     at eventHandlers.<computed> (/home/tg_factory/node_modules/follow-redirects/index.js:49:24)
+2025-01-15T14:32:21:     at ClientRequest.emit (node:events:519:28)
+2025-01-15T14:32:21:     at emitErrorEvent (node:_http_client:108:11)
+2025-01-15T14:32:21:     at Socket.socketOnEnd (node:_http_client:535:5)
+2025-01-15T14:32:21:     at Socket.emit (node:events:531:35)
+2025-01-15T14:32:21:     at endReadableNT (node:internal/streams/readable:1696:12)
+2025-01-15T14:32:21:     at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
+2025-01-15T14:32:21:     at Axios.request (/home/tg_factory/node_modules/axios/dist/node/axios.cjs:4287:41)
+2025-01-15T14:32:21:     at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
+2025-01-15T14:32:21:     at async CMD.get_book_tg_chapter_id (/home/tg_factory/src/api/yw/get_book_tg_chapter_id.js:26:26)
+2025-01-15T14:32:21:     at async /home/tg_factory/tg_factory_main.js:42:13 {
+2025-01-15T14:32:21:   code: 'ECONNRESET',
+2025-01-15T14:32:21:   config: {
+2025-01-15T14:32:21:     transitional: {
+2025-01-15T14:32:21:       silentJSONParsing: true,
+2025-01-15T14:32:21:       forcedJSONParsing: true,
+2025-01-15T14:32:21:       clarifyTimeoutError: false
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     adapter: [ 'xhr', 'http', 'fetch' ],
+2025-01-15T14:32:21:     transformRequest: [ [Function: transformRequest] ],
+2025-01-15T14:32:21:     transformResponse: [ [Function: transformResponse] ],
+2025-01-15T14:32:21:     timeout: 30000,
+2025-01-15T14:32:21:     xsrfCookieName: 'XSRF-TOKEN',
+2025-01-15T14:32:21:     xsrfHeaderName: 'X-XSRF-TOKEN',
+2025-01-15T14:32:21:     maxContentLength: -1,
+2025-01-15T14:32:21:     maxBodyLength: -1,
+2025-01-15T14:32:21:     env: { FormData: [Function], Blob: [class Blob] },
+2025-01-15T14:32:21:     validateStatus: [Function: validateStatus],
+2025-01-15T14:32:21:     headers: Object [AxiosHeaders] {
+2025-01-15T14:32:21:       Accept: 'application/json, text/plain, */*',
+2025-01-15T14:32:21:       'Content-Type': 'application/json',
+2025-01-15T14:32:21:       'User-Agent': 'axios/1.7.7',
+2025-01-15T14:32:21:       'Content-Length': '98',
+2025-01-15T14:32:21:       'Accept-Encoding': 'gzip, compress, deflate, br'
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     httpAgent: Agent {
+2025-01-15T14:32:21:       _events: [Object: null prototype],
+2025-01-15T14:32:21:       _eventsCount: 2,
+2025-01-15T14:32:21:       _maxListeners: undefined,
+2025-01-15T14:32:21:       defaultPort: 80,
+2025-01-15T14:32:21:       protocol: 'http:',
+2025-01-15T14:32:21:       options: [Object: null prototype],
+2025-01-15T14:32:21:       requests: [Object: null prototype] {},
+2025-01-15T14:32:21:       sockets: [Object: null prototype],
+2025-01-15T14:32:21:       freeSockets: [Object: null prototype] {},
+2025-01-15T14:32:21:       keepAliveMsecs: 1000,
+2025-01-15T14:32:21:       keepAlive: true,
+2025-01-15T14:32:21:       maxSockets: 5,
+2025-01-15T14:32:21:       maxFreeSockets: 2,
+2025-01-15T14:32:21:       scheduling: 'lifo',
+2025-01-15T14:32:21:       maxTotalSockets: Infinity,
+2025-01-15T14:32:21:       totalSocketCount: 1,
+2025-01-15T14:32:21:       [Symbol(shapeMode)]: false,
+2025-01-15T14:32:21:       [Symbol(kCapture)]: false
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     method: 'post',
+2025-01-15T14:32:21:     url: 'http://127.0.0.1:8080',
+2025-01-15T14:32:21:     data: '{"cmd":"chapterSpread","cbid":"20879682908817006","OPENSESSID":"ada39ae2c1286d1be3bd32e300951fff"}'
+2025-01-15T14:32:21:   },
+2025-01-15T14:32:21:   request: <ref *1> Writable {
+2025-01-15T14:32:21:     _events: {
+2025-01-15T14:32:21:       close: undefined,
+2025-01-15T14:32:21:       error: [Function: handleRequestError],
+2025-01-15T14:32:21:       prefinish: undefined,
+2025-01-15T14:32:21:       finish: undefined,
+2025-01-15T14:32:21:       drain: undefined,
+2025-01-15T14:32:21:       response: [Function: handleResponse],
+2025-01-15T14:32:21:       socket: [Array],
+2025-01-15T14:32:21:       timeout: undefined,
+2025-01-15T14:32:21:       abort: undefined
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     _writableState: WritableState {
+2025-01-15T14:32:21:       highWaterMark: 16384,
+2025-01-15T14:32:21:       length: 0,
+2025-01-15T14:32:21:       corked: 0,
+2025-01-15T14:32:21:       onwrite: [Function: bound onwrite],
+2025-01-15T14:32:21:       writelen: 0,
+2025-01-15T14:32:21:       bufferedIndex: 0,
+2025-01-15T14:32:21:       pendingcb: 0,
+2025-01-15T14:32:21:       [Symbol(kState)]: 17580812,
+2025-01-15T14:32:21:       [Symbol(kBufferedValue)]: null
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     _maxListeners: undefined,
+2025-01-15T14:32:21:     _options: {
+2025-01-15T14:32:21:       maxRedirects: 21,
+2025-01-15T14:32:21:       maxBodyLength: Infinity,
+2025-01-15T14:32:21:       protocol: 'http:',
+2025-01-15T14:32:21:       path: '/',
+2025-01-15T14:32:21:       method: 'POST',
+2025-01-15T14:32:21:       headers: [Object: null prototype],
+2025-01-15T14:32:21:       agents: [Object],
+2025-01-15T14:32:21:       auth: undefined,
+2025-01-15T14:32:21:       family: undefined,
+2025-01-15T14:32:21:       beforeRedirect: [Function: dispatchBeforeRedirect],
+2025-01-15T14:32:21:       beforeRedirects: [Object],
+2025-01-15T14:32:21:       hostname: '127.0.0.1',
+2025-01-15T14:32:21:       port: '8080',
+2025-01-15T14:32:21:       agent: [Agent],
+2025-01-15T14:32:21:       nativeProtocols: [Object],
+2025-01-15T14:32:21:       pathname: '/'
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     _ended: true,
+2025-01-15T14:32:21:     _ending: true,
+2025-01-15T14:32:21:     _redirectCount: 0,
+2025-01-15T14:32:21:     _redirects: [],
+2025-01-15T14:32:21:     _requestBodyLength: 98,
+2025-01-15T14:32:21:     _requestBodyBuffers: [ [Object] ],
+2025-01-15T14:32:21:     _eventsCount: 3,
+2025-01-15T14:32:21:     _onNativeResponse: [Function (anonymous)],
+2025-01-15T14:32:21:     _currentRequest: ClientRequest {
+2025-01-15T14:32:21:       _events: [Object: null prototype],
+2025-01-15T14:32:21:       _eventsCount: 7,
+2025-01-15T14:32:21:       _maxListeners: undefined,
+2025-01-15T14:32:21:       outputData: [],
+2025-01-15T14:32:21:       outputSize: 0,
+2025-01-15T14:32:21:       writable: true,
+2025-01-15T14:32:21:       destroyed: false,
+2025-01-15T14:32:21:       _last: false,
+2025-01-15T14:32:21:       chunkedEncoding: false,
+2025-01-15T14:32:21:       shouldKeepAlive: true,
+2025-01-15T14:32:21:       maxRequestsOnConnectionReached: false,
+2025-01-15T14:32:21:       _defaultKeepAlive: true,
+2025-01-15T14:32:21:       useChunkedEncodingByDefault: true,
+2025-01-15T14:32:21:       sendDate: false,
+2025-01-15T14:32:21:       _removedConnection: false,
+2025-01-15T14:32:21:       _removedContLen: false,
+2025-01-15T14:32:21:       _removedTE: false,
+2025-01-15T14:32:21:       strictContentLength: false,
+2025-01-15T14:32:21:       _contentLength: '98',
+2025-01-15T14:32:21:       _hasBody: true,
+2025-01-15T14:32:21:       _trailer: '',
+2025-01-15T14:32:21:       finished: true,
+2025-01-15T14:32:21:       _headerSent: true,
+2025-01-15T14:32:21:       _closed: false,
+2025-01-15T14:32:21:       socket: [Socket],
+2025-01-15T14:32:21:       _header: 'POST / HTTP/1.1\r\n' +
+2025-01-15T14:32:21:         'Accept: application/json, text/plain, */*\r\n' +
+2025-01-15T14:32:21:         'Content-Type: application/json\r\n' +
+2025-01-15T14:32:21:         'User-Agent: axios/1.7.7\r\n' +
+2025-01-15T14:32:21:         'Content-Length: 98\r\n' +
+2025-01-15T14:32:21:         'Accept-Encoding: gzip, compress, deflate, br\r\n' +
+2025-01-15T14:32:21:         'Host: 127.0.0.1:8080\r\n' +
+2025-01-15T14:32:21:         'Connection: keep-alive\r\n' +
+2025-01-15T14:32:21:         '\r\n',
+2025-01-15T14:32:21:       _keepAliveTimeout: 0,
+2025-01-15T14:32:21:       _onPendingData: [Function: nop],
+2025-01-15T14:32:21:       agent: [Agent],
+2025-01-15T14:32:21:       socketPath: undefined,
+2025-01-15T14:32:21:       method: 'POST',
+2025-01-15T14:32:21:       maxHeaderSize: undefined,
+2025-01-15T14:32:21:       insecureHTTPParser: undefined,
+2025-01-15T14:32:21:       joinDuplicateHeaders: undefined,
+2025-01-15T14:32:21:       path: '/',
+2025-01-15T14:32:21:       _ended: false,
+2025-01-15T14:32:21:       res: null,
+2025-01-15T14:32:21:       aborted: false,
+2025-01-15T14:32:21:       timeoutCb: [Function: emitRequestTimeout],
+2025-01-15T14:32:21:       upgradeOrConnect: false,
+2025-01-15T14:32:21:       parser: null,
+2025-01-15T14:32:21:       maxHeadersCount: null,
+2025-01-15T14:32:21:       reusedSocket: false,
+2025-01-15T14:32:21:       host: '127.0.0.1',
+2025-01-15T14:32:21:       protocol: 'http:',
+2025-01-15T14:32:21:       _redirectable: [Circular *1],
+2025-01-15T14:32:21:       [Symbol(shapeMode)]: false,
+2025-01-15T14:32:21:       [Symbol(kCapture)]: false,
+2025-01-15T14:32:21:       [Symbol(kBytesWritten)]: 0,
+2025-01-15T14:32:21:       [Symbol(kNeedDrain)]: false,
+2025-01-15T14:32:21:       [Symbol(corked)]: 0,
+2025-01-15T14:32:21:       [Symbol(kOutHeaders)]: [Object: null prototype],
+2025-01-15T14:32:21:       [Symbol(errored)]: null,
+2025-01-15T14:32:21:       [Symbol(kHighWaterMark)]: 16384,
+2025-01-15T14:32:21:       [Symbol(kRejectNonStandardBodyWrites)]: false,
+2025-01-15T14:32:21:       [Symbol(kUniqueHeaders)]: null
+2025-01-15T14:32:21:     },
+2025-01-15T14:32:21:     _currentUrl: 'http://127.0.0.1:8080/',
+2025-01-15T14:32:21:     _timeout: null,
+2025-01-15T14:32:21:     [Symbol(shapeMode)]: true,
+2025-01-15T14:32:21:     [Symbol(kCapture)]: false
+2025-01-15T14:32:21:   },
+2025-01-15T14:32:21:   cause: Error: socket hang up
+2025-01-15T14:32:21:       at Socket.socketOnEnd (node:_http_client:535:25)
+2025-01-15T14:32:21:       at Socket.emit (node:events:531:35)
+2025-01-15T14:32:21:       at endReadableNT (node:internal/streams/readable:1696:12)
+2025-01-15T14:32:21:       at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
+2025-01-15T14:32:21:     code: 'ECONNRESET'
+2025-01-15T14:32:21:   }
+2025-01-15T14:32:21: }

+ 15 - 4
logs/out.log

@@ -1,4 +1,15 @@
-2025-01-10T18:36:43: 
-2025-01-10T18:36:43: > heiyan@1.0.0 start
-2025-01-10T18:36:43: > node tg_factory_main.js
-2025-01-10T18:36:43: 
+2025-01-15T14:14:13: 
+2025-01-15T14:14:13: > heiyan@1.0.0 start
+2025-01-15T14:14:13: > node tg_factory_main.js
+2025-01-15T14:14:13: 
+2025-01-15T14:14:16: Connected to Redis
+2025-01-15T14:30:06: 
+2025-01-15T14:30:06: > heiyan@1.0.0 start
+2025-01-15T14:30:06: > node tg_factory_main.js
+2025-01-15T14:30:06: 
+2025-01-15T14:30:09: Connected to Redis
+2025-01-15T14:32:20: 
+2025-01-15T14:32:20: > heiyan@1.0.0 start
+2025-01-15T14:32:20: > node tg_factory_main.js
+2025-01-15T14:32:20: 
+2025-01-15T14:32:21: Connected to Redis

+ 16 - 2
pm2json.json

@@ -119,8 +119,22 @@
             "args": ["--type=data"],
             "cwd": "/home/tg_factory",
             "log_date_format": "YYYY-MM-DD HH:mm:ss",
-            "error_file": "./logs/qm_factory_error.log",
-            "out_file": "./logs/qm_factory_out.log",
+            "error_file": "./logs/qm_batch_factory_error.log",
+            "out_file": "./logs/qm_batch_factory_out.log",
+            "merge_logs": true,
+            "exec_mode": "fork",
+            "autorestart": true
+        },
+        {
+            "name": "YW_FACTORY",
+            "script": "./2_PRODUCT_FACTORY/yw_batch_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/yw_batch_factory_error.log",
+            "out_file": "./logs/yw_batch_factory_out.log",
             "merge_logs": true,
             "exec_mode": "fork",
             "autorestart": true

+ 1 - 0
run_on.sh

@@ -0,0 +1 @@
+/home/node/node-v20.17.0-linux-x64/lib/node_modules/pm2/bin/pm2 start $1

BIN
src/api/hy/qr.gif


BIN
src/api/hy/qr_resized.gif


+ 10 - 8
src/api/qm/get_qm_call_back_template.js

@@ -3,7 +3,7 @@ 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) {
+CMD.get_callback_template = async function (mini_program_platform_id=config.dy,qm_id) {
     const url = 'https://new-media-fx.qimao.com/api/postback/rule/list';
     
     // 请求参数
@@ -13,30 +13,32 @@ CMD.get_callback_template = async function (mini_program_platform_id=config.dy)
         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-external-id': '4c6e8d8709c14de9a4397b6cbb978f85',
+        'app-external-id': `${app_external_id}`,
         'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
         'project': 'reader_paid_dyminiapp',
         'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
-        'target-id': '544180064332673816',
+        'target-id': `${target_id}`,
         'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sajssdk_2015_new_user_new-media-fx_qimao_com=1; acw_tc=1a0c380f17341043811111513e003f4b4a7b61bafaac1abb4e5d21e565003f; 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%E7%9B%B4%E6%8E%A5%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_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%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',
-        'Referer': 'https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=4c6e8d8709c14de9a4397b6cbb978f85&accountId=544180064332673816'
+        'Referer': `https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=${app_external_id}&accountId=${target_id}`
     };
 
     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-external-id': '9a2737aabb8f11ef93f90293e6ac97a2',
+        'app-external-id': `${app_external_id}`,
         'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
         'project': 'reader_paid_wxminiapp',
         'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
-        'target-id': '544180064332673816',
+        'target-id':  `${target_id}`,
         'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sajssdk_2015_new_user_new-media-fx_qimao_com=1; acw_tc=1a0c380f17341043811111513e003f4b4a7b61bafaac1abb4e5d21e565003f; 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%E7%9B%B4%E6%8E%A5%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_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%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',
-        'Referer': 'https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=4c6e8d8709c14de9a4397b6cbb978f85&accountId=544180064332673816'
+        'Referer':  `https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_wxminiapp&appId=${app_external_id}&accountId=${target_id}`
     };
 
     let headers = ""

+ 10 - 7
src/api/qm/get_qm_recharge_template.js

@@ -5,7 +5,7 @@ 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) {
+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/recharge-panel/list';
     // 请求参数
     const params = new URLSearchParams({
@@ -17,29 +17,32 @@ CMD.get_recharge_template = async function (category,mini_program_platform_id=co
         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': '4c6e8d8709c14de9a4397b6cbb978f85',
+        'app-external-id': `${app_external_id}`,
         'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
         'project': 'reader_paid_dyminiapp',
         'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
-        'target-id': '544180064332673816',
+        'target-id': `${target_id}`,
         'cookie': 'sensorsdata2015jssdkcross=%7B%22%24device_id%22%3A%22193bdc124645e2-0cbeaee172d4ce8-4c657b58-921600-193bdc12465567%22%7D; sajssdk_2015_new_user_new-media-fx_qimao_com=1; acw_tc=1a0c380f17341043811111513e003f4b4a7b61bafaac1abb4e5d21e565003f; 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%E7%9B%B4%E6%8E%A5%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_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_referrer%22%3A%22%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',
-        'Referer': 'https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_dyminiapp&appId=4c6e8d8709c14de9a4397b6cbb978f85&accountId=544180064332673816'
+        'Referer': `https://new-media-fx.qimao.com/backend/postback-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': '9a2737aabb8f11ef93f90293e6ac97a2',
+        'app-external-id': `${app_external_id}`,
         'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBY2NvdW50SUQiOjU0NDA1NjQxNjM3MTI4MjExMSwiQWNjb3VudE5hbWUiOiJ6aHVveXVlIiwiVGltZVN0YW1wIjoxNzM0MDg4MjI1LCJDbGllbnRJUCI6IjIxOS43Ny4yMzYuMTgwIiwiQnVmZmVyVGltZSI6MCwiZXhwIjoxNzM0MTc0NjI1LCJpc3MiOiJxbV9uZXdfbWVkaWFfZngiLCJuYmYiOjE3MzQwODgyMjUsIkVudiI6InJlbGVhc2UiLCJJc1NpbXVsYXRpb25Mb2dpbiI6ZmFsc2V9.LaEHd147NoCt1Wfo9ZZlCs4pludA7D3LajN4xff2H5o',
         'project': 'reader_paid_wxminiapp',
         'signature': 'b4782a395b0d0de3f78bb5c8157cb35ab0d6c51f3677a1cfb4b5390c39f63169',
-        'target-id': '544180064332673816',
+        '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',
-        'Referer': 'https://new-media-fx.qimao.com/backend/recharge-configuration/index?projectId=reader_paid_wxminiapp&appId=9a2737aabb8f11ef93f90293e6ac97a2&accountId=546233830666047938'
+        'Referer': `https://new-media-fx.qimao.com/backend/postback-configuration/index?projectId=reader_paid_wxminiapp&appId=${app_external_id}&accountId=${target_id}`
     };
     let headers = ""
     if(mini_program_platform_id==config.wx){

+ 50 - 0
src/api/yw/check_login.js

@@ -0,0 +1,50 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const redis_help = require('../../use_redis');
+const CMD = {}
+CMD.update_cookies = async function () {
+    await require('./getActiveInfo').getActiveInfo()
+    // try{
+    //     let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+    //     let response =  await fetch("https://open.yuewen.com/api/Announce/AnnounceList?type=0&p=1&coop=0", {
+    //         "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",
+    //           "priority": "u=1, i",
+    //           "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+    //           "sec-ch-ua-mobile": "?0",
+    //           "sec-ch-ua-platform": "\"Windows\"",
+    //           "sec-fetch-dest": "empty",
+    //           "sec-fetch-mode": "cors",
+    //           "sec-fetch-site": "same-origin",
+    //           "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; OPENSESSID=${OPENSESSID}; yw_open_token=6784e90e5a6fe; is_read_notice=6784e90e5a6fe; sidebarStatus=0`,
+    //           "Referer": "https://open.yuewen.com/new/dashboard",
+    //           "Referrer-Policy": "strict-origin-when-cross-origin"
+    //         },
+    //         "body": null,
+    //         "method": "GET"
+    //     });
+
+    //     // console.log('-'.repeat(50));
+    //     // response.headers.forEach((value, key) => {
+    //     //     console.log(`${key}: ${value}`);
+    //     // });
+    //     let cookie = response.headers.get('set-cookie')
+    //     // console.log("cookie:",cookie)
+    //     const match = cookie.match(/OPENSESSID=([^;]+)/);
+    //     if (match && match[1]) {
+    //         OPENSESSID = match[1]
+    //         console.log('OPENSESSID值:', match[1]);
+    //         redis_help.setKeyValue("OPENSESSID",OPENSESSID)
+    //     }
+    //     const data = await response.json();
+    //     // if(data.code!=0){
+    //     //     throw data
+    //     // }
+    //     console.log('响应状态:', response.status);
+    //     console.log('响应数据:', data);
+    // }catch(e){
+
+    // }
+}
+
+module.exports = CMD;

+ 38 - 0
src/api/yw/collect.js

@@ -0,0 +1,38 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const helper = require('../../helper');
+const CMD = {}
+
+CMD.collect = async function() {
+  try{
+      let timestamp = helper.getCurrentUnixTimestamp()
+      let response = await fetch("https://galileotelemetry.tencent.com/collect", {
+        "headers": {
+          "accept": "*/*",
+          "accept-language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
+          "content-type": "text/plain;charset=UTF-8",
+          "priority": "u=1, i",
+          "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+          "sec-ch-ua-mobile": "?0",
+          "sec-ch-ua-platform": "\"Windows\"",
+          "sec-fetch-dest": "empty",
+          "sec-fetch-mode": "cors",
+          "sec-fetch-site": "cross-site",
+          "Referer": "https://open.yuewen.com/",
+          "Referrer-Policy": "strict-origin-when-cross-origin"
+        },
+        "body": `{\"topic\":\"SDK-b301aa81eeb68c449147\",\"data\":[{\"message\":\"{\\\"msg\\\":\\\"\\\",\\\"url\\\":\\\"//open.yuewen.com/api/Account/getActiveInfo\\\",\\\"status\\\":200,\\\"duration\\\":151,\\\"method\\\":\\\"GET\\\",\\\"param\\\":\\\"\\\",\\\"data\\\":\\\"\\\",\\\"reqHeaders\\\":\\\"\\\",\\\"resHeaders\\\":\\\"\\\",\\\"level\\\":\\\"info\\\",\\\"ret\\\":\\\"0\\\",\\\"isErr\\\":false,\\\"trace\\\":\\\"\\\",\\\"span\\\":\\\"\\\",\\\"nextHopProtocol\\\":\\\"\\\",\\\"timestamp\\\":${timestamp}}\",\"fields\":\"{\\\"id\\\":\\\"SDK-b301aa81eeb68c449147\\\",\\\"uid\\\":\\\"\\\",\\\"aid\\\":\\\"0bf5aa4c-d8ed-4bba-b9ed-50d6462ec914\\\",\\\"env\\\":\\\"production\\\",\\\"platform\\\":\\\"windows\\\",\\\"netType\\\":\\\"4G\\\",\\\"vp\\\":\\\"525 * 602\\\",\\\"sr\\\":\\\"1280 * 720\\\",\\\"from\\\":\\\"https://open.yuewen.com/new\\\",\\\"referer\\\":\\\"https://open.yuewen.com/\\\",\\\"type\\\":\\\"api\\\"}\",\"timestamp\":${timestamp}}]}`,
+        "method": "POST"
+      });
+      const data = await response.json();
+      console.log('响应状态:', response.status);
+      console.log('响应数据:', data);
+  }catch(e){
+
+  }
+}
+
+module.exports = CMD;

+ 54 - 0
src/api/yw/getActiveInfo.js

@@ -0,0 +1,54 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const CMD = {}
+
+CMD.getActiveInfo = async function() {
+  try{
+      let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+      let response = await fetch("https://open.yuewen.com/api/Account/getActiveInfo", {
+        "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",
+          "priority": "u=1, i",
+          "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+          "sec-ch-ua-mobile": "?0",
+          "sec-ch-ua-platform": "\"Windows\"",
+          "sec-fetch-dest": "empty",
+          "sec-fetch-mode": "cors",
+          "sec-fetch-site": "same-origin",
+          "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=vN8OkvTZZfzerTHhodh7rc81; OPENSESSID=${OPENSESSID}; yw_open_token=6785d8c2ec046; sidebarStatus=0; is_read_notice=6785d8c2ec046`,
+          "Referer": "https://open.yuewen.com/new/dashboard",
+          "Referrer-Policy": "strict-origin-when-cross-origin"
+        },
+        "body": null,
+        "method": "GET"
+      });
+
+      console.log('-'.repeat(50));
+      response.headers.forEach((value, key) => {
+          console.log(`${key}: ${value}`);
+      });
+      let cookie = response.headers.get('set-cookie')
+      console.log("cookie:",cookie)
+
+      const match = cookie.match(/OPENSESSID=([^;]+)/);
+      if (match && match[1]) {
+          OPENSESSID = match[1]
+          console.log('OPENSESSID值:', match[1]);
+          redis_help.setKeyValue("OPENSESSID",OPENSESSID)
+      }
+      const data = await response.json();
+      if(data.status===true){
+        require('./collect').collect()
+      }
+      console.log('响应状态:', response.status);
+      console.log('响应数据:', data);
+  }catch(e){
+
+  }
+}
+
+module.exports = CMD;

+ 79 - 0
src/api/yw/get_book_tg_chapter_id.js

@@ -0,0 +1,79 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const HttpClient = require('../../HttpClient');
+const CMD = {}
+
+CMD.get_book_tg_chapter_id = async function(book_id) {
+    try{
+        let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+        // let url = `https://open.yuewen.com/api/wechatspread/bookSpread?cbid=30554680307186706&page=1&version=2&order_field=allwords&order_type=0&content_type=0&category2=-1&isfinish=-1`
+      
+        // let headers =  {
+        //     'Accept': 'application/json, text/plain, */*',
+        //     'Cookie': `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=vN8OkvTZZfzerTHhodh7rc81; OPENSESSID=${OPENSESSID}; yw_open_token=6785d8c2ec046; is_read_notice=6785d8c2ec046; sidebarStatus=0`,
+        //     'User-Agent': 'axios/1.7.7'
+        // }
+        let client = tools.getOneNewClinet()
+
+        let postData = {
+            cmd:"chapterSpread",
+            cbid:book_id,
+            OPENSESSID:OPENSESSID
+            
+        }
+        const response = await client.post(config.python_config.host, postData)
+        
+        console.log("response.data.received_data:",response)
+
+        // let client = new HttpClient()
+        // const response = await client.proxyGet({
+        //     url:url,
+        //     headers:{
+        //         "cookie": "Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=vN8OkvTZZfzerTHhodh7rc81; OPENSESSID=b46a306fdc15d6b4ee60c41095b1cdd5; yw_open_token=6785d8c2ec046; is_read_notice=6785d8c2ec046; sidebarStatus=0"
+        //     }
+        // })
+     
+        console.log("get_book_tg_chapter_id:",response)
+        // await require('./getActiveInfo').getActiveInfo()
+        // let url = `https://open.yuewen.com/api/wechatspread/bookSpread?cbid=20879682908817006&page=1&version=2&order_field=allwords&order_type=0&content_type=0&category2=-1&isfinish=-1`
+        // let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+        // console.log("url:",url,OPENSESSID)
+        // const response =   await fetch(url, {
+        //     "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",
+        //       "priority": "u=1, i",
+        //       "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+        //       "sec-ch-ua-mobile": "?0",
+        //       "sec-ch-ua-platform": "\"Windows\"",
+        //       "sec-fetch-dest": "empty",
+        //       "sec-fetch-mode": "cors",
+        //       "sec-fetch-site": "same-origin",
+        //       "Content-Type" : "application/json; charset=utf-8",
+        //       "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=vN8OkvTZZfzerTHhodh7rc81; OPENSESSID=${OPENSESSID}; yw_open_token=6785d8c2ec046; is_read_notice=6785d8c2ec046; sidebarStatus=0`,
+        //       "Referer": "https://open.yuewen.com/new/library",
+        //       "Referrer-Policy": "strict-origin-when-cross-origin"
+        //     },
+        //     "body": null,
+        //     "method": "GET"
+        //   });
+    
+        //   const data = await response.json();
+        //   console.log('响应数据:', response);
+        //   if(data.code!=0){
+        //       throw data
+        //   }
+    
+        //   console.log('响应状态:', response.status);
+        //   console.log('响应数据:', data);
+        //   return data.data.chapterList[0];
+    }catch(error){
+        console.error('请求错误:', error);
+        return null;
+    }
+
+}
+
+module.exports = CMD;

+ 47 - 0
src/api/yw/get_yw_recharge_template.js

@@ -0,0 +1,47 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const CMD = {}
+
+CMD.get_recharge_template = async function (yw_id) {
+    await require('./switchApp').switchApp(yw_id)
+    try {
+        let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+        console.log("OPENSESSID:",OPENSESSID)
+        const response =  await fetch("https://open.yuewen.com/api/WechatWebsite/PageListChargeSettingTemplates", {
+            "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",
+              "priority": "u=1, i",
+              "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+              "sec-ch-ua-mobile": "?0",
+              "sec-ch-ua-platform": "\"Windows\"",
+              "sec-fetch-dest": "empty",
+              "sec-fetch-mode": "cors",
+              "sec-fetch-site": "same-origin",
+              "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; OPENSESSID=${OPENSESSID}; yw_open_token=6784835e6c51a; is_read_notice=6784835e6c51a; sidebarStatus=1`,
+              "Referer": "https://open.yuewen.com/new/library",
+              "Referrer-Policy": "strict-origin-when-cross-origin"
+            },
+            "body": null,
+            "method": "GET"
+        });
+
+        const data = await response.json();
+
+        if(data.code!=0){
+            throw data
+        }
+        
+        console.log('响应状态:', response.status);
+        console.log('响应数据:', data);
+        return data.data.charge_setting_templates;
+    } catch (error) {
+        console.error('请求错误:', error);
+        throw error;
+    }
+}
+
+module.exports = CMD;

+ 32 - 0
src/api/yw/switchApp.js

@@ -0,0 +1,32 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const CMD = {}
+
+CMD.switchApp = async function(yw_id) {
+    // let res =  await require('./yw_login').yw_login()
+    // console.log("res:",res.headers)
+    let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+    return await fetch("https://open.yuewen.com/api/account/switchApp", {
+        "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",
+          "content-type": "application/json",
+          "priority": "u=1, i",
+          "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+          "sec-ch-ua-mobile": "?0",
+          "sec-ch-ua-platform": "\"Windows\"",
+          "sec-fetch-dest": "empty",
+          "sec-fetch-mode": "cors",
+          "sec-fetch-site": "same-origin",
+          "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; OPENSESSID=${OPENSESSID}; yw_open_token=6784835e6c51a; is_read_notice=6784835e6c51a; sidebarStatus=0`,
+          "Referer": "https://open.yuewen.com/new/library",
+          "Referrer-Policy": "strict-origin-when-cross-origin"
+        },
+        "body": `{\"coopid\":24,\"appid\":${yw_id}}`,
+        "method": "POST"
+      });
+}
+
+module.exports = CMD;

+ 55 - 0
src/api/yw/yw_login.js

@@ -0,0 +1,55 @@
+
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const config  = require('../../../etc/config.json');
+const redis_help = require('../../use_redis');
+const CMD = {}
+
+CMD.yw_login = async function() {
+  try{
+      let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+      let response = await fetch("https://open.yuewen.com/api/account/login", {
+        "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",
+          "content-type": "application/json;charset=UTF-8",
+          "priority": "u=1, i",
+          "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+          "sec-ch-ua-mobile": "?0",
+          "sec-ch-ua-platform": "\"Windows\"",
+          "sec-fetch-dest": "empty",
+          "sec-fetch-mode": "cors",
+          "sec-fetch-site": "same-origin",
+          "x-csrf-token": "9EeGTClKZ3EJFZjIQDcVozZj",
+          "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; is_read_notice=6785cfb62a9ac; sidebarStatus=1; OPENSESSID=${OPENSESSID}`,
+          "Referer": "https://open.yuewen.com/",
+          "Referrer-Policy": "strict-origin-when-cross-origin"
+        },
+        "body": "{\"account\":\"zywz2024013@163.com\",\"verifyTicket\":\"tr03Rw2aTt3euItO1WvEU_aUhviMBXhMXfblige5c1XDKqyTOucVQHSJv7W_87606d9HvJvGim7l4WAGXY-b0C4eueAquXQlUvM5c3k8Jfxet8oS0I-vjKfVGsZCYzTuVVIf\",\"randStr\":\"@NQ6\",\"password\":\"Huang888888\"}",
+        "method": "POST"
+      });
+
+
+
+      console.log('-'.repeat(50));
+      response.headers.forEach((value, key) => {
+          console.log(`${key}: ${value}`);
+      });
+      let cookie = response.headers.get('set-cookie')
+      console.log("cookie:",cookie)
+
+      const match = cookie.match(/OPENSESSID=([^;]+)/);
+      if (match && match[1]) {
+          OPENSESSID = match[1]
+          console.log('OPENSESSID值:', match[1]);
+          // redis_help.setKeyValue("OPENSESSID",OPENSESSID)
+      }
+      const data = await response.json();
+      console.log('响应状态:', response.status);
+      console.log('响应数据:', data);
+  }catch(e){
+
+  }
+}
+
+module.exports = CMD;

+ 58 - 0
src/api/yw/yw_search_book.js

@@ -0,0 +1,58 @@
+const fetch = require('node-fetch'); // Node.js 18以下版本需要安装 node-fetch
+const tools = require('../../../tools');
+const helper = require('../../helper');
+const redis_help = require('../../use_redis');
+const CMD = {}
+CMD.search_id = async function (bookId) {
+    try {
+        let OPENSESSID = await redis_help.getKeyValue("OPENSESSID")
+        const response = await fetch(`https://open.yuewen.com/api/wechatspread/bookSpread?cbid=${bookId}&page=1&version=2&order_field=allwords&order_type=0&content_type=1&category1=-1&allwords=-1&category2=-1&isfinish=-1&level=-1`, {
+            "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",
+              "priority": "u=1, i",
+              "sec-ch-ua": "\"Microsoft Edge\";v=\"131\", \"Chromium\";v=\"131\", \"Not_A Brand\";v=\"24\"",
+              "sec-ch-ua-mobile": "?0",
+              "sec-ch-ua-platform": "\"Windows\"",
+              "sec-fetch-dest": "empty",
+              "sec-fetch-mode": "cors",
+              "sec-fetch-site": "same-origin",
+              "cookie": `Hm_lvt_990f9ab9737a266517417cc2949bb3f4=1736394515; csrfToken=9EeGTClKZ3EJFZjIQDcVozZj; OPENSESSID=${OPENSESSID}; yw_open_token=6784835e6c51a; is_read_notice=6784835e6c51a; sidebarStatus=0`,
+              "Referer": "https://open.yuewen.com/new/library",
+              "Referrer-Policy": "strict-origin-when-cross-origin"
+            },
+            "body": null,
+            "method": "GET"
+        });
+
+        const data = await response.json();
+        if(data.code!=0){
+            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]
+        let info = {}
+        info.words =  book_info.WordsCntShow
+        info.book_name =  book_info.BookName
+        info.book_id =  book_info.cbid
+        info.genre = 999;
+        if(book_info.CategoryName=="短篇"){  
+            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;

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

@@ -27,6 +27,32 @@ class get_fq_mf_book_tab_controllers {
         }
     }
 
+    
+    async getDataByBookId(params) {
+        try {
+            // 参数验证
+            if (!params?.book_id) {
+                throw  'get_fq_book_tab_controllers:book_id ID is required';
+            }
+            const book_id = params.book_id;
+            const filterData = await get_fq_mf_book_tab_model.findOne({ book_id: book_id });
+
+            if (!filterData) {
+                return {
+                    success: false,
+                    data: null
+                };
+            }
+
+            return {
+                success: true,
+                data: filterData
+            };
+        } catch (error) {
+
+            throw error;
+        }
+    }
 
      async findNonExistentProductIds(ProductIds) {
         try {

+ 1 - 1
src/data_manager/Model/get_fq_mf_book_tab_model.js

@@ -3,7 +3,7 @@ const BaseModel = require('../BaseModel')
 
 class get_fq_mf_book_tab_model extends BaseModel {
     constructor() {
-        super('get_fq_book_tab'); //表名
+        super('get_fq_mf_book_tab'); //表名
     }
 
     async createData(tableData) {

+ 2 - 1
stopAll.sh

@@ -13,4 +13,5 @@
 /home/node/node-v20.17.0-linux-x64/lib/node_modules/pm2/bin/pm2 stop QM_FACTORY
 /home/node/node-v20.17.0-linux-x64/lib/node_modules/pm2/bin/pm2 stop PULL_TIME_DATA
 /home/node/node-v20.17.0-linux-x64/lib/node_modules/pm2/bin/pm2 stop WX_GUA_JIAN_PARSE
-
+/home/node/node-v20.17.0-linux-x64/lib/node_modules/pm2/bin/pm2 stop FQMF_FACTORY
+/home/node/node-v20.17.0-linux-x64/lib/node_modules/pm2/bin/pm2 stop YW_FACTORY

+ 26 - 51
test.py

@@ -1,58 +1,33 @@
 import requests
-import json
-from urllib.parse import urlparse, parse_qs, urlencode
 
-# First URL
-url1 = "https://api.amemv.com/insights/lynx_web/anchor/preview?anchor_type=internet_service&app_id=1128&cmpt_version=1&component_id=7430558813054405430&download_style=1&interaction_style=1&is_preview=1&item_id=0&owner_id=1809047160845323&sec_uid=MS4wLjABAAAAHBDxS7uq2FpOE5kTjzuQTuIHOqL460dWJi9izIZedWIYRktaqewXWOw_rFvP8Avx"
-
-# Parse URL parameters
-parsed_url = urlparse(url1)
-params = parse_qs(parsed_url.query)
-
-# Extract required parameters
-component_id = params['component_id'][0]
-cmpt_version = params['cmpt_version'][0]
-item_id = params['item_id'][0]
-sec_uid = params['sec_uid'][0]
-app_id = params['app_id'][0]
-
-# Construct extra parameter
-extra_data = {
-    'item_id': item_id,
-    'author_id': params['owner_id'][0],
-    'device_platform': 'ios'
+cookies = {
+    'Hm_lvt_990f9ab9737a266517417cc2949bb3f4': '1736394515',
+    'csrfToken': 'vN8OkvTZZfzerTHhodh7rc81',
+    'OPENSESSID': 'ada39ae2c1286d1be3bd32e300951fff',
+    'yw_open_token': '6785d8c2ec046',
+    'is_read_notice': '6785d8c2ec046',
+    'sidebarStatus': '0',
 }
 
-# Construct parameters for second URL
-params2 = {
-    'component_id': component_id,
-    'cmpt_version': cmpt_version,
-    'extra': json.dumps(extra_data),
-    'app_id': app_id,
-    'sec_uid': sec_uid
+headers = {
+    'authority': 'open.yuewen.com',
+    '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',
+    'priority': 'u=1, i',
+    'referer': 'https://open.yuewen.com/new/library',
+    'sec-ch-ua': '"Microsoft Edge";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
+    'sec-ch-ua-mobile': '?0',
+    'sec-ch-ua-platform': '"Windows"',
+    'sec-fetch-dest': 'empty',
+    'sec-fetch-mode': 'cors',
+    'sec-fetch-site': 'same-origin',
+    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'
 }
 
-# Construct second URL
-url2 = f"https://api.amemv.com/aweme/v1/saiyan/industry/component/anchor/page/?{urlencode(params2)}"
+url = 'https://open.yuewen.com/api/wechatspread/chapterSpread'
+params = {
+    'cbid': '20879682908817006'
+}
 
-try:
-    # Download content from second URL
-    response = requests.get(url2, verify=False)
-    response.raise_for_status()
-    
-    # Parse JSON response
-    data = response.json()
-    
-    # Parse the data string inside anchor_page.data
-    anchor_data = json.loads(data['anchor_page']['data'])
-    
-    # Extract and print specific fields from the first item
-    if anchor_data and len(anchor_data) > 0:
-        item = anchor_data[0]  # Get the first item
-        print(f"wechat_microapp_jump_url: {item.get('wechat_microapp_jump_url', '')}")
-        print(f"wechat_microapp_title: {item.get('wechat_microapp_title', '')}")
-    
-except requests.exceptions.RequestException as e:
-    print(f"Error occurred: {e}")
-except json.JSONDecodeError as e:
-    print(f"JSON parsing error: {e}")
+response = requests.get(url, params=params, cookies=cookies, headers=headers)
+print(response.json())

+ 19 - 5
tg_factory_main.js

@@ -35,22 +35,36 @@ let isInit = false
 if(config.isDebug){
     redis_help.connect( async (results)=>{
         if(results){
+            if(isInit){
+                return
+            }
             isInit = true
+            // await require('./src/api/yw/get_book_tg_chapter_id').get_book_tg_chapter_id("20879682908817006")
+            // await redis_help.setKeyValue("OPENSESSID","ada39ae2c1286d1be3bd32e300951fff")
+
+            // // 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 PlatformInfo =  getPlatformInfoByI(PlatformConfig,3)
+            // let PlatformInfo =  getPlatformInfoByI(PlatformConfig,config.platform_yuewen)
 
-            // let main_info = getMainInfoById(MainConfig,162)
+            // let main_info = getMainInfoById(MainConfig,178) //180
 
             // let data = {
-            //     product_id:"393425",
-            //     product_name:"转学生自称苗疆圣子,可我才是真圣子"
+            //     product_id:"20879682908817006",
+            //     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,()=>{
+
+            // })
+
+
+            
             // let {promotion_name} = await require("./5_CREATE_LINK_FACTORY/qm_create_link").runTask(data,main_info,PlatformInfo,()=>{
 
             // })

+ 2 - 2
tools.js

@@ -158,10 +158,10 @@ class tools {
         return this.getRandomElement(temp)
     }
 
-    getOneNewClinet(){
+    getOneNewClinet(headers=null){
         return axios.create({
             timeout: 30000,
-            headers: {},
+            headers:headers||{},
             // 使用独立的 agent,不影响其他连接
             httpAgent: new http.Agent({ 
                 keepAlive: true,