阿里云:
服务器购买地址
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=201905
2.部署教程
3.代码如下
const axios = require("axios");
var sid = ""
var uid = ""
var cookie = `MEIZUSTORESESSIONID=`
const MeiZu = config.meizu
var 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.nickname
let rcookie = response.headers["set-cookie"][0]
scookie = rcookie.split(";")[0]
cookie += scookie
}
return cookie;
}
*/
// 获取access_token
async 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_id
nickname = response.data.nickname
return 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获取sid
async 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].value
console.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.mcoin
return 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
,然后依次执行签到、获取文章列表、查询任务、执行各类任务,并处理任务的完成情况。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论