【源码】Metis每天打卡前五十成功

有兴趣的读者就自由完善吧

index.js

const rp = require("request-promise-native");
var fs = require("fs");

var nodeFile = fs.readFileSync('./node.json','utf-8'); //读取当前节点JSON数据文件,这个文件读者可以参考下面的代码,自己修改成自动更新的JSON文件
const nodeData = JSON.parse(nodeFile.toString());

var nodeIdList = [];//节点机构号数组

/**
 * 处理一下,做字符串拼接,由于URL不允许 : 的情况,因此替换为 %3A
 */
for(var index=0;index<nodeData.data.length;index++){
    if(nodeData.data[index].dynamicFields.taskCount!=0){
        nodeIdList.push(nodeData.data[index].identityId.substring(0,8)+"%3A"+nodeData.data[index].identityId.substring(9))
        console.log(nodeIdList[index])
    }
}

/**
 * 查询机构号对应的数据,并且以JSON的形式保存到本地taskAll文件夹中
 */
async function fetchNode(NodeId) {
    console.log(`正在向Metis查询 ${NodeId} 的数据...`);
    
    const results = await rp({
        uri: "https://test.technocore.network/scan/task/listTaskByIdentityId?identityId="+NodeId+"&pageNo=1&pageSize="+10000,
        headers: {
            "Connection": "keep-alive",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
            "strict-origin-when-cross-origin": "stats",
        },
        json: true
    });

    /**
     * 保存文件
     */
    await fs.promises.writeFile(
        `./test/${NodeId}.json`,
        JSON.stringify(results, null, 2)
    );
}

async function main() {
    for (var i=0;i<nodeIdList.length;i++) {
        console.log(nodeIdList[i],"开始运行内容抓取脚本......");
        await fetchNode(nodeIdList[i]);
        
        console.log('"'+nodeIdList[i]+'.json",抓取完毕!');
      }
      console.log("全部抓取完毕!");
}

main()

Analysis.js 没有全局去重

var fs = require("fs");

//开始时间
var starttime = '2022-03-24 08:00:00:000';
var startdate = new Date(starttime).getTime();
//console.log(startdate)

//结束时间
var endtime = '2022-03-24 17:39:00:000';
var enddate = new Date(endtime).getTime();
//console.log(enddate)

//读取当前节点JSON数据文件,这个文件读者可以参考下面的代码,自己修改成自动更新的JSON文件
var nodeFile = fs.readFileSync('./node.json','utf-8'); 
const nodeData = JSON.parse(nodeFile.toString());

var nodeIdList = [];//节点机构号数组

/**
 * 处理一下,做字符串拼接,由于URL不允许 : 的情况,因此替换为 %3A
 */
for(var index=0;index<nodeData.data.length;index++){
    if(nodeData.data[index].dynamicFields.taskCount!=0){
        nodeIdList.push(nodeData.data[index].identityId.substring(0,8)+"%3A"+nodeData.data[index].identityId.substring(9))
    }
}

var tasks = []; //全局任务数据数组
var checkTaskCount = 0; //查询期间任务成功数量

//读取对应节点的JSON文件
for(var index=0;index<nodeIdList.length;index++){
    var count=0;
    var nodeIdData = fs.readFileSync('./test/'+nodeIdList[index]+'.json','utf-8');
    const nodeIdJSON = JSON.parse(nodeIdData.toString());
    for(var i=0;i<nodeIdJSON.data.length;i++){
        
        if(nodeIdJSON.data[i].createAt>=startdate && nodeIdJSON.data[i].createAt<=enddate && nodeIdJSON.data[i].status==4){
            var taskNames = [];
            taskNames[0]=nodeIdJSON.data[i].taskName;
            taskNames[1]=nodeIdJSON.data[i].createAt;
            taskNames[2]=nodeIdJSON.data[i].userId;
            count++;
            checkTaskCount++;
            tasks.push(taskNames);
        }
    }
    console.log("当前节点:"+nodeIdList[index]+"的成功次数为:",count)
}
console.log("查询日期内成功任务数共计:",checkTaskCount)

var AnalysisList = []; //去重清洗后的任务数组

//按照userId排序
for(var x=0;x<tasks.length-1;x++){
    for(var y=0;y<tasks.length-1-x;y++){
        if(tasks[y][2]>tasks[y+1][2]){
            var taskTemp = tasks[y+1];
            tasks[y+1]=tasks[y];
            tasks[y]=taskTemp;
        }
    }
}

//按照userId去重
for (let i = 0; i < tasks.length-1; i++) {
    if (tasks[i][2] != tasks[i+1][2]) {
      AnalysisList.push(tasks[i]);
    }
}

