阿里云:
服务器购买地址
https://t.aliyun.com/U/C6sVsb若失效,可用地址
https://www.aliyun.com/activity/wuying/dj?source=5176.29345612&userCode=49hts92d腾讯云:
https://curl.qcloud.com/wJpWmSfU若失效,可用地址
https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console华为云
https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=2019052.部署教程
3.代码如下
const axios = require("axios");var sid = ""var uid = ""var cookie = `MEIZUSTORESESSIONID=`const MeiZu = config.meizuvar nickname = "未命名"var Mcoin = 0;let sleep = ms => new Promise(resolve => setTimeout(resolve, ms));// 封装meizuGet方法async function meizuGet(url, data=null, method="get") {const config = {method: method,url: url,headers: {Referer: "https://www.meizu.cn","local-time": Date.now(),"android-app-channel": "meizu","app-mode":1,"user-agent": "android_app_myplus","android-app-version_name": "6.5.9","android-app-version-code": 50000061,cookie},...(method === 'post' && {data}),};try {//console.log(config)const response = await axios(config);return response;} catch (error) {console.error('请求错误', error.response.data.error);return {error:error.response.data.error,code:400};}}// 获取cookie/*async function getCookie() {const tokenUrl = `https://myplus-api.meizu.cn/myplus-qing/ug/app/start`;const response = await meizuGet(tokenUrl, "", 'get');if (response && response.data && response.data.code === 200) {nickname = response.data.data.member.nicknamelet rcookie = response.headers["set-cookie"][0]scookie = rcookie.split(";")[0]cookie += scookie}return cookie;}*/// 获取access_tokenasync function getAccessToken() {const url = 'https://api.meizu.com/oauth/token';const data = new URLSearchParams({grant_type: 'remember_me',scope: 'trust',remember_me: MeiZu.remember,client_secret: MeiZu.secret,client_id: MeiZu.clientid,account_belong: 'MEIZU'});try {const response = await meizuGet(url, data,"post");if (response.data && response.data.access_token) {console.log('获取access_token成功');uid = response.data.user_idnickname = response.data.nicknamereturn response.data.access_token;} else {console.error('获取access_token失败', response);return null;}} catch (error) {// console.error('获取access_token时发生错误', error.response.data);return null;}}// 使用access_token获取sidasync function getSid(accessToken) {const url = `https://myplus-api.meizu.cn/myplus-login/g/app/login?token=${accessToken}`;try {const response = await meizuGet(url);if (response.data && response.data.code==200) {sid = response.data.data[0].valueconsole.log('获取sid成功');cookie += sid+";"return cookie} else {console.error('获取sid失败', response.data.msg);return null;}} catch (error) {console.error('获取sid时发生错误', error);return null;}}async function getCookie() {const accessToken = await getAccessToken();if (!accessToken) {console.error('无法获取access_token');return null;}cookie = await getSid(accessToken);if (!cookie) {console.error('无法获取sid');return null;}console.log("获取sid成功: "+sid)return `MEIZUSTORESESSIONID=${sid};` ;}// 查询任务列表函数async function queryTasks() {const url = `https://myplus-api.meizu.cn/myplus-muc/u/user/point/task/M_COIN`;try {const response = await meizuGet(url, {}, 'post');if (response && response.data && response.data.code === 200) {console.log('任务列表查询成功');Mcoin = response.data.data.mcoinreturn response.data.data.list; // 返回任务列表} else {console.log('任务列表查询失败', response.data.msg);return [];}} catch (error) {console.error('查询任务列表时发生错误', error);return [];}}async function getreply(){let res = await meizuGet("https://myplus-api.meizu.cn/myplus-qing/ug/comment/rapid/list")if(res.data.code==200) return res.data.data.list[0]else return "共赴山海,热爱无界"}async function signInMzStore(uid, sid) {const url = `https://app.store.res.meizu.com/mzstore/sign/add`;const postData = `uid=${uid}&sid=${sid}`;const response = await meizuGet(url, postData, "post");}// 发表主题函数async function createTopic(title, content, forumId, topicIds) {const url = `https://myplus-api.meizu.cn/myplus-qing/u/content/auth/create/v4`;const data = {ats: [],content: `[{\"c\":[{\"id\":\"${topicIds}\",\"n\":\"${title}\",\"c\":[{\"x\":\"\"}],\"t\":\"tc\"}],\"t\":\"p\"}]`,deviceName: "meizu18pro", // 这里可以根据实际情况修改设备名称enterId: 0,format: 1,forumId: forumId,forumTagId: 0,locationId: 0,pollId: 0,title: title,topicIds: topicIds};try {const response = await meizuGet(url, data, 'post');if (response && response.data && response.data.code === 200) {console.log(`主题 "${title}" 发表成功,主题ID:${response.data.data.id}`);} else {console.log(`主题 "${title}" 发表失败`, response.data.msg);}} catch (error) {console.error(`发表主题 "${title}" 时发生错误`, error);}}// 收藏主题函数async function addFavorite(contentId) {const url = `https://myplus-api.meizu.cn/myplus-qing/u/content/auth/fav/${contentId}?id=${contentId}`;try {const response = await meizuGet(url, "", 'post');if (response && response.data && response.data.code === 200) {console.log(`主题ID ${contentId} 收藏成功`);} else {console.log(`主题ID ${contentId} 收藏失败`, response.data.msg);}} catch (error) {console.error(`收藏主题ID ${contentId} 时发生错误`, error);}}// 评论主题函数async function addComment(contentId, comment) {const url = `https://myplus-api.meizu.cn/myplus-qing/u/comment/add/v2`;const data = {ats: [],content: await getreply(),contentId: contentId,createTime: Math.floor(Date.now() / 1000), // 当前时间的Unix时间戳deviceName: "meizu18pro", // 这里可以根据实际情况修改设备名称isChp: 0,parentId: 0,replyId: 0,replyUid: 0};try {const response = await meizuGet(url,data, 'post', data);if (response && response.data && response.data.code === 200) {console.log(`主题ID ${contentId} 评论成功`);} else {console.log(`主题ID ${contentId} 评论失败`, response.data.msg);}} catch (error) {console.error(`评论主题ID ${contentId} 时发生错误`, error);}}// 关注用户函数async function followUser(uid) {const url = `https://myplus-api.meizu.cn/myplus-qing/u/member/follow?uid=${uid}`;try {const response = await meizuGet(url, "", 'post');if (response && response.data && response.data.code === 200) {console.log(`用户ID ${uid} 关注成功`);} else {console.log(`用户ID ${uid} 关注失败`, response.data.msg);}} catch (error) {console.error(`关注用户ID ${uid} 时发生错误`, error);}}async function addLike(id) {const url = `https://myplus-api.meizu.cn/myplus-qing/u/like/content/add?id=${id}`;try {const response = await meizuGet(url,"", 'get');if (response && response.data && response.data.code === 200) {console.log(`帖子ID ${id} 点赞成功`);} else {console.log(`帖子ID ${id} 点赞失败`, response.data.msg);}} catch (error) {console.error(`点赞帖子ID ${id} 时发生错误`, error);}}// 获取论坛文章的函数async function getForumArticles() {const url = "https://myplus-api.meizu.cn/myplus-qing/ug/topic/content?currentPage=0&topicId=534&sortType=2";try {const response = await meizuGet(url, "", 'get');if (response && response.data && response.data.data && response.data.data.rows) {const articles = response.data.data.rows.slice(1, 11).map(article => {return {id: article.id,title: article.title,uid: article.uid};});return articles;} else {console.log('没有获取到文章列表');return [];}} catch (error) {console.error('获取文章列表失败', error);return [];}}async function signIn() {const url = `https://myplus-api.meizu.cn/myplus-muc/u/user/signin`;let res = await meizuGet(url, "", "post");if (res && res.data.code == 200) {msg = `煤球奖励+${res.data.data.mcoin},已连续签到${res.data.data.continuous}天`;} else {msg = res.data.msg + "[可能已签到]";}console.log(msg)return msg}// 关注用户函数async function followUsers(userList) {for (let i = 0; i < Math.min(3, userList.length); i++) {await followUser(userList[i].uid);await sleep(5000);}}// 点赞函数async function likePosts(postList) {for (let i = 0; i < Math.min(10, postList.length); i++) {await addLike(postList[i].id); //await sleep(5000);}}// 收藏主题函数async function favoriteTopics(topicList) {for (let i = 0; i < Math.min(3, topicList.length); i++) {await addFavorite(topicList[i].id);await sleep(5000);}}async function addComments(topicList) {for (let i = 0; i < Math.min(3, topicList.length); i++) {await addComment(topicList[i].id);await sleep(5000);}}// 任务async function meizu() {let signMsg = ""try {const cookie = await getCookie();if (!cookie) {msg = '获取cookie失败';return "【魅族社区】:" + msg;}signMsg = await signIn();const arList = await getForumArticles()const tasks = await queryTasks();for (const task of tasks) {if (!task.complete) { // 如果任务未完成console.log("去执行任务:" + task.taskName)switch (task.taskName) {case '每日签到':await signIn();break;case '点赞':await likePosts(arList)break;case '关注用户':await followUser(129768998);await followUsers(arList);break;case '发表评论':await addComments(arList)break;case '收藏主题':await favoriteTopics(arList)break;case '发布主题'://await createTopic("小鸟说早早早", "你为什么背上炸药包", 22, 534)break;default:console.log(`没有定义任务 "${task.taskName}" 的执行操作,跳过`);break;}} else console.log("已完成")}await signInMzStore(uid, sid)await queryTasks()} catch (err) {msg = `签到接口请求错误`;console.log(err);}return `【魅族社区(${nickname})】:\n 签到: ${signMsg}\n 煤球:${Mcoin}`;}//meizu()module.exports = meizu;
解析
这脚本是一个为魅族社区用户设计的自动化任务程序,旨在通过各种社区活动(如签到、点赞、关注用户、评论、收藏主题等)来积累社区货币(煤球)和增强用户参与度。脚本使用axios来发送HTTP请求,并通过异步函数处理各种社区活动。
meizuGet:
封装了 axios请求的函数,可以进行GET或POST请求。通过动态配置如headers和data来适配不同的API需求。getAccessToken 和 getSid:
用于获取用户的 access_token和sid。这些凭证对于后续的所有API请求都是必需的,因为它们用于验证用户身份。getCookie:
首先获取 access_token,然后使用它来获取sid。这个过程中会更新全局的cookie变量,以确保之后的请求都能通过身份验证。signIn:
签到函数,用户每日签到,增加煤球并记录连续签到天数。 queryTasks:
查询当前可用的任务列表,并返回这些任务的详细信息。 createTopic, addFavorite, addComment, followUser 和 addLike:
分别用于发表主题、收藏主题、评论主题、关注用户和点赞帖子。这些都是社区内的互动功能,有助于提升用户的活跃度和社区货币。 getForumArticles:
获取论坛文章列表,这些文章将用于执行点赞、评论和收藏操作。 likePosts, favoriteTopics, addComments 和 followUsers:
执行具体的社区任务,如点赞、收藏、评论和关注。这些函数通常会处理多个条目,并在每个操作之间暂停一定时间(例如5000毫秒)以模仿人类用户的行为并避免触发反爬虫机制。 meizu:
主函数,协调上述所有操作。它首先确保可以获取到必需的 cookie,然后依次执行签到、获取文章列表、查询任务、执行各类任务,并处理任务的完成情况。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论