为什么要准备数据表

上篇文章介绍了选型,现在开始实际搭建。

在开始搭建前,需要先准备好数据表,同时要用工作流来完成定时任务。设置每天定时运行来抓取数据。

这样每天凌晨3点自动获取数据,手动查看历史数据的问题就解决了。


3个步骤,轻松完成数据准备

步骤1:创建用户表

第一步是创建数据库来存放数据,使用AI Ware创建了两张表。省事的是影刀支持使用AI创建,复制提示词粘贴即可。

1769064124590-2026-1-22-144204.png

创建ac_user表,用来存放待监控的影刀ID。AI提示词如下:

创建一个影刀id和用户信息表(表名:ac_user)存放带监控的影刀id, 包含影刀用户id(personal_id),系统登陆用户(login_user),用户类型(user_type)和创建时间

注意核对下字段名,后面写查询和做搜索都需要用到。

1769063476591-2026-1-22-143116.png

步骤2:创建数据表

创建ac_his_data表,用来存放监控的历史数据。AI提示词如下:

创建一个影刀成就值监控表(表名ac_his_data)用来存放历史的成就数据, 包含
影刀用户名(yd_username/varchar)
等级(level/varchar)
使用天数(use_days/int)
我开发的应用数(app_count/int)
累计开发的指令行数(developed_lines/int)
我开发的应用运行时间(小时)(app_runtime_hours/decimal)
回答问题(answered_questions/int)
回复被采纳(adopted_replies/int)
发表文章(published_articles/int)
当前成就值(current_achievement/int)
升级所需成就值(achievement_to_upgrade/int)
等级所需成就值(achievement_for_level/int)
原始json(origin_json/json)
影刀用户id(personal_id/varchar)
绑定登陆用户(login_user/varchar)
备注(remark/varchar)
创建/更新时间

注意核对下字段名和类型,后面写查询和做搜索都需要用到。

1769088178591-2026-1-22-212258.png

步骤3:添加测试数据

接下来要用工作流创建定时任务,自动获取监控数据。创建之前需要向ac_user表手动添加一条数据做测试。

1769064288590-2026-1-22-144448.png

点击右上角插入数据,填写数据:

  • personal_id:是成就页面登陆后地址栏最后面的一串数字

  • login_user:建议填你账号的手机号

  • user_type:可以填普通


创建工作流:5步搞定数据采集

接着创建一个工作流,这是数据获取的核心。流程图如下:

1769069250592-2026-1-22-160730.png

工作流程:

定时触发器 → 查询数据 → 数据去重 → 获取成就值 → 数据入库

步骤1:定时触发器

设置触发器为每天凌晨3点触发。

成就值刷新时间是每天凌晨,所以只需要配置一个时间就行。


步骤2:查询数据

从ac_user表查询所有状态为普通并且影刀ID不为空的用户。

SQL查询代码:

select ac.personal_id, ac.login_user
from ac_user ac
where ac.user_type ='普通' and ac.personal_id is not null

步骤3:数据去重

通过JS对上一步的结果进行去重,避免重复查询。

JS代码:

// 如果查询结果为空,返回空数组
if(!get_all_yd_id.data || get_all_yd_id.data.length === 0){
    return []
}

// 核心去重逻辑
const uniqueUserList = Array.from(
    // 用Map存储,key为personal_id,value为对应对象(自动去重)
    new Map(get_all_yd_id.data.map(item => [item.personal_id, item])).values()
);
return uniqueUserList;

步骤4:获取成就值

使用循环处理,对每条数据查询成就值。

JS代码:

const BASE_URL = 'https://api.yingdao.com/api/eco/noauth/v1/achieve/info/query';

const headers = {
    'accept': '*/*'
};

async function fetchAchievementData(item) {
    const personalId = item.personal_id;
    let result = {
        '登陆用户': item.login_user,
        '影刀id': personalId,
        '用户名': '',
        '等级': '',
        '使用天数': null,
        '我开发的应用数': null,
        '累计开发的指令行数': null,
        '我开发的应用运行时间': null,
        '回答问题': null,
        '回复被采纳': null,
        '发表文章': null,
        '当前成就值': null,
        '升级所需成就值': null,
        '等级所需成就值': null,
        '备注': ''
    }
    try {
        // 获取用户基本信息
        const infoResponse = await fetch(`${BASE_URL}/info?personalId=${personalId}`, {headers});
        const infoData = await infoResponse.json();
        // 获取应用和社交数据
        const appSnsResponse = await fetch(`${BASE_URL}/appSnsData?personalId=${personalId}`, {headers});
        const appSnsData = await appSnsResponse.json();
        // 获取成就值升级信息
        const equityResponse = await fetch(`${BASE_URL}/personalEquity?personalId=${personalId}`, {headers});
        const equityData = await equityResponse.json();
        const runTime = Number.parseFloat((appSnsData.data.appDevelopStat.ownerAppRunTimeStat.totalStatVal / 3600).toFixed(2))
        // 提取数据
        result['用户名'] = infoData.data.nickName.trim();
        result['等级'] = infoData.data.achieveLevelInfo.achieveLevelName;
        result['使用天数'] = infoData.data.accountDays;
        result['我开发的应用数'] = appSnsData.data.appDevelopStat.developAppStat.totalStatVal;
        result['累计开发的指令行数'] = appSnsData.data.appDevelopStat.developBlockStat.totalStatVal;
        result['我开发的应用运行时间'] = runTime;
        result['回答问题'] = appSnsData.data.snsStat.answerStat.totalStatVal;
        result['回复被采纳'] = appSnsData.data.snsStat.acceptedStat.totalStatVal;
        result['发表文章'] = appSnsData.data.snsStat.questionStat.totalStatVal;
        result['当前成就值'] = equityData.data.achieveGrowthValInfo.currentGrowthVal;
        result['升级所需成就值'] = equityData.data.achieveGrowthValInfo.diffNextLevelGrowthVal;
        result['等级所需成就值'] = equityData.data.achieveGrowthValInfo.nextLevelGrowthVal;
        result['备注'] = '成功'
    } catch (error) {
        console.error('获取数据失败:', error);
        result['备注'] = '失败'
    }
    return result;
}

return await fetchAchievementData(item)

步骤5:数据入库

还是使用循环处理,对查询数据进行入库。

SQL插入代码:

INSERT INTO
  ac_his_data (
    yd_username,
    level,
    use_days,
    app_count,
    developed_lines,
    app_runtime_hours,
    answered_questions,
    adopted_replies,
    published_articles,
    current_achievement,
    achievement_to_upgrade,
    achievement_for_level,
    personal_id,
    login_user,
    remark
  )
VALUES
  ({{item.用户名}}, {{item.等级}}, {{item.使用天数}}, {{item.我开发的应用数}},
   {{item.累计开发的指令行数}}, {{item.我开发的应用运行时间}}, {{item.回答问题}},
   {{item.回复被采纳}}, {{item.发表文章}}, {{item.当前成就值}}, {{item.升级所需成就值}},
   {{item.等级所需成就值}}, {{item.影刀id}}, {{item.登陆用户}}, {{item.备注}});

模拟运行

点击右上角运行,没有报错则运行成功。

查看数据库可以看到数据已经入库了。

1769069701591-2026-1-22-161501.png


工作流发版

工作流页面点击右上角发版,发版成功。

1769069755591-2026-1-22-161555.png

发版后,工作流就会按照设定的时间自动运行了。


下一步

数据采集已经完成,每天凌晨3点自动获取数据并入库。

下一篇会介绍如何创建应用界面,把数据可视化展示出来。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