//按照时间戳排序
for(var x=0;x<AnalysisList.length-1;x++){
    for(var y=0;y<AnalysisList.length-1-x;y++){
        if(AnalysisList[y][1]>AnalysisList[y+1][1]){
            var taskTemp = AnalysisList[y+1];
            AnalysisList[y+1]=AnalysisList[y];
            AnalysisList[y]=taskTemp;
        }
    }
}

//时间转换函数
function getTimes(timestemp){
    var date = new Date(timestemp);
    var Y = date.getFullYear() + '-';
    var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
    var D = date.getDate() + ' ';
    var h = date.getHours() + ':';
    var m = date.getMinutes() + ':';
    var s = date.getSeconds(); 
    var timeReal = Y+M+D+h+m+s;
    return timeReal;
}

if(AnalysisList.length<50){
    var thisCount=0;
    for(var j=0;j<AnalysisList.length;j++){
            console.log("任务名称:"+AnalysisList[j][0]+",创建时间:"+getTimes(AnalysisList[j][1])+",使用者ID:"+AnalysisList[j][2]);
            thisCount++;
    }
    console.log("AnalysisListLength:",AnalysisList.length)
    console.log(thisCount)
}else{
    var thisCount=0;
    for(var j=0;j<50;j++){
            console.log("任务名称:"+AnalysisList[j][0]+",创建时间:"+getTimes(AnalysisList[j][1])+",使用者ID:"+AnalysisList[j][2]);
            thisCount++;
    }
    console.log("AnalysisListLength:",AnalysisList.length)
    console.log(thisCount)
}

Analysis.js 全局去重,原理是调整执行顺序

var fs = require("fs");

//读取当前节点JSON数据文件,这个文件读者可以参考下面的代码,自己修改成自动更新的JSON文件
var nodeFile = fs.readFileSync('./node.json','utf-8'); 
const nodeData = JSON.parse(nodeFile.toString());

var nodeIdList = [];//节点机构号数组

/**
 * 处理一下,做字符串拼接,由于URL不允许 : 的情况,因此替换为 %3A
 */
for(var index=0;index<nodeData.data.length;index++){
    if(nodeData.data[index].dynamicFields.taskCount!=0){
        nodeIdList.push(nodeData.data[index].identityId.substring(0,8)+"%3A"+nodeData.data[index].identityId.substring(9))
    }
}

var tasks = []; //全局任务数据数组
var checkTaskCount = 0; //查询期间任务成功数量

//读取对应节点的JSON文件
for(var index=0;index<nodeIdList.length;index++){
    var count=0;
    var nodeIdData = fs.readFileSync('./test/'+nodeIdList[index]+'.json','utf-8');
    const nodeIdJSON = JSON.parse(nodeIdData.toString());
    for(var i=0;i<nodeIdJSON.data.length;i++){
        
        if(nodeIdJSON.data[i].status==4){
            var taskNames = [];
            taskNames[0]=nodeIdJSON.data[i].taskName;
            taskNames[1]=nodeIdJSON.data[i].createAt;
            taskNames[2]=nodeIdJSON.data[i].userId;
            count++;
            checkTaskCount++;
            tasks.push(taskNames);
        }
    }
    console.log("当前节点:"+nodeIdList[index]+"的成功次数为:",count)
}

var AnalysisList = []; //去重清洗后的任务数组

//按照userId排序
for(var x=0;x<tasks.length-1;x++){
    for(var y=0;y<tasks.length-1-x;y++){
        if(tasks[y][2]>tasks[y+1][2]){
            var taskTemp = tasks[y+1];
            tasks[y+1]=tasks[y];
            tasks[y]=taskTemp;
        }
    }
}

//按照userId去重
for (let i = 0; i < tasks.length-1; i++) {
    if (tasks[i][2] != tasks[i+1][2]) {
      AnalysisList.push(tasks[i]);
    }
}

//按照时间戳排序
for(var x=0;x<AnalysisList.length-1;x++){
    for(var y=0;y<AnalysisList.length-1-x;y++){
        if(AnalysisList[y][1]>AnalysisList[y+1][1]){
            var taskTemp = AnalysisList[y+1];
            AnalysisList[y+1]=AnalysisList[y];
            AnalysisList[y]=taskTemp;
        }
    }
}

//时间转换函数
function getTimes(timestemp){
    var date = new Date(timestemp);
    var Y = date.getFullYear() + '-';
    var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-';
    var D = date.getDate() + ' ';
    var h = date.getHours() + ':';
    var m = date.getMinutes() + ':';
    var s = date.getSeconds(); 
    var timeReal = Y+M+D+h+m+s;
    return timeReal;
}

