# Task相关接口 ### 说明 1. 通用返回格式, errcode=0 表示无错误 2. 如无特别说明, 以下接口的 Response 格式指的是 data 字段 3. 接口名中带\*的表示, 需要验证 token, token 可以设置 header 的 Authorization: Bearer JWT_token, 或 Post body 的 token 字段, 或 Get 的 query token ```json { "errcode": Number, "errmsg": String, "data": {} } ``` ### 1. 钱包预登录 #### Request - URL:`/api/wallet/nonce?address=` - 方法:`GET` query param | Name | Type | Desc | | ------- | ------ | -------- | | address | string | 钱包地址 | #### Response ```json { "nonce": String, "tips": String } ``` ### 2. 钱包登录 客户端在获得钱包地址后,须先调用预登录方法获取 nonce 和 tips, 然后调用钱包进行 EIP-721 签名. 登录成功后返回的 jwt 需要保存至本地存储, 再次载入后, 可解析并获取 exp 字段, 判断当前 token 是否已经过期 #### Request - URL:`/api/wallet/login` - 方法:`POST` - 头部: - Content-type: application/json - Body: ```json { "activity": String, "signature": String, "message": SiweMessage } ``` SiweMessage说明: https://docs.login.xyz/sign-in-with-ethereum/quickstart-guide/creating-siwe-messages SiweMessage的nonce说明(具体参考例子): ``` 1. 从钱包预登录接口获取nonce 2. nonce = nonce + '|' + 钱包类型字符串 // 比如okx钱包, nonce|okx 3. 使用 活动id 作为 key, 调用aesEncrypt 加密步骤2的字符串 4. 将hex string 转换成base58, 传给SiweMessage ``` #### Response ```json { "token": String, } ``` ### 3. 活动信息 #### Request - URL:`/api/activity/:id` - 方法:`GET` - 参数: - `id`(当前活动的ID) #### Response ```js { "_id": "TwitterConnect", // 任务id "name": "活动名称", "description": "活动描述", "tasks": [ // 该活动需要完成的任务 { "id": "任务id", "task": "任务类型", "title": "任务名", "desc": "任务描述", "type": 1, //任务类型, 1: 一次性任务, 2: 日常任务 "pretasks": ["task id 1"], //前置任务 "score": 0, // 完成任务可获得的积分 "category": "", // 任务分类 "cfg": {}, // 其他一些任务相关配置参数, 比如icon, 或者其他未考虑的参数 "autoclaim": false // 任务完成后是否自动获取奖励 } ], "startTime": 1702628292366, // 活动开始时间 "endTime": 1705220292366 // 活动结束时间 } ``` ### 4. *用户任务进度 #### Request - URL:`/api/tasks/progress` - 方法:`POST` - 头部: - Authorization: Bearer JWT_token - Body: {} #### Response ```js [ { "status": 2, // 任务状态, 0: 未开始, 1: 进行中, 2: 成功, 9: 失败 "id": "TwitterConnect", // 任务id "timeStart": 1703150269527, // 任务开始时间 "data": { // 当前任务带的额外信息, 比如twitter的id和昵称等 "username": "zhl01", "userid": "564269223" }, "timeFinish": 1703150280059 // 任务结束时间 } ] ``` ### 5.\* 开始某个任务 #### Request - URL:`/api/tasks/begin_task` - 方法:`POST` - 头部: - Authorization: Bearer JWT_token body: ```js { "task": "TwitterFollow" // 任务id } ``` #### Response ```json { "status": 1, // 任务状态, 0: 未开始, 1: 进行中, 2: 成功, 9: 失败 "id": "TwitterFollow", // 任务id "timeStart": 1703150294051 // 任务开始时间 } ``` ### 6.\* 检查任务状态 #### Request - URL:`/api/tasks/check_task` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token body: ```js { "task": "TwitterFollow" // 任务id } ``` #### Response ```json { "status": 1, // 任务状态, 0: 未开始, 1: 进行中, 2: 成功, 9: 失败 "id": "TwitterFollow", // 任务id "timeStart": 1703150294051, // 任务开始时间 "timeFinish": 1703151338598 } ``` ### 7.\* 获取任务奖励 #### Request - URL:`/api/tasks/claim` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token body: ```js { "task": "TwitterFollow" // 任务id } ``` #### Response ```json { "status": 1, // 任务状态, 0: 未开始, 1: 进行中, 2: 成功, 9: 失败 "id": "TwitterFollow", // 任务id "timeStart": 1703150294051, // 任务开始时间 "timeFinish": 1703151338598 } ``` ### 8.\* 提交邀请码 #### Request - URL:`/api/activity/upload_invite_code` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token body: ```js { "code": "邀请人的邀请码" } ``` #### Response > 只要不返回errcode, 即表示上传成功 ```json {} ``` ### 9. 积分排行榜 #### Request - URL:`/api/activity/leaderboard/:activity/:page` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token - 参数: - `activity`(当前活动的ID) - `page` (返回数据的分页序号, 0 开始) > 默认返回50条记录, 如果要返回不同数量, query param传 limit #### Response ```json [ { "rank": 1, // 排名, 从1开始 "address": "钱包地址", "invite": "邀请人的地址", "score": 获得的积分, "yesterday": 上一日得分 } ] ``` ### 10.\* 用户状态 #### Request - URL:`/api/user/state` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token #### Response ```json { "address": "钱包地址", "boost": 1, // 正常值为1 "boostExpire": 0, // 计算得分时, 如果boost过期, 即使boost大于1, 也不计算boost "twitterId": "", "twitterName": "", "discordId": "", "discordName": "", "scoreToday": 100, // 今日获得积分 "scoreTotal": 200, // 总积分 "rankTotal": "-", "invite": "邀请人address", "inviteCount": 0, // 我邀请的用户总数 "inviteScore": 0, // 我邀请用户总数获得的分数 "code": "自己的邀请码" } ``` ### 11.\* boost #### Request - URL:`/api/user/state/boost` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token #### Response ```json { "boost": 1, // 正常值为1 "boostExpire": 0, // 计算得分时, 如果boost过期, 即使boost大于1, 也不计算boost } ``` ### 12.\* 签到列表 #### Request - URL:`/api/user/checkin/list?tag=` - 方法:`GET` - 头部: - Authorization: Bearer JWT_token query param | Name | Type | Desc | | ------- | ------ | -------- | | tag | string | last: 最新, 前一天+今天, 1month: 当月 | #### Response ```json [ { "address": "钱包地址", "day": "20240105", // 格式化后签到日期, 时区按SG(UTC+8) "time": 1704436745, // 具体的签到时间 "count": 0 //连签天数 }, ] ```