├── .gitignore ├── package.json ├── README.md ├── .github └── workflows │ └── node.js.yml ├── index.mjs └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "autoSign", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.mjs", 6 | "scripts": { 7 | "start": "node --unhandled-rejections=strict index.mjs" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "got": "^14.4.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 夸克网盘自动签到 - fun 2 | 3 | ### 设置全局环境变量cookie 4 | 1. settings点击之后左边菜单的Security-> secrets and variables->actions 5 | 2. 在下面点击New repository secret 6 | 3. name 填写 `COOKIE`, secret填写获取的cookie 7 | 8 | ### 本地调试 9 | 新增一个文件.env 10 | 内容是 11 | ```text 12 | COOKIE='xxxx' 13 | ``` 14 | 运行命令 15 | ```bash 16 | node --env-file .env .\index.mjs 17 | ``` 18 | 19 | ### 获取cookie方式 20 | COOKIE获取方法:[Alist获取夸克网盘cookie](https://alist.nn.ci/zh/guide/drivers/quark.html) 21 | -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ "main" ] 9 | schedule: 10 | - cron: '0 16 * * *' 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | timeout-minutes: 10 15 | env: 16 | COOKIE: ${{secrets.COOKIE}} 17 | strategy: 18 | matrix: 19 | node-version: [20] 20 | steps: 21 | - uses: actions/checkout@v4 22 | - name: Install pnpm 23 | uses: pnpm/action-setup@v4 24 | with: 25 | version: 9 26 | - name: Use Node.js ${{ matrix.node-version }} 27 | uses: actions/setup-node@v4 28 | with: 29 | node-version: ${{ matrix.node-version }} 30 | cache: 'pnpm' 31 | - name: Install Dependencies 32 | run: pnpm i 33 | - run: pnpm start 34 | -------------------------------------------------------------------------------- /index.mjs: -------------------------------------------------------------------------------- 1 | import got from "got"; 2 | let cookie = process.env.COOKIE; 3 | 4 | async function getGrowthSign() { 5 | let url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/sign?"; 6 | const querystring = { pr: "ucpro", fr: "pc", uc_param_str: "" }; 7 | url = url + new URLSearchParams(querystring).toString(); 8 | const payload = { sign_cyclic: true }; 9 | const data = await got 10 | .post(url, { 11 | method: "post", 12 | headers: { 13 | cookie 14 | }, 15 | json: payload, 16 | timeout: { 17 | request: 15000 18 | } 19 | }) 20 | .json(); 21 | if (data.data) { 22 | return data?.data?.sign_daily_reward; 23 | } else { 24 | return null; 25 | } 26 | } 27 | 28 | // 查询签到情况 29 | async function getGrowthInfo() { 30 | let url = "https://drive-m.quark.cn/1/clouddrive/capacity/growth/info?"; 31 | const querystring = { pr: "ucpro", fr: "pc", uc_param_str: "" }; 32 | url = url + new URLSearchParams(querystring).toString(); 33 | const data = await got(url, { 34 | method: "get", 35 | headers: { 36 | cookie 37 | }, 38 | timeout: { 39 | request: 15000 40 | } 41 | }).json(); 42 | if (data.data) { 43 | return data.data; 44 | } else { 45 | return null; 46 | } 47 | } 48 | 49 | async function getAccountInfo() { 50 | let url = "https://pan.quark.cn/account/info?"; 51 | const querystring = { fr: "pc", platform: "pc" }; 52 | url = url + new URLSearchParams(querystring).toString(); 53 | const data = await got(url, { 54 | method: "get", 55 | headers: { 56 | cookie 57 | }, 58 | timeout: { 59 | request: 15000 60 | } 61 | }).json(); 62 | 63 | if (data.success) { 64 | return data.data; 65 | } else { 66 | return null; 67 | } 68 | } 69 | 70 | (async () => { 71 | if (!cookie) { 72 | console.log("请设置 COOKIE 环境变量"); 73 | return; 74 | } 75 | const userinfo = await getAccountInfo(); 76 | if (userinfo) { 77 | const signInfo = await getGrowthInfo(); 78 | console.log("签到情况", signInfo?.cap_sign?.sign_daily); 79 | if (signInfo?.cap_sign?.sign_daily) { 80 | const msg = `✅执行签到: 今日已签到+${ 81 | signInfo["cap_sign"]["sign_daily_reward"] / 1024 / 1024 82 | }MB, 83 | 连签进度(${ 84 | signInfo["cap_sign"]["sign_progress"] / 85 | signInfo["cap_sign"]["sign_target"] 86 | })`; 87 | console.log(msg); 88 | } else { 89 | const growthSign = await getGrowthSign(); 90 | if (growthSign) { 91 | const msg = `✅ 执行签到: 今日签到+${growthSign / 1024 / 1024}MB, 92 | 连签进度(${ 93 | (signInfo["cap_sign"]["sign_progress"] + 1) / 94 | signInfo["cap_sign"]["sign_target"] 95 | })`; 96 | console.log("签到成功", msg); 97 | } else { 98 | console.log("签到失败"); 99 | } 100 | } 101 | } else { 102 | console.log("cookie失效"); 103 | } 104 | })(); 105 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | got: 9 | specifier: ^14.4.1 10 | version: 14.4.1 11 | 12 | packages: 13 | 14 | /@sec-ant/readable-stream@0.4.1: 15 | resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} 16 | dev: false 17 | 18 | /@sindresorhus/is@6.3.1: 19 | resolution: {integrity: sha512-FX4MfcifwJyFOI2lPoX7PQxCqx8BG1HCho7WdiXwpEQx1Ycij0JxkfYtGK7yqNScrZGSlt6RE6sw8QYoH7eKnQ==} 20 | engines: {node: '>=16'} 21 | dev: false 22 | 23 | /@szmarczak/http-timer@5.0.1: 24 | resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} 25 | engines: {node: '>=14.16'} 26 | dependencies: 27 | defer-to-connect: 2.0.1 28 | dev: false 29 | 30 | /@types/http-cache-semantics@4.0.4: 31 | resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} 32 | dev: false 33 | 34 | /cacheable-lookup@7.0.0: 35 | resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} 36 | engines: {node: '>=14.16'} 37 | dev: false 38 | 39 | /cacheable-request@12.0.1: 40 | resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} 41 | engines: {node: '>=18'} 42 | dependencies: 43 | '@types/http-cache-semantics': 4.0.4 44 | get-stream: 9.0.1 45 | http-cache-semantics: 4.1.1 46 | keyv: 4.5.4 47 | mimic-response: 4.0.0 48 | normalize-url: 8.0.1 49 | responselike: 3.0.0 50 | dev: false 51 | 52 | /decompress-response@6.0.0: 53 | resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} 54 | engines: {node: '>=10'} 55 | dependencies: 56 | mimic-response: 3.1.0 57 | dev: false 58 | 59 | /defer-to-connect@2.0.1: 60 | resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} 61 | engines: {node: '>=10'} 62 | dev: false 63 | 64 | /form-data-encoder@4.0.2: 65 | resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} 66 | engines: {node: '>= 18'} 67 | dev: false 68 | 69 | /get-stream@8.0.1: 70 | resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} 71 | engines: {node: '>=16'} 72 | dev: false 73 | 74 | /get-stream@9.0.1: 75 | resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} 76 | engines: {node: '>=18'} 77 | dependencies: 78 | '@sec-ant/readable-stream': 0.4.1 79 | is-stream: 4.0.1 80 | dev: false 81 | 82 | /got@14.4.1: 83 | resolution: {integrity: sha512-IvDJbJBUeexX74xNQuMIVgCRRuNOm5wuK+OC3Dc2pnSoh1AOmgc7JVj7WC+cJ4u0aPcO9KZ2frTXcqK4W/5qTQ==} 84 | engines: {node: '>=20'} 85 | dependencies: 86 | '@sindresorhus/is': 6.3.1 87 | '@szmarczak/http-timer': 5.0.1 88 | cacheable-lookup: 7.0.0 89 | cacheable-request: 12.0.1 90 | decompress-response: 6.0.0 91 | form-data-encoder: 4.0.2 92 | get-stream: 8.0.1 93 | http2-wrapper: 2.2.1 94 | lowercase-keys: 3.0.0 95 | p-cancelable: 4.0.1 96 | responselike: 3.0.0 97 | type-fest: 4.20.1 98 | dev: false 99 | 100 | /http-cache-semantics@4.1.1: 101 | resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} 102 | dev: false 103 | 104 | /http2-wrapper@2.2.1: 105 | resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} 106 | engines: {node: '>=10.19.0'} 107 | dependencies: 108 | quick-lru: 5.1.1 109 | resolve-alpn: 1.2.1 110 | dev: false 111 | 112 | /is-stream@4.0.1: 113 | resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} 114 | engines: {node: '>=18'} 115 | dev: false 116 | 117 | /json-buffer@3.0.1: 118 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 119 | dev: false 120 | 121 | /keyv@4.5.4: 122 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 123 | dependencies: 124 | json-buffer: 3.0.1 125 | dev: false 126 | 127 | /lowercase-keys@3.0.0: 128 | resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} 129 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 130 | dev: false 131 | 132 | /mimic-response@3.1.0: 133 | resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} 134 | engines: {node: '>=10'} 135 | dev: false 136 | 137 | /mimic-response@4.0.0: 138 | resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} 139 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 140 | dev: false 141 | 142 | /normalize-url@8.0.1: 143 | resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} 144 | engines: {node: '>=14.16'} 145 | dev: false 146 | 147 | /p-cancelable@4.0.1: 148 | resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} 149 | engines: {node: '>=14.16'} 150 | dev: false 151 | 152 | /quick-lru@5.1.1: 153 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 154 | engines: {node: '>=10'} 155 | dev: false 156 | 157 | /resolve-alpn@1.2.1: 158 | resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} 159 | dev: false 160 | 161 | /responselike@3.0.0: 162 | resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} 163 | engines: {node: '>=14.16'} 164 | dependencies: 165 | lowercase-keys: 3.0.0 166 | dev: false 167 | 168 | /type-fest@4.20.1: 169 | resolution: {integrity: sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==} 170 | engines: {node: '>=16'} 171 | dev: false 172 | --------------------------------------------------------------------------------