//搜索开始时间
var startLast = '2022-03-25 08:00:00:000';
var BeginDate = new Date(startLast).getTime();
console.log(BeginDate)

//搜索结束时间
var endLast = '2022-03-26 08:00:00:000';
var OverDate = new Date(endLast).getTime();
console.log(OverDate)

var thisCount=0;
for(var j=0;j<AnalysisList.length;j++){
    if(AnalysisList[j][1]>=BeginDate && AnalysisList[j][1]<=OverDate){
        console.log("任务名称:"+AnalysisList[j][0]+",创建时间:"+getTimes(AnalysisList[j][1])+",使用者ID:"+AnalysisList[j][2]);
        thisCount++;
    }else{
        continue;
    }
}
console.log("AnalysisListLength:",AnalysisList.length)
console.log("查询日期内的成功地址数量:",thisCount)

node.json

链接:https://pan.baidu.com/s/18LqS3eFAOhqwq1e4bmkcNA
提取码:SLQQ
–来自百度网盘超级会员V4的分享

本JSON文件记录时间为上传时间,目前节点数量已经有所更新,读者可以自行抓取

做了数据处理的调整,对全局的任务执行地址去重,截至2022年3月25日13点16分仅有847个地址成功执行Metis

上述方案抛出一个问题:到底要不要给这25个地址奖励?

根据 @Kiki.Chen 的通告,这多余的25个地址,如果在次日同样执行且执行成功并处于当日前五十,应给予100LAT奖励。

因此上述的Analysis.js需修改计算方案,改进方案流程如下:

Analysis.js 代码片段

for(var dateIndex=5;dateIndex<=26;dateIndex++){
    //搜索开始时间
    var startLast = '2022-03-'+dateIndex+' 08:00:00:000';
    var BeginDate = new Date(startLast).getTime();
    console.log("开始搜索时间:"+startLast);

    //搜索结束时间
    var endLast = '2022-03-'+(dateIndex+1)+' 08:00:00:000';
    var OverDate = new Date(endLast).getTime();

    var toDayCount = 0;//当天名额

    for(var index=0;index<AnalysisList.length;index++){
        if(AnalysisList[index][1]>=BeginDate&&AnalysisList[index][1]<=OverDate&&toDayCount<50){
            if(AnalysisList[index][3]==1){
                continue;//顺延
            }else if(AnalysisList[index][3]==0){
                for(var temp=0;temp<AnalysisList.length;temp++){
                    if(AnalysisList[temp][2]==AnalysisList[index][2]){
                        AnalysisList[temp][3]=1;
                    }
                }
                toDayCount++;//当天名额递增
                console.log("第",toDayCount,"位,任务名称:"+AnalysisList[index][0]+",创建时间:"+getTimes(AnalysisList[index][1])+",使用者ID:"+AnalysisList[index][2]+",奖励是否已发放:",AnalysisList[index][3]);
            }
        }
    }
    console.log("结束搜索时间:"+endLast)
}

Analysis.js 2022年3月31日10点58分修复无法跨月查询的Bug

for(var dateIndex=5;dateIndex<=31;dateIndex++){
    var dateCopy = dateIndex;
    var monthIndex = 3;
    if(dateCopy>31){
        dateCopy=dateCopy-31+1;
        monthIndex = 4;
    }
    //搜索开始时间
    var startLast = '2022-0'+monthIndex+'-'+dateCopy+' 08:00:00:000';
    var BeginDate = new Date(startLast).getTime();
    console.log("开始搜索时间:"+startLast);

    //搜索结束时间
    if(dateCopy+1>31){
        dateCopy=dateCopy-31;
        monthIndex = 4;
    }
    var endLast = '2022-0'+monthIndex+'-'+(dateCopy+1)+' 08:00:00:000';
    var OverDate = new Date(endLast).getTime();

    var toDayCount = 0;//当天名额

    for(var index=0;index<AnalysisList.length;index++){
        if(AnalysisList[index][1]>=BeginDate&&AnalysisList[index][1]<=OverDate&&toDayCount<50){
            if(AnalysisList[index][3]==1){
                continue;//顺延
            }else if(AnalysisList[index][3]==0){
                for(var temp=0;temp<AnalysisList.length;temp++){
                    if(AnalysisList[temp][2]==AnalysisList[index][2]){
                        AnalysisList[temp][3]=1;
                    }
                }
                toDayCount++;//当天名额递增
                console.log("第",toDayCount,"位,任务名称:"+AnalysisList[index][0]+",创建时间:"+getTimes(AnalysisList[index][1])+",使用者ID:"+AnalysisList[index][2]+",奖励是否已发放:",AnalysisList[index][3]);
            }
        }
    }
    console.log("结束搜索时间:"+endLast)
}