├── .github └── workflows │ └── daily-task.yml ├── .gitignore ├── AutoSignMachine.js ├── LICENSE ├── README.md ├── commands ├── 52pojie.js ├── bilibili.js ├── iqiyi.js ├── tasks │ ├── 52pojie │ │ ├── 52pojie.js │ │ └── sign.js │ ├── bilibili │ │ ├── AddCoinsForVideo.js │ │ ├── ExchangeSilver2Coin.js │ │ ├── LiveGetSignInfo.js │ │ ├── LiveSign.js │ │ ├── MangaSign.js │ │ ├── ReceiveVipPrivilege.js │ │ ├── account.js │ │ ├── bilibili.js │ │ ├── dailyTaskStatus.js │ │ ├── init.js │ │ ├── myWallet.js │ │ └── watchAndShareVideo.js │ ├── iqiyi │ │ ├── dailyBrowserClub.js │ │ ├── dailyFeed.js │ │ ├── dailyTask.js │ │ ├── dailyWatchVideo.js │ │ ├── init.js │ │ ├── iqiyi.js │ │ ├── signPoint.js │ │ └── signVip.js │ ├── unicom │ │ ├── Niujie.js │ │ ├── RSAUtils.js │ │ ├── commentSystem.js │ │ ├── dailyBookLuckdraw.js │ │ ├── dailyBookRead.js │ │ ├── dailyCheapStorePage.js │ │ ├── dailyCourse.js │ │ ├── dailyGrabdollPage.js │ │ ├── dailyLKMH.js │ │ ├── dailyTTliulan.js │ │ ├── dailyTurntablePage.js │ │ ├── dailyVideo.js │ │ ├── dailyVideoBook.js │ │ ├── dailyVideoFreeGoods.js │ │ ├── dailyVideoScratchcard.js │ │ ├── dailyYYQ.js │ │ ├── dailyYYY.js │ │ ├── dailylottery.js │ │ ├── dailylotteryintegral.js │ │ ├── dailysignin.js │ │ ├── gameYearBox.js │ │ ├── init.js │ │ ├── integral.js │ │ ├── jflottery.js │ │ ├── playGame.json │ │ ├── producGame.js │ │ ├── taskcallback.js │ │ ├── unicom.js │ │ └── woTree.js │ └── wps │ │ ├── clock_in.js │ │ └── wps.js ├── unicom.js └── wps.js ├── default.json ├── docker-compose.yml ├── docker ├── Dockerfile └── entrypoint.sh ├── index.js ├── package-lock.json ├── package.json ├── serverless.yml ├── tscf.js └── utils ├── request.js ├── scheduler.js └── util.js /.github/workflows/daily-task.yml: -------------------------------------------------------------------------------- 1 | name: daily-task 2 | 3 | 4 | on: 5 | 6 | push: # push触发 7 | branches: [ main ] 8 | workflow_dispatch: # 手动触发 9 | schedule: # 计划任务触发 10 | - cron: '30 22 * * *' # cron表达式,Actions时区是UTC时间,所以要往前推8个小时(4-23) 11 | 12 | 13 | jobs: 14 | daily-task: 15 | if: github.event.repository.owner.id == github.event.sender.id 16 | 17 | env: 18 | ENABLE_52POJIE: ${{secrets.ENABLE_52POJIE}} 19 | ENABLE_BILIBILI: ${{secrets.ENABLE_BILIBILI}} 20 | ENABLE_IQIYI: ${{secrets.ENABLE_IQIYI}} 21 | ENABLE_UNICOM: ${{secrets.ENABLE_UNICOM}} 22 | 23 | runs-on: ubuntu-latest 24 | 25 | strategy: 26 | matrix: 27 | node-version: [12] 28 | node-registry: ['https://registry.npmjs.org'] 29 | 30 | steps: 31 | 32 | # 检出 33 | - name: Checkout 34 | uses: actions/checkout@v2 35 | 36 | # 设置服务器时区为东八区 37 | - name: Set time zone 38 | run: sudo timedatectl set-timezone 'Asia/Shanghai' 39 | 40 | - name: Use Node.js ${{ matrix.node-version }} 41 | uses: actions/setup-node@v1 42 | with: 43 | node-version: ${{ matrix.node-version }} 44 | registry-url: ${{ matrix.node-registry }} 45 | 46 | - name: Get npm cache directory 47 | id: npm-cache 48 | run: | 49 | echo "::set-output name=dir::$(npm config get cache)" 50 | 51 | - name: restore npm cache 52 | uses: actions/cache@v2 53 | id: use-npm-cache 54 | with: 55 | path: ${{ steps.npm-cache.outputs.dir }} 56 | key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} 57 | 58 | - name: restore npm dependencies 59 | uses: actions/cache@v2 60 | id: use-npm-depends 61 | with: 62 | path: | 63 | node_modules 64 | */*/node_modules 65 | key: ${{ runner.os }}-depends-${{ hashFiles('**/package-lock.json') }} 66 | 67 | - name: restore task cache 68 | uses: actions/cache@v2 69 | id: use-task-cache 70 | with: 71 | path: | 72 | /home/runner/.AutoSignMachine 73 | key: ${{ runner.os }}-task-${{ hashFiles('**/package-lock.json') }} 74 | 75 | - name: Install dependencies 76 | if: steps.use-npm-cache.outputs.cache-hit != 'true' || steps.use-npm-depends.outputs.cache-hit != 'true' 77 | run: npm install 78 | 79 | # 运行 52pojie 签到任务 80 | - name: Run 52pojie daily task 81 | if: ${{ env.ENABLE_52POJIE }} 82 | env: 83 | htVD_2132_auth: ${{secrets.pojie_htVD_2132_auth}} 84 | htVD_2132_saltkey: ${{secrets.pojie_htVD_2132_saltkey}} 85 | run: node index.js 52pojie --htVD_2132_auth=${htVD_2132_auth} --htVD_2132_saltkey=${htVD_2132_saltkey} 86 | 87 | # 运行 bilibili 签到任务 88 | - name: Run bilibili daily task 89 | if: ${{ env.ENABLE_BILIBILI }} 90 | env: 91 | DedeUserID: ${{secrets.bilibili_USERID}} 92 | SESSDATA: ${{secrets.bilibili_SESSDATA}} 93 | bili_jct: ${{secrets.bilibili_BILIJCT}} 94 | otherConfigs: ${{secrets.bilibili_OTHERCONFIGS}} 95 | run: node index.js bilibili --DedeUserID=${DedeUserID} --SESSDATA=${SESSDATA} --bili_jct=${bili_jct} ${otherConfigs} 96 | 97 | # 运行 iqiyi 签到任务 98 | - name: Run iqiyi daily task 99 | if: ${{ env.ENABLE_IQIYI }} 100 | env: 101 | P00001: ${{secrets.iqiyi_P00001}} 102 | P00PRU: ${{secrets.iqiyi_P00PRU}} 103 | QC005: ${{secrets.iqiyi_QC005}} 104 | dfp: ${{secrets.iqiyi_DFP}} 105 | run: node index.js iqiyi --P00001=${P00001} --P00PRU=${P00PRU} --QC005=${QC005} --dfp=${dfp} 106 | 107 | # 运行 unicom 签到任务 108 | - name: Run unicom daily task 109 | env: 110 | user: ${{secrets.unicom_user}} 111 | password: ${{secrets.unicom_password}} 112 | appid: ${{secrets.unicom_appid}} 113 | run: node index.js unicom --user=${user} --password=${password} --appid=${appid} 114 | 115 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode 3 | yarn.lock 4 | 5 | jspm_packages 6 | 7 | .serverless -------------------------------------------------------------------------------- /AutoSignMachine.js: -------------------------------------------------------------------------------- 1 | const yargs = require('yargs/yargs') 2 | // const { hideBin } = require('yargs/helpers') 3 | /** 4 | * 命令执行入口 5 | */ 6 | var AutoSignMachine_Run = (argv) => { 7 | yargs((argv || process.argv).slice(2)) 8 | .commandDir('commands') 9 | .demand(1) 10 | .config('config', 'JSON配置文件路径') 11 | .help() 12 | .alias('h', 'help') 13 | .locale('en') 14 | .showHelpOnFail(true, '使用--help查看有效选项') 15 | .epilog('copyright 2020 LunnLew') 16 | .argv; 17 | } 18 | module.exports = { 19 | run: AutoSignMachine_Run 20 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 LunnLew 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # AutoSignMachine 2 | 3 | **一个自动执行任务的工具,通过它可以实现账号自动签到,自动领取权益等功能,帮助我们轻松升级。** 4 | 5 | ## bilibili签到任务 6 | **实现现B站帐号的每日自动观看、分享、投币视频,获取经验,每月自动领取会员权益等功能,帮助我们轻松升级会员到Lv6并赚取电池。** 7 | 8 | 详细功能目录如下: 9 | 10 | * **每天自动登录,获取经验** 11 | * **每天自动观看、分享、投币视频** 12 | * **每天漫画自动签到** 13 | * **每天自动直播签到,领取奖励** 14 | * **每天自动使用直播中心银瓜子兑换B币** 15 | * **每个月自动领取5张B币券和大会员权益** 16 | 17 | ```sh 18 | node index.js bilibili --cookies "b6*********4a581;" 19 | ``` 20 | 21 | ### docker部署 22 | ```sh 23 | # 构建 24 | docker build -t auto-sign-machine:latest -f docker/Dockerfile . 25 | # 运行 26 | docker run \ 27 | --name auto-sign-machine \ 28 | -d \ 29 | -e enable_bilibili=true \ 30 | -e DedeUserID=41*****1073 \ 31 | -e SESSDATA=05*********333*b1 \ 32 | -e bili_jct=b6*********4a581 \ 33 | auto-sign-machine:latest 34 | ``` 35 | 36 | ## 52pojie签到任务 37 | **实现现52pojie帐号的每日签到任务。** 38 | 39 | ```sh 40 | node index.js 52pojie --htVD_2132_auth b22d**********************aNjr --htVD_2132_saltkey Jc***********I 41 | ``` 42 | 43 | ### docker部署 44 | ```sh 45 | # 构建 46 | docker build -t auto-sign-machine:latest -f docker/Dockerfile . 47 | # 运行 48 | docker run \ 49 | --name auto-sign-machine \ 50 | -d \ 51 | --label traefik.enable=false \ 52 | -e enable_52pojie=true \ 53 | -e htVD_2132_auth=b******************jr \ 54 | -e htVD_2132_saltkey=Jc************I \ 55 | auto-sign-machine:latest 56 | ``` 57 | 、 58 | ## iqiyi签到任务 59 | **实现现iqiyi帐号的每日签到任务。** 60 | 详细功能目录如下: 61 | 62 | * **普通用户每天自动获取积分** 63 | * **vip用户每日签到随机成长值及积分** 64 | * **vip用户每日浏览会员俱乐部+1成长值** 65 | 66 | ```sh 67 | node index.js iqiyi --P00001 b********jr --P00PRU 12***24 --QC005 5f******6fe --dfp Jc************I 68 | ``` 69 | 70 | ### docker部署 71 | ```sh 72 | # 构建 73 | docker build -t auto-sign-machine:latest -f docker/Dockerfile . 74 | # 运行 75 | docker run \ 76 | --name auto-sign-machine \ 77 | -d \ 78 | --label traefik.enable=false \ 79 | -e enable_iqiyi=true \ 80 | -e P00001=b********jr \ 81 | -e P00PRU=12***24 \ 82 | -e QC005=5f******6fe \ 83 | -e dfp=Jc************I \ 84 | auto-sign-machine:latest 85 | ``` 86 | 87 | 88 | 、 89 | ## 联通APP签到任务 90 | **实现现联通帐号的每日签到任务。** 91 | 详细功能目录如下: 92 | 93 | * **每日签到积分** 94 | * **冬奥积分活动** 95 | * **每日定向积分** 96 | * **每日游戏楼层宝箱** 97 | * **每日抽奖** 98 | * **首页-游戏-娱乐中心-沃之树** 99 | * **首页-小说-阅读越有礼打卡赢话费** 100 | * **首页-小说-读满10章赢好礼** 101 | * **首页-小说-读满10章赢好礼-看视频领2积分** 102 | * **首页-签到有礼-免流量得福利-3积分天天拿(阅读打卡)** 103 | * **首页-小说-阅读福利抽大奖** 104 | * **首页-签到有礼-免费领-浏览领积分** 105 | * **首页-签到有礼-免费拿-看视频夺宝** 106 | * **首页-签到有礼-免费抽** 107 | * **首页-签到有礼-赚更多福利** 108 | * **首页-游戏-娱乐中心-每日打卡** 109 | * **每日游戏时长-天天领取3G流量包** 110 | * **首页-积分查询-游戏任务** 111 | 112 | ```sh 113 | node index.js unicom --user 131*******12 --password 11****11 --appid f7af****ebb 114 | ``` 115 | 116 | ### docker部署 117 | ```sh 118 | # 构建 119 | docker build -t auto-sign-machine:latest -f docker/Dockerfile . 120 | # 运行(cookies和账号密码两种方式二选一) 121 | docker run \ 122 | --name auto-sign-machine \ 123 | -d \ 124 | --label traefik.enable=false \ 125 | -e enable_unicom=true \ 126 | -e user=131*******12 \ 127 | -e password=11****11 \ 128 | -e appid=f7af****ebb \ 129 | auto-sign-machine:latest 130 | ``` 131 | 132 | ### 注意 133 | #### cron中`%`号需要转义`\%` 134 | 135 | ### 脚本运行机制 136 | 任务并非在一次命令执行时全部执行完毕,任务创建时会根据某个时间段,将所有任务分配到该时间段内的随机的某个时间点,然后使用定时任务定时运行脚本入口,内部子任务的运行时机依赖于任务配置项的运行时间及延迟时间,这种机制意味着,只有当脚本的运行时间在当前定时任务运行时间之前,脚本子任务才有可能有选择的被调度出来运行 137 | 138 | ### crontab 任务示例 139 | 在4-23小时之间每隔三十分钟尝试运行可运行的脚本子任务 140 | ```txt 141 | */30 4-23 * * * /bin/node /workspace/AutoSignMachine/index.js unicom --user 1******5 --password 7****** --appid 1************9 142 | ``` 143 | 144 | ### 多用户配置 145 | 启用`--accountSn`表示账户序号,例如`1,2`, 则将提取`option-sn`选项的值,例如`user-1`,`user-2` 146 | 147 | ### 配置文件示例 148 | 启用`--config /path/to/mycfg.json`表示配置文件 149 | ```json 150 | { 151 | "accountSn": "1,2", 152 | "user-1": "22******1", 153 | "password-1": "31******1", 154 | "appid-1": "41******1", 155 | "user-2": "25******1", 156 | "password-3": "72******1", 157 | "appid-2": "92******1" 158 | } 159 | ``` 160 | 161 | ### 运行测试 162 | ```sh 163 | ## 立即模式, 一次性执行所有任务,仅建议测试任务是否正常时运行,该方式无法重试周期任务 164 | ## 该模式不缓存cookie信息,频繁使用将可能导致账号安全警告 165 | #增加 --tryrun 166 | 167 | ## 指定任务模式,可以指定仅需要运行的子任务,多用户使用规则参看`多用户配置` 168 | #增加 --tasks taskName1,taskName2,taskName3 169 | ``` 170 | 171 | ### GitHub Actions 运行问题 172 | 暂未处理GitHub Actions支持 -------------------------------------------------------------------------------- /commands/52pojie.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const { scheduler } = require('../utils/scheduler') 4 | 5 | exports.command = '52pojie' 6 | 7 | exports.describe = '52pojie签到任务' 8 | 9 | exports.builder = function (yargs) { 10 | return yargs 11 | .option('htVD_2132_auth', { 12 | describe: 'cookie项htVD_2132_auth的值', 13 | type: 'string' 14 | }) 15 | .option('htVD_2132_saltkey', { 16 | describe: 'cookie项htVD_2132_saltkey的值', 17 | type: 'string' 18 | }) 19 | .help() 20 | .showHelpOnFail(true, '使用--help查看有效选项') 21 | .epilog('copyright 2020 LunnLew'); 22 | } 23 | 24 | exports.handler = async function (argv) { 25 | var command = argv._[0] 26 | var accounts = [] 27 | if ('accountSn' in argv && argv.accountSn) { 28 | let accountSns = argv.accountSn.split(',') 29 | for (let sn of accountSns) { 30 | if (('htVD_2132_auth-' + sn) in argv) { 31 | let account = { 32 | htVD_2132_auth: argv['htVD_2132_auth-' + sn], 33 | htVD_2132_saltkey: argv['htVD_2132_saltkey-' + sn], 34 | tasks: argv['tasks-' + sn] 35 | } 36 | if (('tryrun-' + sn) in argv) { 37 | account['tryrun'] = true 38 | } 39 | accounts.push(account) 40 | } 41 | } 42 | } else { 43 | accounts.push({ 44 | ...argv 45 | }) 46 | } 47 | console.log('总账户数', accounts.length) 48 | for (let account of accounts) { 49 | await require(path.join(__dirname, 'tasks', command, command)).start({ 50 | cookies: { 51 | htVD_2132_auth: account.htVD_2132_auth, 52 | htVD_2132_saltkey: account.htVD_2132_saltkey 53 | }, 54 | options: {} 55 | }).catch(err => console.log("52pojie签到任务:", err.message)) 56 | let hasTasks = await scheduler.hasWillTask(command, { 57 | tryrun: 'tryrun' in argv, 58 | taskKey: account.htVD_2132_auth 59 | }) 60 | if (hasTasks) { 61 | scheduler.execTask(command, account.tasks).catch(err => console.log("52pojie签到任务:", err.message)).finally(() => { 62 | console.log('当前任务执行完毕!') 63 | }) 64 | } else { 65 | console.log('暂无可执行任务!') 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /commands/bilibili.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const { scheduler } = require('../utils/scheduler') 4 | 5 | exports.command = 'bilibili' 6 | 7 | exports.describe = 'bilibili签到任务' 8 | 9 | exports.builder = function (yargs) { 10 | return yargs 11 | .option('cookies', { 12 | describe: 'cookies', 13 | type: 'string' 14 | }) 15 | .option('username', { 16 | describe: '登陆账号', 17 | type: 'string' 18 | }) 19 | .option('password', { 20 | describe: '登陆密码', 21 | type: 'string' 22 | }) 23 | .option('NumberOfCoins', { 24 | describe: '视频投币的目标数量', 25 | default: 5, 26 | type: 'number' 27 | }) 28 | .option('CoinsForVideo', { 29 | describe: '每个视频投币数量,最多2', 30 | default: 1, 31 | type: 'number' 32 | }) 33 | .option('SelectLike', { 34 | describe: '视频投币时是否点赞', 35 | default: true, 36 | type: 'boolean' 37 | }) 38 | .option('DayOfReceiveVipPrivilege', { 39 | describe: '指定的某一天取得会员权益', 40 | default: 1, 41 | type: 'number' 42 | }) 43 | .help() 44 | .showHelpOnFail(true, '使用--help查看有效选项') 45 | .epilog('copyright 2020 LunnLew'); 46 | } 47 | 48 | exports.handler = async function (argv) { 49 | var command = argv._[0] 50 | var accounts = [] 51 | if ('accountSn' in argv && argv.accountSn) { 52 | let accountSns = argv.accountSn.split(',') 53 | for (let sn of accountSns) { 54 | if (('username-' + sn) in argv) { 55 | let account = { 56 | cookies: argv['cookies-' + sn], 57 | NumberOfCoins: argv['NumberOfCoins-' + sn], 58 | CoinsForVideo: argv['CoinsForVideo-' + sn], 59 | SelectLike: argv['SelectLike-' + sn], 60 | username: argv['username-' + sn] + '', 61 | password: argv['password-' + sn] + '', 62 | tasks: argv['tasks-' + sn] 63 | } 64 | if (('tryrun-' + sn) in argv) { 65 | account['tryrun'] = true 66 | } 67 | accounts.push(account) 68 | } 69 | } 70 | } else { 71 | accounts.push({ 72 | cookies: argv['cookies'], 73 | NumberOfCoins: argv['NumberOfCoins'], 74 | CoinsForVideo: argv['CoinsForVideo'], 75 | SelectLike: argv['SelectLike'], 76 | username: argv['username'] + '', 77 | password: argv['password'] + '', 78 | tasks: argv['tasks'] 79 | }) 80 | } 81 | console.log('总账户数', accounts.length) 82 | for (let account of accounts) { 83 | await require(path.join(__dirname, 'tasks', command, command)).start({ 84 | cookies: account.cookies, 85 | options: { 86 | NumberOfCoins: account.NumberOfCoins, 87 | CoinsForVideo: account.CoinsForVideo, 88 | SelectLike: account.SelectLike, 89 | username: account.username, 90 | password: account.password, 91 | } 92 | }).catch(err => console.log("bilibili签到任务:", err.message)) 93 | let hasTasks = await scheduler.hasWillTask(command, { 94 | tryrun: 'tryrun' in argv, 95 | taskKey: account.username 96 | }) 97 | if (hasTasks) { 98 | scheduler.execTask(command, account.tasks).catch(err => console.log("bilibili签到任务:", err.message)).finally(() => { 99 | console.log('当前任务执行完毕!') 100 | }) 101 | } else { 102 | console.log('暂无可执行任务!') 103 | } 104 | } 105 | } -------------------------------------------------------------------------------- /commands/iqiyi.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const { scheduler } = require('../utils/scheduler') 4 | 5 | exports.command = 'iqiyi' 6 | 7 | exports.describe = 'iqiyi签到任务' 8 | 9 | exports.builder = function (yargs) { 10 | return yargs 11 | .option('P00001', { 12 | describe: 'Cookie中P00001的值', 13 | default: '', 14 | type: 'string' 15 | }) 16 | .option('P00PRU', { 17 | describe: 'Cookie中P00PRU的值', 18 | default: '', 19 | type: 'string' 20 | }) 21 | .option('dfp', { 22 | describe: 'Cookie中_dfp的值', 23 | default: '', 24 | type: 'string' 25 | }) 26 | .help() 27 | .showHelpOnFail(true, '使用--help查看有效选项') 28 | .epilog('copyright 2020 LunnLew'); 29 | } 30 | 31 | exports.handler = async function (argv) { 32 | var command = argv._[0] 33 | var accounts = [] 34 | if ('accountSn' in argv && argv.accountSn) { 35 | let accountSns = argv.accountSn.split(',') 36 | for (let sn of accountSns) { 37 | if (('P00PRU-' + sn) in argv) { 38 | let account = { 39 | P00001: argv['P00001-' + sn], 40 | P00003: argv['P00003-' + sn], 41 | P00PRU: argv['P00PRU-' + sn] + '', 42 | QC005: argv['QC005-' + sn], 43 | dfp: argv['dfp-' + sn], 44 | tasks: argv['tasks-' + sn] 45 | } 46 | if (('tryrun-' + sn) in argv) { 47 | account['tryrun'] = true 48 | } 49 | accounts.push(account) 50 | } 51 | } 52 | } else { 53 | accounts.push({ 54 | P00001: argv['P00001'], 55 | P00003: argv['P00003'], 56 | P00PRU: argv['P00PRU'] + '', 57 | QC005: argv['QC005'], 58 | dfp: argv['dfp'], 59 | tasks: argv['tasks'] 60 | }) 61 | } 62 | console.log('总账户数', accounts.length) 63 | for (let account of accounts) { 64 | await require(path.join(__dirname, 'tasks', command, command)).start({ 65 | cookies: { 66 | P00001: account.P00001, 67 | P00003: account.P00003, 68 | P00PRU: account.P00PRU, 69 | QC005: account.QC005, 70 | _dfp: account.dfp 71 | }, 72 | options: {} 73 | }).catch(err => console.log("iqiyi签到任务:", err.message)) 74 | let hasTasks = await scheduler.hasWillTask(command, { 75 | tryrun: 'tryrun' in argv, 76 | taskKey: account.P00PRU 77 | }) 78 | if (hasTasks) { 79 | scheduler.execTask(command, account.tasks).catch(err => console.log("iqiyi签到任务:", err.message)).finally(() => { 80 | console.log('当前任务执行完毕!') 81 | }) 82 | } else { 83 | console.log('暂无可执行任务!') 84 | } 85 | } 86 | } -------------------------------------------------------------------------------- /commands/tasks/52pojie/52pojie.js: -------------------------------------------------------------------------------- 1 | const _request = require('../../../utils/request') 2 | const { scheduler } = require('../../../utils/scheduler') 3 | var start = async (params) => { 4 | const { cookies, options } = params 5 | 6 | let init = async (request, savedCookies) => { 7 | if (!savedCookies) { 8 | if (!cookies || !('htVD_2132_auth' in cookies) || !cookies['htVD_2132_auth']) { 9 | throw new Error("需要提供htVD_2132_auth参数") 10 | } 11 | 12 | if (!('htVD_2132_saltkey' in cookies) || !cookies['htVD_2132_saltkey']) { 13 | throw new Error("需要提供htVD_2132_saltkey参数") 14 | } 15 | return { 16 | request: _request(cookies) 17 | } 18 | } else { 19 | return { 20 | request 21 | } 22 | } 23 | } 24 | let taskOption = { 25 | init 26 | } 27 | 28 | await scheduler.regTask('dailySign', async (request) => { 29 | await require('./sign')(request) 30 | }, taskOption) 31 | 32 | } 33 | module.exports = { 34 | start 35 | } -------------------------------------------------------------------------------- /commands/tasks/52pojie/sign.js: -------------------------------------------------------------------------------- 1 | const iconv = require('iconv-lite'); 2 | const cheerio = require('cheerio') 3 | 4 | var loadSign = async (axios, url) => { 5 | let chunks = []; 6 | let str = await new Promise((resolve, reject) => { 7 | axios.request({ 8 | url: url, 9 | responseType: 'stream' 10 | }).then(res => { 11 | res.data.on('data', chunk => { 12 | chunks.push(chunk); 13 | }); 14 | res.data.on('end', () => { 15 | let buffer = Buffer.concat(chunks); 16 | let str = iconv.decode(buffer, 'gbk'); 17 | resolve(str) 18 | }) 19 | }) 20 | }) 21 | let $ = cheerio.load(str) 22 | let msg = $('#messagetext').text() 23 | return msg 24 | } 25 | 26 | module.exports = async (axios) => { 27 | let msg = await loadSign(axios, 'https://www.52pojie.cn/home.php?mod=task&do=apply&id=2') 28 | if (msg.indexOf('需要先登录才能继续本操作') !== -1) { 29 | console.log("需要先登录才能继续本操作,跳过本期任务") 30 | return 31 | } 32 | if (msg.indexOf('本期您已申请过此任务') !== -1) { 33 | console.log("本期您已申请过此任务,跳过本期任务") 34 | return 35 | } 36 | msg = await loadSign(axios, 'https://www.52pojie.cn/home.php?mod=task&do=draw&id=2') 37 | console.log("52pojie签到:", msg) 38 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/AddCoinsForVideo.js: -------------------------------------------------------------------------------- 1 | const MaxNumberOfDonateCoins = 5 2 | const MaxCoinsForVideo = 2 3 | 4 | var GetNeedDonateCoins = async (axios, options) => { 5 | let alreadyCoins = 0 6 | let needCoins = 0 7 | let result = await todayCoins(axios) 8 | if (result.code === 0) { 9 | alreadyCoins = result.data / 10 10 | } 11 | // 目标投币 12 | let targetCoins = options.NumberOfCoins > MaxNumberOfDonateCoins 13 | ? MaxNumberOfDonateCoins 14 | : options.NumberOfCoins 15 | console.log("目标投币:", targetCoins) 16 | if (targetCoins > alreadyCoins) { 17 | needCoins = targetCoins - alreadyCoins; 18 | } 19 | console.log("需要投币:", needCoins) 20 | 21 | result = await todayCoinBalance(axios) 22 | return { 23 | alreadyCoins, 24 | needCoins, 25 | targetCoins, 26 | coinBalance: result.data.money 27 | }; 28 | } 29 | 30 | var todayCoins = (axios) => { 31 | return new Promise((resolve, reject) => { 32 | axios.request({ 33 | headers:{ 34 | origin: 'https://account.bilibili.com', 35 | referer: 'https://account.bilibili.com/account/home' 36 | }, 37 | url: `https://api.bilibili.com/x/web-interface/coin/today/exp`, 38 | method: 'get' 39 | }).then(res => { 40 | console.log("今日已获得投币经验: " + res.data.data); 41 | resolve(res.data) 42 | }).catch(reject) 43 | }) 44 | } 45 | 46 | var todayCoinBalance = (axios) => { 47 | return new Promise((resolve, reject) => { 48 | axios.request({ 49 | headers:{ 50 | origin: 'https://account.bilibili.com', 51 | referer: 'https://account.bilibili.com/account/home' 52 | }, 53 | url: `https://account.bilibili.com/site/getCoin`, 54 | method: 'post' 55 | }).then(res => { 56 | console.log("当前硬币余额:" + res.data.data.money); 57 | resolve(res.data) 58 | }).catch(reject) 59 | }) 60 | } 61 | 62 | var fetchVideo = (axios) => { 63 | return new Promise((resolve, reject) => { 64 | let rids = [1, 3, 4, 5, 160, 22, 119] 65 | let days = [1, 3, 7] 66 | let rid = rids[Math.floor(Math.random() * rids.length)] 67 | let day = days[Math.floor(Math.random() * days.length)] 68 | axios.request({ 69 | headers:{ 70 | origin: 'https://account.bilibili.com', 71 | referer: 'https://account.bilibili.com/account/home' 72 | }, 73 | url: `https://api.bilibili.com/x/web-interface/ranking/region?rid=${rid}&day=${day}` 74 | }).then(res => { 75 | let result = res.data 76 | if (result.code === 0) { 77 | resolve(result.data[Math.floor(Math.random() * result.data.length)]) 78 | } else { 79 | resolve() 80 | } 81 | }).catch(reject) 82 | }) 83 | } 84 | 85 | var TryGetNotDonatedVideo = async (axios) => { 86 | let tryCount = 0 87 | let video = undefined 88 | do { 89 | video = await fetchVideo(axios) 90 | tryCount++; 91 | if (video) { 92 | let result = IsDonatedCoinsForVideo(axios, video) 93 | if (!result) { 94 | break 95 | } 96 | } 97 | let s = Math.floor(Math.random() * 20) 98 | console.log('等待%s秒再继续', s) 99 | await new Promise((resolve, reject) => setTimeout(resolve, s * 1000)) 100 | } while (tryCount <= 10) 101 | return video 102 | } 103 | 104 | var IsDonatedCoinsForVideo = (axios, video) => { 105 | return new Promise((resolve, reject) => { 106 | axios.request({ 107 | headers:{ 108 | origin: 'https://account.bilibili.com', 109 | referer: 'https://account.bilibili.com/account/home' 110 | }, 111 | url: `https://api.bilibili.com/x/web-interface/archive/coins?aid=${video.aid}`, 112 | method: 'get' 113 | }).then(res => { 114 | if(!res.data.data){ 115 | throw new Error('获取视频投币状态失败') 116 | } 117 | resolve(res.data.data.multiply) 118 | }).catch(reject) 119 | }) 120 | } 121 | var AddCoinForVideo = (axios, video, options) => { 122 | let { CoinsForVideo, SelectLike } = options 123 | let bili_jct = undefined 124 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 125 | if (item.indexOf('bili_jct') === 0) { 126 | bili_jct = item.split("=").pop() 127 | } 128 | }) 129 | return new Promise((resolve, reject) => { 130 | 131 | // 视频投币 132 | let targetCoins = CoinsForVideo > MaxCoinsForVideo 133 | ? MaxCoinsForVideo 134 | : CoinsForVideo 135 | 136 | let params = { 137 | 'aid': video.aid, 138 | 'multiply': targetCoins, 139 | 'select_like': SelectLike ? 1 : 0, 140 | 'cross_domain': "true", 141 | 'csrf': bili_jct 142 | } 143 | axios.request({ 144 | headers: { 145 | "referer": "https://www.bilibili.com", 146 | "origin": "https://www.bilibili.com", 147 | "content-type": "application/x-www-form-urlencoded", 148 | }, 149 | url: `https://api.bilibili.com/x/web-interface/coin/add`, 150 | method: 'post', 151 | params 152 | }).then(res => { 153 | resolve(res.data) 154 | }).catch((rr) => { 155 | console.log(rr.response) 156 | reject() 157 | }) 158 | }) 159 | } 160 | var tryAddCoinForVideo = async (axios, options) => { 161 | let video = await TryGetNotDonatedVideo(axios) 162 | let result = {} 163 | if (video) { 164 | console.log("正在为“%s”投币", video.title) 165 | result = await AddCoinForVideo(axios, video, options) 166 | } 167 | return { 168 | result, 169 | video 170 | } 171 | } 172 | 173 | module.exports = async (axios, options) => { 174 | const { alreadyCoins, targetCoins, needCoins, coinBalance } = await GetNeedDonateCoins(axios, options) 175 | return new Promise(async (resolve, reject) => { 176 | if (needCoins <= 0) { 177 | console.log("随机视频投币:已完成投币任务,今天不需要再投啦"); 178 | } else { 179 | console.log("还需再投%s枚硬币", needCoins); 180 | if (coinBalance <= 0) { 181 | console.log("因硬币余额不足,今日暂不执行投币任务"); 182 | } else { 183 | //余额小于目标投币数,按余额投 184 | if (coinBalance < needCoins) { 185 | needCoins = coinBalance 186 | console.log("因硬币余额不足,目标投币数调整为: %s", needCoins); 187 | } 188 | let successCoins = 0; 189 | let tryCount = 0; 190 | while (successCoins < needCoins && tryCount <= 10) { 191 | let { result, video } = await tryAddCoinForVideo(axios, options) 192 | if (video) { 193 | if (result.code !== 0) { 194 | console.log("为“%s”投币失败,原因:%s", video.title, result.message); 195 | } else { 196 | console.log("为“%s”投币成功", video.title); 197 | successCoins = successCoins + options.CoinsForVideo; 198 | } 199 | } 200 | tryCount++; 201 | if (tryCount > 10) { 202 | console.log("尝试投币次数超过10次,投币任务终止"); 203 | break 204 | } 205 | let s = Math.floor(Math.random() * 20) 206 | console.log('等待%s秒再继续', s) 207 | await new Promise((resolve, reject) => setTimeout(resolve, s * 1000)) 208 | } 209 | let resultCoinBalance = await todayCoinBalance(axios) 210 | console.log("投币任务完成,余额为: " + resultCoinBalance.data.money); 211 | } 212 | } 213 | resolve() 214 | }) 215 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/ExchangeSilver2Coin.js: -------------------------------------------------------------------------------- 1 | module.exports = async (axios) => { 2 | return new Promise((resolve, reject) => { 3 | axios.request({ 4 | headers:{ 5 | "referer": "https://www.bilibili.com", 6 | "origin": "https://www.bilibili.com", 7 | }, 8 | url: `https://api.live.bilibili.com/pay/v1/Exchange/silver2coin`, 9 | method: 'get' 10 | }).then(res => { 11 | console.log("银瓜子兑换硬币:", res.data.message) 12 | resolve(res.data) 13 | }).catch(reject) 14 | }) 15 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/LiveGetSignInfo.js: -------------------------------------------------------------------------------- 1 | module.exports = (axios) => { 2 | return new Promise((resolve, reject) => { 3 | axios.request({ 4 | headers:{ 5 | "referer": "https://live.bilibili.com", 6 | "origin": "https://live.bilibili.com", 7 | }, 8 | url: 'https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/WebGetSignInfo' 9 | }).then(res => { 10 | let result = res.data 11 | if (result.code !== 0) { 12 | console.log('获取当月直播签到状态失败', result.message) 13 | } else { 14 | console.log('获取当月直播签到状态成功 ','累计签到'+result.data.hadSignDays+'/'+result.data.allDays) 15 | resolve(result.data) 16 | } 17 | }).catch(reject) 18 | }) 19 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/LiveSign.js: -------------------------------------------------------------------------------- 1 | module.exports = async (axios) => { 2 | return new Promise((resolve, reject) => { 3 | axios.request({ 4 | headers:{ 5 | "referer": "https://www.bilibili.com", 6 | "origin": "https://www.bilibili.com", 7 | }, 8 | url: `https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign`, 9 | method: 'get' 10 | }).then(res => { 11 | if (res.data.code === 0) { 12 | console.log("直播中心签到:", '签到成功') 13 | } else { 14 | console.log("直播中心签到:", res.data.message) 15 | } 16 | resolve(res.data) 17 | }).catch(reject) 18 | }) 19 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/MangaSign.js: -------------------------------------------------------------------------------- 1 | module.exports = async (axios) => { 2 | let platform = "ios" 3 | return new Promise((resolve, reject) => { 4 | axios.request({ 5 | headers:{ 6 | "referer": "https://www.bilibili.com", 7 | "origin": "https://www.bilibili.com", 8 | }, 9 | url: `https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn?platform=${platform}`, 10 | method: 'post' 11 | }).then(res => { 12 | resolve(res.data) 13 | }).catch(err => { 14 | console.log("漫画签到:今日已签到过,无法重复签到") 15 | resolve() 16 | })// 400 clockin clockin is duplicat 17 | }) 18 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/ReceiveVipPrivilege.js: -------------------------------------------------------------------------------- 1 | const dayjs = require('dayjs') 2 | 3 | var ReceiveVipPrivilege = async (axios, type) => { 4 | let bili_jct = undefined 5 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 6 | if (item.indexOf('bili_jct') === 0) { 7 | bili_jct = item.split("=").pop() 8 | } 9 | }) 10 | return new Promise((resolve, reject) => { 11 | axios.request({ 12 | headers:{ 13 | "referer": "https://www.bilibili.com", 14 | "origin": "https://www.bilibili.com", 15 | }, 16 | url: `https://api.bilibili.com/x/vip/privilege/receive?type=${type}&csrf=${bili_jct}`, 17 | method: 'post' 18 | }).then(res => { 19 | if (res.data.code == 0) { 20 | if (type == 1) { 21 | console.log("领取年度大会员每月赠送的B币券成功"); 22 | } else if (type == 2) { 23 | console.log("领取大会员福利/权益成功"); 24 | } 25 | } else { 26 | console.log("领取年度大会员每月赠送的B币券/大会员福利失败,原因:%s", res.data.message); 27 | } 28 | resolve(res.data) 29 | }).catch(err => { 30 | resolve() 31 | }) 32 | }) 33 | } 34 | 35 | module.exports = async (axios, options) => { 36 | const {userInfo, DayOfReceiveVipPrivilege} = options 37 | if (userInfo.vipStatus) { 38 | if (DayOfReceiveVipPrivilege != 0) { 39 | let day = dayjs().date() 40 | if (day == DayOfReceiveVipPrivilege) { 41 | if (userInfo.vipType == 2) { 42 | await ReceiveVipPrivilege(axios, 1) 43 | await ReceiveVipPrivilege(axios, 2) 44 | } else { 45 | console.log("普通会员和月度大会员每月不赠送B币券,所以不需要领取权益喽"); 46 | } 47 | } else { 48 | console.log("目标领取日期为%s号,今天是%s号,跳过领取任务", DayOfReceiveVipPrivilege, day); 49 | } 50 | } else { 51 | console.log("已配置为不进行自动领取会员权益,跳过领取任务"); 52 | } 53 | } 54 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/account.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | const os = require('os') 3 | const path = require('path') 4 | const fs = require('fs-extra') 5 | const { getCookies, saveCookies } = require('../../../utils/util') 6 | 7 | const app_key = 'bca7e84c2d947ac6' 8 | var calc_sign = (params) => { 9 | let str = `${params}60698ba2f68e01ce44738920a0ffe768` 10 | return crypto.createHash('md5').update(str).digest('hex'); 11 | } 12 | var transParams = (data) => { 13 | let params = new URLSearchParams(); 14 | for (let item in data) { 15 | params.append(item, data['' + item + '']); 16 | } 17 | return params; 18 | }; 19 | function w() { 20 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 21 | , t = []; 22 | return Object.keys(e).forEach((function (a) { 23 | t.push("".concat(a, "=").concat(encodeURIComponent(e[a]))) 24 | } 25 | )), 26 | t.join("&") 27 | } 28 | // 创建加密算法 29 | const rsapublicKeyEncode = function (data, publicKey) { 30 | let crypted = crypto.publicEncrypt({ 31 | key: publicKey, 32 | padding: crypto.constants.RSA_PKCS1_PADDING 33 | }, Buffer.from(data)).toString('base64'); 34 | return crypted; 35 | }; 36 | var account = { 37 | tokenFile: path.join(os.homedir(), '.AutoSignMachine', 'tokenFile.json'), 38 | getLoginPublicKey: async (axios) => { 39 | let res = await axios.request({ 40 | headers: { 41 | "referer": "https://passport.bilibili.com/", 42 | "origin": "https://passport.bilibili.com", 43 | }, 44 | url: `https://passport.bilibili.com/api/oauth2/getKey`, 45 | method: 'post', 46 | data: transParams({ 47 | appkey: app_key, 48 | sign: calc_sign(`appkey=${app_key}`) 49 | }) 50 | }) 51 | let result = res.data 52 | if (result.code !== 0) { 53 | throw new Error('获取公钥失败') 54 | } 55 | return result.data 56 | }, 57 | getCaptcha: async (axios) => { 58 | let res = await axios.request({ 59 | headers: { 60 | "referer": "https://passport.bilibili.com/", 61 | "origin": "https://passport.bilibili.com", 62 | }, 63 | responseType: "arraybuffer", 64 | url: `https://passport.bilibili.com/captcha`, 65 | method: 'get' 66 | }) 67 | return Buffer.from( 68 | new Uint8Array(res.data).reduce( 69 | (data, byte) => data + String.fromCharCode(byte), 70 | "" 71 | ), 'binary').toString('base64') 72 | }, 73 | getCrackCaptcha: async (axios, image_base64) => { 74 | let res = await axios.request({ 75 | headers: { 76 | "user-agent": "Mozilla/5.0 BiliDroid/6.4.0 (bbcallen@gmail.com) os/android model/M1903F11I mobi_app/android build/6040500 channel/bili innerVer/6040500 osVer/9.0.0 network/2", 77 | "referer": "https://bili.dev/", 78 | "origin": "https://bili.dev", 79 | "Content-Type": 'application/json' 80 | }, 81 | url: `https://bili.dev:2233/captcha`, 82 | method: 'post', 83 | data: { 84 | image: image_base64 85 | } 86 | }) 87 | let result = res.data 88 | if (result.code !== 0) { 89 | throw new Error('获取验证码识别结果失败') 90 | } 91 | return result.message 92 | }, 93 | getInfoByTokenAndSetCookies: async (axios, options) => { 94 | const { mid, access_token } = options 95 | var params = { 96 | access_key: access_token, 97 | appkey: app_key, 98 | ts: new Date().getTime() 99 | } 100 | let sign = calc_sign(w(params)) 101 | let res = await axios.request({ 102 | headers: { 103 | "referer": "https://passport.bilibili.com/", 104 | "origin": "https://passport.bilibili.com", 105 | }, 106 | url: `https://passport.bilibili.com/api/v2/oauth2/info?` + w(params) + '&sign=' + sign, 107 | method: 'get' 108 | }) 109 | 110 | params = { 111 | access_key: access_token, 112 | appkey: app_key, 113 | gourl: "https://account.bilibili.com/account/home", 114 | ts: new Date().getTime() 115 | } 116 | sign = calc_sign(w(params)) 117 | res = await axios.request({ 118 | headers: { 119 | "cookie": res.config.headers.cookie + ";DedeUserID=" + mid, 120 | "referer": "https://passport.bilibili.com/", 121 | "origin": "https://passport.bilibili.com", 122 | }, 123 | url: `https://passport.bilibili.com/api/login/sso?` + w(params) + '&sign=' + sign, 124 | method: 'get' 125 | }) 126 | if (res.status !== 200) { 127 | throw new Error('获取登录状态失败') 128 | } else { 129 | const { config } = res 130 | await saveCookies('bilibili_' + (options.username || 'default'), '', config.jar) 131 | } 132 | }, 133 | loginByPassword: async (axios, options) => { 134 | account.tokenFile = path.join(os.homedir(), '.AutoSignMachine', 'tokenFile_bilibili_' + (options.username || 'default') + '.json') 135 | let tokenJson 136 | if (fs.existsSync(account.tokenFile)) { 137 | let token = JSON.parse(fs.readFileSync(account.tokenFile).toString('utf-8')) 138 | let time = new Date().getTime() 139 | // 将过期 140 | if (token.expires_in < time + 60 * 60 * 24 && token.expires_in > time) { 141 | // TODO 刷新token 142 | tokenJson = token 143 | } else if (token.expires_in > time) { 144 | tokenJson = token 145 | } else { 146 | // 过期不处理 147 | } 148 | } 149 | if (tokenJson) { 150 | await account.getInfoByTokenAndSetCookies(axios, { 151 | ...options, 152 | ...tokenJson 153 | }) 154 | return tokenJson 155 | } 156 | let { key, hash } = await account.getLoginPublicKey(axios) 157 | let img = await account.getCaptcha(axios) 158 | let captcha = await account.getCrackCaptcha(axios, img) 159 | var params = { 160 | actionKey: 'appkey', 161 | appkey: app_key, 162 | captcha: captcha, 163 | password: rsapublicKeyEncode(hash + options.password, key.toString('ascii')), 164 | username: options.username 165 | } 166 | let sign = calc_sign(w(params)) 167 | 168 | let res = await axios.request({ 169 | headers: { 170 | "referer": "https://passport.bilibili.com/", 171 | "origin": "https://passport.bilibili.com", 172 | }, 173 | url: `https://passport.bilibili.com/api/v2/oauth2/login`, 174 | method: 'post', 175 | data: transParams(params) + '&sign=' + sign 176 | }) 177 | if (res.data.code === -449) { 178 | // 服务繁忙,更换api登录 179 | params = { 180 | access_key: '', 181 | actionKey: 'appkey', 182 | appkey: app_key, 183 | build: 6040500, 184 | captcha: captcha, 185 | challenge: '', 186 | channel: 'bili', 187 | cookies: '', 188 | device: 'phone', 189 | mobi_app: 'android', 190 | password: rsapublicKeyEncode(hash + options.password, key.toString('ascii')), 191 | permission: 'ALL', 192 | platform: 'android', 193 | seccode: '', 194 | subid: 1, 195 | ts: new Date().getTime(), 196 | username: options.username, 197 | validate: '' 198 | } 199 | sign = calc_sign(w(params)) 200 | res = await axios.request({ 201 | headers: { 202 | "referer": "https://passport.bilibili.com/", 203 | "origin": "https://passport.bilibili.com", 204 | }, 205 | url: `https://passport.bilibili.com/api/v3/oauth2/login`, 206 | method: 'post', 207 | data: transParams(params) + '&sign=' + sign 208 | }) 209 | } 210 | if (res.data.code !== 0) { 211 | throw new Error(res.data.message) 212 | } 213 | if (res.data.data.status === 2) { 214 | throw new Error(res.data.data.message) 215 | } 216 | tokenJson = { 217 | ...res.data.data.token_info, 218 | expires_in: res.data.data.token_info.expires_in + new Date().getTime() 219 | } 220 | fs.ensureFileSync(account.tokenFile) 221 | fs.writeFileSync(account.tokenFile, JSON.stringify(tokenJson)) 222 | await account.getInfoByTokenAndSetCookies(axios, { 223 | ...options, 224 | ...tokenJson 225 | }) 226 | return tokenJson 227 | } 228 | } 229 | module.exports = account 230 | -------------------------------------------------------------------------------- /commands/tasks/bilibili/bilibili.js: -------------------------------------------------------------------------------- 1 | const _request = require('../../../utils/request') 2 | const { scheduler } = require('../../../utils/scheduler') 3 | const { getCookies, saveCookies } = require('../../../utils/util') 4 | var start = async (params) => { 5 | const { cookies, options } = params 6 | 7 | let init = async (request, savedCookies) => { 8 | let userInfo = await require('./init')(request, { 9 | ...params, 10 | cookies: savedCookies || cookies 11 | }) 12 | return { 13 | request, 14 | data: { 15 | userInfo 16 | } 17 | } 18 | } 19 | let taskOption = { 20 | init 21 | } 22 | 23 | // 每日观看分享视频 24 | await scheduler.regTask('watchAndShareVideo', async (request) => { 25 | let dailyTaskStatus = await require('./dailyTaskStatus')(request) 26 | if (!dailyTaskStatus.watch || !dailyTaskStatus.share) { 27 | await require('./watchAndShareVideo')(request, dailyTaskStatus) 28 | } else { 29 | console.log('每日观看分享视频已完成') 30 | } 31 | }, taskOption) 32 | 33 | // 每日视频投币 34 | await scheduler.regTask('AddCoinsForVideo', async (request) => { 35 | let dailyTaskStatus = await require('./dailyTaskStatus')(request) 36 | if (!dailyTaskStatus.coins) { 37 | await require('./AddCoinsForVideo')(request, options) 38 | } else { 39 | console.log('每日视频投币已完成') 40 | } 41 | }, taskOption) 42 | 43 | // 漫画签到 44 | await scheduler.regTask('MangaSign', async (request) => { 45 | await require('./MangaSign')(request) 46 | }, taskOption) 47 | 48 | // 直播签到 49 | await scheduler.regTask('LiveSign', async (request) => { 50 | let SignInfo = await require('./LiveGetSignInfo')(request) 51 | if (!SignInfo.status) { 52 | await require('./LiveSign')(request) 53 | } else { 54 | console.log('今日已进行直播签到') 55 | } 56 | }, taskOption) 57 | 58 | // 银瓜子兑换硬币 59 | await scheduler.regTask('ExchangeSilver2Coin', async (request) => { 60 | let WalletInfo = await require('./myWallet')(request) 61 | if (WalletInfo.silver >= 700) { 62 | await require('./ExchangeSilver2Coin')(request) 63 | } else { 64 | console.log('银瓜子不足700无法兑换为硬币') 65 | } 66 | }, taskOption) 67 | 68 | // vip会员任务 - 年度大会员 69 | await scheduler.regTask('ReceiveVipPrivilege', async (request, data) => { 70 | const { userInfo } = data 71 | await require('./ReceiveVipPrivilege')(request, { 72 | ...options, 73 | userInfo 74 | }) 75 | }, taskOption) 76 | 77 | } 78 | module.exports = { 79 | start 80 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/dailyTaskStatus.js: -------------------------------------------------------------------------------- 1 | module.exports = (axios) => { 2 | return new Promise((resolve, reject) => { 3 | axios.request({ 4 | headers: { 5 | "referer": "https://account.bilibili.com/account/home", 6 | "origin": "https://www.bilibili.com", 7 | }, 8 | url: 'https://api.bilibili.com/x/member/web/exp/reward', 9 | method:'get' 10 | }).then(res => { 11 | let result = res.data 12 | if (result.code !== 0) { 13 | console.log('获取每日任务状态失败', result.message) 14 | throw new Error('获取每日任务状态失败:' + result.message) 15 | } else { 16 | console.log('获取每日任务状态成功 ', '每日登录+5' + (result.data.login ? '完成' : '未完成'), '每日观看视频+5' + (result.data.watch ? '完成' : '未完成'), '每日投币+50' + (result.data.coins ? '完成' : '未完成'), '每日分享视频+5' + (result.data.share ? '完成' : '未完成')) 17 | resolve(result.data) 18 | } 19 | }).catch(reject) 20 | }) 21 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/init.js: -------------------------------------------------------------------------------- 1 | const EveryDayExp = 5 + 5 + 50 + 5 2 | 3 | var checkInfo = async (axios) => { 4 | const res = await axios.request({ 5 | headers: { 6 | "referer": "https://passport.bilibili.com/", 7 | "origin": "https://passport.bilibili.com", 8 | }, 9 | url: 'https://api.bilibili.com/x/web-interface/nav', 10 | method: 'get' 11 | }) 12 | return res 13 | } 14 | module.exports = async (axios, params) => { 15 | const { options, cookies } = params 16 | 17 | let result 18 | 19 | try { 20 | let res = await checkInfo(axios) 21 | result = res.data 22 | } catch (err) { 23 | console.log('获取信息失败') 24 | } 25 | 26 | // 重要:密码账户登录易出现 您的账号存在高危异常行为,为了您的账号安全,请验证手机号后登录帐号 提示,建议使用cookies 27 | if (Object.prototype.toString.call(result) !== '[object Object]' || !result || result.code !== 0) { 28 | console.log('cookies凭据访问失败,将使用账户密码登录') 29 | if (options['username']) { 30 | if (!('password' in options) || !options['password']) { 31 | throw new Error("需要提供登陆密码") 32 | } 33 | } else if (!cookies) { 34 | throw new Error("需要提供登录信息,使用密码账号或者cookies") 35 | } 36 | await require('./account').loginByPassword(axios, options) 37 | res = await checkInfo(axios) 38 | result = res.data 39 | } 40 | 41 | if (result.code !== 0 || !result.data.isLogin) { 42 | throw new Error(result.message) 43 | } else { 44 | let userInfo = result.data 45 | console.log(`获取用户状态成功 用户名:%s,硬币余额:%s,当前等级Lv%s,经验值为:%s,下级经验值为:%s`, userInfo.uname.substr(0, 2) + "********", userInfo.money, userInfo.level_info.current_level, userInfo.level_info.current_exp, userInfo.level_info.next_exp) 46 | if (userInfo.level_info.current_level < 6) { 47 | console.log(`距离升级到Lv%s还有: %s天`, userInfo.level_info.current_level + 1, new Number((userInfo.level_info.next_exp - userInfo.level_info.current_exp) / EveryDayExp).toFixed(2)) 48 | } 49 | return userInfo 50 | } 51 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/myWallet.js: -------------------------------------------------------------------------------- 1 | module.exports = (axios) => { 2 | return new Promise((resolve, reject) => { 3 | axios.request({ 4 | headers:{ 5 | "referer": "https://live.bilibili.com", 6 | "origin": "https://live.bilibili.com", 7 | }, 8 | url: 'https://api.live.bilibili.com/pay/v2/Pay/myWallet?need_bp=1&need_metal=1&platform=pc' 9 | }).then(res => { 10 | let result = res.data 11 | if (result.code !== 0) { 12 | console.log('获取钱包信息失败', result.message) 13 | } else { 14 | console.log('获取钱包信息成功 B币%s,硬币%s,银瓜子%s,金瓜子%s',result.data.bp,result.data.metal,result.data.silver,result.data.gold) 15 | resolve(result.data) 16 | } 17 | }).catch(reject) 18 | }) 19 | } -------------------------------------------------------------------------------- /commands/tasks/bilibili/watchAndShareVideo.js: -------------------------------------------------------------------------------- 1 | var fetchVideo = (axios) => { 2 | return new Promise((resolve, reject) => { 3 | let rids = [1, 3, 4, 5, 160, 22, 119] 4 | let days = [1, 3, 7] 5 | let rid = rids[Math.floor(Math.random() * rids.length)] 6 | let day = days[Math.floor(Math.random() * days.length)] 7 | axios.request({ 8 | headers: { 9 | "referer": "https://www.bilibili.com", 10 | "origin": "https://www.bilibili.com", 11 | }, 12 | url: `https://api.bilibili.com/x/web-interface/ranking/region?rid=${rid}&day=${day}` 13 | }).then(res => { 14 | let result = res.data 15 | if (result.code === 0) { 16 | resolve(result.data[Math.floor(Math.random() * result.data.length)]) 17 | } else { 18 | throw new Error('获取随机视频失败' + result.message) 19 | } 20 | }).catch(reject) 21 | }) 22 | } 23 | 24 | var WatchVideo = (axios, videoInfo) => { 25 | return new Promise((resolve, reject) => { 26 | let playedTime = Math.floor(Math.random() * 90) 27 | axios.request({ 28 | headers: { 29 | "referer": "https://www.bilibili.com", 30 | "origin": "https://www.bilibili.com", 31 | }, 32 | url: `https://api.bilibili.com/x/click-interface/web/heartbeat?aid=${videoInfo.aid}&played_time=${playedTime}`, 33 | method: 'post' 34 | }).then(res => { 35 | if (res.data.code == 0) { 36 | console.log("视频播放成功,已观看到第%s秒", playedTime); 37 | } else { 38 | console.log("视频播放失败,原因:%s", res.data.message); 39 | } 40 | resolve(res.data) 41 | }).catch(reject) 42 | }) 43 | } 44 | 45 | var ShareVideo = (axios, videoInfo, bili_jct) => { 46 | return new Promise((resolve, reject) => { 47 | axios.request({ 48 | headers: { 49 | "referer": "https://www.bilibili.com", 50 | "origin": "https://www.bilibili.com", 51 | }, 52 | url: `https://api.bilibili.com/x/web-interface/share/add?aid=${videoInfo.aid}&csrf=${bili_jct}`, 53 | method: 'post' 54 | }).then(res => { 55 | if (res.data.code == 0) { 56 | console.log("视频分享成功"); 57 | } else { 58 | console.log("视频分享失败,原因:%s", res.data.message); 59 | } 60 | resolve(res.data) 61 | }).catch(reject) 62 | }) 63 | } 64 | 65 | module.exports = async (axios, dailyTaskStatus) => { 66 | let videoInfo = undefined 67 | let bili_jct = undefined 68 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 69 | if (item.indexOf('bili_jct') === 0) { 70 | bili_jct = item.split("=").pop() 71 | } 72 | }) 73 | return new Promise(async (resolve, reject) => { 74 | if (!dailyTaskStatus.watch || !dailyTaskStatus.share) { 75 | videoInfo = await fetchVideo(axios) 76 | } 77 | if (videoInfo) { 78 | if (!dailyTaskStatus.watch) 79 | await WatchVideo(axios, videoInfo); 80 | else 81 | console.log("今天已经观看过了,不需要再看啦"); 82 | 83 | if (!dailyTaskStatus.share) 84 | await ShareVideo(axios, videoInfo, bili_jct); 85 | else 86 | console.log("今天已经分享过了,不要再分享啦"); 87 | } 88 | resolve() 89 | }) 90 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/dailyBrowserClub.js: -------------------------------------------------------------------------------- 1 | 2 | function w () { 3 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 4 | , t = []; 5 | return Object.keys(e).forEach((function (a) { 6 | t.push("".concat(a, "=").concat(e[a])) 7 | } 8 | )), 9 | t.join("&") 10 | } 11 | 12 | module.exports = async (axios) => { 13 | console.log('浏览会员俱乐部任务') 14 | 15 | let P00001 = undefined 16 | let QC005 = undefined 17 | let dfp = undefined 18 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 19 | if (item.indexOf('P00001') === 0) { 20 | P00001 = item.split("=").pop() 21 | } 22 | if (item.indexOf('QC005') === 0) { 23 | QC005 = item.split("=").pop() 24 | } 25 | if (item.indexOf('_dfp') === 0) { 26 | dfp = item.split("=").pop().split("@")[0] 27 | } 28 | }) 29 | 30 | var p = { 31 | 'P00001': P00001, 32 | 'taskCode': 'b6e688905d4e7184', 33 | 'platform': 'b6c13e26323c537d', 34 | 'lang': 'zh_CN', 35 | 'app_lm': 'cn' 36 | } 37 | let res = await axios.request({ 38 | headers: { 39 | "referer": "https://www.iqiyi.com", 40 | "origin": "https://www.iqiyi.com" 41 | }, 42 | url: "".concat("https://tc.vip.iqiyi.com/taskCenter/task/joinTask", "?").concat(w(p)), 43 | }) 44 | if(res.data.code==='A00000'){ 45 | console.log('领取浏览会员俱乐部任务成功') 46 | 47 | await axios.request({ 48 | headers: { 49 | "referer": "https://www.iqiyi.com", 50 | "origin": "https://www.iqiyi.com" 51 | }, 52 | url: "https://www.iqiyi.com/kszt/pcwnewclub.html" 53 | }) 54 | 55 | var a = { 56 | P00001: P00001, 57 | taskCode: 'b6e688905d4e7184', 58 | dfp: dfp, 59 | platform: 'b6c13e26323c537d', 60 | lang: 'zh_CN', 61 | app_lm: 'cn', 62 | deviceID: QC005, 63 | token: '', 64 | multiReward: 1, 65 | fv: 'bed99b2cf5722bfe' 66 | } 67 | 68 | let res = await axios.request({ 69 | headers: { 70 | "referer": "https://www.iqiyi.com", 71 | "origin": "https://www.iqiyi.com" 72 | }, 73 | url: "".concat("https://tc.vip.iqiyi.com/taskCenter/task/getTaskRewards", "?").concat(w(a)), 74 | method: 'post' 75 | }) 76 | data = res.data.data 77 | if (res.data.code === 'A00000' && data.length) { 78 | console.log('浏览会员俱乐部任务:', "签到成功!成长值+1点") 79 | } else { 80 | console.log('浏览会员俱乐部任务:', res.data.message||"无") 81 | } 82 | 83 | } else { 84 | console.log('领取浏览会员俱乐部任务失败:', res.data.msg) 85 | } 86 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/dailyFeed.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | function k(e, t) { 3 | var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {} 4 | , n = a.split 5 | , c = void 0 === n ? "|" : n 6 | , r = a.sort 7 | , s = void 0 === r || r 8 | , o = a.splitSecretKey 9 | , i = void 0 !== o && o 10 | , l = s ? Object.keys(t).sort() : Object.keys(t) 11 | , u = l.map((function (e) { 12 | return "".concat(e, "=").concat(t[e]) 13 | } 14 | )).join(c) + (i ? c : "") + e; 15 | return g(u) 16 | } 17 | function g(e) { 18 | return crypto.createHash("md5").update(e, "utf8").digest("hex") 19 | } 20 | 21 | function w() { 22 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 23 | , t = []; 24 | return Object.keys(e).forEach((function (a) { 25 | t.push("".concat(a, "=").concat(e[a])) 26 | } 27 | )), 28 | t.join("&") 29 | } 30 | 31 | module.exports = async (axios) => { 32 | console.log('访问热点首页') 33 | 34 | let { config } = await axios.request({ 35 | headers: { 36 | "referer": "https://www.iqiyi.com", 37 | "origin": "https://www.iqiyi.com" 38 | }, 39 | url: "https://www.iqiyi.com/feed/?vfrm=pcw_my&vfrmblk=body_jf&vfrmrst=702091_jf_rd" 40 | }) 41 | 42 | let user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' 43 | 44 | let cookiesJson = config.jar.toJSON() 45 | let P00001 = cookiesJson.cookies.find(i => i.key == 'P00001') 46 | P00001 = P00001.value 47 | let P00PRU = cookiesJson.cookies.find(i => i.key == 'P00PRU') 48 | P00PRU = P00PRU.value 49 | let dfp = cookiesJson.cookies.find(i => i.key == '_dfp') 50 | dfp = dfp.value.split("@")[0] 51 | 52 | var a = { 53 | 'agenttype': '1', 54 | 'agentversion': '0', 55 | 'appKey': 'basic_pcw', 56 | 'appver': '0', 57 | 'authCookie': P00001, 58 | 'channelCode': 'paopao_pcw', 59 | 'dfp': dfp, 60 | 'scoreType': '1', 61 | 'srcplatform': '1', 62 | 'typeCode': 'point', 63 | 'userId': P00PRU, 64 | 'user_agent': user_agent, 65 | 'verticalCode': 'iQIYI' 66 | } 67 | 68 | var c = k("UKobMjDMsDoScuWOfp6F", a, { 69 | split: "|", 70 | sort: !0, 71 | splitSecretKey: !0 72 | }) 73 | 74 | let res = await axios.request({ 75 | headers: { 76 | "referer": "https://www.iqiyi.com", 77 | "origin": "https://www.iqiyi.com" 78 | }, 79 | url: "".concat("https://community.iqiyi.com/openApi/task/complete", "?").concat(w(a), "&sign=").concat(c), 80 | method: 'post' 81 | }) 82 | 83 | data = res.data.data 84 | if (res.data.code === 'A0000' && data.length) { 85 | console.log('访问热点首页:', "签到成功!") 86 | } else { 87 | console.log('访问热点首页:', res.data.message || "无") 88 | } 89 | 90 | // a = { 91 | // 'agenttype': '1', 92 | // 'agentversion': '0', 93 | // 'appKey': 'basic_pcw', 94 | // 'appver': '0', 95 | // 'authCookie': P00001, 96 | // 'channelCode': 'paopao_pcw', 97 | // 'dfp': dfp, 98 | // 'scoreType': '1', 99 | // 'srcplatform': '1', 100 | // 'typeCode': 'point', 101 | // 'userId': P00PRU, 102 | // 'user_agent': user_agent, 103 | // 'verticalCode': 'iQIYI' 104 | // } 105 | 106 | // c = k("UKobMjDMsDoScuWOfp6F", a, { 107 | // split: "|", 108 | // sort: !0, 109 | // splitSecretKey: !0 110 | // }) 111 | 112 | // res = await axios.request({ 113 | // headers: { 114 | // "referer": "https://www.iqiyi.com", 115 | // "origin": "https://www.iqiyi.com" 116 | // }, 117 | // url: "".concat("https://community.iqiyi.com/openApi/score/getReward", "?").concat(w(a), "&sign=").concat(c), 118 | // method: 'post' 119 | // }) 120 | // data = res.data.data 121 | // if (res.data.code === 'A00000' && data.length) { 122 | // console.log('访问热点首页:', "签到成功!成长值+" + data.score + "1点") 123 | // } else { 124 | // console.log('访问热点首页:', res.data.message || "无") 125 | // } 126 | 127 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/dailyTask.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | 3 | function w() { 4 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 5 | , t = []; 6 | return Object.keys(e).forEach((function (a) { 7 | t.push("".concat(a, "=").concat(e[a])) 8 | } 9 | )), 10 | t.join("&") 11 | } 12 | 13 | var task = { 14 | getTasks: async (axios) => { 15 | console.log('查询每日任务列表') 16 | let P00001 = undefined 17 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 18 | if (item.indexOf('P00001') === 0) { 19 | P00001 = item.split("=").pop() 20 | } 21 | }) 22 | let { data } = await axios.request({ 23 | headers: { 24 | "referer": "https://www.iqiyi.com", 25 | "origin": "https://www.iqiyi.com" 26 | }, 27 | url: `https://tc.vip.iqiyi.com/taskCenter/task/queryUserTask`, 28 | method: 'get', 29 | params: { 30 | P00001: P00001 31 | } 32 | }) 33 | if (data.code === 'A00000') { 34 | console.log('获取成功') 35 | return data.data 36 | } else { 37 | console.log(data.msg) 38 | } 39 | }, 40 | getTaskStatus: async (axios, taskIds) => { 41 | console.log('查询每日任务状态') 42 | let P00001 = undefined 43 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 44 | if (item.indexOf('P00001') === 0) { 45 | P00001 = item.split("=").pop() 46 | } 47 | }) 48 | var a = taskIds 49 | , i = a.join(",") 50 | , n = crypto.createHash("md5").update((new Date).getTime() + Math.floor(999999999 * Math.random()) + '', "utf8").digest("hex") 51 | , r = { 52 | appname: "PCW", 53 | messageId: n, 54 | version: "2.0", 55 | invokeType: 'outer_https', 56 | lang: "zh_cn", 57 | P00001: P00001, 58 | taskCode: i, 59 | newH5: "1", 60 | fv: "bed99b2cf5722bfe" 61 | }; 62 | let { data } = await axios.request({ 63 | headers: { 64 | "referer": "https://www.iqiyi.com", 65 | "origin": "https://www.iqiyi.com" 66 | }, 67 | url: `https://tc.vip.iqiyi.com/taskCenter/task/getTaskStatus`, 68 | method: 'get', 69 | params: r 70 | }) 71 | if (data.code === 'A00000') { 72 | console.log('获取成功') 73 | return data.data 74 | } else { 75 | console.log(data.msg) 76 | } 77 | }, 78 | joinTasks: async (axios, tasks) => { 79 | console.log('开始参与任务') 80 | let P00001 = undefined 81 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 82 | if (item.indexOf('P00001') === 0) { 83 | P00001 = item.split("=").pop() 84 | } 85 | }) 86 | let params = { 87 | 'P00001': P00001, 88 | 'taskCode': 'b6e688905d4e7184', 89 | 'platform': 'b6c13e26323c537d', 90 | 'lang': 'zh_CN', 91 | 'app_lm': 'cn' 92 | } 93 | for (let task of tasks) { 94 | params['taskCode'] = task.taskCode 95 | let { data } = await axios.request({ 96 | headers: { 97 | "referer": "https://www.iqiyi.com", 98 | "origin": "https://www.iqiyi.com" 99 | }, 100 | url: `https://tc.vip.iqiyi.com/taskCenter/task/joinTask`, 101 | method: 'get', 102 | params: params 103 | }) 104 | if (data.code === 'A00000') { 105 | console.log(`参与任务[${task.taskTitle}]:`, '成功') 106 | } else { 107 | console.log(`参与任务[${task.taskTitle}]:`, data.msg) 108 | } 109 | } 110 | }, 111 | getTaskReward: async (axios, taskn, a) => { 112 | let { data } = await axios.request({ 113 | headers: { 114 | "referer": "https://www.iqiyi.com", 115 | "origin": "https://www.iqiyi.com" 116 | }, 117 | url: "".concat("https://tc.vip.iqiyi.com/taskCenter/task/getTaskRewards", "?").concat(w(a)), 118 | method: 'post' 119 | }) 120 | if (data.code === 'A00000') { 121 | console.log(`完成任务[${taskn.taskCode}, ${taskn.taskTitle}]:`, '成功') 122 | data.dataNew.length ? console.log(data.dataNew.map(i => i.name + i.value).join(',')) : '' 123 | } else if ("Q00700" === data.code) { 124 | console.log(`Q00700:跳过任务[${taskn.taskCode}, ${taskn.taskTitle}]:`) 125 | // await task.getTaskReward(axios, taskn, { 126 | // ...a, 127 | // token: data.data.token 128 | // }) 129 | } else { 130 | console.log(`完成任务[${taskn.taskCode}, ${taskn.taskTitle}]:`, data.msg) 131 | } 132 | }, 133 | completeTasks: async (axios, tasks) => { 134 | console.log('开始完成任务') 135 | let P00001 = undefined 136 | let QC005 = undefined 137 | let dfp = undefined 138 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 139 | if (item.indexOf('P00001') === 0) { 140 | P00001 = item.split("=").pop() 141 | } 142 | if (item.indexOf('QC005') === 0) { 143 | QC005 = item.split("=").pop() 144 | } 145 | if (item.indexOf('_dfp') === 0) { 146 | dfp = item.split("=").pop().split("@")[0] 147 | } 148 | }) 149 | var a = { 150 | P00001: P00001, 151 | taskCode: 'b6e688905d4e7184', 152 | dfp: dfp, 153 | platform: 'b6c13e26323c537d', 154 | lang: 'zh_CN', 155 | app_lm: 'cn', 156 | deviceID: QC005, 157 | token: '', 158 | multiReward: 1, 159 | fv: 'bed99b2cf5722bfe' 160 | } 161 | for (let taskn of tasks) { 162 | a['taskCode'] = taskn.taskCode 163 | await task.getTaskReward(axios, taskn, a) 164 | } 165 | } 166 | } 167 | 168 | module.exports = task -------------------------------------------------------------------------------- /commands/tasks/iqiyi/dailyWatchVideo.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | function k(e, t) { 3 | var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {} 4 | , n = a.split 5 | , c = void 0 === n ? "|" : n 6 | , r = a.sort 7 | , s = void 0 === r || r 8 | , o = a.splitSecretKey 9 | , i = void 0 !== o && o 10 | , l = s ? Object.keys(t).sort() : Object.keys(t) 11 | , u = l.map((function (e) { 12 | return "".concat(e, "=").concat(t[e]) 13 | } 14 | )).join(c) + (i ? c : "") + e; 15 | return g(u) 16 | } 17 | function g(e) { 18 | return crypto.createHash("md5").update(e, "utf8").digest("hex") 19 | } 20 | 21 | function w() { 22 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 23 | , t = []; 24 | return Object.keys(e).forEach((function (a) { 25 | t.push("".concat(a, "=").concat(e[a])) 26 | } 27 | )), 28 | t.join("&") 29 | } 30 | 31 | module.exports = { 32 | getRndVideo: async (axios) => { 33 | return new Promise((resolve, reject) => { 34 | axios.request({ 35 | headers: { 36 | "referer": "https://list.iqiyi.com/", 37 | "origin": "https://list.iqiyi.com", 38 | }, 39 | url: `https://pcw-api.iqiyi.com/search/recommend/list?channel_id=2&data_type=1&mode=4&page_id=1&ret_num=48`, 40 | method: 'get' 41 | }).then(res => { 42 | let result = res.data 43 | if (result.code !== 'A00000') { 44 | throw new Error('获取视频列表失败') 45 | } 46 | resolve(result.data.list) 47 | }).catch(reject) 48 | }) 49 | }, 50 | reportPlayTime: async (axios) => { 51 | let videos = await module.exports.getRndVideo(axios) 52 | let isComplete = false 53 | for (let video of videos) { 54 | let res = await axios.get(video.playUrl) 55 | let str = res.data.substr(res.data.indexOf("param['tvid']") + 15, 30) 56 | let tvid = str.match(/\"(\d.*)\"/)[1] 57 | res = await axios.request({ 58 | headers: { 59 | "referer": video.playUrl, 60 | "origin": "https://www.iqiyi.com", 61 | }, 62 | url: `https://l-rcd.iqiyi.com/apis/qiyirc/getvplay?tvId=${tvid}&agent_type=1`, 63 | method: 'get' 64 | }) 65 | if (res.data.indexOf('A00000') === -1) { 66 | continue 67 | } 68 | let history = JSON.parse(res.data) 69 | let videoPlayTime = (history.data && history.data.videoPlayTime) ? history.data.videoPlayTime : 1 70 | console.log('videoPlayTime', videoPlayTime) 71 | do { 72 | let report = `https://l-rcd.iqiyi.com/apis/qiyirc/setrc.php?tvId=${tvid}&terminalId=11&agent_type=1&videoPlayTime=${videoPlayTime}` 73 | videoPlayTime = videoPlayTime + 300 + parseInt(Math.random() * 30) 74 | res = await axios.request({ 75 | headers: { 76 | "referer": video.playUrl, 77 | "origin": "https://www.iqiyi.com", 78 | }, 79 | url: report, 80 | method: 'get' 81 | }) 82 | if (res.data.indexOf('A00000') === -1) { 83 | continue 84 | } 85 | console.log('上报播放时长', video.name, videoPlayTime) 86 | await new Promise((resolve, reject) => { 87 | setTimeout(resolve, 20 * 1000) 88 | }) 89 | } while (videoPlayTime <= 35 * 60) 90 | 91 | let cookiesJson = res.config.jar.toJSON() 92 | let P00001 = cookiesJson.cookies.find(i => i.key == 'P00001') 93 | P00001 = P00001.value 94 | let P00PRU = cookiesJson.cookies.find(i => i.key == 'P00PRU') 95 | P00PRU = P00PRU.value 96 | let dfp = cookiesJson.cookies.find(i => i.key == '_dfp') 97 | dfp = dfp.value.split("@")[0] 98 | 99 | var a = { 100 | 'agenttype': '1', 101 | 'agentversion': '0', 102 | 'appKey': 'basic_pcw', 103 | 'appver': '0', 104 | 'authCookie': P00001, 105 | 'srcplatform': '1', 106 | 'typeCode': 'point', 107 | 'userId': P00PRU, 108 | 'verticalCode': 'iQIYI' 109 | } 110 | console.log('查询观看视频任务状态') 111 | var c = k("UKobMjDMsDoScuWOfp6F", a, { 112 | split: "|", 113 | sort: !0, 114 | splitSecretKey: !0 115 | }) 116 | 117 | res = await axios.request({ 118 | headers: { 119 | "referer": "https://www.iqiyi.com", 120 | "origin": "https://www.iqiyi.com" 121 | }, 122 | url: "".concat("https://community.iqiyi.com/openApi/task/list", "?").concat(w(a), "&sign=").concat(c), 123 | method: 'post' 124 | }) 125 | 126 | if (res.data.code !== 'A00000') { 127 | console.log(res.data.message) 128 | continue 129 | } else { 130 | let it = res.data.data[0].find(i => i.channelCode === 'view_pcw') 131 | console.log('任务进度:已完成', it.processCount, '次') 132 | if (it.processCount >= 3) { 133 | isComplete = true 134 | break 135 | } 136 | } 137 | } 138 | if (!isComplete) { 139 | throw new Error('本次执行尚未完成视频观看任务,等待下次尝试') 140 | } 141 | }, 142 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/init.js: -------------------------------------------------------------------------------- 1 | module.exports = (axios) => { 2 | return new Promise((resolve, reject) => { 3 | axios.request({ 4 | headers: { 5 | "referer": "https://www.iqiyi.com", 6 | "origin": "https://www.iqiyi.com" 7 | }, 8 | url: 'https://pcw-api.iqiyi.com/passport/user/userinfodetail' 9 | }).then(res => { 10 | let result = res.data 11 | if (result.code !== 'A00000' || !('nickname' in result.data.userInfo)) { 12 | throw new Error(result.message||result.data.verifyInfo.msg) 13 | } else { 14 | let userInfo = result.data 15 | console.log(`获取用户状态成功 nickname:%s`,userInfo.userInfo.nickname.substr(0, 2) + "********") 16 | resolve(userInfo) 17 | } 18 | }).catch(reject) 19 | }) 20 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/iqiyi.js: -------------------------------------------------------------------------------- 1 | const _request = require('../../../utils/request') 2 | const { scheduler } = require('../../../utils/scheduler') 3 | var start = async (params) => { 4 | const { cookies, options } = params 5 | 6 | let init = async (request, savedCookies) => { 7 | if (!savedCookies) { 8 | if (!('P00001' in cookies) || !cookies['P00001']) { 9 | throw new Error("需要提供P00001参数") 10 | } 11 | if (!('P00PRU' in cookies) || !cookies['P00PRU']) { 12 | throw new Error("需要提供P00001参数") 13 | } 14 | if (!('_dfp' in cookies) || !cookies['_dfp']) { 15 | throw new Error("需要提供_dfp参数") 16 | } 17 | return { 18 | request: _request(cookies) 19 | } 20 | } else { 21 | return { 22 | request 23 | } 24 | } 25 | } 26 | let taskOption = { 27 | init 28 | } 29 | 30 | // 普通用户积分签到 31 | await scheduler.regTask('signPoint', async (request) => { 32 | await require('./signPoint')(request) 33 | }, taskOption) 34 | 35 | // 日常任务 36 | await scheduler.regTask('dailyTask', async (request) => { 37 | let { tasks } = await require('./dailyTask').getTasks(request) 38 | let { daily } = tasks 39 | await require('./dailyTask').joinTasks(request, daily) 40 | await require('./dailyTask').completeTasks(request, daily) 41 | }, taskOption) 42 | 43 | // vip 用户成长值签到 44 | 45 | // vip签到任务 46 | await scheduler.regTask('signVip', async (request) => { 47 | let userinfo = await require('./init')(request) 48 | if (userinfo.vipInfo.status === '1') { 49 | let isNotSign = await require('./signVip').querySignInfo(request) 50 | if (isNotSign) { 51 | await require('./signVip').vipSign(request) 52 | } 53 | } else { 54 | console.log('非vip会员跳过vip签到任务') 55 | } 56 | }, taskOption) 57 | 58 | // 浏览会员俱乐部任务 59 | await scheduler.regTask('dailyBrowserClub', async (request) => { 60 | let userinfo = await require('./init')(request) 61 | if (userinfo.vipInfo.status === '1') { 62 | await require('./dailyBrowserClub')(request) 63 | } else { 64 | console.log('非vip会员跳过浏览会员俱乐部任务') 65 | } 66 | }, taskOption) 67 | 68 | // 访问热点首页 69 | await scheduler.regTask('dailyFeed', async (request) => { 70 | let userinfo = await require('./init')(request) 71 | if (userinfo.vipInfo.status === '1') { 72 | await require('./dailyFeed')(request) 73 | } else { 74 | console.log('非vip会员跳过访问热点首页') 75 | } 76 | }, taskOption) 77 | 78 | // 每日观看视频30分钟3次 79 | await scheduler.regTask('dailyWatchVideo', async (request) => { 80 | let userinfo = await require('./init')(request) 81 | if (userinfo.vipInfo.status === '1') { 82 | // await require('./dailyWatchVideo').reportPlayTime(request) 83 | } else { 84 | console.log('非vip会员跳过每日观看视频30分钟3次') 85 | } 86 | }, taskOption) 87 | 88 | 89 | } 90 | module.exports = { 91 | start 92 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/signPoint.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | function k (e, t) { 3 | var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {} 4 | , n = a.split 5 | , c = void 0 === n ? "|" : n 6 | , r = a.sort 7 | , s = void 0 === r || r 8 | , o = a.splitSecretKey 9 | , i = void 0 !== o && o 10 | , l = s ? Object.keys(t).sort() : Object.keys(t) 11 | , u = l.map((function (e) { 12 | return "".concat(e, "=").concat(t[e]) 13 | } 14 | )).join(c) + (i ? c : "") + e; 15 | return g(u) 16 | } 17 | function g (e) { 18 | return crypto.createHash("md5").update(e, "utf8").digest("hex") 19 | } 20 | function w () { 21 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 22 | , t = []; 23 | return Object.keys(e).forEach((function (a) { 24 | t.push("".concat(a, "=").concat(e[a])) 25 | } 26 | )), 27 | t.join("&") 28 | } 29 | module.exports = async (axios) => { 30 | console.log('普通用户积分签到') 31 | 32 | let P00001 = undefined 33 | let P00PRU = undefined 34 | let dfp = undefined 35 | let user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' 36 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 37 | if (item.indexOf('P00001') === 0) { 38 | P00001 = item.split("=").pop() 39 | } 40 | if (item.indexOf('P00PRU') === 0) { 41 | P00PRU = item.split("=").pop() 42 | } 43 | if (item.indexOf('_dfp') === 0) { 44 | dfp = item.split("=").pop().split("@")[0] 45 | } 46 | }) 47 | var a = { 48 | agenttype: "1", 49 | agentversion: "0", 50 | appKey: "basic_pcw", 51 | appver: "0", 52 | authCookie: P00001, 53 | channelCode: "sign_pcw", 54 | dfp: dfp, 55 | scoreType: "1", 56 | srcplatform: "1", 57 | typeCode: "point", 58 | userId: P00PRU, 59 | user_agent: user_agent, 60 | verticalCode: "iQIYI" 61 | } 62 | var c = k("UKobMjDMsDoScuWOfp6F", a, { 63 | split: "|", 64 | sort: !0, 65 | splitSecretKey: !0 66 | }) 67 | let res = await axios.request({ 68 | headers: { 69 | "referer": "https://www.iqiyi.com", 70 | "origin": "https://www.iqiyi.com" 71 | }, 72 | url: "".concat("https://community.iqiyi.com/openApi/score/add", "?").concat(w(a), "&sign=").concat(c), 73 | method: 'post' 74 | }) 75 | let result = res.data 76 | 77 | if (result.code === 'A00000') { 78 | let data = result.data[0] 79 | if (result.code === 'A00000') { 80 | if (data.code === 'A0000') { 81 | console.log('积分签到:', '积分变动增加' + data.score) 82 | } else { 83 | console.log('积分签到:', data.message) 84 | } 85 | } else { 86 | console.log('积分签到:', result.message) 87 | } 88 | } else { 89 | console.log('积分签到:', result.message) 90 | } 91 | } -------------------------------------------------------------------------------- /commands/tasks/iqiyi/signVip.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var moment = require('moment'); 3 | function k(e, t) { 4 | var a = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {} 5 | , n = a.split 6 | , c = void 0 === n ? "|" : n 7 | , r = a.sort 8 | , s = void 0 === r || r 9 | , o = a.splitSecretKey 10 | , i = void 0 !== o && o 11 | , l = s ? Object.keys(t).sort() : Object.keys(t) 12 | , u = l.map((function (e) { 13 | return "".concat(e, "=").concat(t[e]) 14 | } 15 | )).join(c) + (i ? c : "") + e; 16 | return g(u) 17 | } 18 | function g(e) { 19 | return crypto.createHash("md5").update(e, "utf8").digest("hex") 20 | } 21 | function w() { 22 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 23 | , t = []; 24 | return Object.keys(e).forEach((function (a) { 25 | t.push("".concat(a, "=").concat(e[a])) 26 | } 27 | )), 28 | t.join("&") 29 | } 30 | var sign = { 31 | querySignInfo: async (axios) => { 32 | console.log('查询签到状态') 33 | let P00001 = undefined 34 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 35 | if (item.indexOf('P00001') === 0) { 36 | P00001 = item.split("=").pop() 37 | } 38 | }) 39 | var a = moment().format('YYYYMMDDHHmmss') 40 | , i = crypto.createHash("md5").update(a, "utf8").digest("hex") 41 | , n = { 42 | P00001: P00001, 43 | platform: "b6c13e26323c537d", 44 | lang: "zh_CN", 45 | app_lm: "cn", 46 | deviceID: "", 47 | version: "", 48 | messageId: "PCW_" + i 49 | }; 50 | let { data } = await axios.request({ 51 | headers: { 52 | "referer": "https://www.iqiyi.com", 53 | "origin": "https://www.iqiyi.com" 54 | }, 55 | url: `https://tc.vip.iqiyi.com/taskCenter/task/querySignInfo`, 56 | method: 'get', 57 | params: n 58 | }) 59 | if (data.code === 'A00000') { 60 | let { isSign, continueSignDaysSum, todayGrowth } = data.data 61 | console.log(isSign === 'yes' ? `今日已签到,连续签到${continueSignDaysSum}天,成长值+${todayGrowth}` : '今日还未签到') 62 | return isSign !== 'yes' 63 | } else { 64 | console.log(data.msg) 65 | } 66 | }, 67 | vipSign: async (axios) => { 68 | console.log('进行VIP签到') 69 | let P00001 = undefined 70 | let QC005 = undefined 71 | axios.defaults.headers.Cookie.split('; ').forEach(item => { 72 | if (item.indexOf('P00001') === 0) { 73 | P00001 = item.split("=").pop() 74 | } 75 | if (item.indexOf('QC005') === 0) { 76 | QC005 = item.split("=").pop() 77 | } 78 | }) 79 | var a = { 80 | P00001: P00001, 81 | app_lm: 'cn', 82 | deviceID: QC005, 83 | fv: 'bed99b2cf5722bfe', 84 | lang: 'zh_CN', 85 | platform: 'b6c13e26323c537d', 86 | version: '' 87 | } 88 | let res = await axios.request({ 89 | headers: { 90 | "referer": "https://www.iqiyi.com", 91 | "origin": "https://www.iqiyi.com" 92 | }, 93 | url: "".concat("https://tc.vip.iqiyi.com/taskCenter/task/userSign", "?").concat(w(a)), 94 | method: 'post' 95 | }) 96 | data = res.data.data 97 | if (res.data.code === 'A00000') { 98 | console.log('成长值签到:', "签到成功!成长值+" + data.rewardMap.growth + "点,积分+" + data.rewardMap.integral + "点!", res.data.msg, '已连续签到:', data.signReached, '天') 99 | } else { 100 | console.log('成长值签到:', res.data.msg) 101 | if (data) { 102 | console.log('已连续签到:', data.continueSignDaysSum, '天') 103 | } 104 | } 105 | } 106 | } 107 | 108 | module.exports = sign -------------------------------------------------------------------------------- /commands/tasks/unicom/Niujie.js: -------------------------------------------------------------------------------- 1 | var transParams = (data) => { 2 | let params = new URLSearchParams(); 3 | for (let item in data) { 4 | params.append(item, data['' + item + '']); 5 | } 6 | return params; 7 | }; 8 | 9 | var Niujie = { 10 | // 转盘抽奖3次-1000牛气抽1次 11 | CalfLottery: async (axios, options) => { 12 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 13 | let n = 3 14 | do { 15 | console.log('第', n, '次') 16 | let { data } = await axios.request({ 17 | headers: { 18 | "user-agent": useragent, 19 | "referer": "https://img.client.10010.com/2021springfestival/index.html", 20 | "origin": "https://img.client.10010.com" 21 | }, 22 | url: `https://m.client.10010.com/Niujie/calf/CalfLottery`, 23 | method: 'POST' 24 | }) 25 | console.log(data) 26 | await new Promise((resolve, reject) => setTimeout(resolve, 1500)) 27 | } while (--n) 28 | }, 29 | // 牛气如意-秒杀抢兑 30 | spikePrize: async (axios, options) => { 31 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 32 | let prizes = [ 33 | { 34 | name: 'vivos7', 35 | prizeId: '21013015030315978' 36 | }, 37 | { 38 | name: '8折充值券', 39 | prizeId: '21013123452511221' 40 | }, 41 | { 42 | name: '10G流量日包', 43 | prizeId: '21013015071318307' 44 | }, 45 | { 46 | name: '腾讯视频会员', 47 | prizeId: '21012919443117040' 48 | } 49 | ] 50 | for (let prize of prizes) { 51 | console.log('尝试抢兑', prize.name) 52 | let { data } = await axios.request({ 53 | headers: { 54 | "user-agent": useragent, 55 | "referer": "https://img.client.10010.com/2021springfestival/index.html", 56 | "origin": "https://img.client.10010.com" 57 | }, 58 | url: `https://m.client.10010.com/Niujie/imazamox/spikePrize`, 59 | method: 'POST', 60 | data: transParams({ 61 | 'prizeId': prize.prizeId 62 | }) 63 | }) 64 | console.log(data) 65 | } 66 | 67 | }, 68 | getTaskList: async (axios, options) => { 69 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 70 | console.log('获取牛气任务中') 71 | let { data } = await axios.request({ 72 | headers: { 73 | "user-agent": useragent, 74 | "referer": "https://img.client.10010.com/2021springfestival/index.html", 75 | "origin": "https://img.client.10010.com" 76 | }, 77 | url: `https://m.client.10010.com/Niujie/task/getTaskList`, 78 | method: 'POST' 79 | }) 80 | return data.data 81 | }, 82 | doNiuqiTask: async (axios, options) => { 83 | const { task } = options 84 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 85 | console.log('完成牛气任务中') 86 | let { data } = await axios.request({ 87 | headers: { 88 | "user-agent": useragent, 89 | "referer": "https://img.client.10010.com/2021springfestival/index.html", 90 | "origin": "https://img.client.10010.com" 91 | }, 92 | url: `https://m.client.10010.com/Niujie/task/doTask`, 93 | method: 'POST', 94 | data: transParams({ 95 | 'taskId': task.taskId 96 | }) 97 | }) 98 | await axios.request({ 99 | headers: { 100 | "user-agent": useragent, 101 | "referer": "https://img.client.10010.com/2021springfestival/index.html", 102 | "origin": "https://img.client.10010.com" 103 | }, 104 | url: task.taskUrl, 105 | method: 'get' 106 | }) 107 | console.log(data) 108 | await new Promise((resolve, reject) => setTimeout(resolve, 500)) 109 | }, 110 | doNiuqiTasks: async (axios, options) => { 111 | let tasklist = await Niujie.getTaskList(axios, options) 112 | tasklist = tasklist.filter(t => t.taskStatus === '1') 113 | if (!tasklist.length) { 114 | console.log('每天领取牛气任务已完成,跳过') 115 | } 116 | for (let task of tasklist) { 117 | console.log('去完成', task.taskName) 118 | await Niujie.doNiuqiTask(axios, { 119 | ...options, 120 | task 121 | }) 122 | } 123 | }, 124 | doTask: async (axios, options) => { 125 | await Niujie.doNiuqiTasks(axios, options) 126 | await Niujie.CalfLottery(axios, options) 127 | }, 128 | receiveCalf: async (axios, options) => { 129 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 130 | await axios.request({ 131 | headers: { 132 | "user-agent": useragent, 133 | "origin": "https://img.client.10010.com" 134 | }, 135 | url: 'https://img.client.10010.com/2021springfestival/index.html', 136 | method: 'get' 137 | }) 138 | let shops = [ 139 | 'BdShopVenue', 140 | 'CfShopVenue', 141 | 'DpShopVenue', 142 | 'FGShopVenue', 143 | 'JjShopVenue', 144 | 'HqShopVenue', 145 | 'NqShopVenue', 146 | 'WzShopVenue', 147 | 'XxShopVenue' 148 | ] 149 | for (let shop of shops) { 150 | let { data } = await axios.request({ 151 | headers: { 152 | "user-agent": useragent, 153 | "referer": "https://img.client.10010.com/2021springfestival/index.html", 154 | "origin": "https://img.client.10010.com" 155 | }, 156 | url: 'https://m.client.10010.com/Niujie/calf/receiveCalf?shop=' + shop, 157 | method: 'get' 158 | }) 159 | console.log(data.message) 160 | await new Promise((resolve, reject) => setTimeout(resolve, 500)) 161 | } 162 | console.log('本轮领取完毕') 163 | } 164 | } 165 | 166 | module.exports = Niujie -------------------------------------------------------------------------------- /commands/tasks/unicom/commentSystem.js: -------------------------------------------------------------------------------- 1 | var transParams = (data) => { 2 | let params = new URLSearchParams(); 3 | for (let item in data) { 4 | params.append(item, data['' + item + '']); 5 | } 6 | return params; 7 | }; 8 | module.exports = { 9 | commentTask: async (axios, options) => { 10 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 11 | console.log('尝试文章点赞') 12 | let result = await axios.request({ 13 | baseURL: 'https://m.client.10010.com/', 14 | headers: { 15 | "user-agent": useragent, 16 | "referer": "https://img.client.10010.com/kuaibao/index.html", 17 | "origin": "https://img.client.10010.com" 18 | }, 19 | url: `/commentSystem/getNewsList`, 20 | method: 'post', 21 | data: transParams({ 22 | pageNum: 1, 23 | pageSize: 10, 24 | reqChannel: '00' 25 | }) 26 | }).catch(err => console.log('获取文章数据失败')) 27 | if (!result || result.data.code !== '0000') { 28 | throw new Error('获取文章数据失败') 29 | } 30 | let newsIds = result.data.data.map(i => ( 31 | { 32 | id: i.id, 33 | mainTitle: i.mainTitle, 34 | subTitle: i.subTitle 35 | } 36 | )) 37 | if (!newsIds.length) { 38 | throw new Error('获取文章数据失败') 39 | } 40 | for (let newsId of newsIds) { 41 | let result 42 | try { 43 | result = await axios.request({ 44 | baseURL: 'https://m.client.10010.com/', 45 | headers: { 46 | "user-agent": useragent, 47 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${newsId.id}&taskId=`, 48 | "origin": "https://img.client.10010.com" 49 | }, 50 | url: `/commentSystem/getCommentList`, 51 | method: 'post', 52 | data: transParams({ 53 | id: newsId.id, 54 | pageNum: 1, 55 | pageSize: 20, 56 | reqChannel: 'quickNews' 57 | }) 58 | }) 59 | } catch (err) { 60 | continue 61 | } 62 | let data = result.data 63 | if (!result || data.code !== '0000') { 64 | throw new Error('获取文章评论数据失败') 65 | } else { 66 | let comments = [] 67 | if ('length' in data.commentList) { 68 | comments = data.commentList.map(i => ( 69 | { 70 | comId: i.id, 71 | nickId: i.nickName 72 | } 73 | )) 74 | } 75 | for (let comment of comments) { 76 | // 取消点赞 77 | await axios.request({ 78 | baseURL: 'https://m.client.10010.com/', 79 | headers: { 80 | "user-agent": useragent, 81 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${newsId.id}&taskId=`, 82 | "origin": "https://img.client.10010.com" 83 | }, 84 | url: `/commentSystem/csPraise`, 85 | method: 'post', 86 | data: transParams({ 87 | 'pointChannel': '02', 88 | 'pointType': '02', 89 | 'reqChannel': 'quickNews', 90 | 'reqId': comment.comId, 91 | 'praisedMobile': comment.nickId, 92 | 'newsId': newsId.id 93 | }) 94 | }).catch(() => console.log('文章点赞失败')) 95 | // 进行点赞 96 | let result = await axios.request({ 97 | baseURL: 'https://m.client.10010.com/', 98 | headers: { 99 | "user-agent": useragent, 100 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${newsId.id}&taskId=`, 101 | "origin": "https://img.client.10010.com" 102 | }, 103 | url: `/commentSystem/csPraise`, 104 | method: 'post', 105 | data: transParams({ 106 | 'pointChannel': '02', 107 | 'pointType': '01', 108 | 'reqChannel': 'quickNews', 109 | 'reqId': comment.comId, 110 | 'praisedMobile': comment.nickId, 111 | 'newsId': newsId.id 112 | }) 113 | }).catch(() => console.log('文章点赞失败')) 114 | if (!result || result.data.code !== '0000') { 115 | console.log('文章评论点赞失败', result ? result.data.desc : '') 116 | } else { 117 | if (result.data.growScore === '0') { 118 | break 119 | } 120 | console.log('文章评论点赞成功') 121 | } 122 | } 123 | 124 | 125 | // 取消点赞 126 | await axios.request({ 127 | baseURL: 'https://m.client.10010.com/', 128 | headers: { 129 | "user-agent": useragent, 130 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${newsId.id}&taskId=`, 131 | "origin": "https://img.client.10010.com" 132 | }, 133 | url: `/commentSystem/csPraise`, 134 | method: 'post', 135 | data: transParams({ 136 | 'pointChannel': '01', 137 | 'pointType': '02', 138 | 'reqChannel': 'quickNews', 139 | 'reqId': newsId.id 140 | }) 141 | }).catch(() => console.log('文章点赞失败')) 142 | // 进行点赞 143 | let result = await axios.request({ 144 | baseURL: 'https://m.client.10010.com/', 145 | headers: { 146 | "user-agent": useragent, 147 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${newsId.id}&taskId=`, 148 | "origin": "https://img.client.10010.com" 149 | }, 150 | url: `/commentSystem/csPraise`, 151 | method: 'post', 152 | data: transParams({ 153 | 'pointChannel': '01', 154 | 'pointType': '01', 155 | 'reqChannel': 'quickNews', 156 | 'reqId': newsId.id 157 | }) 158 | }).catch(() => console.log('文章点赞失败')) 159 | if (!result || result.data.code !== '0000') { 160 | console.log('文章点赞失败', result ? result.data.desc : '') 161 | } else { 162 | if (result.data.growScore === '0') { 163 | break 164 | } 165 | console.log('文章点赞成功') 166 | } 167 | } 168 | break 169 | } 170 | 171 | console.log('尝试文章评论') 172 | let n = 5 173 | do { 174 | let news = newsIds[newsIds.length - 1] 175 | result = await axios.request({ 176 | baseURL: 'https://m.client.10010.com/', 177 | headers: { 178 | "user-agent": useragent, 179 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${news.id}&taskId=`, 180 | "origin": "https://img.client.10010.com" 181 | }, 182 | url: `/commentSystem/saveComment`, 183 | method: 'post', 184 | data: transParams({ 185 | 'id': news.id, 186 | 'belongPro': '098', 187 | 'commentContent': '6666...!', 188 | 'newsTitle': news.mainTitle, 189 | 'reqChannel': 'quickNews', 190 | 'subTitle': news.subTitle, 191 | 'upLoadImgName': '' 192 | }) 193 | }).catch(() => console.log('保存评论失败')) 194 | if (!result || result.data.code !== '0000') { 195 | console.log('保存评论失败', result ? result.data.desc : '') 196 | } else { 197 | console.log('保存评论成功') 198 | result = await axios.request({ 199 | baseURL: 'https://m.client.10010.com/', 200 | headers: { 201 | "user-agent": useragent, 202 | "referer": `https://img.client.10010.com/kuaibao/detail.html?pageFrom=newsList&id=${news.id}&taskId=`, 203 | "origin": "https://img.client.10010.com" 204 | }, 205 | url: `/commentSystem/delDynamic`, 206 | method: 'post', 207 | data: transParams({ 208 | 'reqChannel': 'quickNews', 209 | 'reqId': result.data.commentDetail.id, 210 | 'type': '01' 211 | }) 212 | }).catch(() => console.log('删除评论失败')) 213 | if (!result || result.data.code !== '0000') { 214 | console.log('保存评论成功', result ? result.data.desc : '') 215 | } else { 216 | console.log('删除评论成功') 217 | } 218 | } 219 | } while (--n) 220 | } 221 | } -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyBookLuckdraw.js: -------------------------------------------------------------------------------- 1 | 2 | var crypto = require('crypto'); 3 | var CryptoJS = require("crypto-js"); 4 | const { RSAUtils } = require('./RSAUtils'); 5 | 6 | var transParams = (data) => { 7 | let params = new URLSearchParams(); 8 | for (let item in data) { 9 | params.append(item, data['' + item + '']); 10 | } 11 | return params; 12 | }; 13 | 14 | var sign = (data) => { 15 | let str = 'integralofficial&' 16 | let params = [] 17 | data.forEach((v, i) => { 18 | if (v) { 19 | params.push('arguments' + (i + 1) + v) 20 | } 21 | }); 22 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 23 | } 24 | 25 | var dailyBookLuckdraw = { 26 | oauthMethod: async (axios, options) => { 27 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 28 | let { data } = await axios.request({ 29 | headers: { 30 | "user-agent": useragent, 31 | "referer": `https://img.client.10010.com/`, 32 | "origin": "https://img.client.10010.com" 33 | }, 34 | url: `https://m.client.10010.com/finderInterface/woReadOauth/?typeCode=oauthMethod`, 35 | method: 'GET' 36 | }) 37 | return data.data.key 38 | }, 39 | login: async (axios, options) => { 40 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 41 | 42 | //密码加密 43 | var modulus = "00D9C7EE8B8C599CD75FC2629DBFC18625B677E6BA66E81102CF2D644A5C3550775163095A3AA7ED9091F0152A0B764EF8C301B63097495C7E4EA7CF2795029F61229828221B510AAE9A594CA002BA4F44CA7D1196697AEB833FD95F2FA6A5B9C2C0C44220E1761B4AB1A1520612754E94C55DC097D02C2157A8E8F159232ABC87"; 44 | var exponent = "010001"; 45 | var key = RSAUtils.getKeyPair(exponent, '', modulus); 46 | let phonenum = RSAUtils.encryptedString(key, options.user); 47 | let { data, config } = await axios.request({ 48 | headers: { 49 | "user-agent": useragent, 50 | "X-Requested-With": "com.sinovatech.unicom.ui" 51 | }, 52 | url: `https://m.iread.wo.cn/touchextenernal/common/shouTingLogin.action`, 53 | method: 'POST', 54 | data: transParams({ 55 | phonenum 56 | }) 57 | }) 58 | let jar = config.jar 59 | let cookiesJson = jar.toJSON() 60 | let diwert = cookiesJson.cookies.find(i => i.key == 'diwert') 61 | let useraccount = cookiesJson.cookies.find(i => i.key == 'useraccount') 62 | if (!useraccount || !diwert) { 63 | throw new Error('获取用户信息失败') 64 | } 65 | 66 | await axios.request({ 67 | headers: { 68 | "user-agent": useragent 69 | }, 70 | jar, 71 | url: `http://m.iread.wo.cn/touchextenernal/seeadvertluckdraw/index.action?channelid=18000018&yw_code=&desmobile=${options.user}&version=android@8.0100`, 72 | method: 'GET' 73 | }) 74 | 75 | return { 76 | jar 77 | } 78 | }, 79 | doTask: async (axios, options) => { 80 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 81 | let Authorization = await dailyBookLuckdraw.oauthMethod(axios, options) 82 | let { jar } = await dailyBookLuckdraw.login(axios, { 83 | ...options, 84 | Authorization 85 | }) 86 | 87 | let times = 5 88 | do { 89 | if (times < 5) { 90 | let params = { 91 | 'arguments1': 'AC20200521222721', 92 | 'arguments2': 'GGPD', 93 | 'arguments3': '', 94 | 'arguments4': new Date().getTime(), 95 | 'arguments6': '', 96 | 'arguments7': '', 97 | 'arguments8': '', 98 | 'arguments9': '', 99 | 'netWay': 'Wifi', 100 | 'remark': '阅读每日读书福利广告1', 101 | 'remark1': '阅读每日读书福利广告1', 102 | 'version': `android@8.0100`, 103 | 'codeId': 945535424 104 | } 105 | 106 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 107 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 108 | params['arguments4'] = new Date().getTime() 109 | 110 | await require('./taskcallback').reward(axios, { 111 | ...options, 112 | params, 113 | jar 114 | }) 115 | } 116 | 117 | let res = await axios.request({ 118 | headers: { 119 | "user-agent": useragent 120 | }, 121 | jar, 122 | url: `http://m.iread.wo.cn/touchextenernal/seeadvertluckdraw/doDraw.action`, 123 | method: 'POST', 124 | data: transParams({ 125 | 'acticeindex': 'NzJBQTQxMEE2QzQwQUE2MDYxMEI5MDNGQjFEMEEzODI=' 126 | }) 127 | }).catch(err => { 128 | if (err.response.status !== 200) { 129 | console.log('访问错误', err.response.statusText) 130 | throw new Error('访问错误:' + [err.response.status, err.response.statusText].join('-')) 131 | } 132 | }) 133 | let result = res.data 134 | if (result.code === '0000') { 135 | console.log('阅读每日读书福利抽奖', result.prizedesc) 136 | } else if (result.code === '9999') { 137 | console.log('阅读每日读书福利抽奖', result.message) 138 | break 139 | } else { 140 | console.log('阅读每日读书福利抽奖', result.message) 141 | } 142 | 143 | console.log('等待15秒再继续') 144 | await new Promise((resolve, reject) => setTimeout(resolve, 15 * 1000)) 145 | 146 | } while (--times) 147 | } 148 | } 149 | 150 | module.exports = dailyBookLuckdraw -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyBookRead.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var sign = (data) => { 3 | let str = 'integralofficial&' 4 | let params = [] 5 | data.forEach((v, i) => { 6 | if (v) { 7 | params.push('arguments' + (i + 1) + v) 8 | } 9 | }); 10 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 11 | } 12 | let account = { 13 | yhTaskId: "93273c65ee2048c29b8e630a4b456cf0", 14 | yhChannel: "GGPD", 15 | accountChannel: "517050707", 16 | accountUserName: "517050707", 17 | accountPassword: "123456", 18 | accountToken: "4640b530b3f7481bb5821c6871854ce5", 19 | } 20 | var dailyTTliulan = { 21 | query: async (request, options) => { 22 | let params = { 23 | 'arguments1': 'AC20200521222721', // acid 24 | 'arguments2': account.yhChannel, // yhChannel 25 | 'arguments3': account.yhTaskId, // yhTaskId menuId 26 | 'arguments4': new Date().getTime(), // time 27 | 'arguments6': account.accountChannel, 28 | 'netWay': 'Wifi', 29 | 'version': `android@8.0100`, 30 | } 31 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 32 | return await require('./taskcallback').query(request, { 33 | ...options, 34 | params 35 | }) 36 | }, 37 | doTask: async (request, options) => { 38 | let { num, jar } = await dailyTTliulan.query(request, options) 39 | if (!num) { 40 | console.log('阅读计时器任务得积分: 今日已完成') 41 | return 42 | } 43 | do { 44 | console.log('第', num, '次') 45 | let params = { 46 | 'arguments1': 'AC20200521222721', // acid 47 | 'arguments2': account.yhChannel, // yhChannel 48 | 'arguments3': account.yhTaskId, // yhTaskId menuId 49 | 'arguments4': new Date().getTime(), // time 50 | 'arguments6': account.accountChannel, 51 | 'arguments7': account.accountUserName, 52 | 'arguments8': account.accountPassword, 53 | 'arguments9': account.accountToken, 54 | 'orderId': crypto.createHash('md5').update(new Date().getTime() + '').digest('hex'), 55 | 'netWay': 'Wifi', 56 | 'remark': '阅读计时器任务得积分', 57 | 'version': `android@8.0100`, 58 | 'codeId': 945535616 59 | } 60 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 61 | await require('./taskcallback').doTask(request, { 62 | ...options, 63 | params, 64 | jar 65 | }) 66 | let s = Math.floor(Math.random() * 20) 67 | console.log('等待%s秒再继续', s) 68 | await new Promise((resolve, reject) => setTimeout(resolve, s * 1000)) 69 | } while (--num) 70 | } 71 | } 72 | 73 | module.exports = dailyTTliulan -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyGrabdollPage.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var moment = require('moment'); 3 | 4 | // 开心抓大奖 5 | var transParams = (data) => { 6 | let params = new URLSearchParams(); 7 | for (let item in data) { 8 | params.append(item, data['' + item + '']); 9 | } 10 | return params; 11 | }; 12 | function w() { 13 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 14 | , t = []; 15 | return Object.keys(e).forEach((function (a) { 16 | t.push("".concat(a, "=").concat(encodeURIComponent(e[a]))) 17 | } 18 | )), 19 | t.join("&") 20 | } 21 | var sign = (data) => { 22 | let str = 'integralofficial&' 23 | let params = [] 24 | data.forEach((v, i) => { 25 | if (v) { 26 | params.push('arguments' + (i + 1) + v) 27 | } 28 | }); 29 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 30 | } 31 | 32 | function encryption(data, key) { 33 | var iv = ""; 34 | var cipherEncoding = 'base64'; 35 | var cipher = crypto.createCipheriv('aes-128-ecb', key, iv); 36 | cipher.setAutoPadding(true); 37 | return Buffer.concat([cipher.update(data), cipher.final()]).toString(cipherEncoding); 38 | } 39 | 40 | var dailyGrabdollPage = { 41 | getState: async (axios, options) => { 42 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:}` 43 | const { searchParams, ecs_token } = options 44 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 45 | let timestamp = moment().format('YYYYMMDDHHmmss') 46 | let { data, config } = await axios.request({ 47 | headers: { 48 | "user-agent": useragent, 49 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/grabdollPage?source=unicom&type=02&ticket=${searchParams.ticket}&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&duanlianjieabc=tbKHR&userNumber=${options.user}`, 50 | }, 51 | url: `https://wxapp.msmds.cn/jplus/api/channelGrabDoll/index`, 52 | method: 'POST', 53 | data: transParams({ 54 | 'channelId': 'LT_channel', 55 | "phone": phone, 56 | 'token': ecs_token, 57 | 'sourceCode': 'lt_zhuawawa' 58 | }) 59 | }) 60 | if (data.code !== 200) { 61 | console.log('获取任务状态失败') 62 | return { 63 | jar: config.jar, 64 | state: false 65 | } 66 | } else { 67 | return { 68 | jar: config.jar, 69 | state: data.data.grabDollAgain 70 | } 71 | } 72 | }, 73 | doTask: async (axios, options) => { 74 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:}` 75 | let searchParams = {} 76 | let result = await axios.request({ 77 | baseURL: 'https://m.client.10010.com/', 78 | headers: { 79 | "user-agent": useragent, 80 | "referer": `https://img.client.10010.com/`, 81 | "origin": "https://img.client.10010.com" 82 | }, 83 | url: `https://m.client.10010.com/mobileService/openPlatform/openPlatLine.htm?to_url=https://wxapp.msmds.cn/h5/react_web/unicom/grabdollPage?source=unicom&duanlianjieabc=tbKHR`, 84 | method: 'GET', 85 | transformResponse: (data, headers) => { 86 | if ('location' in headers) { 87 | let uu = new URL(headers.location) 88 | let pp = {} 89 | for (let p of uu.searchParams) { 90 | pp[p[0]] = p[1] 91 | } 92 | if ('ticket' in pp) { 93 | searchParams = pp 94 | } 95 | } 96 | return data 97 | } 98 | }).catch(err => console.log(err)) 99 | let jar1 = result.config.jar 100 | 101 | let cookiesJson = jar1.toJSON() 102 | let ecs_token = cookiesJson.cookies.find(i => i.key == 'ecs_token') 103 | ecs_token = ecs_token.value 104 | if (!ecs_token) { 105 | throw new Error('ecs_token缺失') 106 | } 107 | let { state, jar: gjar } = await dailyGrabdollPage.getState(axios, { 108 | ...options, 109 | ecs_token, 110 | searchParams 111 | }) 112 | if (!state) { 113 | console.log('任务已完成,明日再来') 114 | return 115 | } 116 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 117 | let times = 5 118 | do { 119 | 120 | if (times < 5) { 121 | let params = { 122 | 'arguments1': 'AC20200624091508', 123 | 'arguments2': 'GGPD', 124 | 'arguments3': '734225b6ec9946cca3bcdc6a6e14fc1f', 125 | 'arguments4': new Date().getTime(), 126 | 'arguments6': '', 127 | 'arguments7': '', 128 | 'arguments8': '', 129 | 'arguments9': '', 130 | 'netWay': 'Wifi', 131 | 'remark': '签到看视频得积分2', 132 | 'remark1': '签到看视频得积分2', 133 | 'version': `android@8.0100`, 134 | 'codeId': 945474727 135 | } 136 | 137 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 138 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 139 | params['arguments4'] = new Date().getTime() 140 | 141 | let result = await require('./taskcallback').reward(axios, { 142 | ...options, 143 | params, 144 | jar: jar1 145 | }) 146 | let a = { 147 | 'channelId': 'LT_channel', 148 | "phone": phone, 149 | 'token': ecs_token, 150 | 'sourceCode': 'lt_zhuawawa' 151 | } 152 | 153 | let timestamp = moment().format('YYYYMMDDHHmmss') 154 | result = await axios.request({ 155 | headers: { 156 | "user-agent": useragent, 157 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/grabdollPage?source=unicom&type=02&ticket=${searchParams.ticket}&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&duanlianjieabc=tbKHR&userNumber=${options.user}`, 158 | "origin": "https://wxapp.msmds.cn" 159 | }, 160 | jar: gjar, 161 | url: `https://wxapp.msmds.cn/jplus/api/channelGrabDoll/playAgainByLookingVideos`, 162 | method: 'POST', 163 | data: transParams(a) 164 | }) 165 | 166 | if (result.data.code !== 200) { 167 | console.log('提交任务失败', result.data.msg) 168 | } else { 169 | console.log('提交任务成功', `${result.data.data}`) 170 | } 171 | 172 | } 173 | 174 | let timestamp = moment().format('YYYYMMDDHHmmss') 175 | let res = await axios.request({ 176 | headers: { 177 | "user-agent": useragent, 178 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/grabdollPage?source=unicom&type=02&ticket=${searchParams.ticket}&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&duanlianjieabc=tbKHR&userNumber=${options.user}`, 179 | }, 180 | jar: gjar, 181 | url: `https://wxapp.msmds.cn/jplus/api/channelGrabDoll/startGame`, 182 | method: 'POST', 183 | data: transParams({ 184 | 'channelId': 'LT_channel', 185 | "phone": phone, 186 | 'token': ecs_token, 187 | 'sourceCode': 'lt_zhuawawa' 188 | }) 189 | }) 190 | 191 | let result = res.data 192 | if (result.code === 200) { 193 | console.log('阅读开心抓大奖', result.data.goodsName) 194 | } else { 195 | console.log('阅读开心抓大奖', result.msg) 196 | } 197 | 198 | console.log('等待15秒再继续') 199 | await new Promise((resolve, reject) => setTimeout(resolve, 15 * 1000)) 200 | 201 | } while (--times) 202 | } 203 | } 204 | 205 | module.exports = dailyGrabdollPage -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyTTliulan.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var sign = (data) => { 3 | let str = 'integralofficial&' 4 | let params = [] 5 | data.forEach((v, i) => { 6 | if (v) { 7 | params.push('arguments' + (i + 1) + v) 8 | } 9 | }); 10 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 11 | } 12 | let account = { 13 | yhTaskId: "6c54032f662c4d2bb576872ed408232c", 14 | yhChannel: "GGPD", 15 | accountChannel: "517050707", 16 | accountUserName: "517050707", 17 | accountPassword: "123456", 18 | accountToken: "4640b530b3f7481bb5821c6871854ce5", 19 | } 20 | var dailyTTliulan = { 21 | query: async (request, options) => { 22 | let params = { 23 | 'arguments1': 'AC20200814162815', // acid 24 | 'arguments2': account.yhChannel, // yhChannel 25 | 'arguments3': account.yhTaskId, // yhTaskId menuId 26 | 'arguments4': new Date().getTime(), // time 27 | 'arguments6': account.accountChannel, 28 | 'netWay': 'Wifi', 29 | 'version': `android@8.0100`, 30 | } 31 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 32 | return await require('./taskcallback').query(request, { 33 | ...options, 34 | params 35 | }) 36 | }, 37 | doTask: async (request, options) => { 38 | let { num, jar } = await dailyTTliulan.query(request, options) 39 | if (!num) { 40 | console.log('手厅浏览有礼发积分: 今日已完成') 41 | return 42 | } 43 | do { 44 | console.log('第', num, '次') 45 | let params = { 46 | 'arguments1': 'AC20200814162815', // acid 47 | 'arguments2': account.yhChannel, // yhChannel 48 | 'arguments3': account.yhTaskId, // yhTaskId menuId 49 | 'arguments4': new Date().getTime(), // time 50 | 'arguments6': account.accountChannel, 51 | 'arguments7': account.accountUserName, 52 | 'arguments8': account.accountPassword, 53 | 'arguments9': account.accountToken, 54 | 'orderId': crypto.createHash('md5').update(new Date().getTime() + '').digest('hex'), 55 | 'netWay': 'Wifi', 56 | 'remark': '手厅浏览有礼发积分', 57 | 'version': `android@8.0100`, 58 | 'codeId': 945535616 59 | } 60 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 61 | await require('./taskcallback').doTask(request, { 62 | ...options, 63 | params, 64 | jar 65 | }) 66 | 67 | let s = Math.floor(Math.random() * 20) 68 | console.log('等待%s秒再继续', s) 69 | await new Promise((resolve, reject) => setTimeout(resolve, s * 1000)) 70 | } while (--num) 71 | } 72 | } 73 | 74 | module.exports = dailyTTliulan -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyTurntablePage.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var moment = require('moment'); 3 | 4 | // 幸运大转盘 5 | var transParams = (data) => { 6 | let params = new URLSearchParams(); 7 | for (let item in data) { 8 | params.append(item, data['' + item + '']); 9 | } 10 | return params; 11 | }; 12 | function w() { 13 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 14 | , t = []; 15 | return Object.keys(e).forEach((function (a) { 16 | t.push("".concat(a, "=").concat(encodeURIComponent(e[a]))) 17 | } 18 | )), 19 | t.join("&") 20 | } 21 | var sign = (data) => { 22 | let str = 'integralofficial&' 23 | let params = [] 24 | data.forEach((v, i) => { 25 | if (v) { 26 | params.push('arguments' + (i + 1) + v) 27 | } 28 | }); 29 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 30 | } 31 | 32 | function encryption(data, key) { 33 | var iv = ""; 34 | var cipherEncoding = 'base64'; 35 | var cipher = crypto.createCipheriv('aes-128-ecb', key, iv); 36 | cipher.setAutoPadding(true); 37 | return Buffer.concat([cipher.update(data), cipher.final()]).toString(cipherEncoding); 38 | } 39 | 40 | var dailyTurntablePage = { 41 | getGoodsList: async (axios, options) => { 42 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 43 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 44 | let result = await axios.request({ 45 | headers: { 46 | "user-agent": useragent, 47 | "referer": `https://wxapp.msmds.cn/`, 48 | "origin": "https://wxapp.msmds.cn" 49 | }, 50 | url: `https://wxapp.msmds.cn/jplus/api/change/luck/draw/gift/v1/list`, 51 | method: 'POST', 52 | data: transParams({ 53 | 'channelId': 'LT_channel', 54 | 'phone': phone, 55 | 'token': options.ecs_token, 56 | 'sourceCode': 'lt_turntable' 57 | }) 58 | }) 59 | return result.data.data 60 | }, 61 | doTask: async (axios, options) => { 62 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:}` 63 | let searchParams = {} 64 | let result = await axios.request({ 65 | baseURL: 'https://m.client.10010.com/', 66 | headers: { 67 | "user-agent": useragent, 68 | "referer": `https://img.client.10010.com/`, 69 | "origin": "https://img.client.10010.com" 70 | }, 71 | url: `https://m.client.10010.com/mobileService/openPlatform/openPlatLine.htm?to_url=https://wxapp.msmds.cn/h5/react_web/unicom/turntablePage`, 72 | method: 'GET', 73 | transformResponse: (data, headers) => { 74 | if ('location' in headers) { 75 | let uu = new URL(headers.location) 76 | let pp = {} 77 | for (let p of uu.searchParams) { 78 | pp[p[0]] = p[1] 79 | } 80 | if ('ticket' in pp) { 81 | searchParams = pp 82 | } 83 | } 84 | return data 85 | } 86 | }).catch(err => console.log(err)) 87 | let jar1 = result.config.jar 88 | 89 | let cookiesJson = jar1.toJSON() 90 | let ecs_token = cookiesJson.cookies.find(i => i.key == 'ecs_token') 91 | ecs_token = ecs_token.value 92 | if (!ecs_token) { 93 | throw new Error('ecs_token缺失') 94 | } 95 | 96 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 97 | let playCounts = 0 98 | let isLookVideo = false 99 | do { 100 | let res = await dailyTurntablePage.getGoodsList(axios, { 101 | ...options, 102 | ecs_token, 103 | phone 104 | }) 105 | 106 | 107 | playCounts = res.playCounts 108 | isLookVideo = res.isLookVideo 109 | 110 | if (!playCounts && !isLookVideo) { 111 | console.log('没有游戏次数') 112 | break 113 | } 114 | 115 | if (!playCounts && isLookVideo) { 116 | 117 | let params = { 118 | 'arguments1': '', 119 | 'arguments2': '', 120 | 'arguments3': '', 121 | 'arguments4': new Date().getTime(), 122 | 'arguments6': '', 123 | 'arguments7': '', 124 | 'arguments8': '', 125 | 'arguments9': '', 126 | 'netWay': 'Wifi', 127 | 'remark': '签到小游戏买什么都省转盘抽奖', 128 | 'version': `android@8.0100`, 129 | 'codeId': 945535695 130 | } 131 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 132 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 133 | params['arguments4'] = new Date().getTime() 134 | 135 | result = await require('./taskcallback').reward(axios, { 136 | ...options, 137 | params, 138 | jar: jar1 139 | }) 140 | let a = { 141 | 'channelId': 'LT_channel', 142 | "phone": phone, 143 | 'token': ecs_token, 144 | 'videoOrderNo': params['orderId'], 145 | 'sourceCode': 'lt_turntable' 146 | } 147 | 148 | let timestamp = moment().format('YYYYMMDDHHmmss') 149 | result = await axios.request({ 150 | headers: { 151 | "user-agent": useragent, 152 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/turntablePage?ticket=${searchParams.ticket}&type=02&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&userNumber=${options.user}`, 153 | "origin": "https://wxapp.msmds.cn" 154 | }, 155 | url: `https://wxapp.msmds.cn/jplus/api/change/luck/draw/gift/v1/liantong/look/video`, 156 | method: 'POST', 157 | data: transParams(a) 158 | }) 159 | 160 | if (result.data.code !== 200) { 161 | console.log('提交任务失败', result.data.msg) 162 | } else { 163 | console.log('提交任务成功', `${result.data.data}`) 164 | } 165 | } 166 | 167 | let a = { 168 | 'channelId': 'LT_channel', 169 | 'code': '', 170 | 'flag': '', 171 | "phone": phone, 172 | 'token': ecs_token, 173 | 'taskId': '', 174 | 'sourceCode': 'lt_turntable' 175 | } 176 | 177 | let timestamp = moment().format('YYYYMMDDHHmmss') 178 | result = await axios.request({ 179 | headers: { 180 | "user-agent": useragent, 181 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/turntablePage?ticket=${searchParams.ticket}&type=02&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&userNumber=${options.user}`, 182 | "origin": "https://wxapp.msmds.cn" 183 | }, 184 | url: `https://wxapp.msmds.cn/jplus/api/change/luck/draw/gift/v1/playLuckDraw?` + w(a), 185 | method: 'POST' 186 | }) 187 | 188 | if (result.data.code !== 200) { 189 | console.log('提交任务失败', result.data.msg) 190 | } else { 191 | let good = result.data.data.list.find(f => f.giftId === result.data.data.giftId) 192 | console.log('提交任务成功,获得', good.giftName) 193 | if (result.data.data.lookVideoDouble) { 194 | console.log('提交积分翻倍') 195 | await dailyTurntablePage.lookVideoDouble(axios, { 196 | ...options, 197 | jar: result.config.jar 198 | }) 199 | } 200 | } 201 | 202 | console.log('等待25秒再继续') 203 | await new Promise((resolve, reject) => setTimeout(resolve, 25 * 1000)) 204 | 205 | } while (playCounts || isLookVideo) 206 | }, 207 | lookVideoDouble: async (axios, options) => { 208 | const { jar } = options 209 | let params = { 210 | 'arguments1': 'AC20200716103629', // acid 211 | 'arguments2': 'GGPD', // yhChannel 212 | 'arguments3': 'fc32b68892de4299b6ccfb2de72e1ab8', // yhTaskId menuId 213 | 'arguments4': new Date().getTime(), // time 214 | 'arguments6': '517050707', 215 | 'netWay': 'Wifi', 216 | 'version': `android@8.0100` 217 | } 218 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 219 | let { num } = await require('./taskcallback').query(axios, { 220 | ...options, 221 | params 222 | }) 223 | 224 | if (!num) { 225 | console.log('签到小游戏买什么都省转盘抽奖: 今日已完成') 226 | return 227 | } 228 | do { 229 | console.log('第', num, '次') 230 | let params = { 231 | 'arguments1': 'AC20200716103629', // acid 232 | 'arguments2': 'GGPD', // yhChannel 233 | 'arguments3': 'fc32b68892de4299b6ccfb2de72e1ab8', // yhTaskId menuId 234 | 'arguments4': new Date().getTime(), // time 235 | 'arguments6': '', 236 | 'arguments7': '', 237 | 'arguments8': '', 238 | 'arguments9': '', 239 | 'orderId': crypto.createHash('md5').update(new Date().getTime() + '').digest('hex'), 240 | 'netWay': 'Wifi', 241 | 'remark': '签到小游戏买什么都省转盘抽奖', 242 | 'version': `android@8.0100`, 243 | 'codeId': 945535695 244 | } 245 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 246 | await require('./taskcallback').doTask(axios, { 247 | ...options, 248 | params, 249 | jar 250 | }) 251 | 252 | if (num) { 253 | console.log('等待15秒再继续') 254 | await new Promise((resolve, reject) => setTimeout(resolve, 15 * 1000)) 255 | } 256 | 257 | } while (--num) 258 | } 259 | } 260 | 261 | module.exports = dailyTurntablePage -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyVideo.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var sign = (data) => { 3 | let str = 'integralofficial&' 4 | let params = [] 5 | data.forEach((v, i) => { 6 | if (v) { 7 | params.push('arguments' + (i + 1) + v) 8 | } 9 | }); 10 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 11 | } 12 | let account = { 13 | yhTaskId: "734225b6ec9946cca3bcdc6a6e14fc1f", 14 | yhChannel: "GGPD", 15 | accountChannel: "517050707", 16 | accountUserName: "517050707", 17 | accountPassword: "123456", 18 | accountToken: "4640b530b3f7481bb5821c6871854ce5", 19 | } 20 | var dailyVideo = { 21 | query: async (request, options) => { 22 | let params = { 23 | 'arguments1': 'AC20200624091508', // acid 24 | 'arguments2': account.yhChannel, // yhChannel 25 | 'arguments3': account.yhTaskId, // yhTaskId menuId 26 | 'arguments4': new Date().getTime(), // time 27 | 'arguments6': account.accountChannel, 28 | 'netWay': 'Wifi', 29 | 'version': `android@8.0100` 30 | } 31 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 32 | return await require('./taskcallback').query(request, { 33 | ...options, 34 | params 35 | }) 36 | }, 37 | doTask: async (request, options) => { 38 | let { num, jar } = await dailyVideo.query(request, options) 39 | if (!num) { 40 | console.log('签到看视频得积分: 今日已完成') 41 | return 42 | } 43 | do { 44 | console.log('第', num, '次') 45 | let params = { 46 | 'arguments1': 'AC20200624091508', // acid 47 | 'arguments2': account.yhChannel, // yhChannel 48 | 'arguments3': account.yhTaskId, // yhTaskId menuId 49 | 'arguments4': new Date().getTime(), // time 50 | 'arguments6': '', 51 | 'arguments7': '', 52 | 'arguments8': '', 53 | 'arguments9': '', 54 | 'orderId': crypto.createHash('md5').update(new Date().getTime() + '').digest('hex'), 55 | 'netWay': 'Wifi', 56 | 'remark': '签到看视频得积分', 57 | 'version': `android@8.0100`, 58 | 'codeId': 945535616 59 | } 60 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 61 | await require('./taskcallback').doTask(request, { 62 | ...options, 63 | params, 64 | jar 65 | }) 66 | 67 | let s = Math.floor(Math.random() * 20) 68 | console.log('等待%s秒再继续', s) 69 | await new Promise((resolve, reject) => setTimeout(resolve, s * 1000)) 70 | } while (--num) 71 | } 72 | } 73 | 74 | module.exports = dailyVideo -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyVideoFreeGoods.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var moment = require('moment'); 3 | 4 | // 签到小游戏买什么都省免费夺宝 5 | var transParams = (data) => { 6 | let params = new URLSearchParams(); 7 | for (let item in data) { 8 | params.append(item, data['' + item + '']); 9 | } 10 | return params; 11 | }; 12 | 13 | var sign = (data) => { 14 | let str = 'integralofficial&' 15 | let params = [] 16 | data.forEach((v, i) => { 17 | if (v) { 18 | params.push('arguments' + (i + 1) + v) 19 | } 20 | }); 21 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 22 | } 23 | 24 | function encryption (data, key) { 25 | var iv = ""; 26 | var cipherEncoding = 'base64'; 27 | var cipher = crypto.createCipheriv('aes-128-ecb', key, iv); 28 | cipher.setAutoPadding(true); 29 | return Buffer.concat([cipher.update(data), cipher.final()]).toString(cipherEncoding); 30 | } 31 | 32 | var dailyVideoFreeGoods = { 33 | getGoodsList: async (axios, options) => { 34 | const { token } = options 35 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 36 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 37 | let res = await axios.request({ 38 | headers: { 39 | "user-agent": useragent, 40 | "referer": `https://wxapp.msmds.cn/`, 41 | "origin": "https://wxapp.msmds.cn" 42 | }, 43 | url: `https://wxapp.msmds.cn/jplus/api/channel/integral/free/goods/findAll`, 44 | method: 'POST', 45 | data: transParams({ 46 | 'fromType': '22', 47 | 'status': '0', 48 | 'pageNo': '1', 49 | 'pageSize': '10', 50 | 'channelId': 'LT_channel', 51 | 'phone': phone, 52 | 'token': token, 53 | 'sourceCode': 'lt_freeTake' 54 | }) 55 | }) 56 | let result = res.data 57 | return { 58 | goods: result.data.goodsList.data, 59 | freeTimes: result.data.freeTimes, 60 | leftTimes: result.data.leftTimes, 61 | time: result.data.time, 62 | getFreeTime: result.data.getFreeTime, 63 | sameGoodsMaxTimes: result.data.sameGoodsMaxTimes, 64 | } 65 | }, 66 | doTask: async (axios, options) => { 67 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:}` 68 | let searchParams = {} 69 | let result = await axios.request({ 70 | baseURL: 'https://m.client.10010.com/', 71 | headers: { 72 | "user-agent": useragent, 73 | "referer": `https://img.client.10010.com/`, 74 | "origin": "https://img.client.10010.com" 75 | }, 76 | url: `https://m.client.10010.com/mobileService/openPlatform/openPlatLine.htm?to_url=https://wxapp.msmds.cn/h5/react_web/unicom/freeTakePage`, 77 | method: 'get', 78 | transformResponse: (data, headers) => { 79 | if ('location' in headers) { 80 | let uu = new URL(headers.location) 81 | let pp = {} 82 | for (let p of uu.searchParams) { 83 | pp[p[0]] = p[1] 84 | } 85 | if ('ticket' in pp) { 86 | searchParams = pp 87 | } 88 | } 89 | return data 90 | } 91 | }).catch(err => console.log(err)) 92 | 93 | let jar1 = result.config.jar 94 | let cookiesJson = jar1.toJSON() 95 | let ecs_token = cookiesJson.cookies.find(i => i.key == 'ecs_token') 96 | if (!ecs_token) { 97 | throw new Error('ecs_token缺失') 98 | } 99 | ecs_token = ecs_token.value 100 | let { goods, freeTimes, leftTimes, time, getFreeTime, sameGoodsMaxTimes } = await dailyVideoFreeGoods.getGoodsList(axios, { 101 | ...options, 102 | token: ecs_token 103 | }) 104 | console.log('签到小游戏买什么都省免费夺宝', `剩余机会(${leftTimes}/${freeTimes})`) 105 | 106 | if (!leftTimes) { 107 | if (time) { 108 | console.log(`签到小游戏买什么都省免费夺宝: 剩余机会不足,等待下一轮,` + moment().add(time, 'seconds').format('YYYY-MM-DD HH:mm:ss') + ' 后可再次尝试') 109 | } 110 | } 111 | 112 | let params = { 113 | 'arguments1': '', 114 | 'arguments2': '', 115 | 'arguments3': '', 116 | 'arguments4': new Date().getTime(), 117 | 'arguments6': '', 118 | 'arguments7': '', 119 | 'arguments8': '', 120 | 'arguments9': '', 121 | 'netWay': 'Wifi', 122 | 'remark': '签到小游戏买什么都省免费夺宝', 123 | 'version': `android@8.0100`, 124 | 'codeId': 945535689 125 | } 126 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 127 | 128 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 129 | 130 | // 同一期商品最多3次机会,每4小时可获得5次机会 131 | for (let good of goods) { 132 | 133 | console.log('开始处理', good.goodsName) 134 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 135 | params['arguments4'] = new Date().getTime() 136 | 137 | let p = { 138 | 'channelId': 'LT_channel', 139 | 'phone': phone, 140 | 'token': ecs_token, 141 | 'sourceCode': 'lt_freeTake' 142 | } 143 | 144 | let timestamp = moment().format('YYYYMMDDHHmmss') 145 | result = await axios.request({ 146 | baseURL: 'https://m.client.10010.com/', 147 | headers: { 148 | "user-agent": useragent, 149 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/freeTakeGoodDetail/${good.id}?source=unicom&type=02&ticket=${searchParams.ticket}&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&userNumber=${options.user} `, 150 | "origin": "https://wxapp.msmds.cn" 151 | }, 152 | url: `https://wxapp.msmds.cn/jplus/api/channel/integral/free/goods/getTimes`, 153 | method: 'GET', 154 | params: transParams(p) 155 | }) 156 | 157 | if (result.data.data.time) { 158 | console.log(`已处于限制期,` + moment().add(result.data.data.time, 'seconds').format('YYYY-MM-DD HH:mm:ss') + ' 后可再次尝试,跳过') 159 | break 160 | } 161 | 162 | result = await require('./taskcallback').reward(axios, { 163 | ...options, 164 | params, 165 | jar: jar1 166 | }) 167 | 168 | timestamp = moment().format('YYYYMMDDHHmmss') 169 | result = await axios.request({ 170 | headers: { 171 | "user-agent": useragent, 172 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/freeTakeGoodDetail/${good.id}?source=unicom&type=02&ticket=${searchParams.ticket}&version=android@8.0100×tamp=${timestamp}&desmobile=${options.user}&num=0&postage=${searchParams.postage}&userNumber=${options.user}`, 173 | "origin": "https://wxapp.msmds.cn" 174 | }, 175 | url: `https://wxapp.msmds.cn/jplus/api/channel/integral/free/goods/doFreeGoods`, 176 | method: 'POST', 177 | data: transParams({ 178 | 'channelId': 'LT_channel', 179 | 'code': '', 180 | 'flag': '', 181 | 'id': good.id, 182 | "phone": phone, 183 | 'sourceCode': 'lt_freeTake', 184 | 'taskId': '', 185 | 'token': ecs_token, 186 | 'videoOrderNo': params.orderId 187 | }) 188 | }) 189 | if (result.data.code !== 2000) { 190 | console.log(result.data.msg) 191 | } else { 192 | if (result.data.data.luckCode) { 193 | console.log('提交任务成功', `券码:${result.data.data.luckCode}`) 194 | } else if (result.data.data.time) { 195 | throw new Error(`已处于限制期,` + moment().add(result.data.data.time, 'seconds').format('YYYY-MM-DD HH:mm:ss') + ' 后可再次尝试') 196 | } else { 197 | console.log('提交任务成功') 198 | } 199 | } 200 | console.log('等待25秒再继续') 201 | await new Promise((resolve, reject) => setTimeout(resolve, 25 * 1000)) 202 | } 203 | } 204 | } 205 | 206 | module.exports = dailyVideoFreeGoods -------------------------------------------------------------------------------- /commands/tasks/unicom/dailyVideoScratchcard.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | 3 | // 疯狂刮刮乐 4 | var transParams = (data) => { 5 | let params = new URLSearchParams(); 6 | for (let item in data) { 7 | params.append(item, data['' + item + '']); 8 | } 9 | return params; 10 | }; 11 | function w () { 12 | var e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {} 13 | , t = []; 14 | return Object.keys(e).forEach((function (a) { 15 | t.push("".concat(a, "=").concat(encodeURIComponent(e[a]))) 16 | } 17 | )), 18 | t.join("&") 19 | } 20 | var sign = (data) => { 21 | let str = 'integralofficial&' 22 | let params = [] 23 | data.forEach((v, i) => { 24 | if (v) { 25 | params.push('arguments' + (i + 1) + v) 26 | } 27 | }); 28 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 29 | } 30 | 31 | function encryption (data, key) { 32 | var iv = ""; 33 | var cipherEncoding = 'base64'; 34 | var cipher = crypto.createCipheriv('aes-128-ecb', key, iv); 35 | cipher.setAutoPadding(true); 36 | return Buffer.concat([cipher.update(data), cipher.final()]).toString(cipherEncoding); 37 | } 38 | 39 | var dailyVideoScratchcard = { 40 | getGoodsList: async (axios, options) => { 41 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 42 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 43 | let result = await axios.request({ 44 | headers: { 45 | "user-agent": useragent, 46 | "referer": `https://wxapp.msmds.cn/`, 47 | "origin": "https://wxapp.msmds.cn" 48 | }, 49 | url: `https://wxapp.msmds.cn/jplus/h5/channelScratchCard/findAllCard`, 50 | method: 'GET', 51 | params: transParams({ 52 | 'channelId': 'LT_channel', 53 | 'phone': phone, 54 | 'token': options.ecs_token, 55 | 'sourceCode': 'lt_scratchcard' 56 | }) 57 | }) 58 | return result.data.data.allCards.filter(c => !c.status) 59 | }, 60 | doTask: async (axios, options) => { 61 | 62 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:}` 63 | let searchParams = {} 64 | let result = await axios.request({ 65 | baseURL: 'https://m.client.10010.com/', 66 | headers: { 67 | "user-agent": useragent, 68 | "referer": `https://img.client.10010.com/`, 69 | "origin": "https://img.client.10010.com" 70 | }, 71 | url: `https://m.client.10010.com/mobileService/openPlatform/openPlatLine.htm?to_url=https://wxapp.msmds.cn/h5/react_web/unicom/scratchcardPage?source=unicom&duanlianjieabc=tbkR2`, 72 | method: 'get', 73 | transformResponse: (data, headers) => { 74 | if ('location' in headers) { 75 | let uu = new URL(headers.location) 76 | let pp = {} 77 | for (let p of uu.searchParams) { 78 | pp[p[0]] = p[1] 79 | } 80 | if ('ticket' in pp) { 81 | searchParams = pp 82 | } 83 | } 84 | return data 85 | } 86 | }).catch(err => console.log(err)) 87 | 88 | let jar1 = result.config.jar 89 | 90 | let cookiesJson = jar1.toJSON() 91 | let ecs_token = cookiesJson.cookies.find(i => i.key == 'ecs_token') 92 | if (!ecs_token) { 93 | throw new Error('ecs_token缺失') 94 | } 95 | ecs_token = ecs_token.value 96 | 97 | let phone = encryption(options.user, 'gb6YCccUvth75Tm2') 98 | 99 | let goods = await dailyVideoScratchcard.getGoodsList(axios, { 100 | ...options, 101 | ecs_token, 102 | phone 103 | }) 104 | 105 | let params = { 106 | 'arguments1': '', 107 | 'arguments2': '', 108 | 'arguments3': '', 109 | 'arguments4': new Date().getTime(), 110 | 'arguments6': '', 111 | 'arguments7': '', 112 | 'arguments8': '', 113 | 'arguments9': '', 114 | 'netWay': 'Wifi', 115 | 'remark': '签到小游戏幸运刮刮卡', 116 | 'version': `android@8.0100`, 117 | 'codeId': 945597731 118 | } 119 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 120 | 121 | if (goods.length) { 122 | for (let good of goods) { 123 | console.log('开始处理', good.name) 124 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 125 | params['arguments4'] = new Date().getTime() 126 | 127 | result = await require('./taskcallback').reward(axios, { 128 | ...options, 129 | params, 130 | jar: jar1 131 | }) 132 | let a = { 133 | 'channelId': 'LT_channel', 134 | "phone": phone, 135 | 'token': ecs_token, 136 | 'cardId': good.id, 137 | 'sourceCode': 'lt_scratchcard' 138 | } 139 | result = await axios.request({ 140 | headers: { 141 | "user-agent": useragent, 142 | "referer": `https://wxapp.msmds.cn/h5/react_web/unicom/scratchcardItemPage`, 143 | "origin": "https://wxapp.msmds.cn" 144 | }, 145 | url: `https://wxapp.msmds.cn/jplus/h5/channelScratchCard/doScratchCard?` + w(a), 146 | method: 'GET' 147 | }) 148 | if (result.data.code !== 200) { 149 | console.log(result.data.msg) 150 | } else { 151 | console.log('提交任务成功', `+${result.data.data.prizeType ? result.data.data.integral : 0}`) 152 | } 153 | console.log('等待15秒再继续') 154 | await new Promise((resolve, reject) => setTimeout(resolve, 15 * 1000)) 155 | } 156 | } else { 157 | console.log('暂无可刮得商品') 158 | } 159 | } 160 | } 161 | 162 | module.exports = dailyVideoScratchcard -------------------------------------------------------------------------------- /commands/tasks/unicom/dailylottery.js: -------------------------------------------------------------------------------- 1 | 2 | var dailylottery = { 3 | encryptmobile: async (axios, options) => { 4 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 5 | let res = await axios.request({ 6 | baseURL: 'https://m.client.10010.com/', 7 | headers: { 8 | "user-agent": useragent, 9 | "referer": `https://img.client.10010.com/jifenshangcheng/Directional?from=9110001000%E2%80%8B&yw_code=&desmobile=${options.user}&version=android%408.0100`, 10 | "origin": "https://img.client.10010.com" 11 | }, 12 | url: `/dailylottery/static/textdl/userLogin?flag=1&floortype=tbanner&from=9110001000%E2%80%8B&oneid=undefined&twoid=undefined`, 13 | method: 'get' 14 | }) 15 | let result = res.data 16 | let encryptmobile = result.substr(result.indexOf('encryptmobile=') + 14, 32) 17 | return encryptmobile 18 | }, 19 | doTask: async (axios, options) => { 20 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 21 | let encryptmobile = await dailylottery.encryptmobile(axios, options) 22 | 23 | let res = await axios.request({ 24 | baseURL: 'https://m.client.10010.com/', 25 | headers: { 26 | "user-agent": useragent, 27 | "referer": "https://img.client.10010.com/", 28 | "origin": "https://img.client.10010.com" 29 | }, 30 | url: `/dailylottery/static/active/findActivityInfo?areaCode=085&groupByType=&mobile=${encryptmobile}`, 31 | method: 'GET' 32 | }) 33 | 34 | let acid = res.data.acCode 35 | let usableAcFreq = res.data.acFrequency.usableAcFreq 36 | do { 37 | res = await axios.request({ 38 | baseURL: 'https://m.client.10010.com/', 39 | headers: { 40 | "user-agent": useragent, 41 | "referer": "https://img.client.10010.com/", 42 | "origin": "https://img.client.10010.com" 43 | }, 44 | url: `/dailylottery/static/doubleball/choujiang?usernumberofjsp=${encryptmobile}`, 45 | method: 'post' 46 | }) 47 | let result = res.data 48 | if (result.Rsptype === '6666') { 49 | console.log('抽奖失败', result.RspMsg) 50 | break 51 | } else { 52 | console.log(result.RspMsg) 53 | } 54 | 55 | console.log('等待15秒再继续') 56 | await new Promise((resolve, reject) => setTimeout(resolve, 15 * 1000)) 57 | 58 | } while (--usableAcFreq) 59 | } 60 | } 61 | module.exports = dailylottery -------------------------------------------------------------------------------- /commands/tasks/unicom/dailylotteryintegral.js: -------------------------------------------------------------------------------- 1 | 2 | var dailylotteryintegral = { 3 | encryptmobile: async (axios, options) => { 4 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 5 | let res = await axios.request({ 6 | baseURL: 'https://m.client.10010.com/', 7 | headers: { 8 | "user-agent": useragent, 9 | "referer": `https://img.client.10010.com/jifenshangcheng/Directional?from=9110001000%E2%80%8B&yw_code=&desmobile=${options.user}&version=android%408.0100`, 10 | "origin": "https://img.client.10010.com" 11 | }, 12 | url: `/dailylottery/static/textdl/userLogin?flag=1&floortype=tbanner&from=9110001000%E2%80%8B&oneid=undefined&twoid=undefined`, 13 | method: 'get' 14 | }) 15 | let result = res.data 16 | let encryptmobile = result.substr(result.indexOf('encryptmobile=') + 14, 32) 17 | return encryptmobile 18 | }, 19 | doTask: async (axios, options) => { 20 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 21 | let encryptmobile = await dailylotteryintegral.encryptmobile(axios, options) 22 | 23 | let res = await axios.request({ 24 | baseURL: 'https://m.client.10010.com/', 25 | headers: { 26 | "user-agent": useragent, 27 | "referer": "https://img.client.10010.com/", 28 | "origin": "https://img.client.10010.com" 29 | }, 30 | url: `/dailylottery/static/integral/choujiang?usernumberofjsp=${encryptmobile}`, 31 | method: 'post' 32 | }) 33 | let result = res.data 34 | if ('id' in result) { 35 | console.log('获得奖品', result.RspMsg) 36 | } else { 37 | console.log('抽奖失败', result.RspMsg) 38 | } 39 | 40 | } 41 | } 42 | module.exports = dailylotteryintegral -------------------------------------------------------------------------------- /commands/tasks/unicom/dailysignin.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var CryptoJS = require("crypto-js"); 3 | 4 | // 快乐摇摇球 5 | var transParams = (data) => { 6 | let params = new URLSearchParams(); 7 | for (let item in data) { 8 | params.append(item, data['' + item + '']); 9 | } 10 | return params; 11 | }; 12 | 13 | var sign = (data) => { 14 | let str = 'integralofficial&' 15 | let params = [] 16 | data.forEach((v, i) => { 17 | if (v) { 18 | params.push('arguments' + (i + 1) + v) 19 | } 20 | }); 21 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 22 | } 23 | 24 | var dailysignin = { 25 | getIntegral: async (axios, options) => { 26 | const useragent = `okhttp/4.4.0` 27 | let { data } = await axios.request({ 28 | baseURL: 'https://act.10010.com/', 29 | headers: { 30 | "user-agent": useragent, 31 | "referer": "https://img.client.10010.com", 32 | "origin": "https://img.client.10010.com" 33 | }, 34 | url: `/SigninApp/signin/getIntegral`, 35 | method: 'post' 36 | }) 37 | if (data.status !== '0000') { 38 | throw new Error(result.msg) 39 | } else { 40 | if (data.status === '0000') { 41 | console.log('用户已有累计积分:' + data.data.integralTotal) 42 | } else { 43 | throw new Error('获取积分信息失败') 44 | } 45 | } 46 | return data.data 47 | }, 48 | query: async (axios, options) => { 49 | const useragent = `okhttp/4.4.0` 50 | let { data } = await axios.request({ 51 | baseURL: 'https://act.10010.com/', 52 | headers: { 53 | "user-agent": useragent, 54 | "referer": "https://img.client.10010.com", 55 | "origin": "https://img.client.10010.com" 56 | }, 57 | url: `/SigninApp/signin/getContinuous`, 58 | method: 'post' 59 | }) 60 | return data 61 | }, 62 | daySign: async (axios, options) => { 63 | const useragent = `okhttp/4.4.0` 64 | let { data, config } = await axios.request({ 65 | baseURL: 'https://act.10010.com/', 66 | headers: { 67 | "user-agent": useragent, 68 | "referer": "https://img.client.10010.com", 69 | "origin": "https://img.client.10010.com" 70 | }, 71 | url: `/SigninApp/signin/daySign`, 72 | method: 'post' 73 | }) 74 | return { 75 | data, 76 | config 77 | } 78 | }, 79 | doTask: async (axios, options) => { 80 | let { integralTotal } = await dailysignin.getIntegral(axios, options) 81 | let result = await dailysignin.query(axios, options) 82 | if (result.status === '0000') { 83 | if (result.data.todaySigned === '1') { 84 | let { data, config } = await dailysignin.daySign(axios, options) 85 | if (data.status === '0000') { 86 | console.log('积分签到成功+' + (data.data.newCoin - integralTotal) + '积分', '总积分:' + data.data.newCoin) 87 | if (data.data.doubleShowFlag) { 88 | await dailysignin.lookVideoDouble(axios, { 89 | ...options, 90 | jar: config.jar 91 | }) 92 | } 93 | } else { 94 | console.log('积分签到失败', data.msg) 95 | } 96 | } else { 97 | console.log('今日已签到') 98 | } 99 | } else { 100 | console.log('获取签到状态失败', result.msg) 101 | } 102 | }, 103 | lookVideoDouble: async (axios, options) => { 104 | const { jar } = options 105 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:}` 106 | let params = { 107 | 'arguments1': '', 108 | 'arguments2': '', 109 | 'arguments3': '', 110 | 'arguments4': new Date().getTime(), 111 | 'arguments6': '', 112 | 'arguments7': '', 113 | 'arguments8': '', 114 | 'arguments9': '', 115 | 'netWay': 'Wifi', 116 | 'remark1': '签到看视频翻倍得积分', 117 | 'remark': '签到积分翻倍', 118 | 'version': `android@8.0100`, 119 | 'codeId': 945535743 120 | } 121 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 122 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 123 | 124 | await require('./taskcallback').reward(axios, { 125 | ...options, 126 | params, 127 | jar 128 | }) 129 | 130 | let { data } = await axios.request({ 131 | baseURL: 'https://act.10010.com/', 132 | headers: { 133 | "user-agent": useragent, 134 | "referer": "https://img.client.10010.com", 135 | "origin": "https://img.client.10010.com" 136 | }, 137 | url: `/SigninApp/signin/bannerAdPlayingLogo`, 138 | method: 'post' 139 | }) 140 | if (data.status === '0000') { 141 | console.log('积分翻倍成功:', data.data.prizeCount) 142 | } else { 143 | console.log('积分翻倍失败:', data.msg) 144 | } 145 | } 146 | } 147 | 148 | module.exports = dailysignin -------------------------------------------------------------------------------- /commands/tasks/unicom/gameYearBox.js: -------------------------------------------------------------------------------- 1 | 2 | const { default: PQueue } = require('p-queue'); 3 | 4 | var transParams = (data) => { 5 | let params = new URLSearchParams(); 6 | for (let item in data) { 7 | params.append(item, data['' + item + '']); 8 | } 9 | return params; 10 | }; 11 | 12 | 13 | var gameYearBox = { 14 | games: async (axios, options) => { 15 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 16 | let { data, config } = await axios.request({ 17 | headers: { 18 | "user-agent": useragent, 19 | "referer": "https://img.client.10010.com/newyeargame/index.html?channelID=04", 20 | "origin": "https://img.client.10010.com" 21 | }, 22 | url: `https://m.client.10010.com/game_year_activity`, 23 | method: 'POST', 24 | data: transParams({ 25 | 'methodType': 'games', 26 | 'clientVersion': '8.0102', 27 | 'deviceType': 'Android' 28 | }) 29 | }) 30 | return { 31 | games: data.data, 32 | jar: config.jar 33 | } 34 | }, 35 | query_box_info: async (axios, options) => { 36 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 37 | let { data } = await axios.request({ 38 | headers: { 39 | "user-agent": useragent, 40 | "referer": "https://img.client.10010.com/newyeargame/index.html?channelID=04", 41 | "origin": "https://img.client.10010.com" 42 | }, 43 | url: `https://m.client.10010.com/game_year_activity`, 44 | method: 'POST', 45 | data: transParams({ 46 | 'methodType': 'query_box_info', 47 | 'clientVersion': '8.0102', 48 | 'deviceType': 'Android' 49 | }) 50 | }) 51 | return data.data 52 | }, 53 | box_get_reward: async (axios, options) => { 54 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 55 | let { data } = await axios.request({ 56 | headers: { 57 | "user-agent": useragent, 58 | "referer": "https://img.client.10010.com/newyeargame/index.html?channelID=04", 59 | "origin": "https://img.client.10010.com" 60 | }, 61 | url: `https://m.client.10010.com/game_year_activity`, 62 | method: 'POST', 63 | data: transParams({ 64 | 'methodType': 'box_get_reward', 65 | 'clientVersion': '8.0102', 66 | 'deviceType': 'Android', 67 | "boxFlag": options.boxFlag 68 | }) 69 | }) 70 | if (data.code === '0000') { 71 | console.log(data.desc, data.data.reward_type, data.data.reward_val) 72 | } else { 73 | console.log(data.desc) 74 | } 75 | }, 76 | doTask: async (axios, options) => { 77 | let boxinfo = await gameYearBox.query_box_info(axios, options) 78 | let boxs = [{ 79 | 'name': 'first_box', 80 | 'duration': 10, 81 | 'boxFlag': 1 82 | }, { 83 | 'name': 'second_box', 84 | 'duration': 20, 85 | 'boxFlag': 2 86 | }, { 87 | 'name': 'third_box', 88 | 'duration': 30, 89 | 'boxFlag': 3 90 | }, { 91 | 'name': 'fourth_box', 92 | 'duration': 60, 93 | 'boxFlag': 4 94 | }] 95 | for (let box of boxs) { 96 | if (boxinfo[box.name] === '0') { 97 | console.log('领取宝箱中,尝试达成宝箱条件') 98 | let producGame = require('./producGame') 99 | let { games, jar } = await gameYearBox.games(axios, options) 100 | let queue = new PQueue({ concurrency: 2 }); 101 | console.log('调度任务中', '并发数', 2) 102 | let n = Math.floor((box.duration - parseInt(boxinfo.total_duration_num)) / 6) + 1 103 | console.log('预计再游玩', n * 6, '分钟') 104 | for (let game of games) { 105 | queue.add(async () => { 106 | console.log(game.name) 107 | await producGame.gameverify(axios, { 108 | ...options, 109 | jar, 110 | game 111 | }) 112 | await producGame.gamerecord(axios, { 113 | ...options, 114 | gameId: game.game_id 115 | }) 116 | await producGame.playGame(axios, { 117 | ...options, 118 | jar, 119 | game: { 120 | ...game, 121 | gameCode: game.game_code 122 | } 123 | }) 124 | }) 125 | --n 126 | if (n <= 0) { 127 | break 128 | } 129 | } 130 | await queue.onIdle() 131 | await gameYearBox.query_box_info(axios, options) 132 | await gameYearBox.box_get_reward(axios, { 133 | ...options, 134 | boxFlag: box.boxFlag 135 | }) 136 | } else if (boxinfo[box.name] === '1') { 137 | console.log('领取宝箱中') 138 | await gameYearBox.box_get_reward(axios, { 139 | ...options, 140 | boxFlag: box.boxFlag 141 | }) 142 | } else if (boxinfo[box.name] === '2') { 143 | console.log('已领取,跳过') 144 | } 145 | } 146 | } 147 | } 148 | 149 | module.exports = gameYearBox -------------------------------------------------------------------------------- /commands/tasks/unicom/init.js: -------------------------------------------------------------------------------- 1 | const { getCookies, saveCookies } = require('../../../utils/util') 2 | var crypto = require('crypto'); 3 | var moment = require('moment'); 4 | moment.locale('zh-cn'); 5 | // 联通APP版本 6 | const unicom_version = '8.0100' 7 | 8 | const publicKey = `-----BEGIN PUBLIC KEY----- 9 | MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDc+CZK9bBA9IU+gZUOc6 10 | FUGu7yO9WpTNB0PzmgFBh96Mg1WrovD1oqZ+eIF4LjvxKXGOdI79JRdve9 11 | NPhQo07+uqGQgE4imwNnRx7PFtCRryiIEcUoavuNtuRVoBAm6qdB0Srctg 12 | aqGfLgKvZHOnwTjyNqjBUxzMeQlEC2czEMSwIDAQAB 13 | -----END PUBLIC KEY-----`.toString('ascii') 14 | 15 | // 创建加密算法 16 | const rsapublicKeyEncode = function (data) { 17 | let crypted = crypto.publicEncrypt({ 18 | key: publicKey, 19 | padding: crypto.constants.RSA_PKCS1_PADDING 20 | }, Buffer.from(data)).toString('base64'); 21 | return crypted; 22 | }; 23 | 24 | var transParams = (data) => { 25 | let params = new URLSearchParams(); 26 | for (let item in data) { 27 | params.append(item, data['' + item + '']); 28 | } 29 | return params; 30 | }; 31 | 32 | var chars = ['1', '2', '3', '4', '5', '6', '7', '8', '9']; 33 | function generateMixed(n) { 34 | let res = ""; 35 | for (var i = 0; i < n; i++) { 36 | var id = Math.ceil(Math.random() * 61); 37 | res += chars[id]; 38 | } 39 | return res; 40 | } 41 | 42 | module.exports = async (axios, params) => { 43 | let { cookies, options } = params 44 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 45 | let token_online 46 | let appId 47 | let data 48 | 49 | if (cookies) { 50 | let res = await axios.request({ 51 | baseURL: 'https://m.client.10010.com', 52 | headers: { 53 | "user-agent": useragent, 54 | "referer": "https://m.client.10010.com", 55 | "origin": "https://m.client.10010.com" 56 | }, 57 | url: `/mobileService/customer/query/getMyUnicomDateTotle.htm`, 58 | method: 'post' 59 | }) 60 | data = res.data 61 | config = res.config 62 | let cookiesJson = config.jar.toJSON() 63 | token_online = cookiesJson.cookies.find(i => i.key == 'token_online') 64 | if (token_online) { 65 | token_online = token_online.value 66 | } else { 67 | token_online = undefined 68 | } 69 | appId = cookiesJson.cookies.find(i => i.key == 'appId') 70 | if (appId) { 71 | appId = appId.value || options.appid 72 | } else { 73 | appId = undefined 74 | } 75 | } 76 | 77 | if (Object.prototype.toString.call(data) !== '[object Object]' || !data || !('phone' in data)) { 78 | console.log('cookies凭据访问失败,将使用账户密码登录') 79 | if (!('appid' in options) || !options['appid']) { 80 | throw new Error("需要提供appid") 81 | } 82 | if (options['user']) { 83 | if (!('password' in options) || !options['password']) { 84 | throw new Error("需要提供登陆密码") 85 | } 86 | } else if (!cookies) { 87 | throw new Error("需要提供登录信息,使用密码账号或者cookies") 88 | } 89 | const deviceId = generateMixed(15) 90 | var params = { 91 | // ChinaunicomMobileBusiness 92 | 'appId': appId || options.appid, 93 | 'deviceBrand': 'samsung', 94 | 'deviceCode': deviceId + '', 95 | 'deviceId': deviceId + '', 96 | 'deviceModel': 'SM-G977N', 97 | 'deviceOS': 'android7.1.2', 98 | 'isRemberPwd': 'true', 99 | 'keyVersion': '', 100 | 'mobile': rsapublicKeyEncode(options.user), 101 | 'netWay': 'Wifi', 102 | 'password': rsapublicKeyEncode(options.password), 103 | 'pip': '172.16.70.15', 104 | 'provinceChanel': 'general', 105 | 'simCount': '0', 106 | 'timestamp': moment().format('YYYYMMDDHHmmss'), 107 | 'version': `android@${unicom_version}`, 108 | 'yw_code': '' 109 | } 110 | const { data, config } = await axios.request({ 111 | baseURL: 'https://m.client.10010.com', 112 | headers: { 113 | "user-agent": useragent, 114 | "referer": "https://m.client.10010.com", 115 | "origin": "https://m.client.10010.com" 116 | }, 117 | url: `/mobileService/login.htm`, 118 | method: 'post', 119 | data: transParams(params) 120 | }) 121 | if (data.code !== '0') { 122 | throw new Error('登陆失败:' + data.dsc) 123 | } 124 | cookies = 'token_online=' + data.token_online + '; appId=' + data.appId 125 | await saveCookies('unicom_' + (options.user || 'default'), cookies, config.jar) 126 | console.log('获得登录状态成功') 127 | } else { 128 | const deviceId = generateMixed(15) 129 | var params = { 130 | 'appId': appId, 131 | 'deviceBrand': 'samsung', 132 | 'deviceCode': deviceId, 133 | 'deviceId': deviceId, 134 | 'deviceModel': 'SM-G977N', 135 | 'deviceOS': 'android7.1.2', 136 | 'netWay': 'Wifi', 137 | 'platformToken': '0867442035025655300000391200CN01', 138 | 'pushPlatform': 'samsung', 139 | 'reqtime': new Date().getTime(), 140 | 'token_online': token_online, 141 | 'version': `android@${unicom_version}`, 142 | } 143 | if (!params.appId) { 144 | throw new Error('appId参数无效') 145 | } 146 | if (!params.token_online) { 147 | throw new Error('token_online参数无效') 148 | } 149 | const { data, config } = await axios.request({ 150 | baseURL: 'https://m.client.10010.com', 151 | headers: { 152 | "user-agent": useragent, 153 | "referer": "https://m.client.10010.com", 154 | "origin": "https://m.client.10010.com" 155 | }, 156 | url: `/mobileService/onLine.htm`, 157 | method: 'post', 158 | data: transParams(params) 159 | }).catch(err => console.log(err)) 160 | 161 | if (data.code !== '0') { 162 | console.log(data.dsc) 163 | } 164 | cookies += '; token_online=' + data.token_online + '; appId=' + data.appId 165 | await saveCookies('unicom_' + (options.user || 'default'), cookies, config.jar) 166 | console.log('获得登录状态成功') 167 | } 168 | } -------------------------------------------------------------------------------- /commands/tasks/unicom/jflottery.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var CryptoJS = require("crypto-js"); 3 | const { URL } = require('url'); 4 | // 豪礼大派送 5 | var transParams = (data) => { 6 | let params = new URLSearchParams(); 7 | for (let item in data) { 8 | params.append(item, data['' + item + '']); 9 | } 10 | return params; 11 | }; 12 | 13 | var secretkeyArray = function () { 14 | for (var e = [], t = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", 15 | "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", 16 | "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", 17 | "r", "s", "t", "u", "v", "w", "x", "y", "z"], i = 0; 18 | 5 > i; 19 | i++) { 20 | for (var n = "", s = 0; 16 > s; s++) { 21 | var a = Math.floor(62 * Math.random()); 22 | n += t[a] 23 | } 24 | e.push(n) 25 | } 26 | return e; 27 | } 28 | 29 | var encrypt = function (word, keyStr) { 30 | var key = CryptoJS.enc.Utf8.parse(keyStr); 31 | var srcs = CryptoJS.enc.Utf8.parse(word); 32 | var encrypted = CryptoJS.AES.encrypt(srcs, key, { 33 | mode: CryptoJS.mode.ECB, 34 | padding: CryptoJS.pad.Pkcs7 35 | }); 36 | return encrypted.toString(); 37 | } 38 | 39 | var decrypt = function (word, keyStr) { 40 | var key = CryptoJS.enc.Utf8.parse(keyStr); 41 | var decrypted = CryptoJS.AES.decrypt(word, key, { 42 | mode: CryptoJS.mode.ECB, 43 | padding: CryptoJS.pad.Pkcs7 44 | }); 45 | return decrypted.toString(CryptoJS.enc.Utf8); 46 | } 47 | var sign = (data) => { 48 | let str = 'integralofficial&' 49 | let params = [] 50 | data.forEach((v, i) => { 51 | if (v) { 52 | params.push('arguments' + (i + 1) + v) 53 | } 54 | }); 55 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 56 | } 57 | module.exports = { 58 | getTicket: async (axios, options) => { 59 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 60 | let searchParams = {} 61 | let res = await axios.request({ 62 | headers: { 63 | "user-agent": useragent, 64 | "referer": "https://m.jf.10010.com/", 65 | "origin": "https://m.jf.10010.com" 66 | }, 67 | url: `https://m.client.10010.com/mobileService/openPlatform/openPlatLine.htm?to_url=https://m.jf.10010.com/jf-order/avoidLogin/forActive/tigerarmqd&duanlianjieabc=tbkyH`, 68 | method: 'get', 69 | transformResponse: (data, headers) => { 70 | if ('location' in headers) { 71 | let uu = new URL(headers.location) 72 | let pp = {} 73 | for (let p of uu.searchParams) { 74 | pp[p[0]] = p[1] 75 | } 76 | if ('ticket' in pp) { 77 | searchParams = pp 78 | } 79 | } 80 | return data 81 | } 82 | }).catch(err => console.log(err)) 83 | return { 84 | searchParams, 85 | jar: res.config.jar 86 | } 87 | }, 88 | timesDraw: async (axios, options) => { 89 | const useragent = `Mozilla/5.0 (Linux; Android 7.1.2; SM-G977N Build/LMY48Z; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:android@8.0100,desmobile:${options.user}};devicetype{deviceBrand:samsung,deviceModel:SM-G977N};{yw_code:} ` 90 | let { searchParams, jar } = await module.exports.getTicket(axios, options) 91 | let cookiesJson = jar.toJSON() 92 | let jfid = cookiesJson.cookies.find(i => i.key == '_jf_id') 93 | if (!jfid) { 94 | throw new Error('jfid缺失') 95 | } 96 | jfid = jfid.value 97 | 98 | let keyArr = secretkeyArray() 99 | let keyrdm = Math.floor(Math.random() * 5) 100 | 101 | let params = { 102 | activityId: "Ac-de644531df54410e875ba08ca2256b6a", 103 | userCookie: jfid, 104 | userNumber: searchParams.userNumber, 105 | time: new Date().getTime() 106 | }; 107 | 108 | let reqdata = JSON.stringify({ 109 | params: encrypt(JSON.stringify(params), keyArr[keyrdm]) + keyrdm, 110 | parKey: keyArr 111 | }) 112 | 113 | let res = await axios.request({ 114 | baseURL: 'https://m.jf.10010.com/', 115 | headers: { 116 | "user-agent": useragent, 117 | "referer": "https://m.jf.10010.com/cms/yuech/unicom-integral-ui/yuech-Blindbox/tigerarm/index.html?jump=sign", 118 | "origin": "https://img.jf.10010.com", 119 | "Content-Type": "application/json" 120 | }, 121 | jar, 122 | url: `/jf-yuech/p/freeLoginRock`, 123 | method: 'post', 124 | data: reqdata 125 | }).catch(err => console.log(err)) 126 | let result = res.data 127 | if (result.code !== 0) { 128 | throw new Error(result.message) 129 | } 130 | let jar1 = res.config.jar 131 | 132 | let activity = result.data.activityInfos.activityVOs[0] 133 | let Authorization = result.data.token.access_token 134 | let freeTimes = activity.activityTimesInfo.freeTimes 135 | let advertTimes = activity.activityTimesInfo.advertTimes 136 | 137 | do { 138 | console.log("已消耗机会", (1 + 4) - (freeTimes + advertTimes), "剩余免费机会", freeTimes, '看视频广告机会', advertTimes) 139 | 140 | if (!freeTimes && !advertTimes) { 141 | console.log('没有游戏次数') 142 | break 143 | } 144 | let currentTimes = (1 + 4) - (freeTimes + advertTimes) + 1 145 | 146 | let p1 = { 147 | activityId: activity.activityId, 148 | currentTimes: freeTimes, 149 | type: "积分" 150 | } 151 | 152 | if (!freeTimes && advertTimes) { 153 | let params = { 154 | 'arguments1': 'AC20200611152252', 155 | 'arguments2': '', 156 | 'arguments3': '', 157 | 'arguments4': new Date().getTime(), 158 | 'arguments6': '', 159 | 'arguments7': '', 160 | 'arguments8': '', 161 | 'arguments9': '', 162 | 'netWay': 'Wifi', 163 | 'remark1': '到小游戏豪礼派送', 164 | 'remark': '签到小游戏翻倍得积分', 165 | 'version': `android@8.0100`, 166 | 'codeId': 945705532 167 | } 168 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 169 | params['orderId'] = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 170 | params['arguments4'] = new Date().getTime() 171 | 172 | result = await require('./taskcallback').reward(axios, { 173 | ...options, 174 | params, 175 | jar: jar1 176 | }) 177 | 178 | p1 = { 179 | 'activityId': activity.activityId, 180 | 'currentTimes': advertTimes, 181 | 'type': '广告', 182 | 'orderId': params['orderId'], 183 | 'phoneType': 'android', 184 | 'version': '8.01' 185 | } 186 | advertTimes-- 187 | } else { 188 | freeTimes-- 189 | } 190 | 191 | let n = Math.floor(5 * Math.random()) 192 | let i = secretkeyArray() 193 | 194 | params = { 195 | "params": encrypt(JSON.stringify(p1), i[n]) + n, 196 | "parKey": i 197 | } 198 | res = await axios.request({ 199 | baseURL: 'https://m.jf.10010.com/', 200 | headers: { 201 | "Authorization": `Bearer ${Authorization}`, 202 | "user-agent": useragent, 203 | "referer": "https://img.jf.10010.com/", 204 | "origin": "https://img.jf.10010.com" 205 | }, 206 | url: `/jf-yuech/api/gameResultV2/timesDraw`, 207 | method: 'post', 208 | data: params 209 | }) 210 | result = res.data 211 | if (result.code !== 0) { 212 | console.log("豪礼大派送抽奖:", result.message) 213 | } else { 214 | if (result.data.consumptionV1Infos.code !== '0') { 215 | console.log("豪礼大派送抽奖:", result.data.consumptionV1Infos.result) 216 | } else { 217 | if (result.data.consumptionV1Infos.gameResult.prizeStatus === '中奖') { 218 | if(result.data.consumptionV1Infos.gameResult.integralScore){ 219 | console.log('豪礼大派送抽奖:', '中奖+', result.data.consumptionV1Infos.gameResult.integralScore) 220 | } else { 221 | console.log(result.data.consumptionV1Infos) 222 | console.log('豪礼大派送抽奖:', '中奖') 223 | } 224 | } else { 225 | 226 | console.log('豪礼大派送抽奖:', result.data.consumptionV1Infos.gameResult.prizeStatus) 227 | } 228 | } 229 | } 230 | 231 | if (freeTimes && advertTimes) { 232 | console.log('等待15秒再继续') 233 | await new Promise((resolve, reject) => setTimeout(resolve, 15 * 1000)) 234 | } 235 | 236 | } while (freeTimes || advertTimes) 237 | } 238 | } -------------------------------------------------------------------------------- /commands/tasks/unicom/playGame.json: -------------------------------------------------------------------------------- 1 | { 2 | "nested": { 3 | "a": { 4 | "fields": { 5 | "key": { 6 | "type": "string", 7 | "id": 1 8 | }, 9 | "value": { 10 | "type": "string", 11 | "id": 2 12 | } 13 | } 14 | }, 15 | "b": { 16 | "fields": { 17 | "method": { 18 | "type": "string", 19 | "id": 1 20 | }, 21 | "iv": { 22 | "type": "int32", 23 | "id": 2 24 | } 25 | } 26 | }, 27 | "JudgeTimingBusiBuff": { 28 | "fields": { 29 | "Seq": { 30 | "type": "int64", 31 | "id": 1 32 | }, 33 | "qua": { 34 | "type": "string", 35 | "id": 2 36 | }, 37 | "deviceInfo": { 38 | "type": "string", 39 | "id": 3 40 | }, 41 | "busiBuff": { 42 | "type": "JudgeTiming", 43 | "id": 4 44 | }, 45 | "traceid": { 46 | "type": "string", 47 | "id": 5 48 | }, 49 | "Module": { 50 | "type": "string", 51 | "id": 6 52 | }, 53 | "Cmdname": { 54 | "type": "string", 55 | "id": 7 56 | }, 57 | "loginSig": { 58 | "type": "C0011a", 59 | "id": 8 60 | }, 61 | "Crypto": { 62 | "type": "b", 63 | "id": 9 64 | }, 65 | "Extinfo": { 66 | "type": "int32", 67 | "id": 10 68 | }, 69 | "contentType": { 70 | "type": "int32", 71 | "id": 11 72 | } 73 | } 74 | }, 75 | "GetAppInfoByLinkBusiBuff": { 76 | "fields": { 77 | "Seq": { 78 | "type": "int64", 79 | "id": 1 80 | }, 81 | "qua": { 82 | "type": "string", 83 | "id": 2 84 | }, 85 | "deviceInfo": { 86 | "type": "string", 87 | "id": 3 88 | }, 89 | "busiBuff": { 90 | "type": "bytes", 91 | "id": 4 92 | }, 93 | "traceid": { 94 | "type": "string", 95 | "id": 5 96 | }, 97 | "Module": { 98 | "type": "string", 99 | "id": 6 100 | }, 101 | "Cmdname": { 102 | "type": "string", 103 | "id": 7 104 | }, 105 | "loginSig": { 106 | "type": "C0011a", 107 | "id": 8 108 | }, 109 | "Crypto": { 110 | "type": "b", 111 | "id": 9 112 | }, 113 | "Extinfo": { 114 | "type": "int32", 115 | "id": 10 116 | }, 117 | "contentType": { 118 | "type": "int32", 119 | "id": 11 120 | } 121 | } 122 | }, 123 | "d": { 124 | "fields": { 125 | "Seq": { 126 | "type": "int32", 127 | "id": 1 128 | }, 129 | "retCode": { 130 | "type": "int64", 131 | "id": 2 132 | }, 133 | "errMsg": { 134 | "type": "bytes", 135 | "id": 3 136 | }, 137 | "busiBuff": { 138 | "type": "bytes", 139 | "id": 4 140 | }, 141 | "Extinfo": { 142 | "rule": "repeated", 143 | "type": "a", 144 | "id": 5 145 | } 146 | } 147 | }, 148 | "C0011a": { 149 | "fields": { 150 | "uin": { 151 | "type": "string", 152 | "id": 1 153 | }, 154 | "sig": { 155 | "type": "string", 156 | "id": 2 157 | }, 158 | "platform": { 159 | "type": "string", 160 | "id": 3 161 | }, 162 | "type": { 163 | "type": "int32", 164 | "id": 4 165 | }, 166 | "appid": { 167 | "type": "string", 168 | "id": 5 169 | }, 170 | "openid": { 171 | "type": "string", 172 | "id": 6 173 | }, 174 | "sessionkey": { 175 | "type": "bytes", 176 | "id": 7 177 | }, 178 | "Extinfo": { 179 | "rule": "repeated", 180 | "type": "a", 181 | "id": 8 182 | } 183 | } 184 | }, 185 | "q2b": { 186 | "fields": { 187 | "mapInfo": { 188 | "rule": "repeated", 189 | "type": "a", 190 | "id": 1 191 | }, 192 | "attachInfo": { 193 | "type": "string", 194 | "id": 2 195 | } 196 | } 197 | }, 198 | "JudgeTiming": { 199 | "fields": { 200 | "extInfo": { 201 | "type": "q2b", 202 | "id": 1 203 | }, 204 | "appid": { 205 | "type": "string", 206 | "id": 2 207 | }, 208 | "factType": { 209 | "type": "int32", 210 | "id": 3 211 | }, 212 | "duration": { 213 | "type": "int32", 214 | "id": 4 215 | }, 216 | "reportTime": { 217 | "type": "int64", 218 | "id": 5 219 | }, 220 | "afterCertify": { 221 | "type": "int32", 222 | "id": 6 223 | }, 224 | "appType": { 225 | "type": "int32", 226 | "id": 7 227 | }, 228 | "scene": { 229 | "type": "int32", 230 | "id": 8 231 | }, 232 | "totalTime": { 233 | "type": "int32", 234 | "id": 9 235 | }, 236 | "launchId": { 237 | "type": "string", 238 | "id": 10 239 | }, 240 | "via": { 241 | "type": "string", 242 | "id": 11 243 | }, 244 | "AdsTotalTime": { 245 | "type": "int32", 246 | "id": 12 247 | }, 248 | "hostExtInfo": { 249 | "type": "string", 250 | "id": 13 251 | } 252 | } 253 | }, 254 | "GetAppInfoByLink": { 255 | "fields": { 256 | "link": { 257 | "type": "string", 258 | "id": 1 259 | }, 260 | "linkType": { 261 | "type": "int32", 262 | "id": 2 263 | } 264 | } 265 | } 266 | } 267 | } -------------------------------------------------------------------------------- /commands/tasks/unicom/taskcallback.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | var transParams = (data) => { 3 | let params = new URLSearchParams(); 4 | for (let item in data) { 5 | params.append(item, data['' + item + '']); 6 | } 7 | return params; 8 | }; 9 | 10 | //data 是准备加密的字符串,key是你的密钥 11 | 12 | function encryption (data, key) { 13 | var iv = ""; 14 | var cipherEncoding = 'base64'; 15 | var cipher = crypto.createCipheriv('aes-128-ecb', key, iv); 16 | cipher.setAutoPadding(true); 17 | return Buffer.concat([cipher.update(data), cipher.final()]).toString(cipherEncoding); 18 | } 19 | 20 | //data 是你的准备解密的字符串,key是你的密钥 21 | function decryption (data, key) { 22 | var iv = ""; 23 | var clearEncoding = 'utf8'; 24 | var cipherEncoding = 'base64'; 25 | var decipher = crypto.createDecipheriv('aes-128-ecb', key, iv); 26 | decipher.setAutoPadding(true); 27 | return Buffer.concat([decipher.update(data, cipherEncoding), decipher.final()]).toString(clearEncoding); 28 | } 29 | 30 | function a (str) { 31 | str = str + str 32 | return str.substr(8, 16) 33 | } 34 | 35 | var taskcallback = { 36 | // 查询活动状态 37 | query: async (axios, options) => { 38 | let { params } = options 39 | const useragent = `okhttp/4.4.0` 40 | 41 | let { data, config } = await axios.request({ 42 | baseURL: 'https://m.client.10010.com/', 43 | headers: { 44 | "user-agent": useragent, 45 | "referer": `https://img.client.10010.com/`, 46 | "origin": "https://img.client.10010.com" 47 | }, 48 | url: `/taskcallback/taskfilter/query`, 49 | method: 'POST', 50 | data: transParams(params) 51 | }) 52 | if (data.code === '0000') { 53 | console.log(data.timeflag === '1' ? `今日参加活动已达上限(${data.achieve}/${data.allocation}次)` : `活动可参加(${data.achieve}/${data.allocation}次)`) 54 | return { 55 | num: parseInt(data.allocation) - parseInt(data.achieve), 56 | jar: config.jar 57 | } 58 | } else { 59 | console.log('查询出错', data.desc) 60 | return false 61 | } 62 | }, 63 | reward: async (axios, options) => { 64 | let { params, jar } = options 65 | let cookiesJson = jar.toJSON() 66 | let ecs_token = cookiesJson.cookies.find(i => i.key == 'ecs_token') 67 | if (!ecs_token) { 68 | throw new Error('ecs_token缺失') 69 | } 70 | ecs_token = ecs_token.value 71 | let orderId = params.orderId || crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 72 | let codeId = parseInt(params.codeId || 945535616) 73 | let app_id = "5049584" 74 | let media_extra = [ 75 | ecs_token, 76 | options.user, 77 | 'android', 78 | params.arguments1, 79 | params.arguments2, 80 | orderId,// orderId 81 | codeId, //codeId 82 | params.remark, 83 | 'Wifi' 84 | ] 85 | 86 | var data = { 87 | "oversea_version_type": 0, 88 | "reward_name": `android-${params.remark1 || params.remark}-激励视频`, 89 | "reward_amount": 1, 90 | "network": 4, 91 | // "latitude": 26.611770629882812, 92 | // "longitude": 106.63581085205078, 93 | "sdk_version": "3.3.0.3", 94 | "user_agent": "Mozilla\/5.0 (Linux; Android 9; VKY-AL00 Build\/HUAWEIVKY-AL00; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/86.0.4240.198 Mobile Safari\/537.36", 95 | "extra": { 96 | // "ad_slot_type": 7, 97 | // "oaid": "ebdde3b9-def7-6cc3-fdfe-9bfff7ce4126", 98 | // "language": "golang", 99 | // "ug_creative_id": "", 100 | // "ad_id": 1687489184287789, 101 | // "creative_id": 1687493310795863, 102 | // "convert_id": 1682419505842179, 103 | // "uid": 95981094553, 104 | // "ad_type": 1, 105 | // "pricing": 9, 106 | // "ut": 12, 107 | // "version_code": "8.1", 108 | // "device_id": 50137151117, 109 | // "width": 360, 110 | // "height": 640, 111 | // "mac": "10:44:00:73:74:BF", 112 | // "uuid": "867442035025655", 113 | // "uuid_md5": "8a4dac2481580bd94f8c4b17787b74cd", 114 | // "os": "android", 115 | // "client_ip": "111.121.67.62", 116 | // "open_udid": "", 117 | // "os_type": null, 118 | // "app_name": "手机营业厅", 119 | // "device_type": "VKY-AL00", 120 | // "os_version": "9", 121 | // "app_id": "5049584", 122 | // "template_id": 0, 123 | // "template_rate": 0, 124 | // "promotion_type": 0, 125 | // "img_gen_type": 0, 126 | // "img_md5": "", 127 | // "source_type": 1, 128 | // "pack_time": "{pack_time}", 129 | // "cid": 1687493310795863, 130 | // "interaction_type": 4, 131 | // "src_type": "app", 132 | // "package_name": "com.sinovatech.unicom.ui", 133 | // "pos": 5, 134 | // "landing_type": 3, 135 | // "is_sdk": true, 136 | // "is_dsp_ad": false, 137 | // "imei": "867442035025655", 138 | // "req_id": "e9da96b1-2d0c-49d0-b5b0-3fd6540d22d4u2997", 139 | "rit": codeId 140 | }, 141 | "media_extra": encodeURI(media_extra.join('|')), 142 | "video_duration": 28.143, 143 | "play_start_ts": new Date().getTime() - 32 * 1000, 144 | "play_end_ts": 0, 145 | "duration": 28143, 146 | "user_id": app_id, 147 | "trans_id": crypto.createHash('md5').update(new Date().getTime() + '').digest('hex') 148 | } 149 | 150 | let key = crypto.createHash('md5').update(new Date().getTime() + '').digest('hex').substr(8, 16) 151 | let t = JSON.stringify(data).replace(/\//g, "\\\/")//.replace('"{pack_time}"', '1.609770734935479E9') 152 | let m = encryption(t, a(key)).replace(/(.{76})/g, '$1\n') 153 | m = '2' + key + m 154 | 155 | var message = { 156 | message: m, 157 | cypher: 2 158 | } 159 | // let s = a(message.message.substr(1, 16)) 160 | // console.log(decryption(message.message.replace(/\n/g, '').substr(17), s)) 161 | // process.exit(0) 162 | 163 | const useragent = `VADNetAgent/0` 164 | let res = await axios.request({ 165 | headers: { 166 | "user-agent": useragent, 167 | "Content-Type": "application/json; charset=utf-8" 168 | }, 169 | url: `https://api-access.pangolin-sdk-toutiao.com/api/ad/union/sdk/reward_video/reward/`, 170 | method: 'POST', 171 | data: message 172 | }) 173 | data = res.data 174 | // s = a(data.message.substr(1, 16)) 175 | // console.log(decryption(data.message.replace(/\n/g, '').substr(17), s)) 176 | if ('code' in data) { 177 | throw new Error('获取激励信息出错') 178 | } 179 | 180 | return { 181 | orderId 182 | } 183 | 184 | }, 185 | // 提交任务 186 | doTask: async (axios, options) => { 187 | let result = await taskcallback.reward(axios, options) 188 | let params = options.params 189 | params['orderId'] = result['orderId'] 190 | delete params.codeId 191 | const useragent = `okhttp/4.4.0` 192 | let { data } = await axios.request({ 193 | baseURL: 'https://m.client.10010.com/', 194 | headers: { 195 | "user-agent": useragent, 196 | "referer": `https://img.client.10010.com/`, 197 | "origin": "https://img.client.10010.com" 198 | }, 199 | url: `/taskcallback/taskfilter/dotasks`, 200 | method: 'POST', 201 | data: transParams(params) 202 | }) 203 | if (data.code === '0000') { 204 | console.log('提交任务成功', data.prizeName + '+' + data.prizeCount) 205 | } else { 206 | console.log('提交任务出错', data.desc) 207 | } 208 | }, 209 | } 210 | module.exports = taskcallback -------------------------------------------------------------------------------- /commands/tasks/unicom/unicom.js: -------------------------------------------------------------------------------- 1 | const { scheduler } = require('../../../utils/scheduler') 2 | const { getCookies, saveCookies } = require('../../../utils/util') 3 | const _request = require('../../../utils/request') 4 | 5 | var start = async (params) => { 6 | const { cookies, options } = params 7 | 8 | let init = async (request, savedCookies) => { 9 | await require('./init')(request, { 10 | ...params, 11 | cookies: savedCookies || cookies 12 | }) 13 | return { 14 | request 15 | } 16 | } 17 | let taskOption = { 18 | init 19 | } 20 | 21 | // 每日签到积分 22 | await scheduler.regTask('dailysignin', async (request) => { 23 | await require('./dailysignin').doTask(request, options) 24 | await require('./integral').addFlow(request, options) 25 | }, taskOption) 26 | 27 | // 冬奥积分活动 20201231 28 | await scheduler.regTask('winterTwo', async (request) => { 29 | await require('./integral').winterTwoGetIntegral(request, options) 30 | await require('./integral').winterTwoStatus(request, options) 31 | }, taskOption) 32 | 33 | // 每日定向积分 20201231 34 | await scheduler.regTask('dxIntegralEveryDay', async (request) => { 35 | await require('./integral').dxIntegralEveryDay(request, options) 36 | }, taskOption) 37 | 38 | // 每日游戏楼层宝箱 39 | await scheduler.regTask('dailygamebox', async (request) => { 40 | await require('./integral').gamebox(request, options) 41 | }, taskOption) 42 | 43 | // 每日抽奖 44 | await scheduler.regTask('dailylotteryintegral', async (request) => { 45 | await require('./dailylotteryintegral').doTask(request, options) 46 | }, taskOption) 47 | 48 | // 首页-游戏-娱乐中心-沃之树 49 | await scheduler.regTask('dailywoTree', async (request) => { 50 | await require('./woTree').doTask(request, options) 51 | }, taskOption) 52 | 53 | await scheduler.regTask('dailyBookRead', async (request) => { 54 | // 首页-小说-阅读越有礼打卡赢话费 55 | await require('./dailyBookRead').doTask(request, options) 56 | await require('./dailyVideoBook').doTask(request, options) 57 | }, taskOption) 58 | 59 | // 首页-小说-读满10章赢好礼 60 | await scheduler.regTask('dailyBookRead10doDraw', async (request) => { 61 | // 首页-小说-读满10章赢好礼 62 | await require('./dailyVideoBook').read10doDraw(request, options) 63 | // 首页-小说-读满10章赢好礼-看视频领2积分 64 | await require('./dailyVideoBook').read10doDrawLookVideoDouble(request, options) 65 | // 首页-签到有礼-免流量得福利-3积分天天拿(阅读打卡) 66 | await require('./dailyVideoBook').giftBoints(request, options) 67 | }, taskOption) 68 | 69 | await scheduler.regTask('dailyBookLuckdraw', async (request) => { 70 | // 首页-小说-阅读福利抽大奖 71 | await require('./dailyBookLuckdraw').doTask(request, options) 72 | }, taskOption) 73 | 74 | // 首页-签到有礼-免费领-浏览领积分 75 | await scheduler.regTask('dailyLiuLan', async (request) => { 76 | await require('./dailyTTliulan').doTask(request, options) 77 | }, taskOption) 78 | 79 | // 首页-签到有礼-免费拿-看视频夺宝 80 | // 易出现本次操作需要进行验证,暂时注释 81 | // await scheduler.regTask('dailyVideoFreeGoods', async (request) => { 82 | // await require('./dailyVideoFreeGoods').doTask(request, options) 83 | // }, { 84 | // isCircle: true, 85 | // startTime: 10 * 3600, 86 | // intervalTime: 4 * 3600 87 | // }) 88 | 89 | // 首页-签到有礼-免费抽-抓OPPO手机 90 | await scheduler.regTask('dailyGrabdollPage', async (request) => { 91 | await require('./dailyGrabdollPage').doTask(request, options) 92 | }, taskOption) 93 | 94 | // 首页-签到有礼-免费抽-拿666积分-豪礼大派送抽奖 95 | await scheduler.regTask('jflottery', async (request) => { 96 | await require('./jflottery').timesDraw(request, options) 97 | }, taskOption) 98 | 99 | // 首页-签到有礼-免费抽-拿苹果iPad Pro(摇一摇) 100 | await scheduler.regTask('dailyYYY', async (request) => { 101 | await require('./dailyYYY').doTask(request, options) 102 | }, taskOption) 103 | 104 | // 首页-签到有礼-免费抽-华为mate40pro(刮刮乐) 105 | await scheduler.regTask('dailyVideoScratchcard', async (request) => { 106 | await require('./dailyVideoScratchcard').doTask(request, options) 107 | }, taskOption) 108 | 109 | // 首页-签到有礼-免费抽-赢三星Galaxy Z(试试手气) 110 | await scheduler.regTask('dailyCheapStorePage', async (request) => { 111 | await require('./dailyCheapStorePage').doTask(request, options) 112 | }, { 113 | isCircle: true, 114 | intervalTime: 4 * 3600, 115 | ...taskOption 116 | }) 117 | 118 | // 首页-签到有礼-免费抽-拆华为Pad(去抽奖) 119 | await scheduler.regTask('dailyLKMH', async (request) => { 120 | await require('./dailyLKMH').doTask(request, options) 121 | }, taskOption) 122 | 123 | // 首页-签到有礼-免费抽-拿iPhone12(摇一摇) 124 | await scheduler.regTask('dailyYYQ', async (request) => { 125 | await require('./dailyYYQ').doTask(request, options) 126 | }, taskOption) 127 | 128 | // 首页-签到有礼-免费抽-赢Apple Watch(去抽奖) 129 | await scheduler.regTask('dailyTurntablePage', async (request) => { 130 | await require('./dailyTurntablePage').doTask(request, options) 131 | }, taskOption) 132 | 133 | // 首页-签到有礼-赚更多福利-看视频奖励5积分 134 | await scheduler.regTask('dailyVideo', async (request) => { 135 | await require('./dailyVideo').doTask(request, options) 136 | }, taskOption) 137 | 138 | // 首页-签到有礼-赚更多福利-天天抽好礼 139 | await scheduler.regTask('dailylottery', async (request) => { 140 | await require('./dailylottery').doTask(request, options) 141 | }, taskOption) 142 | 143 | // 首页-游戏-娱乐中心-每日打卡 144 | await scheduler.regTask('producGameSignin', async (request) => { 145 | await require('./producGame').gameSignin(request, options) 146 | await require('./producGame').gameBox(request, options) 147 | }, taskOption) 148 | 149 | // 首页-游戏-娱乐中心-天天领取3G流量包 150 | await scheduler.regTask('dailygameflow', async (request) => { 151 | await require('./producGame').doGameFlowTask(request, options) 152 | }, taskOption) 153 | 154 | // 首页-积分查询-游戏任务 155 | await scheduler.regTask('dailygameIntegral', async (request) => { 156 | await require('./producGame').doGameIntegralTask(request, options) 157 | }, taskOption) 158 | 159 | // 首页-知识-限时免费(连续7天阶梯激励) 160 | await scheduler.regTask('dailyCourse', async (request) => { 161 | await require('./dailyCourse').doTask(request, options) 162 | }, { 163 | ...taskOption, 164 | startTime: 9 * 3600 165 | }) 166 | 167 | // await require('./integral').getflDetail(request, options) 168 | // await require('./integral').getTxDetail(request, options) 169 | // await require('./integral').getDxDetail(request, options) 170 | // await require('./integral').getCoins(request, options) 171 | 172 | // 每日评论积分 173 | await scheduler.regTask('dailycomment', async (request) => { 174 | await require('./commentSystem').commentTask(request, options).catch(console.log) 175 | }, taskOption) 176 | 177 | // 首页-游戏-娱乐中心-每日打卡-完成今日任务(200m) 178 | await scheduler.regTask('todayDailyTask', async (request) => { 179 | await require('./producGame').doTodayDailyTask(request, options) 180 | }, { 181 | ...taskOption, 182 | startTime: 20 * 3600 183 | }) 184 | 185 | // 首页-签到有礼-居家娱乐馆 186 | await scheduler.regTask('gameYearBox', async (request) => { 187 | await require('./gameYearBox').doTask(request, options) 188 | }, { 189 | ...taskOption, 190 | startTime: 20 * 3600 191 | }) 192 | 193 | // 首页-牛气-秒杀抢兑 194 | await scheduler.regTask('NiujieSpikePrize', async (request) => { 195 | await require('./Niujie').spikePrize(request, options) 196 | }, { 197 | ...taskOption, 198 | startTime: 9.6 * 3600, 199 | ignoreRelay: true 200 | }) 201 | 202 | // 首页-牛气-转盘抽奖 203 | await scheduler.regTask('NiujieTask', async (request) => { 204 | await require('./Niujie').doTask(request, options) 205 | }, taskOption) 206 | 207 | 208 | // 首页-牛气-场馆领牛气 209 | await scheduler.regTask('NiujieReceiveCalf', async (request) => { 210 | await require('./Niujie').receiveCalf(request, options) 211 | }, { 212 | isCircle: true, 213 | intervalTime: 1 * 3600, 214 | ...taskOption 215 | }) 216 | } 217 | module.exports = { 218 | start 219 | } -------------------------------------------------------------------------------- /commands/tasks/unicom/woTree.js: -------------------------------------------------------------------------------- 1 | var crypto = require('crypto'); 2 | const { buildUnicomUserAgent } = require('../../../utils/util') 3 | 4 | var sign = (data) => { 5 | let str = 'integralofficial&' 6 | let params = [] 7 | data.forEach((v, i) => { 8 | if (v) { 9 | params.push('arguments' + (i + 1) + v) 10 | } 11 | }); 12 | return crypto.createHash('md5').update(str + params.join('&')).digest('hex') 13 | } 14 | 15 | var transParams = (data) => { 16 | let params = new URLSearchParams(); 17 | for (let item in data) { 18 | params.append(item, data['' + item + '']); 19 | } 20 | return params; 21 | }; 22 | 23 | var woTree = { 24 | entry: async (axios, options) => { 25 | const useragent = buildUnicomUserAgent(options, 'p') 26 | let searchParams = {} 27 | let result = await axios.request({ 28 | baseURL: 'https://m.client.10010.com/', 29 | headers: { 30 | "user-agent": useragent, 31 | "referer": `https://img.client.10010.com/`, 32 | "origin": "https://img.client.10010.com" 33 | }, 34 | url: `https://m.client.10010.com/mobileService/openPlatform/openPlatLineNew.htm?to_url=https://img.client.10010.com/mactivity/woTree/index.html&duanlianjieabc=qA504`, 35 | method: 'get', 36 | transformResponse: (data, headers) => { 37 | if ('location' in headers) { 38 | let uu = new URL(headers.location) 39 | let pp = {} 40 | for (let p of uu.searchParams) { 41 | pp[p[0]] = p[1] 42 | } 43 | if ('ticket' in pp) { 44 | searchParams = pp 45 | } 46 | } 47 | return data 48 | } 49 | }).catch(err => console.log(err)) 50 | 51 | let jar = result.config.jar 52 | let cookiesJson = jar.toJSON() 53 | let ecs_token = cookiesJson.cookies.find(i => i.key == 'ecs_token') 54 | if (!ecs_token) { 55 | throw new Error('ecs_token缺失') 56 | } 57 | ecs_token = ecs_token.value 58 | 59 | return { 60 | searchParams, 61 | ecs_token, 62 | jar 63 | } 64 | }, 65 | getStatus: (axios, options) => { 66 | const useragent = buildUnicomUserAgent(options, 'p') 67 | return new Promise((resolve, reject) => { 68 | axios.request({ 69 | baseURL: 'https://m.client.10010.com/', 70 | headers: { 71 | "user-agent": useragent, 72 | "referer": "https://img.client.10010.com", 73 | "origin": "https://img.client.10010.com" 74 | }, 75 | url: `/mactivity/arbordayJson/index.htm`, 76 | method: 'post' 77 | }).then(res => { 78 | let result = res.data 79 | if (result.code !== '0000') { 80 | console.log(result.msg) 81 | } else { 82 | resolve(result.data) 83 | } 84 | }).catch(reject) 85 | }) 86 | }, 87 | takeFlow: async (axios, params) => { 88 | const { options, flowChangeList } = params 89 | const useragent = buildUnicomUserAgent(options, 'p') 90 | // type 1 看视频得流量 0 普通任务 91 | for (let flow of flowChangeList) { 92 | const { data } = await axios.request({ 93 | baseURL: 'https://m.client.10010.com/', 94 | headers: { 95 | "user-agent": useragent, 96 | "referer": "https://img.client.10010.com", 97 | "origin": "https://img.client.10010.com" 98 | }, 99 | url: flow.type === '1' ? `/mactivity/flowData/refresh.htm?flowId=${flow.id}` : `/mactivity/flowData/takeFlow.htm?flowId=${flow.id}`, 100 | method: 'post' 101 | }) 102 | if (data.code !== '0000') { 103 | console.log(data.msg) 104 | } else { 105 | console.log('领取流量+', flow.countTransFlowStr, 'M成功') 106 | } 107 | } 108 | }, 109 | takePop: async (axios, params) => { 110 | const { options, popList } = params 111 | const useragent = buildUnicomUserAgent(options, 'p') 112 | for (let pop of popList) { 113 | const { data } = await axios.request({ 114 | baseURL: 'https://m.client.10010.com/', 115 | headers: { 116 | "user-agent": useragent, 117 | "referer": "https://img.client.10010.com", 118 | "origin": "https://img.client.10010.com" 119 | }, 120 | url: `/mactivity/arbordayJson/arbor/${pop.id}/${pop.type}/${pop.friendNum}/grow.htm`, 121 | method: 'post' 122 | }) 123 | if (data.code !== '0000') { 124 | console.log(data.msg) 125 | } else { 126 | console.log('领取话费+', data.data.addedValue) 127 | } 128 | } 129 | }, 130 | water: async (axios, options) => { 131 | const { jar } = await woTree.entry(axios, options) 132 | const useragent = buildUnicomUserAgent(options, 'p') 133 | 134 | const { data } = await axios.request({ 135 | baseURL: 'https://m.client.10010.com/', 136 | headers: { 137 | "user-agent": useragent, 138 | "referer": "https://img.client.10010.com", 139 | "origin": "https://img.client.10010.com" 140 | }, 141 | url: `/mactivity/arbordayJson/getChanceByIndex.htm?index=0`, 142 | method: 'post' 143 | }) 144 | 145 | if (data.code !== '0000') { 146 | console.log('查询浇水机会失败') 147 | return 148 | } 149 | 150 | if (data.data.chance_0 === 0) { 151 | console.log('暂无浇水机会,跳过') 152 | return 153 | } 154 | 155 | let num = 2 156 | do { 157 | if (num < 2) { 158 | console.log('看视频浇水') 159 | let params = { 160 | 'arguments1': '', 161 | 'arguments2': '', 162 | 'arguments3': '', 163 | 'arguments4': new Date().getTime(), 164 | 'arguments6': '', 165 | 'arguments7': '', 166 | 'arguments8': '', 167 | 'arguments9': '', 168 | 'netWay': 'Wifi', 169 | 'remark1': '沃之树看视频得浇水机会', 170 | 'remark': '', 171 | 'version': `android@8.0100`, 172 | 'codeId': 945535626 173 | } 174 | params['sign'] = sign([params.arguments1, params.arguments2, params.arguments3, params.arguments4]) 175 | let result = await require('./taskcallback').reward(axios, { 176 | ...options, 177 | params, 178 | jar 179 | }) 180 | result = await axios.request({ 181 | headers: { 182 | "user-agent": useragent, 183 | "referer": `https://img.client.10010.com/`, 184 | "origin": "https://img.client.10010.com", 185 | }, 186 | url: `https://m.client.10010.com/mactivity/arbordayJson/giveGrowChance.htm`, 187 | method: 'POST', 188 | data: transParams({ 189 | "{}": "" 190 | }) 191 | }) 192 | console.log(result.data.msg) 193 | } 194 | let res = await axios.request({ 195 | headers: { 196 | "user-agent": useragent, 197 | "referer": `https://img.client.10010.com/`, 198 | "origin": "https://img.client.10010.com", 199 | }, 200 | url: `https://m.client.10010.com/mactivity/arbordayJson/arbor/3/0/3/grow.htm`, 201 | method: 'POST', 202 | data: transParams({ 203 | "{}": "" 204 | }) 205 | }) 206 | let result = res.data 207 | if (result.code !== '0000') { 208 | console.log('浇水失败', result.msg) 209 | } else { 210 | if (result.data.addedValue) { 211 | console.log('浇水成功', '培养值+' + result.data.addedValue) 212 | } else { 213 | console.log('浇水操作完成') 214 | } 215 | } 216 | } while (--num) 217 | }, 218 | doTask: async (request, options) => { 219 | // 沃之树 浇水 220 | await woTree.water(request, options) 221 | let i = 2 222 | let result 223 | do { 224 | // 普通 - 看视频 似乎是分开的两次 225 | result = await woTree.getStatus(request, options) 226 | await woTree.takeFlow(request, { 227 | options, 228 | flowChangeList: result.flowChangeList 229 | }) 230 | } while (i--) 231 | await woTree.takePop(request, { 232 | options, 233 | popList: result.popList 234 | }) 235 | } 236 | } 237 | 238 | module.exports = woTree -------------------------------------------------------------------------------- /commands/tasks/wps/clock_in.js: -------------------------------------------------------------------------------- 1 | // https://zt.wps.cn/2018/clock_in 2 | 3 | var isInTime = function (e, t) { 4 | var n = (new Date).getHours(); 5 | return n >= e && n < t 6 | } 7 | // 打卡领会员-仅自动邀请 8 | var clockIn = { 9 | doTask: async (axios, options) => { 10 | // https://zt.wps.cn/2018/clock_in/api/get_data?member=wps 11 | let { data } = await axios.request({ 12 | url: `https://zt.wps.cn/2018/clock_in`, 13 | method: 'get' 14 | }).catch(err => console.log(err)) 15 | let datamodel = data.match(/datamodel\s*=\s(.*?);/)[1] 16 | datamodel = JSON.parse(datamodel) 17 | console.log(`当前用户${datamodel.username},打卡奖励倍数${datamodel.times}倍,昨日是否签到${datamodel.is_sign_up_yesterday},今日是否打卡${datamodel.is_clock_in}`) 18 | if (datamodel.isSignUpYesterday) { 19 | if (datamodel.is_clock_in) { 20 | console.log('今日已打卡,跳过') 21 | return 22 | } else if (!isInTime(6, 13)) { 23 | console.log('不在6-13时间段内,跳过') 24 | return 25 | } 26 | } else { 27 | console.log('昨日未签到,开始报名挑战') 28 | } 29 | 30 | if (!datamodel.is_sign_up) { 31 | console.log('今天尚未报名,开始报名') 32 | let t = (new Date).getTime() 33 | let { data: sd } = await axios.request({ 34 | url: `https://zt.wps.cn/2018/clock_in/api/sign_up?sid=${datamodel.userinfo.userid}&from=&csource=&_t=${t}&_=${t}`, 35 | method: 'get' 36 | }).catch(err => console.log(err)) 37 | if (sd.result === 'error') { 38 | console.log('需要绑定相关信息,请访问【https://zt.wps.cn/2018/clock_in】绑定相关信息后在操作,跳过') 39 | return 40 | } 41 | } else { 42 | console.log('今天已报名') 43 | } 44 | console.log('开始邀请人员参与挑战') 45 | 46 | let invite_sid = [ 47 | 'V02S2UBSfNlvEprMOn70qP3jHPDqiZU00a7ef4a800341c7c3b', 48 | 'V02StVuaNcoKrZ3BuvJQ1FcFS_xnG2k00af250d4002664c02f', 49 | 'V02SWIvKWYijG6Rggo4m0xvDKj1m7ew00a8e26d3002508b828', 50 | 'V02Sr3nJ9IicoHWfeyQLiXgvrRpje6E00a240b890023270f97', 51 | 'V02SBsNOf4sJZNFo4jOHdgHg7-2Tn1s00a338776000b669579', 52 | 'V02S2oI49T-Jp0_zJKZ5U38dIUSIl8Q00aa679530026780e96', 53 | 'V02ShotJqqiWyubCX0VWTlcbgcHqtSQ00a45564e002678124c', 54 | 'V02SFiqdXRGnH5oAV2FmDDulZyGDL3M00a61660c0026781be1', 55 | 'V02S7tldy5ltYcikCzJ8PJQDSy_ElEs00a327c3c0026782526', 56 | 'V02SPoOluAnWda0dTBYTXpdetS97tyI00a16135e002684bb5c', 57 | 'V02Sb8gxW2inr6IDYrdHK_ywJnayd6s00ab7472b0026849b17', 58 | 'V02SwV15KQ_8n6brU98_2kLnnFUDUOw00adf3fda0026934a7f', 59 | 'V02SC1mOHS0RiUBxeoA8NTliH2h2NGc00a803c35002693584d' 60 | ] 61 | for (let sid of invite_sid) { 62 | try { 63 | let res = await axios.request({ 64 | headers: { "sid": sid }, 65 | url: `http://zt.wps.cn/2018/clock_in/api/invite`, 66 | method: 'post', 67 | data: `invite_userid=${datamodel.userinfo.userid}` 68 | }).catch(err => console.log(err)) 69 | let td = res.data 70 | if (td.result === 'error') { 71 | console.log(`邀请[${sid}]失败`, td.msg) 72 | } else { 73 | console.log(`邀请[${sid}]成功`, td.msg) 74 | } 75 | console.log(`延时等待`) 76 | await new Promise((resolve, reject) => setTimeout(resolve, 500)) 77 | } catch (err) { 78 | console.log(err) 79 | } 80 | } 81 | 82 | // let { data: clock_in } = await axios.request({ 83 | // headers: { "sid": sid }, 84 | // url: `http://zt.wps.cn/2018/clock_in/api/clock_in?member=wps`, 85 | // method: 'get' 86 | // }).catch(err => console.log(err)) 87 | } 88 | } 89 | module.exports = clockIn -------------------------------------------------------------------------------- /commands/tasks/wps/wps.js: -------------------------------------------------------------------------------- 1 | const { scheduler } = require('../../../utils/scheduler') 2 | const _request = require('../../../utils/request') 3 | 4 | var start = async (params) => { 5 | const { cookies, options } = params 6 | 7 | let init = async (request, savedCookies) => { 8 | if (!savedCookies) { 9 | if (!cookies || !('wps_sid' in cookies) || !cookies['wps_sid']) { 10 | throw new Error("需要提供wps_sid参数") 11 | } 12 | if (!('csrf' in cookies) || !cookies['csrf']) { 13 | throw new Error("需要提供csrf参数") 14 | } 15 | return { 16 | request: _request(cookies) 17 | } 18 | } else { 19 | return { 20 | request 21 | } 22 | } 23 | } 24 | let taskOption = { 25 | init 26 | } 27 | 28 | await scheduler.regTask('wps_clock_in', async (request) => { 29 | await require('./clock_in').doTask(request, options) 30 | }, { 31 | startHours: 6, 32 | endHours: 8, 33 | ...taskOption 34 | }) 35 | 36 | } 37 | module.exports = { 38 | start 39 | } -------------------------------------------------------------------------------- /commands/unicom.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const { scheduler } = require('../utils/scheduler') 4 | 5 | exports.command = 'unicom' 6 | 7 | exports.describe = 'unicom任务' 8 | 9 | exports.builder = function (yargs) { 10 | return yargs 11 | .option('user', { 12 | describe: '用于登录的手机号码', 13 | default: '', 14 | type: 'string' 15 | }) 16 | .option('password', { 17 | describe: '用于登录的账户密码', 18 | default: '', 19 | type: 'string' 20 | }) 21 | .option('appid', { 22 | describe: 'appid', 23 | default: '', 24 | type: 'string' 25 | }) 26 | .option('cookies', { 27 | describe: '签到cookies', 28 | default: '', 29 | type: 'string' 30 | }) 31 | .help() 32 | .showHelpOnFail(true, '使用--help查看有效选项') 33 | .epilog('copyright 2020 LunnLew'); 34 | } 35 | 36 | exports.handler = async function (argv) { 37 | var command = argv._[0] 38 | var accounts = [] 39 | if ('accountSn' in argv && argv.accountSn) { 40 | let accountSns = (argv.accountSn + '').split(',') 41 | for (let sn of accountSns) { 42 | if (('user-' + sn) in argv) { 43 | let account = { 44 | cookies: argv['cookies-' + sn], 45 | user: argv['user-' + sn] + '', 46 | password: argv['password-' + sn] + '', 47 | appid: argv['appid-' + sn], 48 | tasks: argv['tasks-' + sn] || argv['tasks'] 49 | } 50 | if (('tryrun-' + sn) in argv) { 51 | account['tryrun'] = true 52 | } 53 | accounts.push(account) 54 | } 55 | } 56 | } else { 57 | accounts.push({ 58 | cookies: argv['cookies'], 59 | user: argv['user'] + '', 60 | password: argv['password'] + '', 61 | appid: argv['appid'], 62 | tasks: argv['tasks'] 63 | }) 64 | } 65 | console.log('总账户数', accounts.length) 66 | for (let account of accounts) { 67 | await require(path.join(__dirname, 'tasks', command, command)).start({ 68 | cookies: account.cookies, 69 | options: { 70 | appid: account.appid, 71 | user: account.user, 72 | password: account.password 73 | } 74 | }).catch(err => console.log("unicom任务:", err)) 75 | let hasTasks = await scheduler.hasWillTask(command, { 76 | tryrun: 'tryrun' in argv, 77 | taskKey: account.user 78 | }) 79 | if (hasTasks) { 80 | scheduler.execTask(command, account.tasks).catch(err => console.log("unicom任务:", err)).finally(() => { 81 | console.log('当前任务执行完毕!') 82 | }) 83 | } else { 84 | console.log('暂无可执行任务!') 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /commands/wps.js: -------------------------------------------------------------------------------- 1 | 2 | const path = require('path') 3 | const { scheduler } = require('../utils/scheduler') 4 | 5 | exports.command = 'wps' 6 | 7 | exports.describe = 'wps签到任务' 8 | 9 | exports.builder = function (yargs) { 10 | return yargs 11 | .option('wps_sid', { 12 | describe: 'cookie项wps_sid的值', 13 | type: 'string' 14 | }) 15 | .option('csrf', { 16 | describe: 'cookie项csrf的值', 17 | type: 'string' 18 | }) 19 | .help() 20 | .showHelpOnFail(true, '使用--help查看有效选项') 21 | .epilog('copyright 2020 LunnLew'); 22 | } 23 | 24 | exports.handler = async function (argv) { 25 | var command = argv._[0] 26 | var accounts = [] 27 | if ('accountSn' in argv && argv.accountSn) { 28 | let accountSns = argv.accountSn.split(',') 29 | for (let sn of accountSns) { 30 | if (('wps_sid-' + sn) in argv) { 31 | let account = { 32 | wps_sid: argv['wps_sid-' + sn], 33 | csrf: argv['csrf-' + sn], 34 | tasks: argv['tasks-' + sn] 35 | } 36 | if (('tryrun-' + sn) in argv) { 37 | account['tryrun'] = true 38 | } 39 | accounts.push(account) 40 | } 41 | } 42 | } else { 43 | accounts.push({ 44 | ...argv 45 | }) 46 | } 47 | console.log('总账户数', accounts.length) 48 | for (let account of accounts) { 49 | await require(path.join(__dirname, 'tasks', command, command)).start({ 50 | cookies: { 51 | wps_sid: account.wps_sid, 52 | csrf: account.csrf, 53 | }, 54 | options: {} 55 | }).catch(err => console.log("wps签到任务:", err.message)) 56 | let hasTasks = await scheduler.hasWillTask(command, { 57 | tryrun: 'tryrun' in argv, 58 | taskKey: account.wps_sid 59 | }) 60 | if (hasTasks) { 61 | scheduler.execTask(command, account.tasks).catch(err => console.log("wps签到任务:", err.message)).finally(() => { 62 | console.log('当前任务执行完毕!') 63 | }) 64 | } else { 65 | console.log('暂无可执行任务!') 66 | } 67 | } 68 | } -------------------------------------------------------------------------------- /default.json: -------------------------------------------------------------------------------- 1 | { 2 | "accountSn": "1", 3 | "user-1": "1*****1", 4 | "password-1": "1*****1", 5 | "appid-1": "1*****1" 6 | } -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | asm_unicom: 4 | container_name: asm_unicom 5 | build: 6 | context: ./ 7 | dockerfile: docker/Dockerfile 8 | volumes: 9 | - ./:/AutoSignMachine #同步脚本地址 10 | restart: always 11 | tty: true 12 | network_mode: "bridge" 13 | hostname: asm_unicom 14 | environment: 15 | - enable_unicom=true #签到开关 false / true 16 | - user=123456 # 输入用户手机号 17 | - password=123456 #输入用户密码 18 | - appid=FFFFFFFF #输入手机端APPID 19 | asm_bili: 20 | container_name: asm_bili 21 | build: 22 | context: ./ 23 | dockerfile: docker/Dockerfile 24 | volumes: 25 | - ./:/AutoSignMachine #同步脚本地址 26 | restart: always 27 | tty: true 28 | network_mode: "bridge" 29 | environment: 30 | - enable_bilibili=false #签到开关 31 | - DedeUserID= # 32 | - SESSDATA= # 33 | - bili_jct= # 34 | 35 | asm52pojie: 36 | container_name: asm52pojie 37 | build: 38 | context: ./ 39 | dockerfile: docker/Dockerfile 40 | volumes: 41 | - ./:/AutoSignMachine #同步脚本地址 42 | restart: always 43 | tty: true 44 | network_mode: "bridge" 45 | environment: 46 | - enable_52pojie=false #签到开关 47 | - htVD_2132_auth= # 48 | - htVD_2132_saltkey= # 49 | 50 | asm_iqiyi: 51 | container_name: asm_iqiyi 52 | build: 53 | context: ./ 54 | dockerfile: docker/Dockerfile 55 | volumes: 56 | - ./:/AutoSignMachine #同步脚本地址 57 | restart: always 58 | tty: true 59 | network_mode: "bridge" 60 | environment: 61 | - enable_iqiyi=false #签到开关 62 | - P00001= # 63 | - P00PRU= # 64 | - QC005= # 65 | - dfp= # 66 | 67 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:latest 2 | 3 | WORKDIR /AutoSignMachine/ 4 | 5 | RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories 6 | RUN apk add --no-cache tzdata nodejs npm 7 | RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 8 | 9 | # 复制代码 10 | COPY . /AutoSignMachine/ 11 | 12 | RUN npm install --registry https://registry.npm.taobao.org 13 | 14 | COPY docker/entrypoint.sh /entrypoint.sh 15 | 16 | RUN chmod +x /entrypoint.sh 17 | 18 | ENTRYPOINT /entrypoint.sh -------------------------------------------------------------------------------- /docker/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | crontab -r 4 | if [ ${enable_52pojie} ];then 5 | echo "10 13 * * * node /AutoSignMachine/index.js 52pojie --htVD_2132_auth=${htVD_2132_auth} --htVD_2132_saltkey=${htVD_2132_saltkey}" >> /var/spool/cron/crontabs/root 6 | fi 7 | 8 | if [ ${enable_bilibili} ];then 9 | echo "*/30 7-22 * * * node /AutoSignMachine/index.js bilibili --cookies ${cookies} --username ${username} --password ${password} ${othercfg}" >> /var/spool/cron/crontabs/root 10 | fi 11 | 12 | if [ ${enable_iqiyi} ];then 13 | echo "*/30 7-22 * * * node /AutoSignMachine/index.js iqiyi --P00001 ${P00001} --P00PRU ${P00PRU} --QC005 ${QC005} --dfp ${dfp}" >> /var/spool/cron/crontabs/root 14 | fi 15 | 16 | if [ ${enable_unicom} ];then 17 | echo "*/30 7-22 * * * node /AutoSignMachine/index.js unicom --cookies ${cookies} --user ${user} --password ${password} --appid ${appid}" >> /var/spool/cron/crontabs/root 18 | fi 19 | 20 | /usr/sbin/crond -S -c /var/spool/cron/crontabs -f -L /dev/stdout -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | (async () => { 2 | require('./AutoSignMachine.js').run() 3 | })() -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "auto-sign-machine", 3 | "version": "1.0.0", 4 | "description": "自动签到机器人", 5 | "main": "index.js", 6 | "repository": "https://github.com/lunnlew/AutoSignMachine.git", 7 | "author": "lunnlew", 8 | "license": "MIT", 9 | "dependencies": { 10 | "axios": "^0.21.0", 11 | "axios-cookiejar-support": "^1.0.1", 12 | "cheerio": "^1.0.0-rc.3", 13 | "crypto": "^1.0.1", 14 | "crypto-js": "^4.0.0", 15 | "dayjs": "^1.9.6", 16 | "fs-extra": "^9.0.1", 17 | "iconv-lite": "^0.6.2", 18 | "moment": "^2.29.1", 19 | "p-queue": "^6.6.2", 20 | "protobufjs": "^6.10.2", 21 | "qs": "^6.9.4", 22 | "tough-cookie": "^4.0.0", 23 | "yargs": "^16.1.0" 24 | }, 25 | "devDependencies": { 26 | "serverless-tencent-scf": "^0.1.7" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: auto-sign-matchine 2 | 3 | provider: # provider information 4 | name: tencent 5 | runtime: Nodejs12.16 # Nodejs8.9 or Nodejs6.10 6 | credentials: ~/credentials 7 | 8 | # you can overwrite defaults here 9 | # stage: dev 10 | # cosBucket: DEFAULT 11 | # role: QCS_SCFExcuteRole 12 | # memorySize: 256 13 | # timeout: 10 14 | # region: ap-shanghai 15 | # environment: 16 | # variables: 17 | # ENV_FIRST: env1 18 | # ENV_SECOND: env2 19 | # vpcConfig: 20 | # vpcId: test 21 | # subnetId: test 22 | 23 | plugins: 24 | - serverless-tencent-scf 25 | 26 | # you can add packaging information here 27 | #package: 28 | # include: 29 | # - include-me.js 30 | # - include-me-dir/** 31 | # exclude: 32 | # - exclude-me.js 33 | # - exclude-me-dir/** 34 | 35 | # 免费用户执行时长不得超过900秒 36 | 37 | functions: 38 | task1: 39 | handler: tscf.main_handler 40 | runtime: Nodejs12.16 41 | memorySize: 256 42 | timeout: 900 43 | environment: 44 | variables: 45 | cmd: unicom 46 | config: default.json 47 | tasks: dailysignin,winterTwo,dxIntegralEveryDay,dailygamebox,dailylotteryintegral,dailywoTree,dailyLiuLan,dailycomment,producGameSignin 48 | events: 49 | - timer: 50 | name: timer 51 | parameters: 52 | cronExpression: '10 9-10 * * *' 53 | enable: true 54 | task2: 55 | handler: tscf.main_handler 56 | runtime: Nodejs12.16 57 | memorySize: 256 58 | timeout: 900 59 | environment: 60 | variables: 61 | cmd: unicom 62 | config: default.json 63 | tasks: dailygameflow 64 | events: 65 | - timer: 66 | name: timer 67 | parameters: 68 | cronExpression: '*/30 7-23 * * *' 69 | enable: true 70 | task3: 71 | handler: tscf.main_handler 72 | runtime: Nodejs12.16 73 | memorySize: 256 74 | timeout: 900 75 | environment: 76 | variables: 77 | cmd: unicom 78 | config: default.json 79 | tasks: dailygameIntegral 80 | events: 81 | - timer: 82 | name: timer 83 | parameters: 84 | cronExpression: '*/30 7-23 * * *' 85 | enable: true 86 | task4: 87 | handler: tscf.main_handler 88 | runtime: Nodejs12.16 89 | memorySize: 256 90 | timeout: 900 91 | environment: 92 | variables: 93 | cmd: unicom 94 | config: default.json 95 | tasks: todayDailyTask 96 | events: 97 | - timer: 98 | name: timer 99 | parameters: 100 | cronExpression: '*/30 22 * * *' 101 | enable: true -------------------------------------------------------------------------------- /tscf.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | // see https://github.com/serverless/serverless/blob/master/README_CN.md#how-to-install-a-service 4 | 5 | exports.main_handler = (event, context, callback) => { 6 | let argv = process.argv 7 | argv[2] = process.env.cmd 8 | argv[3] = '--config' 9 | argv[4] = process.env.USER_CODE_ROOT + '/' + process.env.config 10 | argv[5] = '--tasks' 11 | argv[6] = process.env.tasks 12 | console.log(argv.join(' ')) 13 | if (!process.env.tasks) { 14 | callback(null, '必须单独指定任务'); 15 | } else { 16 | require('./AutoSignMachine.js').run(argv) 17 | callback(null, '触发任务执行成功'); 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /utils/request.js: -------------------------------------------------------------------------------- 1 | const axios = require('axios'); 2 | const axiosCookieJarSupport = require('axios-cookiejar-support').default; 3 | const tough = require('tough-cookie'); 4 | axiosCookieJarSupport(axios); 5 | 6 | const err = (error) => { 7 | return Promise.reject(error) 8 | } 9 | 10 | var parseDefaultCookie = function (cookies) { 11 | let cookie = [] 12 | if (Object.prototype.toString.call(cookies) == '[object String]') { 13 | cookie = cookies ? [cookies] : [] 14 | } else if (Object.prototype.toString.call(cookies) == '[object Object]') { 15 | Object.keys(cookies).forEach(item => { 16 | cookie.push(item + '=' + cookies[item]) 17 | }) 18 | } 19 | return cookie.join('; ') 20 | } 21 | 22 | var setCookieString = function (jar, cookies, config) { 23 | let url 24 | if (config.url.indexOf('http') === 0) { 25 | url = config.url 26 | } else { 27 | url = config.baseURL + config.url 28 | } 29 | let uuuu = new URL(url) 30 | // console.log('setCookieString for', uuuu.origin) 31 | cookies = parseDefaultCookie(cookies) 32 | if (Object.prototype.toString.call(cookies) == '[object String]') { 33 | cookies.length && cookies.split('; ').forEach(cookie => { 34 | jar.setCookieSync(cookie, uuuu.origin + '/', {}) 35 | }) 36 | } 37 | return jar 38 | } 39 | 40 | module.exports = cookies => { 41 | const service = axios.create({ 42 | headers: { 43 | Cookie: parseDefaultCookie(cookies) 44 | }, 45 | jar: new tough.CookieJar(), 46 | timeout: 60000, 47 | withCredentials: true 48 | }) 49 | service.interceptors.request.use(async config => { 50 | if (!('user-agent' in config.headers)) { 51 | config.headers['user-agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36' 52 | } 53 | let jar = config.jar 54 | if (!jar) { 55 | jar = new tough.CookieJar() 56 | } else { 57 | config.headers['Cookie'] = '' 58 | } 59 | config.jar = setCookieString(jar, cookies, config) 60 | return config 61 | }, err) 62 | service.interceptors.response.use(async response => { 63 | return response 64 | }, err) 65 | return service; 66 | } -------------------------------------------------------------------------------- /utils/util.js: -------------------------------------------------------------------------------- 1 | const os = require('os') 2 | const path = require('path') 3 | const fs = require('fs-extra') 4 | 5 | module.exports = { 6 | async delCookiesFile(key) { 7 | let dir = path.join(os.homedir(), '.AutoSignMachine') 8 | if ('TENCENTCLOUD_RUNENV' in process.env && process.env.TENCENTCLOUD_RUNENV === 'SCF') { 9 | dir = path.join('/tmp', '.AutoSignMachine') 10 | } 11 | if (!fs.existsSync(dir)) { 12 | fs.mkdirpSync(dir) 13 | } 14 | let cookieFile = path.join(dir, 'cookieFile_' + key + '.txt') 15 | if (fs.existsSync(cookieFile)) { 16 | fs.unlinkSync(cookieFile) 17 | } 18 | }, 19 | getCookies: (key) => { 20 | let dir = path.join(os.homedir(), '.AutoSignMachine') 21 | if ('TENCENTCLOUD_RUNENV' in process.env && process.env.TENCENTCLOUD_RUNENV === 'SCF') { 22 | dir = path.join('/tmp', '.AutoSignMachine') 23 | } 24 | if (!fs.existsSync(dir)) { 25 | fs.mkdirpSync(dir) 26 | } 27 | let cookieFile = path.join(dir, 'cookieFile_' + key + '.txt') 28 | if (fs.existsSync(cookieFile)) { 29 | let cookies = fs.readFileSync(cookieFile).toString('utf-8') 30 | return cookies 31 | } 32 | return '' 33 | }, 34 | saveCookies: (key, cookies, cookiesJar) => { 35 | let dir = path.join(os.homedir(), '.AutoSignMachine') 36 | if ('TENCENTCLOUD_RUNENV' in process.env && process.env.TENCENTCLOUD_RUNENV === 'SCF') { 37 | dir = path.join('/tmp', '.AutoSignMachine') 38 | } 39 | if (!fs.existsSync(dir)) { 40 | fs.mkdirpSync(dir) 41 | } 42 | let cookieFile = path.join(dir, 'cookieFile_' + key + '.txt') 43 | let allcookies = {} 44 | if (cookies) { 45 | cookies.split('; ').map(c => { 46 | let item = c.split('=') 47 | allcookies[item[0]] = item[1] || '' 48 | }) 49 | } 50 | if (cookiesJar) { 51 | cookiesJar.toJSON().cookies.map(c => { 52 | allcookies[c.key] = c.value || '' 53 | }) 54 | } 55 | let cc = [] 56 | for (let key in allcookies) { 57 | cc.push({ 58 | key: key, 59 | value: allcookies[key] || '' 60 | }) 61 | } 62 | fs.ensureFileSync(cookieFile) 63 | fs.writeFileSync(cookieFile, cc.map(c => c.key + '=' + c.value).join('; ') 64 | ) 65 | }, 66 | buildUnicomUserAgent: (options, tplname) => { 67 | var tpl = { 68 | 'p': 'Mozilla/5.0 (Linux; Android {android_version}; {deviceModel} Build/{buildSn}; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/75.0.3770.143 Mobile Safari/537.36; unicom{version:{unicom_version},desmobile:{desmobile}};devicetype{deviceBrand:{deviceBrand},deviceModel:{deviceModel}};{yw_code:}' 69 | } 70 | var rdm = { 71 | android_version: '7.1.2', 72 | unicom_version: 'android@8.0100', 73 | deviceBrand: 'samsung', 74 | deviceModel: 'SM-G977N', 75 | buildSn: 'LMY48Z', 76 | desmobile: options.user 77 | } 78 | var fmt = (str, params) => { 79 | for (let key in params) { 80 | str = str.replace(new RegExp("\\{" + key + "\\}", "g"), params[key]); 81 | } 82 | return str 83 | } 84 | return fmt(tpl[tplname], Object.assign(rdm, options)) 85 | } 86 | } --------------------------------------------------------------------------------