Continue seeded Qinglong script collection

This commit is contained in:
Hermes Agent
2026-05-24 05:33:05 +00:00
parent ca1a4275e4
commit b082da3fe1
392 changed files with 131619 additions and 7 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,342 @@
// # Source: https://github.com/sudojia/AutoTaskScript/blob/script/src/client/sudojia_xiangwan.js
// # Raw: https://raw.githubusercontent.com/sudojia/AutoTaskScript/script/src/client/sudojia_xiangwan.js
// # Repo: sudojia/AutoTaskScript
// # Path: src/client/sudojia_xiangwan.js
// # UploadedAt: 2025-04-28T19:26:13+08:00
// # SHA256: 659341f6d90da24ae84aff1ca890993bb08f62f22537ed7eca9ee139ad06e61d
// # Category: APP版/账密
// # Evidence: username/password/mobile/login
//
/**
* 享玩游戏APP
* 下载链接https://dl.duoyou.com/fenapk/xwshare/xw_100016.apk?version=1.3
*
* 会员v0起始签到 10 个玩豆,连续签到递增 1 玩豆,最高签到 15 个玩豆
* 会员v1-2起始 15最高 20
* ...
* 会员v10起始 75最高 80
* 具体自行查看签到规则
*
* 以会员v0来计算包含连签奖励
* 10 玩豆 兑换 0.1 现金,
* 500 玩豆 兑换 5 现金,大约需 21 天
* 1000 玩豆 兑换 10 现金,大约需 30 天
* 5000 玩豆 兑换 50 现金,大约需 200 天
* 10000 玩豆 兑换 100现金大约需 381 天
* 30000 玩豆 兑换 300 现金,大约需 1135 天 😂😂😂
*
* export XWGAME_ACCOUNTS = '手机号#密码'
* 多账号用 & 或换行
*
* @author Telegram@sudojia
* @site https://blog.imzjw.cn
* @date 2025/02/25
*
* const $ = new Env('享玩游戏APP')
* cron: 33 0 * * *
*/
const initScript = require('../utils/initScript')
const {$, notify, sudojia, checkUpdate} = initScript('享玩游戏APP');
const crypto = require('crypto');
const moment = require('moment');
const fs = require('fs').promises;
const path = require('path');
const xiangWanList = process.env.XWGAME_ACCOUNTS ? process.env.XWGAME_ACCOUNTS.split(/[\n&]/) : [];
// 消息推送
let message = '';
// token 缓存地址
const TOKEN_CACHE_PATH = path.join(__dirname, 'xiangwan_token_cache.json');
// 接口地址
const baseUrl = 'https://sdk-api.xiangwan.com'
// 加密秘钥Base64
const keyBase64 = '5snOI0E5WUpP99pG5+fzug==';
// 解码 Base64 得到原始的二进制密钥
const key = Buffer.from(keyBase64, 'base64');
// 加密 IvBase64
const ivBase64 = 'KhVRUtkYTNM82dSDxb7/YQ==';
// 解码 Base64 得到原始的二进制 IV
const iv = Buffer.from(ivBase64, 'base64');
// 请求头
const headers = {
'User-Agent': 'okhttp/4.11.0',
'Accept-Encoding': 'gzip',
'Content-Type': 'application/x-www-form-urlencoded'
};
!(async () => {
await checkUpdate($.name, xiangWanList);
for (let i = 0; i < xiangWanList.length; i++) {
const index = i + 1;
const [account, pwd] = xiangWanList[i].split('#');
console.log(`\n*****第[${index}]个${$.name}账号*****`);
await login(account, pwd);
if (!$.isLogin) {
continue;
}
await $.wait(sudojia.getRandomWait(1e3, 2e3));
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 sign();
await $.wait(sudojia.getRandomWait(1e3, 2e3));
await getUserInfo();
}
/**
* 登录
*
* @param account
* @param password
* @returns {Promise<void>}
*/
async function login(account, password) {
try {
let cachedToken = await getTokenFromCache("xiangwan", account);
if (cachedToken) {
headers.authorization = `Bearer ${cachedToken}`;
console.log('使用缓存 token 登录,验证中...');
const isValid = await validateToken(cachedToken);
await $.wait(sudojia.getRandomWait(2e3, 3e3));
if (isValid) {
$.isLogin = true;
console.log('token 验证有效✅');
return;
} else {
console.log('缓存 token 验证失效,开始重新登录更新 token...');
}
}
const encryptData = await sudojia.sendRequest(`${baseUrl}/account/account_login`, 'post', headers, {
"params": encryptCredentials(JSON.stringify({
...getCommonParams(),
account: account,
password: password
}))
});
const decryptData = JSON.parse(decryptCredentials(encryptData));
if (200 !== decryptData.status_code) {
$.isLogin = false;
return console.error(`登录失败 ->`, decryptData);
}
console.log('登录成功~');
headers.authorization = `Bearer ${decryptData.data.token}`;
$.isLogin = true;
// 保存 token 到文件
await saveTokenToCache("xiangwan", account, decryptData.data.token);
} catch (e) {
$.isLogin = false;
if (e.response || e.response.data) {
console.error(`登录时发生异常 ->`, e.response.data);
} else {
console.error(`登录时发生异常 ->`, e);
}
}
}
/**
* 签到
*
* @returns {Promise<void>}
*/
async function sign() {
try {
console.log('\n开始执行...');
await $.wait(sudojia.getRandomWait(1e3, 2e3));
const days = moment().format('YYYYMMDD');
const encryptData = await sudojia.sendRequest(`${baseUrl}/discover/sign`, 'post', headers, {
"params": encryptCredentials(JSON.stringify({
...getCommonParams(),
"days": days
}))
});
const decryptData = JSON.parse(decryptCredentials(encryptData));
if (200 !== decryptData.status_code) {
message += `签到失败 -> ${decryptData.message}\n`;
return console.error(`签到失败 ->`, decryptData.message);
}
console.log(`签到成功,恭喜获得:${decryptData.data.score}玩豆`);
message += `签到成功,恭喜获得:${decryptData.data.score}玩豆\n`;
} catch (e) {
console.error(`签到时发生异常 ->`, e);
}
}
/**
* 获取用户信息
*
* @returns {Promise<void>}
*/
async function getUserInfo() {
try {
const encryptData = await sudojia.sendRequest(`${baseUrl}/me/member_info`, 'post', headers, {
"params": encryptCredentials(JSON.stringify({
...getCommonParams()
}))
});
const decryptData = JSON.parse(decryptCredentials(encryptData));
if (200 !== decryptData.status_code) {
return console.error(`获取用户信息时发生异常 ->`, decryptData);
}
const {nickname, mobile, balance} = decryptData.data;
const hiddenMobile = `${mobile.slice(0, 3)}***${mobile.slice(-3)}` || 18888888888;
const displayName = nickname || "吴彦祖";
console.log(`${displayName}(${hiddenMobile})`);
console.log(`当前玩豆:${balance}`);
message += `${nickname}(${hiddenMobile})\n`;
message += `当前玩豆:${balance}\n\n`;
} catch (e) {
console.error(`获取用户信息时发生异常 ->`, e);
}
}
/**
* 验证 token 是否有效
*
* @param token
* @returns {Promise<boolean>}
*/
async function validateToken(token) {
try {
const encryptData = await sudojia.sendRequest(`${baseUrl}/me/member_account`, 'post', {
authorization: `Bearer ${token}`
}, {
"params": encryptCredentials(JSON.stringify({
...getCommonParams()
}))
});
const decryptData = JSON.parse(decryptCredentials(encryptData));
return 200 === decryptData.status_code;
} catch (error) {
console.error('验证 token 时发生异常:', error);
return false;
}
}
/**
* 获取公共请求参数
*
* @returns {Object} 包含公共请求参数的对象
*/
function getCommonParams() {
return {
"app_channel": "xw_100016",
"app_version": "1.3",
"invite_uid": "",
"app_os": "android",
"server_device_id": "176"
};
}
/**
* 加密请求数据
*
* @returns {string} 加密后的Base64字符串
*/
function encryptCredentials(plainText) {
// 创建加密器
const cipher = crypto.createCipheriv('aes-128-cbc', key, iv);
// 加密数据
let encrypted = cipher.update(plainText, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}
/**
* 解密响应数据
*
* @param encryptedText
* @returns {string}
*/
function decryptCredentials(encryptedText) {
// 创建解密器
const decipher = crypto.createDecipheriv('aes-128-cbc', key, iv);
// 解密数据
let decrypted = decipher.update(encryptedText, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
/**
* 从文件中读取 token
*
* @param platform
* @param username
* @returns {Promise<*|null>}
*/
async function getTokenFromCache(platform, username) {
try {
try {
// 检查文件是否存在
await fs.access(TOKEN_CACHE_PATH);
} catch (error) {
console.warn('token 缓存文件不存在,创建一个空文件...');
await fs.writeFile(TOKEN_CACHE_PATH, JSON.stringify({}, null, 2), 'utf8');
return null;
}
const cache = await fs.readFile(TOKEN_CACHE_PATH, 'utf-8');
// 检查文件内容是否为空
if (!cache.trim()) {
console.warn('token 缓存文件内容为空,开始重新登录生成 token 内容');
return null;
}
let cacheObj;
try {
cacheObj = JSON.parse(cache);
} catch (parseError) {
console.error('解析 token 缓存文件失败:', parseError);
return null; // 解析失败时返回 null
}
// 检查平台和用户名是否存在
if (cacheObj[platform] && cacheObj[platform][username]) {
return cacheObj[platform][username];
} else {
console.warn(`token 缓存文件中未找到[${username}]的账号,开始重新登录生成 token`);
return null;
}
} catch (error) {
console.error('读取缓存文件失败:', error);
return null;
}
}
/**
* 将 token 保存到文件
*
* @param platform
* @param username
* @param token
*
* @returns {Promise<void>}
*/
async function saveTokenToCache(platform, username, token) {
try {
let cacheObj = {};
try {
const cache = await fs.readFile(TOKEN_CACHE_PATH, 'utf-8');
if (cache.trim()) {
cacheObj = JSON.parse(cache);
} else {
console.warn('token 缓存文件内容为空,开始初始化为空对象...');
}
} catch (error) {
console.warn('读取缓存文件失败,初始化为空对象:', error);
}
if (!cacheObj[platform]) {
cacheObj[platform] = {};
}
cacheObj[platform][username] = token;
await fs.writeFile(TOKEN_CACHE_PATH, JSON.stringify(cacheObj, null, 2), 'utf-8');
console.log('token 已保存到缓存文件[xiangwan_token_cache.json]');
console.log(`路径:${TOKEN_CACHE_PATH}`);
} catch (error) {
console.error('保存 token 失败:', error);
}
}

View File

@@ -0,0 +1,235 @@
// # Source: https://github.com/sudojia/AutoTaskScript/blob/script/src/client/sudojia_tuchong.js
// # Raw: https://raw.githubusercontent.com/sudojia/AutoTaskScript/script/src/client/sudojia_tuchong.js
// # Repo: sudojia/AutoTaskScript
// # Path: src/client/sudojia_tuchong.js
// # UploadedAt: 2025-04-28T19:26:13+08:00
// # SHA256: 1bc74b1583f9e64ca80f93708622e78e4f8972e2c837fb9b581804ae01ffbcb3
// # Category: APP版/账密
// # Evidence: username/password/mobile/login
//
/**
* 图虫APP
*
* 每日签到及部分任务获取积分
* 自行重设密码
* export TUC_ACCOUNTS = '手机号#密码'
* 多账号用 & 或换行
*
* @author Telegram@sudojia
* @site https://blog.imzjw.cn
* @date 2024/12/28
*
* const $ = new Env('图虫')
* cron: 38 5 * * *
*/
const initScript = require('../utils/initScript')
const {$, notify, sudojia, checkUpdate} = initScript('图虫');
const crypto = require('crypto');
const tuList = process.env.TUC_ACCOUNTS ? process.env.TUC_ACCOUNTS.split(/[\n&]/) : [];
const key = Buffer.from('41343045353832423133303141423545', 'hex');
// 消息推送
let message = '';
// 接口地址
const baseUrl = 'https://api.tuchong.com'
// 请求头
const headers = {
'User-Agent': 'okhttp/3.12.2 com.ss.android.tuchong (Tuchong: 7391 7.39.1) (Android: 11 30)',
'Accept-Encoding': 'gzip',
'Content-Type': 'application/x-www-form-urlencoded',
'version': '7576',
'channel': 'oppo',
'platform': 'android',
};
!(async () => {
await checkUpdate($.name, tuList);
for (let i = 0; i < tuList.length; i++) {
const index = i + 1;
const [phone, pwd] = tuList[i].split('#');
console.log(`\n*****第[${index}]个${$.name}账号*****`);
const isLogin = await login(phone, pwd);
if (!isLogin) {
continue;
}
await $.wait(sudojia.getRandomWait(1e3, 2e3));
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(1e3, 2e3))
await checkIn();
await $.wait(sudojia.getRandomWait(1e3, 2e3))
await getArticle();
await $.wait(sudojia.getRandomWait(1e3, 2e3))
await getPointStatus();
}
/**
* 登录
*
* @param phone
* @param pwd
* @returns {Promise<boolean>}
*/
async function login(phone, pwd) {
try {
const encryptedPhone = encrypt(phone);
const data = await sudojia.sendRequest(`${baseUrl}/accounts/login`, 'post', headers, {
"password": pwd,
"account": encryptedPhone
});
if (0 !== data.account_status) {
console.error(`账号或密码错误`);
return false;
}
headers.token = data.token;
$.accountId = data.identity;
console.log(`登录成功`);
return true;
} catch (e) {
console.error(`登录时发生异常:${e}`);
}
}
/**
* 获取用户信息
*
* @returns {Promise<void>}
*/
async function getUserInfo() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/2/sites/${$.accountId}`, 'get', headers);
if ('SUCCESS' !== data.result) {
return console.error(`获取用户信息失败 ->`, data);
}
console.log(`${data.site.name}(${data.site.site_id})`);
message += `${data.site.name}(${data.site.site_id})\n`;
} catch (e) {
console.error(`获取用户信息时发生异常:${e}`);
}
}
/**
* 签到
*
* @returns {Promise<void>}
*/
async function checkIn() {
try {
const data = await sudojia.sendRequest(`${baseUrl}/point/check-in`, 'get', headers);
if ('SUCCESS' !== data.result) {
message += `签到失败, ${data.message}\n`;
return console.error(`签到失败 ->`, data);
}
console.log('签到成功');
message += `签到成功\n`;
} catch (e) {
console.error(`签到时发生异常:${e}`);
}
}
/**
* 获取文章信息
* 然后随机选择一篇文章进行点赞和关注作者操作
*
* @returns {Promise<void>}
*/
async function getArticle() {
try {
const data = await sudojia.sendRequest(`https://tuchong.com/gapi/feed/app`, 'get', headers);
// 过滤掉没有data_id的项得到有效的文章列表
const filteredFeedList = data.feedList.filter(item => item.data_id !== undefined);
let listElement = filteredFeedList[Math.floor(Math.random() * filteredFeedList.length)];
console.log(`获取到文章id${listElement.data_id}`);
// 执行点赞操作
await performAction('点赞', favorite, listElement.data_id);
// 执行关注作者操作
await performAction('关注作者', follow, listElement.entry.author_id);
} catch (e) {
console.error(`开宝箱时发生异常:${e}`);
}
}
/**
* 点赞操作
* 调用performInteraction函数来执行点赞操作
*
* @param postId
* @returns {Promise<void>}
*/
async function favorite(postId) {
return await performInteraction('favorite', postId);
}
/**
* 关注作者操作
* 调用performInteraction函数来执行关注作者操作
*
* @param userId
* @returns {Promise<void>}
*/
async function follow(userId) {
return await performInteraction('follow', userId, 'site_id');
}
/**
* 执行交互操作,点赞和关注
*
* @param action 交互操作类型 'favorite' 或 'follow'
* @param id 文章ID或用户ID
* @param paramKey 请求参数中的键名,默认为 'post_id'
*
* @returns {Promise<void>}
*/
async function performInteraction(action, id, paramKey = 'post_id') {
try {
let data = await sudojia.sendRequest(`https://tuchong.com/gapi/interactive/${action}?_rticket=${new Date().getTime()}`, 'put', headers, {
[paramKey]: id
});
console.log(`开始取消操作`);
await $.wait(sudojia.getRandomWait(1e3, 2e3));
data = await sudojia.sendRequest(`https://tuchong.com/gapi/interactive/${action}?${paramKey}=${id}`, 'DELETE', headers);
console.log(data);
} catch (e) {
console.error(`${action}时发生异常:${e}`);
}
}
async function performAction(description, actionFunction, id) {
console.log(`开始${description}`);
await $.wait(sudojia.getRandomWait(1e3, 2e3));
// 执行传入的操作函数
await actionFunction(id);
}
/**
* 获取积分
*
* @returns {Promise<void>}
*/
async function getPointStatus() {
try {
const data = await sudojia.sendRequest(`https://m.tuchong.com/tuchonggapi/misc/point/v2/status?platform=android&version=7.57.6`, 'get', headers);
console.log(`当前积分:${data.status.total_point}`);
console.log(`当前等级:${data.status.influence_level_text}`);
message += `当前积分:${data.status.total_point}\n当前等级:${data.status.influence_level_text}\n\n`;
} catch (e) {
console.error(`获取积分状态时发生异常:${e}`);
}
}
function encrypt(text) {
const cipher = crypto.createCipheriv('aes-128-ecb', key, '');
cipher.setAutoPadding(true);
let encrypted = cipher.update(text, 'utf8', 'base64');
encrypted += cipher.final('base64');
return encrypted;
}

View File

@@ -0,0 +1,304 @@
// # 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);
}
}

View File

@@ -0,0 +1,96 @@
# Source: https://github.com/NaroisCool/naro-scripts/blob/master/%E8%9E%83%E8%9F%B9%E7%A7%9F%E5%8F%B7%E7%88%AC%E8%99%AB.py
# Raw: https://raw.githubusercontent.com/NaroisCool/naro-scripts/master/%E8%9E%83%E8%9F%B9%E7%A7%9F%E5%8F%B7%E7%88%AC%E8%99%AB.py
# Repo: NaroisCool/naro-scripts
# Path: 螃蟹租号爬虫.py
# UploadedAt: 2025-10-28T05:54:28+08:00
# SHA256: bb196fc9a07e36e2128f56eb40eb3b6ca348cf3716f82f66fdb8116b383d4197
# Category: APP版/账密
# Evidence: username/password/mobile/login
#螃蟹租号爬虫
import requests
import notify
# 定义基础URL
base_url = 'https://api.pxb7.com/api/product/daily/details?game_id=61&date=1712419200&page={}'
header ={
"accept": "application/json, text/plain, */*",
"accept-language": "zh-CN,zh;q=0.9",
"ApiToken":"dfb00eb839abe281c499e141686f3247",
"token":"feb93033a7ab04ea442b08103ec019a4",
"loginstatus": "false",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site"}
ol = 0
ten = 0
mobile = 0
start_page = 1
while True:
# 构造完整的URL
url = base_url.format(start_page)
# 发送HTTP GET请求并获取响应
response = requests.get(url=url,headers=header).json()
code = response.get('code')
# 检查响应的状态码
if code == 200:
data = response.get('data')
#print(data)
#昨日卖出总数
total = data.get('total')
start_page = data.get('page')
#租号数据
data2 = data.get('list')
#总共的页码
pages = (total + 10 -1) // 10
print('总共页数'+str(pages))
print('总数'+str(total))
print(''+str(start_page)+'')
if start_page <= pages:
for l in data2:
try:
if 'OL' in l.get('category')[0].get('value'):
gj = l.get('category')[3].get('value')
name = l.get('name')
date = l.get('pay_date')
pop = str(l.get('collect'))
price = l.get('price')
olf = open('ol.txt','a')
olf.write('官阶:'+gj+'\n描述:'+name+'\n价格:'+str(price)+'\n成交时间'+date+'\n欢迎度'+pop+'\n')
olf.close()
#print('官阶:'+gj+'\n描述'+name+'\n价格'+price+'\n成交时间'+date+'\n欢迎度'+pop)
if price >= 900:
notify.send('爬取结果','官阶:'+gj+'\n描述:'+name+'\n价格:'+str(price)+'\n成交时间'+date+'\n欢迎度'+pop+'\n\n')
ol = ol +1
if '十周年' in l.get('category')[0].get('value'):
gj = l.get('category')[3].get('value')
name = l.get('name')
date = l.get('pay_date')
pop = str(l.get('collect'))
price = l.get('price')
tf = open('ten.txt','a')
tf.write('官阶:'+gj+'\n描述:'+name+'\n价格:'+str(price)+'\n成交时间'+date+'\n欢迎度'+pop+'\n\n')
tf.close()
ten = ten +1
if '移动' in l.get('category')[0].get('value'):
gj = l.get('category')[3].get('value')
name = l.get('name')
date = l.get('pay_date')
pop = str(l.get('collect'))
price = l.get('price')
mf = open('mobile.txt','a')
mf.write('官阶:'+gj+'\n描述:'+name+'\n价格:'+str(price)+'\n成交时间'+date+'\n欢迎度'+pop+'\n\n')
mf.close()
mobile = mobile +1
except:
print('出错')
if start_page == pages:
print('遍历完成!')
notify.send('遍历完成!','ol/十周年/移动'+str(ol)+'/'+str(ten)+'/'+str(mobile))
break
else:
start_page = start_page +1
else:
break

View File

@@ -0,0 +1,132 @@
// # Source: https://github.com/sudojia/AutoTaskScript/blob/script/src/web/sudojia_aliyundrive.js
// # Raw: https://raw.githubusercontent.com/sudojia/AutoTaskScript/script/src/web/sudojia_aliyundrive.js
// # Repo: sudojia/AutoTaskScript
// # Path: src/web/sudojia_aliyundrive.js
// # UploadedAt: 2025-04-28T19:26:13+08:00
// # SHA256: 75ec43e2a22bf9b15950ca462ac41bcfb78ba18983f400ec906670a29fd035c9
// # Category: APP版/账密
// # Evidence: username/password/mobile/login
//
/**
* 阿里云盘每日签到
*
* 移除了获取奖励, 目前仅支持签到
* export ALI_REFRESH_TOKEN = 'xxxxx'
* 多账号用 & 或换行
*
* @author Telegram@sudojia
* @site https://blog.imzjw.cn
* @date 2024/5/18
*
* const $ = new Env('阿里云盘签到')
* cron: 35 10 * * *
*/
const initScript = require('../utils/initScript')
const {$, notify, sudojia, checkUpdate} = initScript('阿里云盘签到');
// 环境变量
const refreshTokenList = process.env.ALI_REFRESH_TOKEN ? process.env.ALI_REFRESH_TOKEN.split(/[\n&]/) : [];
// 消息推送
let message = '';
// 阿里云盘 API 配置
const API_CONFIG = {
"SIGN_IN_API": "https://member.aliyundrive.com/v1/activity/sign_in_list",
"GET_REWARD_API": "https://member.aliyundrive.com/v1/activity/sign_in_reward?_rx-s=mobile",
"ACCESS_TOKEN_API": "https://auth.aliyundrive.com/v2/account/token"
}
!(async () => {
await checkUpdate($.name, refreshTokenList);
for (let i = 0; i < refreshTokenList.length; i++) {
const index = i + 1;
const refreshToken = refreshTokenList[i];
console.log(`\n*****第[${index}]个${$.name}账号*****`);
message += `📣====${$.name}账号[${index}]====📣\n`;
await main(refreshToken);
await $.wait(sudojia.getRandomWait(2300, 2800));
}
if (message) {
await notify.sendNotify(`${$.name}`, `${message}`);
}
})().catch((e) => $.logErr(e)).finally(() => $.done());
async function main(refreshToken) {
const accessToken = await getAccessToken(refreshToken);
if (!accessToken) {
console.log('获取access_token失败, refresh_token可能有误');
return;
}
await $.wait(sudojia.getRandomWait(1200, 2000));
const signInCount = await AliSignIn(refreshToken, accessToken);
// await $.wait(1000);
// await getReward(accessToken, signInCount);
}
/**
* 获取 access_token
*
* @returns {Promise<void>}
*/
async function getAccessToken(refreshToken) {
try {
const params = {
grant_type: 'refresh_token',
refresh_token: refreshToken
}
const data = await sudojia.sendRequest(API_CONFIG.ACCESS_TOKEN_API, 'post', {}, params);
if (!data.access_token) {
console.log('获取access_token失败, refresh_token可能有误');
process.exit(0);
}
message += `【用户昵称】${data.nick_name}(${data.user_name})\n`;
return data.access_token;
} catch (e) {
$.logErr('获取access_token接口异常', e);
return null;
}
}
/**
* 签到
*
* @returns {Promise<void>}
*/
async function AliSignIn(refreshToken, accessToken) {
try {
const params = {
grant_type: 'refresh_token',
refresh_token: refreshToken
}
const headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
}
const data = await sudojia.sendRequest(API_CONFIG.SIGN_IN_API, 'post', headers, params);
console.log(data.success ? '签到成功\n' : '签到失败\n');
message += data.success ? '【签到状态】签到成功\n' : '【签到状态】签到失败\n'
message += `【签到统计】已累计签到${data.result.signInCount}\n\n`;
// 返回签到天数
return data.result.signInCount;
} catch (e) {
$.logErr('请求签到接口异常:', e);
return null;
}
}
/**
* 获取签到奖励
*
* @returns {Promise<void>}
*/
async function getReward(accessToken, signInCount) {
const params = {
signInDay: signInCount
}
const headers = {
'Content-Type': 'application/json',
'Authorization': `Bearer ${accessToken}`
}
const data = await sudojia.sendRequest(API_CONFIG.GET_REWARD_API, 'post', headers, params);
console.log(`奖励: ${data.result.notice}\n`);
message += `【签到奖励】${data.result.notice}\n`
}