411 lines
13 KiB
JavaScript
411 lines
13 KiB
JavaScript
// # Source: https://github.com/sudojia/AutoTaskScript/blob/script/src/client/sudojia_shmedia.js
|
||
// # Raw: https://raw.githubusercontent.com/sudojia/AutoTaskScript/script/src/client/sudojia_shmedia.js
|
||
// # Repo: sudojia/AutoTaskScript
|
||
// # Path: src/client/sudojia_shmedia.js
|
||
// # UploadedAt: 2025-04-28T19:26:13+08:00
|
||
// # SHA256: fc123c5cb93f7069c83f15b2c939881360d4bd0cd21bae12444871e9623216c1
|
||
// # Category: APP版/抓包
|
||
// # Evidence: cookie/token/authorization/header
|
||
//
|
||
|
||
/**
|
||
* 上海杨浦APP
|
||
*
|
||
* 抓包 Host:https://ypapi.shmedia.tech 获取请求头 token
|
||
* export SHYP_TOKEN = 'eyJ0eXxx'
|
||
* 多账号用 & 或换行
|
||
*
|
||
* @author Telegram@sudojia
|
||
* @site https://blog.imzjw.cn
|
||
* @date 2024/10/05
|
||
*
|
||
* const $ = new Env('上海杨浦')
|
||
* cron: 33 7 * * *
|
||
*/
|
||
const initScript = require('../utils/initScript')
|
||
const {$, notify, sudojia, checkUpdate} = initScript('上海杨浦');
|
||
const shMediaList = process.env.SHYP_TOKEN ? process.env.SHYP_TOKEN.split(/[\n&]/) : [];
|
||
// 消息推送
|
||
let message = '';
|
||
// 接口地址
|
||
const baseUrl = 'https://ypapi.shmedia.tech'
|
||
// 请求头
|
||
const headers = {
|
||
'User-Agent': 'okhttp/4.10.0',
|
||
'Accept-Encoding': 'gzip',
|
||
'siteid': '310110',
|
||
'content-type': 'application/json; charset=UTF-8'
|
||
};
|
||
// 请求体
|
||
const dataBody = {
|
||
"orderBy": "release_desc",
|
||
"requestType": "2",
|
||
"siteId": "310110"
|
||
}
|
||
// 映射表用于转换任务 ID
|
||
const TASK_ID_MAP = {
|
||
'002': 'read',
|
||
'003': 'video',
|
||
'007': 'share'
|
||
};
|
||
|
||
!(async () => {
|
||
await checkUpdate($.name, shMediaList);
|
||
for (let i = 0; i < shMediaList.length; i++) {
|
||
const index = i + 1;
|
||
console.log(`\n*****第[${index}]个${$.name}账号*****`);
|
||
headers.token = shMediaList[i];
|
||
message += `📣====${$.name}账号[${index}]====📣\n`;
|
||
await main();
|
||
await $.wait(sudojia.getRandomWait(2000, 2500));
|
||
}
|
||
if (message) {
|
||
await notify.sendNotify(`「${$.name}」`, `${message}`);
|
||
}
|
||
})().catch((e) => $.logErr(e)).finally(() => $.done());
|
||
|
||
async function main() {
|
||
await getUserInfo();
|
||
await $.wait(sudojia.getRandomWait(1500, 2500));
|
||
await doTask();
|
||
await $.wait(sudojia.getRandomWait(1500, 2500));
|
||
await getPoints();
|
||
await $.wait(sudojia.getRandomWait(1500, 2500));
|
||
await getGoodsList();
|
||
}
|
||
|
||
/**
|
||
* 获取用户信息
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function getUserInfo() {
|
||
try {
|
||
const data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/personal/get`, 'post', headers);
|
||
if (0 !== data.code) {
|
||
return console.error('获取用户信息失败 ->', data.msg);
|
||
}
|
||
const mobile = data.data.mobile || '18888888888';
|
||
const hiddenMobile = `${mobile.slice(0, 3)}***${mobile.slice(-3)}`;
|
||
console.log(`${data.data.nickname}(${hiddenMobile})`);
|
||
message += `${data.data.nickname}(${mobile})\n`;
|
||
} catch (e) {
|
||
console.error(`获取用户信息时发生异常 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 签到
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function sign() {
|
||
try {
|
||
const data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/personal/score/sign`, 'post', headers, dataBody);
|
||
if (0 !== data.code) {
|
||
return console.error('签到失败 ->', data.msg);
|
||
}
|
||
if (!data.data.score) {
|
||
return console.error(data.data.title);
|
||
}
|
||
console.log(`签到成功,积分+${data.data.score}`);
|
||
message += `签到成功\n`;
|
||
} catch (e) {
|
||
console.error(`签到时发生异常 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取任务列表
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function doTask() {
|
||
try {
|
||
let data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/personal/score/info`, 'post', headers, dataBody);
|
||
if (0 !== data.code) {
|
||
return console.error(`获取任务列表失败 -> ${data.msg}`);
|
||
}
|
||
const tasks = data.data.jobs;
|
||
for (const item of tasks) {
|
||
if (['004'].includes(item.id)) {
|
||
console.log(`\n跳过【${item.title}】`);
|
||
continue;
|
||
}
|
||
// 已获得的任务积分
|
||
let taskScore = item.progress;
|
||
if (taskScore >= item.totalProgress) {
|
||
console.log(`【${item.title}】任务已完成`)
|
||
await $.wait(sudojia.getRandomWait(800, 1300));
|
||
continue;
|
||
}
|
||
console.log(`\n开始【${item.title}】`);
|
||
await $.wait(sudojia.getRandomWait(1e3, 2e3));
|
||
while (taskScore < item.totalProgress) {
|
||
// 获取文章 ID
|
||
const articleId = await getArticleId();
|
||
switch (item.id) {
|
||
case '001':
|
||
// 签到
|
||
await sign();
|
||
await $.wait(sudojia.getRandomWait(2e3, 3e3));
|
||
break;
|
||
case '002': // 阅读
|
||
case '003': // 视频
|
||
case '007': // 分享
|
||
await commonTask(item.id, item.title);
|
||
break;
|
||
case '005':
|
||
// 收藏
|
||
await favorArticle(articleId);
|
||
await $.wait(sudojia.getRandomWait(5e3, 8e3));
|
||
break;
|
||
case '006':
|
||
// 评论
|
||
await commentArticle(articleId);
|
||
await $.wait(sudojia.getRandomWait(15000, 20000));
|
||
break;
|
||
default:
|
||
console.log(`其它任务:${item.title}`);
|
||
break;
|
||
}
|
||
// 更新 taskScore
|
||
taskScore = await updateTaskScore(item.id);
|
||
await $.wait(sudojia.getRandomWait(1e3, 2e3));
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.error(`获取任务列表时发生异常 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 通用任务 002
|
||
* 003
|
||
* 007
|
||
*
|
||
* @param taskId
|
||
* @param taskName
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function commonTask(taskId, taskName) {
|
||
const taskType = TASK_ID_MAP[taskId];
|
||
const taskUrl = `${baseUrl}/media-basic-port/api/app/points/${taskType}/add`;
|
||
const taskData = await sudojia.sendRequest(taskUrl, 'post', headers, {
|
||
"orderBy": "release_desc",
|
||
"requestType": "1",
|
||
"siteId": "310110"
|
||
});
|
||
if (0 !== taskData.code) {
|
||
throw new Error(`${taskName}任务失败 -> ${taskData.msg}`);
|
||
}
|
||
console.log(`${taskName}任务成功`);
|
||
await $.wait(sudojia.getRandomWait(5e3, 8e3));
|
||
}
|
||
|
||
/**
|
||
* 更新任务积分
|
||
*
|
||
* @param itemId
|
||
* @returns {Promise<*|void>}
|
||
*/
|
||
async function updateTaskScore(itemId) {
|
||
try {
|
||
const updatedData = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/personal/score/info`, 'post', headers, dataBody);
|
||
if (0 !== updatedData.code) {
|
||
return console.error('更新任务列表失败 ->', updatedData.msg);
|
||
}
|
||
const updatedItem = updatedData.data.jobs.find(job => job.id === itemId);
|
||
if (!updatedItem) {
|
||
return console.error(`未找到任务ID: ${itemId}`);
|
||
}
|
||
return updatedItem.progress;
|
||
} catch (e) {
|
||
console.error(`更新任务列表出错 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取文章 ID
|
||
*
|
||
* @returns {Promise<*|null>}
|
||
*/
|
||
async function getArticleId() {
|
||
try {
|
||
// 频道列表
|
||
const channelIds = [
|
||
// 推荐
|
||
'a978f44b3e284e5e86777f9d4e3be7bb',
|
||
// 要闻
|
||
'01ff4b46f6bf4e19af6fe88e6320a6c1',
|
||
// 时政
|
||
'ba1f152e715f4ee99e6e13a02f6a218e',
|
||
// 三区
|
||
'0375dc90023f43ffafaf9bc161c30348',
|
||
// 城事
|
||
'0ea24f917ab54157bcd2cecffbf9bfa2'
|
||
];
|
||
// 随机选择一个频道
|
||
const channelId = channelIds[Math.floor(Math.random() * channelIds.length)];
|
||
const data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/news/content/list`, 'post', headers, {
|
||
"channel": {
|
||
"id": channelId
|
||
},
|
||
"pageNo": 1,
|
||
"pageSize": 30,
|
||
"orderBy": "release_desc",
|
||
"requestType": "1",
|
||
"siteId": "310110"
|
||
});
|
||
if (0 !== data.code) {
|
||
console.error('获取新闻列表失败 ->', data.msg)
|
||
return null;
|
||
}
|
||
const articles = data.data.records[Math.floor(Math.random() * data.data.records.length)];
|
||
return articles.id;
|
||
} catch (e) {
|
||
console.error(`获取文章 ID 时发生异常 -> ${e}`);
|
||
return null;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 收藏文章
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function favorArticle(articleId) {
|
||
try {
|
||
const data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/news/content/favor`, 'post', headers, {
|
||
"id": articleId,
|
||
"orderBy": "release_desc",
|
||
"requestType": "2",
|
||
"siteId": "310110"
|
||
});
|
||
if (0 !== data.code) {
|
||
return console.error('收藏文章失败 ->', data.msg);
|
||
}
|
||
console.log(`收藏文章成功\n`);
|
||
} catch (e) {
|
||
console.error(`收藏文章时发生异常 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 文章评论
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function commentArticle(articleId) {
|
||
try {
|
||
// 随机评论句子
|
||
const contentList = [
|
||
'👍',
|
||
'👍👍',
|
||
'好!!',
|
||
'占个楼',
|
||
'mark!',
|
||
'读完这篇文章后,我感到充满了力量和决心',
|
||
'这篇文章让我感到非常温暖和鼓舞',
|
||
'激荡团结奋斗的强大正能量,汇聚起亿万人民团结奋斗的磅礴之力。'
|
||
];
|
||
const content = contentList[Math.floor(Math.random() * contentList.length)];
|
||
console.log(`随机获取评论句子:[${content}]`);
|
||
const data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/common/comment/add`, 'post', headers, {
|
||
"content": content,
|
||
"displayResources": [],
|
||
"targetId": articleId,
|
||
"targetType": "content",
|
||
"pageNo": 0,
|
||
"pageSize": 10,
|
||
"orderBy": "create_desc",
|
||
"requestType": "1",
|
||
"siteId": "310110"
|
||
})
|
||
if (0 !== data.code) {
|
||
return console.error('评论文章失败 ->', data.msg, '\n');
|
||
}
|
||
console.log('评论成功\n');
|
||
} catch (e) {
|
||
console.error(`评论文章时发生异常 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取积分
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function getPoints() {
|
||
try {
|
||
const data = await sudojia.sendRequest(`${baseUrl}/media-basic-port/api/app/personal/score/info`, 'post', headers, dataBody);
|
||
if (0 !== data.code) {
|
||
return console.error('获取任务列表失败 ->', data.msg);
|
||
}
|
||
const tasks = data.data.jobs;
|
||
for (const item of tasks) {
|
||
if (['004'].includes(item.id)) {
|
||
continue;
|
||
}
|
||
if ('1' === item.status) {
|
||
message += `【${item.title}】已完成\n`;
|
||
}
|
||
}
|
||
$.points = data.data.totalScore || 0;
|
||
if (data.data.signTitle) {
|
||
console.log(data.data.signTitle);
|
||
message += `${data.data.signTitle}\n`;
|
||
}
|
||
console.log(`当前积分:${$.points}`);
|
||
message += `当前积分:${$.points}\n`;
|
||
} catch (e) {
|
||
console.error(`获取积分时发生异常 -> ${e}`);
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 获取商品列表
|
||
*
|
||
* @returns {Promise<void>}
|
||
*/
|
||
async function getGoodsList() {
|
||
try {
|
||
const requests = [
|
||
{
|
||
params: 'seller_id=31011001&page_no=1&page_size=10&shop_cat_id=1544652237932859394&sort=create_desc',
|
||
type: '限时商品'
|
||
},
|
||
{
|
||
params: 'keyword=&page_no=1&page_size=20&sort=create_desc&seller_id=31011001&shop_cat_id=1431136756879056898',
|
||
type: '虚拟商品'
|
||
}
|
||
];
|
||
for (const req of requests) {
|
||
let data = await sudojia.sendRequest(`https://mall-api.shmedia.tech/goods-service/goods/search?${req.params}`, 'get', headers);
|
||
await $.wait(sudojia.getRandomWait(1e3, 2e3));
|
||
if (!data || !data.data) {
|
||
console.error(`${req.type}: data 数据为空`);
|
||
continue;
|
||
}
|
||
const promotions = data.data.flatMap(item => item.promotion);
|
||
let hasExchangeableGoods = false;
|
||
console.log(`${req.type}:`);
|
||
message += `${req.type}:\n`;
|
||
for (const ex of promotions) {
|
||
const {goods_name, exchange_point} = ex.exchange;
|
||
if ($.points >= exchange_point) {
|
||
console.log(`可兑换[${goods_name}], 所需[${exchange_point}]积分`);
|
||
message += `可兑换[${goods_name}], 所需[${exchange_point}]积分\n`;
|
||
hasExchangeableGoods = true;
|
||
}
|
||
}
|
||
if (!hasExchangeableGoods) {
|
||
message += `当前积分暂无商品可兑换\n\n`;
|
||
console.log(`当前积分暂无商品可兑换\n`);
|
||
}
|
||
}
|
||
} catch (e) {
|
||
console.error(`获取商品列表时发生异常 -> ${e}`);
|
||
}
|
||
}
|