Files
smzdm_script/library_task.js
2025-06-17 15:29:57 +08:00

1468 lines
36 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const { SmzdmBot, requestApi, removeTags, wait } = require('./bot');
// ------------------------------------
class SmzdmTaskBot extends SmzdmBot {
constructor(cookie, env) {
super(cookie);
this.$env = env;
}
// 执行任务列表中的任务
async doTasks(tasks) {
let notifyMsg = '';
for (let i = 0; i < tasks.length; i++) {
const task = tasks[i];
// 待领取任务
if (task.task_status == '3') {
this.$env.log(`领取[${task.task_name}]奖励:`);
const { isSuccess } = await this.receiveReward(task.task_id);
notifyMsg += `${isSuccess ? '🟢' : '❌'}领取[${task.task_name}]奖励${isSuccess ? '成功' : '失败!请查看日志'}\n`;
await wait(5, 15);
}
// 未完成任务
else if (task.task_status == '2') {
// 浏览文章任务
if (task.task_event_type == 'interactive.view.article') {
const { isSuccess } = await this.doViewTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 分享任务
else if (task.task_event_type == 'interactive.share') {
const { isSuccess } = await this.doShareTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 抽奖任务
else if (task.task_event_type == 'guide.crowd') {
const { isSuccess, code } = await this.doCrowdTask(task);
if (code !== 99) {
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
}
await wait(5, 15);
}
// 关注用户任务
else if (task.task_event_type == 'interactive.follow.user') {
const { isSuccess } = await this.doFollowUserTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 关注栏目任务
else if (task.task_event_type == 'interactive.follow.tag') {
const { isSuccess } = await this.doFollowTagTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 关注品牌
else if (task.task_event_type == 'interactive.follow.brand') {
const { isSuccess } = await this.doFollowBrandTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 收藏任务
else if (task.task_event_type == 'interactive.favorite') {
const { isSuccess } = await this.doFavoriteTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 点赞任务
else if (task.task_event_type == 'interactive.rating') {
const { isSuccess } = await this.doRatingTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
// 评论任务
else if (task.task_event_type == 'interactive.comment') {
if (process.env.SMZDM_COMMENT && String(process.env.SMZDM_COMMENT).length > 10) {
const { isSuccess } = await this.doCommentTask(task);
notifyMsg += this.getTaskNotifyMessage(isSuccess, task);
await wait(5, 15);
}
else {
this.$env.log('🟡请设置 SMZDM_COMMENT 环境变量后才能做评论任务!');
}
}
}
}
return notifyMsg;
}
getTaskNotifyMessage(isSuccess, task) {
return `${isSuccess ? '🟢' : '❌'}完成[${task.task_name}]任务${isSuccess ? '成功' : '失败!请查看日志'}\n`;
}
// 执行评论任务
async doCommentTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
const articles = await this.getArticleList(20);
if (articles.length < 1) {
return {
isSuccess: false
};
}
// 随机选一篇文章来评论
const article = articles[Math.floor(Math.random() * articles.length)];
await wait(3, 10);
const {isSuccess, data } = await this.submitComment({
articleId: article.article_id,
channelId: article.article_channel_id,
content: process.env.SMZDM_COMMENT
});
if (!isSuccess) {
return {
isSuccess
};
}
this.$env.log('删除评论');
await wait(20, 30);
const {isSuccess: result } = await this.removeComment(data.data.comment_ID);
if (!result) {
this.$env.log('再试一次');
await wait(10, 20);
// 不成功再执行一次删除
await this.removeComment(data.data.comment_ID);
}
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行点赞任务
async doRatingTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
let article;
if (task.task_description.indexOf('任意') >= 0 || task.task_redirect_url.link_val == '0' || !task.task_redirect_url.link_val) {
// 随机选一篇文章
const articles = await this.getArticleList(20);
if (articles.length < 1) {
return {
isSuccess: false
};
}
article = this.getOneByRandom(articles);
}
else if (task.task_redirect_url.link_type === 'lanmu') {
// 从栏目获取文章
const articles = await this.getArticleListFromLanmu(task.task_redirect_url.link_val, 20);
if (articles.length < 1) {
return {
isSuccess: false
};
}
article = this.getOneByRandom(articles);
}
else if (task.task_redirect_url.link != '' && task.task_redirect_url.link_val != '') {
const channelId = await this.getArticleChannelIdForTesting(task.task_redirect_url.link);
if (!channelId) {
return {
isSuccess: false
};
}
article = {
'article_id': task.task_redirect_url.link_val,
'article_channel_id': channelId
};
}
else {
this.$env.log('尚未支持');
return {
isSuccess: false
};
}
await wait(3, 10);
if (article.article_price) {
// 点值
await this.rating({
method: 'worth_cancel',
type: 3,
id: article.article_id,
channelId: article.article_channel_id
});
await wait(3, 10);
await this.rating({
method: 'worth_create',
type: 1,
id: article.article_id,
channelId: article.article_channel_id
});
await wait(3, 10);
await this.rating({
method: 'worth_cancel',
type: 3,
id: article.article_id,
channelId: article.article_channel_id
});
}
else {
// 点赞
await this.rating({
method: 'like_cancel',
id: article.article_id,
channelId: article.article_channel_id
});
await wait(3, 10);
await this.rating({
method: 'like_create',
id: article.article_id,
channelId: article.article_channel_id
});
await wait(3, 10);
await this.rating({
method: 'like_cancel',
id: article.article_id,
channelId: article.article_channel_id
});
await wait(3, 10);
await this.rating({
method: 'like_create',
id: article.article_id,
channelId: article.article_channel_id
});
await wait(3, 10);
await this.rating({
method: 'like_cancel',
id: article.article_id,
channelId: article.article_channel_id
});
}
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行收藏任务
async doFavoriteTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
let articleId = '';
let channelId = '';
if (task.task_redirect_url.link_type === 'lanmu') {
// 从栏目获取文章
const articles = await this.getArticleListFromLanmu(task.task_redirect_url.link_val, 20);
if (articles.length < 1) {
return {
isSuccess: false
};
}
const article = this.getOneByRandom(articles);
articleId = article.article_id;
channelId = article.article_channel_id;
}
else if (task.task_redirect_url.link_type === 'tag') {
// 从 Tag 获取文章
const articles = await this.getArticleListFromTag(task.task_redirect_url.link_val, task.task_redirect_url.link_title, 20);
if (articles.length < 1) {
return {
isSuccess: false
};
}
const article = this.getOneByRandom(articles);
articleId = article.article_id;
channelId = article.article_channel_id;
}
else if (task.task_redirect_url.link_val == '0' || !task.task_redirect_url.link_val) {
// 随机选一篇文章
const articles = await this.getArticleList(20);
if (articles.length < 1) {
return {
isSuccess: false
};
}
const article = this.getOneByRandom(articles);
articleId = article.article_id;
channelId = article.article_channel_id;
}
else {
articleId = task.task_redirect_url.link_val;
// 获取文章信息
const articleDetail = await this.getArticleDetail(articleId);
if (articleDetail === false) {
return {
isSuccess: false
};
}
channelId = articleDetail.channel_id;
}
await wait(3, 10);
await this.favorite({
method: 'destroy',
id: articleId,
channelId
});
await wait(3, 10);
await this.favorite({
method: 'create',
id: articleId,
channelId
});
await wait(3, 10);
await this.favorite({
method: 'destroy',
id: articleId,
channelId
});
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行关注用户任务
async doFollowUserTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
// 随机选一个用户
const user = await this.getUserByRandom();
if (!user) {
return {
isSuccess: false
};
}
await wait(3, 10);
for (let i = 0; i < Number(task.task_even_num - task.task_finished_num); i++) {
if (user.is_follow == '1') {
await this.follow({
method: 'destroy',
type: 'user',
keyword: user.keyword
});
await wait(3, 10);
}
await this.follow({
method: 'create',
type: 'user',
keyword: user.keyword
});
await wait(3, 10);
if (user.is_follow == '0') {
await this.follow({
method: 'destroy',
type: 'user',
keyword: user.keyword
});
}
await wait(3, 10);
}
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行关注栏目任务(先取关,再关注,最后取关)
async doFollowTagTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
let lanmuId = '';
if (task.task_redirect_url.link_val == '0') {
const tag = await this.getTagByRandom();
if (tag === false) {
return {
isSuccess: false
};
}
lanmuId = tag.lanmu_id;
await wait(3, 10);
}
else {
lanmuId = task.task_redirect_url.link_val;
}
// 获取栏目信息
const tagDetail = await this.getTagDetail(lanmuId);
if (!tagDetail.lanmu_id) {
this.$env.log('获取栏目信息失败!');
return {
isSuccess: false
};
}
await wait(3, 10);
await this.follow({
method: 'destroy',
type: 'tag',
keywordId: tagDetail.lanmu_id,
keyword: tagDetail.lanmu_info.lanmu_name
});
await wait(3, 10);
await this.follow({
method: 'create',
type: 'tag',
keywordId: tagDetail.lanmu_id,
keyword: tagDetail.lanmu_info.lanmu_name
});
await wait(3, 10);
await this.follow({
method: 'destroy',
type: 'tag',
keywordId: tagDetail.lanmu_id,
keyword: tagDetail.lanmu_info.lanmu_name
});
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行关注品牌任务(先取关,再关注,最后取关)
async doFollowBrandTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
// 获取品牌信息
const brandDetail = await this.getBrandDetail(task.task_redirect_url.link_val);
if (!brandDetail.id) {
return {
isSuccess: false
};
}
await wait(3, 10);
await this.followBrand({
method: 'dingyue_lanmu_del',
keywordId: brandDetail.id,
keyword: brandDetail.title
});
await wait(3, 10);
await this.followBrand({
method: 'dingyue_lanmu_add',
keywordId: brandDetail.id,
keyword: brandDetail.title
});
await wait(3, 10);
await this.followBrand({
method: 'dingyue_lanmu_del',
keywordId: brandDetail.id,
keyword: brandDetail.title
});
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行抽奖任务
async doCrowdTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
let { isSuccess, data } = await this.getCrowd('免费', 0);
if (!isSuccess) {
if (process.env.SMZDM_CROWD_SILVER_5 == 'yes') {
({ isSuccess, data } = await this.getCrowd('5碎银子', 5));
if (!isSuccess) {
return {
isSuccess,
code: 99
};
}
}
else {
this.$env.log('🟡请设置 SMZDM_CROWD_SILVER_5 环境变量值为 yes 后才能进行5碎银子抽奖');
return {
isSuccess,
code: 99
};
}
}
await wait(5, 15);
const result = await this.joinCrowd(data);
if (!result.isSuccess) {
return {
isSuccess: result.isSuccess
};
}
this.$env.log('领取奖励');
await wait(5, 15);
return await this.receiveReward(task.task_id);
}
// 执行文章分享任务
async doShareTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
let articles = [];
if (task.article_id == '0') {
articles = await this.getArticleList(task.task_even_num - task.task_finished_num);
await wait(3, 10);
}
else {
articles = [{
article_id: task.article_id,
article_channel_id: task.channel_id
}];
}
for (let i = 0; i < articles.length; i++) {
this.$env.log(`开始分享第 ${i + 1} 篇文章...`);
const article = articles[i];
if (task.task_redirect_url.link_type != 'other') {
// 模拟打开文章
if (/detail_haojia/i.test(task.task_redirect_url.scheme_url)) {
await this.getHaojiaDetail(article.article_id);
}
else {
await this.getArticleDetail(article.article_id);
}
await wait(8, 20);
}
await this.shareArticleDone(article.article_id, article.article_channel_id);
await this.shareDailyReward(article.article_channel_id);
await this.shareCallback(article.article_id, article.article_channel_id);
await wait(5, 15);
}
this.$env.log('领取奖励');
await wait(3, 10);
return await this.receiveReward(task.task_id);
}
// 执行浏览任务
async doViewTask(task) {
this.$env.log(`开始任务: ${task.task_name}`);
let articles = [];
let isRead = true;
if (task.article_id == '0') {
isRead = true;
articles = await this.getArticleList(task.task_even_num - task.task_finished_num);
await wait(3, 10);
}
else {
for (let i = 0; i < task.task_even_num - task.task_finished_num; i++) {
articles.push({
article_id: task.article_id,
article_channel_id: task.channel_id
});
}
isRead = task.task_redirect_url.link_val != '';
}
for (let i = 0; i < articles.length; i++) {
this.$env.log(`开始阅读第 ${i + 1} 篇文章...`);
const article = articles[i];
if (isRead) {
// 模拟打开文章
if (/detail_haojia/i.test(task.task_redirect_url.scheme_url)) {
await this.getHaojiaDetail(article.article_id);
}
else {
await this.getArticleDetail(article.article_id);
}
}
this.$env.log('模拟阅读文章');
await wait(20, 50);
const { isSuccess, response } = await requestApi('https://user-api.smzdm.com/task/event_view_article_sync', {
method: 'post',
headers: this.getHeaders(),
data: {
article_id: article.article_id,
channel_id: article.article_channel_id,
task_id: task.task_id
}
});
if (isSuccess) {
this.$env.log('完成阅读成功。');
}
else {
this.$env.log(`完成阅读失败!${response}`);
}
await wait(5, 15);
}
this.$env.log('领取奖励');
await wait(3, 10);
return await this.receiveReward(task.task_id);
}
// 关注/取关
async follow({keywordId, keyword, type, method}) {
let touchstone = '';
if (type === 'user') {
touchstone = this.getTouchstoneEvent({
event_value: {
cid: 'null',
is_detail: false,
p: '1'
},
sourceMode: '我的_我的任务页',
sourcePage: 'Android/关注/达人/爆料榜',
upperLevel_url: '关注/达人/推荐/'
});
}
else if (type === 'tag') {
touchstone = this.getTouchstoneEvent({
event_value: {
cid: 'null',
is_detail: false
},
sourceMode: '栏目页',
sourcePage: `Android/栏目页/${keyword}/${keywordId}/`,
source_page_type_id: String(keywordId),
upperLevel_url: '个人中心/赚奖励/',
source_area: {
lanmu_id: String(keywordId),
prev_source_scence: '我的_我的任务页'
}
});
}
const { isSuccess, response } = await requestApi(`https://dingyue-api.smzdm.com/dingyue/${method}`, {
method: 'post',
headers: this.getHeaders(),
data: {
touchstone_event: touchstone,
refer: '',
keyword_id: keywordId,
keyword,
type
}
});
if (isSuccess) {
this.$env.log(`${method} 关注成功: ${keyword}`);
}
else {
this.$env.log(`${method} 关注失败!${response}`);
}
return {
isSuccess,
response
};
}
// 随机获取用户
async getUserByRandom() {
const { isSuccess, data, response } = await requestApi('https://dingyue-api.smzdm.com/tuijian/search_result', {
method: 'post',
headers: this.getHeaders(),
data: {
nav_id: 0,
page: 1,
type: 'user',
time_code: ''
}
});
if (isSuccess) {
return data.data.rows[Math.floor(Math.random() * data.data.rows.length)];
}
else {
this.$env.log(`获取用户列表失败!${response}`);
return false;
}
}
// 参加抽奖
async joinCrowd(id) {
const { isSuccess, data, response } = await requestApi('https://zhiyou.m.smzdm.com/user/crowd/ajax_participate', {
method: 'post',
sign: false,
headers: {
...this.getHeadersForWeb(),
Origin: 'https://zhiyou.m.smzdm.com',
Referer: `https://zhiyou.m.smzdm.com/user/crowd/p/${id}/`
},
data: {
crowd_id: id,
sourcePage: `https://zhiyou.m.smzdm.com/user/crowd/p/${id}/`,
client_type: 'android',
sourceRoot: '个人中心',
sourceMode: '幸运屋抽奖',
price_id: 1
}
});
if (isSuccess) {
this.$env.log(removeTags(data.data.msg));
}
else {
this.$env.log(`参加免费抽奖失败: ${response}`);
}
return {
isSuccess,
response
};
}
// 获取抽奖信息
async getCrowd(name, price) {
const { isSuccess, data, response } = await requestApi('https://zhiyou.smzdm.com/user/crowd/', {
sign: false,
parseJSON: false,
headers: this.getHeadersForWeb()
});
const re = new RegExp(`<button\\s+([^>]+?)>\\s+?<div\\s+[^>]+?>\\s*${name}(?:抽奖)?\\s*<\\/div>\\s+<span\\s+class="reduceNumber">-${price}<\\/span>[\\s\\S]+?<\\/button>`, 'ig');
if (isSuccess) {
const crowds = [];
let match;
while ((match = re.exec(data)) !== null) {
crowds.push(match[1]);
}
if (crowds.length < 1) {
this.$env.log(`未找到${name}抽奖`);
return {
isSuccess: false
};
}
let crowd;
if (price > 0 && process.env.SMZDM_CROWD_KEYWORD) {
crowd = crowds.find((item) => {
const match = item.match(/data-title="([^"]+)"/i);
return (match && match[1].indexOf(process.env.SMZDM_CROWD_KEYWORD) >= 0);
});
if (!crowd) {
this.$env.log('未找到符合关键词的抽奖,执行随机选取');
crowd = this.getOneByRandom(crowds);
}
}
else {
crowd = this.getOneByRandom(crowds);
}
const matchCrowd = crowd.match(/data-crowd_id="(\d+)"/i);
if (matchCrowd) {
this.$env.log(`${name}抽奖ID: ${matchCrowd[1]}`);
return {
isSuccess: true,
data: matchCrowd[1]
};
}
else {
this.$env.log(`未找到${name}抽奖ID`);
return {
isSuccess: false
};
}
}
else {
this.$env.log(`获取${name}抽奖失败: ${response}`);
return {
isSuccess: false
};
}
}
// 分享完成
async shareArticleDone(articleId, channelId) {
const { isSuccess, response } = await requestApi('https://user-api.smzdm.com/share/complete_share_rule', {
method: 'post',
headers: this.getHeaders(),
data: {
token: this.token,
article_id: articleId,
channel_id: channelId,
tag_name: 'gerenzhongxin'
}
});
if (isSuccess) {
this.$env.log('完成分享成功。');
return {
isSuccess,
msg: '完成分享成功。'
};
}
else {
this.$env.log(`完成分享失败!${response}`);
return {
isSuccess: false,
msg: '完成分享失败!'
};
}
}
// 分享完成后回调接口
async shareCallback(articleId, channelId) {
const { isSuccess, response } = await requestApi('https://user-api.smzdm.com/share/callback', {
method: 'post',
headers: this.getHeaders(),
data: {
token: this.token,
article_id: articleId,
channel_id: channelId,
touchstone_event: this.getTouchstoneEvent({
event_value: {
aid: articleId,
cid: channelId,
is_detail: true,
pid: '无'
},
sourceMode: '排行榜_社区_好文精选',
sourcePage: `Android/长图文/P/${articleId}/`,
upperLevel_url: '排行榜/社区/好文精选/文章_24H/'
})
}
});
if (isSuccess) {
this.$env.log('分享回调完成。');
return {
isSuccess,
msg: ''
};
}
else {
this.$env.log(`分享回调失败!${response}`);
return {
isSuccess,
msg: '分享回调失败!'
};
}
}
// 分享的每日奖励(貌似没啥用)
async shareDailyReward(channelId) {
const { isSuccess, data, response } = await requestApi('https://user-api.smzdm.com/share/daily_reward', {
method: 'post',
headers: this.getHeaders(),
data: {
token: this.token,
channel_id: channelId
}
});
if (isSuccess) {
this.$env.log(data.data.reward_desc);
return {
isSuccess,
msg: data.data.reward_desc
};
}
else {
if (data) {
this.$env.log(data.error_msg);
return {
isSuccess,
msg: data.error_msg
};
}
else {
this.$env.log(`分享每日奖励请求失败!${response}`);
return {
isSuccess,
msg: '分享每日奖励请求失败!'
};
}
}
}
// 获取文章列表
async getArticleList(num = 1) {
const { isSuccess, data, response } = await requestApi('https://article-api.smzdm.com/ranking_list/articles', {
headers: this.getHeaders(),
data: {
offset: 0,
channel_id: 76,
tab: 2,
order: 0,
limit: 20,
exclude_article_ids: '',
stream: 'a',
ab_code: 'b'
}
});
if (isSuccess) {
// 取前 num 个做任务
return data.data.rows.slice(0, num);
}
else {
this.$env.log(`获取文章列表失败: ${response}`);
return [];
}
}
async getRobotToken() {
const { isSuccess, data, response } = await requestApi('https://user-api.smzdm.com/robot/token', {
method: 'post',
headers: this.getHeaders()
});
if (isSuccess) {
return data.data.token;
}
else {
this.$env.log(`Robot Token 获取失败!${response}`);
return false;
}
}
// 获取栏目信息
async getTagDetail(id) {
const { isSuccess, data, response } = await requestApi('https://common-api.smzdm.com/lanmu/config_data', {
headers: this.getHeaders(),
data: {
middle_page: '',
tab_selects: '',
redirect_params: id
}
});
if (isSuccess) {
return data.data;
}
else {
this.$env.log(`获取栏目信息失败!${response}`);
return {};
}
}
// 获取栏目列表
async getTagByRandom() {
const { isSuccess, data, response } = await requestApi('https://dingyue-api.smzdm.com/tuijian/search_result', {
headers: this.getHeaders(),
data: {
time_code: '',
nav_id: '',
type: 'tag',
limit: 20
}
});
if (isSuccess) {
return data.data.rows[Math.floor(Math.random() * data.data.rows.length)];
}
else {
this.$env.log(`获取栏目列表失败!${response}`);
return false;
}
}
// 获取文章详情
async getArticleDetail(id) {
const { isSuccess, data, response } = await requestApi(`https://article-api.smzdm.com/article_detail/${id}`, {
headers: this.getHeaders(),
data: {
comment_flow: '',
hashcode: '',
lastest_update_time: '',
uhome: 0,
imgmode: 0,
article_channel_id: 0,
h5hash: ''
}
});
if (isSuccess) {
return data.data;
}
else {
this.$env.log(`获取文章详情失败!${response}`);
return false;
}
}
// 获取好价详情
async getHaojiaDetail(id) {
const { isSuccess, data, response } = await requestApi(`https://haojia-api.smzdm.com/detail/${id}`, {
headers: this.getHeaders(),
data: {
imgmode: 0,
hashcode: '',
h5hash: ''
}
});
if (isSuccess) {
return data.data;
}
else {
this.$env.log(`获取好价详情失败!${response}`);
return false;
}
}
// 收藏
async favorite({id, channelId, method}) {
const { isSuccess, response } = await requestApi(`https://user-api.smzdm.com/favorites/${method}`, {
method: 'post',
headers: this.getHeaders(),
data: {
touchstone_event: this.getTouchstoneEvent({
event_value: {
aid: id,
cid: channelId,
is_detail: true
},
sourceMode: '我的_我的任务页',
sourcePage: `Android/长图文/P/${id}/`,
upperLevel_url: '个人中心/赚奖励/'
}),
token: this.token,
id,
channel_id: channelId
}
});
if (isSuccess) {
this.$env.log(`${method} 收藏成功: ${id}`);
}
else {
this.$env.log(`${method} 收藏失败!${response}`);
}
return {
isSuccess,
response
};
}
getTouchstoneEvent(obj) {
const defaultObj = {
search_tv: 'f',
sourceRoot: '个人中心',
trafic_version: '113_a,115_b,116_e,118_b,131_b,132_b,134_b,136_b,139_a,144_a,150_b,153_a,179_a,183_b,185_b,188_b,189_b,193_a,196_b,201_a,204_a,205_a,208_b,222_b,226_a,228_a,22_b,230_b,232_b,239_b,254_a,255_b,256_b,258_b,260_b,265_a,267_a,269_a,270_c,273_b,276_a,278_a,27_a,280_a,281_a,283_b,286_a,287_a,290_a,291_b,295_a,302_a,306_b,308_b,312_b,314_a,317_a,318_a,322_b,325_a,326_a,329_b,32_c,332_b,337_c,341_a,347_a,349_b,34_a,351_a,353_b,355_a,357_b,366_b,373_B,376_b,378_b,380_b,388_b,391_b,401_d,403_b,405_b,407_b,416_a,421_a,424_b,425_b,427_a,436_b,43_j,440_a,442_a,444_b,448_a,450_b,451_b,454_b,455_a,458_c,460_a,463_c,464_b,466_b,467_b,46_a,470_b,471_b,474_b,475_a,484_b,489_a,494_b,496_b,498_a,500_a,503_b,507_b,510_bb,512_b,515_a,520_a,522_b,525_c,527_b,528_a,59_a,65_b,85_b,102_b,103_a,106_b,107_b,10_f,11_b,120_a,143_b,157_g,158_c,159_c,160_f,161_d,162_e,163_a,164_a,165_a,166_f,171_a,174_a,175_e,176_d,209_b,225_a,235_a,236_b,237_c,272_b,296_c,2_f,309_a,315_b,334_a,335_d,339_b,346_b,361_b,362_d,367_b,368_a,369_e,374_b,381_c,382_b,383_d,385_b,386_c,389_i,38_b,390_d,396_a,398_b,3_a,413_a,417_a,418_c,419_b,420_b,422_e,428_a,430_a,431_d,432_e,433_a,437_b,438_c,478_b,479_b,47_a,480_a,481_b,482_a,483_a,488_b,491_j,492_j,504_b,505_a,514_a,518_b,52_d,53_d,54_v,55_z1,56_z3,66_a,67_i,68_a1,69_i,74_i,77_d,93_a',
tv: 'z1'
};
return JSON.stringify({...defaultObj, ...obj});
}
// 关注品牌
async followBrand({keywordId, keyword, method}) {
const touchstone = this.getTouchstoneEvent({
event_value: {
cid: '44',
is_detail: true,
aid: String(keywordId)
},
sourceMode: '百科_品牌详情页',
sourcePage: `Android/其他/品牌详情页/${keyword}/${keywordId}/`,
upperLevel_url: '个人中心/赚奖励/'
});
const { isSuccess, response } = await requestApi(`https://dingyue-api.smzdm.com/dy/util/api/user_action`, {
method: 'post',
headers: this.getHeaders(),
data: {
action: method,
params: JSON.stringify({
keyword: keywordId,
keyword_id: keywordId,
type: 'brand'
}),
refer: `Android/其他/品牌详情页/${keyword}/${keywordId}/`,
touchstone_event: touchstone
}
});
if (isSuccess) {
this.$env.log(`${method} 关注成功: ${keyword}`);
}
else {
this.$env.log(`${method} 关注失败!${response}`);
}
return {
isSuccess,
response
};
}
// 获取品牌信息
async getBrandDetail(id) {
const { isSuccess, data, response } = await requestApi('https://brand-api.smzdm.com/brand/brand_basic', {
headers: this.getHeaders(),
data: {
brand_id: id
}
});
if (isSuccess) {
return data.data;
}
else {
this.$env.log(`获取品牌信息失败!${response}`);
return {};
}
}
// 根据栏目信息获取文章列表
async getArticleListFromLanmu(id, num = 1) {
const lanmuDetail = await this.getTagDetail(id);
if (!lanmuDetail.lanmu_id) {
return [];
}
const { isSuccess, data, response } = await requestApi('https://common-api.smzdm.com/lanmu/list_data', {
headers: this.getHeaders(),
data: {
price_lt: '',
order: '',
category_ids: '',
price_gt: '',
referer_article: '',
tag_params: '',
mall_ids: '',
time_sort: '',
page: 1,
params: id,
limit: 20,
tab_params: lanmuDetail.tab[0].params
}
});
if (isSuccess) {
// 取前 num 个做任务
return data.data.rows.slice(0, num);
}
else {
this.$env.log(`获取文章列表失败: ${response}`);
return [];
}
}
// 点赞
async rating({id, channelId, method, type}) {
const { isSuccess, response } = await requestApi(`https://user-api.smzdm.com/rating/${method}`, {
method: 'post',
headers: this.getHeaders(),
data: {
touchstone_event: this.getTouchstoneEvent({
event_value: {
aid: id,
cid: channelId,
is_detail: true
},
sourceMode: '栏目页',
sourcePage: `Android//P/${id}/`,
upperLevel_url: '栏目页///'
}),
token: this.token,
id,
channel_id: channelId,
wtype: type
}
});
if (isSuccess) {
this.$env.log(`${method} 点赞成功: ${id}`);
}
else {
this.$env.log(`${method} 点赞失败!${response}`);
}
return {
isSuccess,
response
};
}
// 发表评论
async submitComment({ articleId, channelId, content }) {
const { isSuccess, data, response } = await requestApi('https://comment-api.smzdm.com/comments/submit', {
method: 'post',
headers: this.getHeaders(),
data: {
touchstone_event: this.getTouchstoneEvent({
event_value: {
aid: articleId,
cid: channelId,
is_detail: true
},
sourceMode: '好物社区_全部',
sourcePage: `Android/长图文/${articleId}/评论页/`,
upperLevel_url: '好物社区/首页/全部/',
sourceRoot: '社区'
}),
is_like: 3,
reply_from: 3,
smiles: 0,
atta: 0,
parentid: 0,
token: this.token,
article_id: articleId,
channel_id: channelId,
content
}
});
if (isSuccess) {
this.$env.log(`评论发表成功: ${data.data.comment_ID}`);
}
else {
this.$env.log(`评论发表失败!${response}`);
}
return {
isSuccess,
data,
response
};
}
// 删除评论
async removeComment(id) {
const { isSuccess, response } = await requestApi('https://comment-api.smzdm.com/comments/delete_comment', {
method: 'post',
headers: this.getHeaders(),
data: {
comment_id: id
}
});
if (isSuccess) {
this.$env.log(`评论删除成功: ${id}`);
}
else {
this.$env.log(`评论删除失败!${response}`);
}
return {
isSuccess,
response
};
}
// 获取 Dingyue 状态
async getDingyueStatus(name) {
const { isSuccess, data, response } = await requestApi('https://dingyue-api.smzdm.com/dingyue/follow_status', {
method: 'post',
headers: this.getHeaders(),
data: {
rules: JSON.stringify([{
type: 'tag',
keyword: name
}])
}
});
if (isSuccess) {
return data;
}
else {
this.$env.log(`获取订阅状态失败: ${response}`);
return {};
}
}
// 根据 Tag ID 获取文章列表
async getArticleListFromTag(id, name, num = 1) {
const status = this.getDingyueStatus(name);
const { isSuccess, data, response } = await requestApi('https://tag-api.smzdm.com/theme/detail_feed', {
headers: this.getHeaders(),
data: {
article_source: 1,
past_num: 0,
feed_sort: 2,
smzdm_id: status.smzdm_id,
tag_id: id,
name,
time_sort: 0,
page: 1,
article_tab: 0,
limit: 20
}
});
if (isSuccess) {
// 取前 num 个做任务
return data.data.rows.slice(0, num);
}
else {
this.$env.log(`获取文章列表失败: ${response}`);
return [];
}
}
// 通过 url 获取文章 channel_id
async getArticleChannelIdForTesting(url) {
const { isSuccess, response } = await requestApi(url, {
method: 'get',
headers: this.getHeaders(),
parseJSON: false,
sign: false
});
if (!isSuccess) {
this.$env.log(`获取文章信息失败!${response}`);
return false;
}
// 通过正则提取页面中的 channel_id
const re = /'channel_id'\s*:\s*'(\d+)'/;
const matchRet = response.match(re);
if (!matchRet) {
this.$env.log(`获取文章信息失败!${response}`);
return false;
}
return matchRet[1];
}
}
module.exports = {
SmzdmTaskBot
};