Files
qinglong/脚本库/APP版/账密/小牛电动/2025-04-28_sudojia_xniu_881d6e72.js
2026-05-24 05:33:05 +00:00

305 lines
9.3 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.
// # Source: https://github.com/sudojia/AutoTaskScript/blob/script/src/client/sudojia_xniu.js
// # Raw: https://raw.githubusercontent.com/sudojia/AutoTaskScript/script/src/client/sudojia_xniu.js
// # Repo: sudojia/AutoTaskScript
// # Path: src/client/sudojia_xniu.js
// # UploadedAt: 2025-04-28T19:26:13+08:00
// # SHA256: 881d6e7286177862b1e9c05ebd6c71ceeb80a12924183f25c85a2f710a64feda
// # Category: APP版/账密
// # Evidence: username/password/mobile/login
//
/**
* 小牛电动 APP
*
* 账号#密码
* export XNIU_ACCOUNT = '18888888888#123456'
* 多账号用 & 或换行
*
* @author Telegram@sudojia
* @site https://blog.imzjw.cn
* @date 2024/08/26
*
* const $ = new Env('小牛电动')
* cron: 19 11 * * *
*/
const initScript = require('../utils/initScript')
const {$, notify, sudojia, checkUpdate} = initScript('小牛电动');
const xniuList = process.env.XNIU_ACCOUNT ? process.env.XNIU_ACCOUNT.split(/[\n&]/) : [];
// 消息推送
let message = '';
// 接口地址
const baseUrl = 'https://app-api.niu.com'
// 请求头
const headers = {
'User-Agent': 'manager/5.7.4 (android; OPPO R9s 9);lang=zh-CN;clientIdentifier=Domestic;timezone=Asia/Shanghai;model=OPPO_OPPO R9s;deviceName=OPPO R9s;ostype=android',
'Content-Type': 'application/json',
'Accept-Encoding': 'gzip',
};
!(async () => {
await checkUpdate($.name, xniuList);
for (let i = 0; i < xniuList.length; i++) {
const index = i + 1;
$.isLogin = true;
let [phone, pwd] = xniuList[i].split('#');
console.log(`\n*****第[${index}]个${$.name}账号*****`);
await getToken(phone, sudojia.md5(pwd));
if (!$.isLogin) {
continue;
}
await $.wait(sudojia.getRandomWait(800, 1200));
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(1200, 2000));
await getQuestionList();
await $.wait(sudojia.getRandomWait(2000, 2500));
await readGuide();
await $.wait(sudojia.getRandomWait(2000, 2500));
await getPostIdByCity();
await $.wait(sudojia.getRandomWait(2000, 2500));
await followUser();
await $.wait(sudojia.getRandomWait(3000, 3500));
await followUser();
await $.wait(sudojia.getRandomWait(2000, 2500));
await getPoints();
}
/**
* 获取 token
*
* @param phone 手机号
* @param pwd 密码
* @returns {Promise<void>}
*/
async function getToken(phone, pwd) {
try {
const headerCp = JSON.parse(JSON.stringify(headers));
headerCp['Content-Type'] = 'application/x-www-form-urlencoded';
headerCp.token = 'tokenExperienceMode';
const params = `password=${pwd}&grant_type=password&scope=base&app_id=niu_ktdrr960&account=${phone}`
const data = await sudojia.sendRequest(`https://account.niu.com/v3/api/oauth2/token`, 'post', headerCp, params);
if (0 !== data.status) {
console.log(data.desc);
$.isLogin = false;
return;
}
console.log('登录成功~');
headers.token = data.data.token.access_token;
$.userId = data.data.user.user_id;
} catch (e) {
console.error(`获取 token 时发生异常:` + e);
$.isLogin = false;
}
}
/**
* 获取用户信息
*
* @returns {Promise<void>}
*/
async function getUserInfo() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/user/profile?user_id=${$.userId}`, 'get', headers);
if (0 !== data.status) {
console.log(data.desc);
return;
}
console.log(`昵称:${data.data.user_nick_name}`);
message += `昵称:${data.data.user_nick_name}\n`;
} catch (e) {
console.error(`获取用户信息时发生异常:` + e);
}
}
/**
* 获取问题列表
* type1 热门 2 最新提问 3 最新回答
*
* @returns {Promise<*>}
*/
async function getQuestionList() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/qa/list?type=2&category_id=&page=1&page_size=30&_=${Date.now()}`, 'get', headers);
if (0 !== data.status) {
console.log(data.desc);
return;
}
const quest = data.data.items[Math.floor(Math.random() * data.data.items.length)];
console.log(`开始回答[${quest.content}]`);
await $.wait(sudojia.getRandomWait(2000, 2500));
await getAnswer(quest.id);
} catch (e) {
console.error(`获取问题列表时发生异常:` + e);
}
}
/**
* 获取回答评论
*
* @param pid
* @returns {Promise<void>}
*/
async function getAnswer(pid) {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/posts/comments/list?parent_id=${pid}&parent_type=1&page=1&page_size=20&hide_hot=1&version=2&_=${Date.now()}`, 'get', headers);
if (0 !== data.status) {
console.log(data.desc);
return;
}
let answer;
if (!data.data.items || data.data.items.length === 0) {
console.log('这个问题的回答评论为空,将使用默认的回答评论【我也遇到过】');
answer = '我也遇到过';
} else {
answer = data.data.items[Math.floor(Math.random() * data.data.items.length)].content;
}
console.log(`开始回答评论 -> ${answer}`);
await $.wait(sudojia.getRandomWait(2000, 2500));
await postAnswer(pid, answer);
} catch (e) {
console.error(`获取回答评论时发生异常:` + e);
}
}
/**
* 回答问题
*
* @param pid
* @param content
* @returns {Promise<void>}
*/
async function postAnswer(pid, content) {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/posts/comments`, 'post', headers, {
"content": content,
"object": 2,
"parent_id": pid
});
if (0 !== data.status) {
console.log(data.desc);
return;
}
console.log(`回答成功`);
} catch (e) {
console.error(`回答问题时发生异常:` + e);
}
}
/**
* 阅读社区指引
*
* @returns {Promise<void>}
*/
async function readGuide() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/posts/detail?id=1940&version=2&_=${Date.now()}`, 'get', headers);
if (0 !== data.status) {
console.log(data.desc);
return;
}
await $.wait(sudojia.getRandomWait(2000, 2500));
console.log(`阅读社区指引完成`);
} catch (e) {
console.error(`阅读社区指引时发生异常:` + e);
}
}
/**
* 根据不同的城市获取文章ID
*
* @returns {Promise<void>}
*/
async function getPostIdByCity() {
try {
for (let i = 0; i < 2; i++) {
const cityCodeList = ['110000', '120000', '310000', '440100', '440300', '320400', '441900', '442000', '441300', '440700', '431100', '371000'];
const city = cityCodeList[Math.floor(Math.random() * cityCodeList.length)];
const data = await sudojia.sendRequest(`${baseUrl}/community/api/group/city/recommend_list?city_code=${city}&last_score=0&page_size=20&_=${Date.now()}`, 'get', headers);
if (0 !== data.status) {
console.log(data.desc);
return;
}
const {id, user_id} = data.data.items[Math.floor(Math.random() * data.data.items.length)];
await $.wait(sudojia.getRandomWait(2000, 2500));
await share(id);
await $.wait(sudojia.getRandomWait(800, 1200));
$.uid = user_id;
}
} catch (e) {
console.error(`获取文章ID时发生异常` + e);
}
}
/**
* 分享文章
*
* @param postId 文章ID
* @returns {Promise<void>}
*/
async function share(postId) {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/posts/shares`, 'post', headers, {
"id": postId
});
if (0 !== data.status) {
console.log(data.desc);
return;
}
console.log(`分享文章成功`);
} catch (e) {
console.error(`分享文章时发生异常:` + e);
}
}
/**
* 关注用户
*
* @returns {Promise<void>}
*/
async function followUser() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/community/api/user/follow/create`, 'post', headers, {
"follow_user_id": $.uid
});
if (0 !== data.status) {
console.log(data.desc);
return;
}
if (2 === data.data.followType) {
console.log(`关注用户成功`);
} else {
console.log(`取关用户成功`);
}
} catch (e) {
console.error(`关注用户时发生异常:` + e);
}
}
/**
* 获取积分
*
* @returns {Promise<void>}
*/
async function getPoints() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/v5/points/index`, 'get', headers);
if (0 !== data.status) {
console.log(data.desc);
return;
}
console.log(`当前积分:${data.data.userPoints}`);
message += `当前积分:${data.data.userPoints}\n\n`;
} catch (e) {
console.error(`获取积分时发生异常:` + e);
}
}