diff --git a/.github/pull.yml b/.github/pull.yml
new file mode 100644
index 00000000..bbadc61e
--- /dev/null
+++ b/.github/pull.yml
@@ -0,0 +1,6 @@
+version: "1"
+rules: # Array of rules
+ - base: master # Required. Target branch
+ upstream: lxk0301:master # Required. Must be in the same fork network.
+ mergeMethod: hardreset # Optional, one of [none, merge, squash, rebase, hardreset], Default: none.
+ mergeUnstable: true # Optional, merge pull request even when the mergeable_state is not clean. Default: false
diff --git a/.github/workflows/build_docker_image.yml b/.github/workflows/build_docker_image.yml
new file mode 100644
index 00000000..b29542a3
--- /dev/null
+++ b/.github/workflows/build_docker_image.yml
@@ -0,0 +1,43 @@
+name: 构建JD Scripts镜像
+
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+ paths:
+ - "docker/Dockerfile"
+
+jobs:
+ build-and-push:
+ runs-on: ubuntu-latest
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ steps:
+ - uses: actions/checkout@master
+
+ # 要去 https://hub.docker.com/ 那边注册一个账户然后配置用户名密码
+ # - name: 构建并推送到Dockerhub官方镜像仓库
+ # uses: docker/build-push-action@v1
+ # with:
+ # username: ${{ secrets.DOCKER_USERNAME }}
+ # password: ${{ secrets.DOCKER_PASSWORD }}
+ # dockerfile: docker/Dockerfile
+ # repository: akyakya/jd_scripts
+ # tag_with_ref: true
+
+ - id: repo_name
+ uses: ASzc/change-string-case-action@v1
+ with:
+ string: ${{ github.repository }}
+
+ - name: 构建并推送到Github Packages
+ uses: docker/build-push-action@v1
+ if: env.GITHUB_TOKEN
+ with:
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+ dockerfile: docker/Dockerfile
+ registry: docker.pkg.github.com
+ repository: ${{ steps.repo_name.outputs.lowercase }}/jd_scripts
+ tag_with_ref: true
diff --git a/.github/workflows/jd_818.yml b/.github/workflows/jd_818.yml
new file mode 100644
index 00000000..89bbbb3c
--- /dev/null
+++ b/.github/workflows/jd_818.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_818
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 1,4,7,10,12,16,22 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: 818
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【手机狂欢城脚本】'
+ run: |
+ node jd_818.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+ JD_818_SHAREID_NOTIFY: ${{ secrets.JD_818_SHAREID_NOTIFY }}
diff --git a/.github/workflows/jd_bean_change.yml b/.github/workflows/jd_bean_change.yml
new file mode 100644
index 00000000..fb3337f7
--- /dev/null
+++ b/.github/workflows/jd_bean_change.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_bean_change
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 2 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: bean_change
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京豆变动通知】'
+ run: |
+ node jd_bean_change.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+ JD_818_SHAREID_NOTIFY: ${{ secrets.JD_818_SHAREID_NOTIFY }}
diff --git a/.github/workflows/jd_bean_sign.yml b/.github/workflows/jd_bean_sign.yml
new file mode 100644
index 00000000..004aa2fc
--- /dev/null
+++ b/.github/workflows/jd_bean_sign.yml
@@ -0,0 +1,54 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_bean_sign
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 16 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: bean_sgin
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京豆签到脚本】'
+ run: |
+ node jd_bean_sign.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ JD_BEAN_STOP: ${{secrets.JD_BEAN_STOP}} #自定义延迟签到,单位毫秒. 默认分批并发无延迟. 延迟作用于每个签到接口, 如填入延迟则切换顺序签到(耗时较长)
+ JD_BEAN_SIGN_STOP_NOTIFY: ${{secrets.JD_BEAN_SIGN_STOP_NOTIFY}}
+ JD_BEAN_SIGN_NOTIFY_SIMPLE: ${{secrets.JD_BEAN_SIGN_NOTIFY_SIMPLE}}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_blueCoin.yml b/.github/workflows/jd_blueCoin.yml
new file mode 100644
index 00000000..58b3a18d
--- /dev/null
+++ b/.github/workflows/jd_blueCoin.yml
@@ -0,0 +1,53 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_blueCoin
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 16 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: blueCoin
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京小超兑换奖品】'
+ run: |
+ node jd_blueCoin.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ MARKET_COIN_TO_BEANS: ${{ secrets.MARKET_COIN_TO_BEANS }}
+ MARKET_REWARD_NOTIFY: ${{ secrets.MARKET_REWARD_NOTIFY }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_club_lottery.yml b/.github/workflows/jd_club_lottery.yml
new file mode 100644
index 00000000..ffec69bc
--- /dev/null
+++ b/.github/workflows/jd_club_lottery.yml
@@ -0,0 +1,51 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_club_lottery
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 16 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: club_lottery
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【摇京豆脚本】'
+ run: |
+ node jd_club_lottery.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
diff --git a/.github/workflows/jd_collectProduceScore.yml b/.github/workflows/jd_collectProduceScore.yml
new file mode 100644
index 00000000..5a1cef4c
--- /dev/null
+++ b/.github/workflows/jd_collectProduceScore.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_collectProduceScore
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '30 * * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: collectProduceScore
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京东全民营业领金币】'
+ run: |
+ node jd_collectProduceScore.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+ JD_818_SHAREID_NOTIFY: ${{ secrets.JD_818_SHAREID_NOTIFY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_daily_egg.yml b/.github/workflows/jd_daily_egg.yml
new file mode 100644
index 00000000..2756a751
--- /dev/null
+++ b/.github/workflows/jd_daily_egg.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_daily_egg
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '10 */3 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: jd_daily_egg
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【天天提鹅】'
+ run: |
+ node jd_daily_egg.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+ JD_818_SHAREID_NOTIFY: ${{ secrets.JD_818_SHAREID_NOTIFY }}
diff --git a/.github/workflows/jd_fruit.yml b/.github/workflows/jd_fruit.yml
new file mode 100644
index 00000000..0bc786fb
--- /dev/null
+++ b/.github/workflows/jd_fruit.yml
@@ -0,0 +1,54 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_fruit
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '20 23,4,10 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: fruit
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【东东农场】'
+ run: |
+ node jd_fruit.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ FRUITSHARECODES: ${{ secrets.FRUITSHARECODES }}
+ FRUIT_BEAN_CARD: ${{ secrets.FRUIT_BEAN_CARD }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ FRUIT_NOTIFY_CONTROL: ${{ secrets.FRUIT_NOTIFY_CONTROL }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_joy.yml b/.github/workflows/jd_joy.yml
new file mode 100644
index 00000000..48977de6
--- /dev/null
+++ b/.github/workflows/jd_joy.yml
@@ -0,0 +1,53 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_joy
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 0,1,4,10,15,16 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: joy
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【宠汪汪】'
+ run: |
+ node jd_joy.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ JOY_FEED_COUNT: ${{ secrets.JOY_FEED_COUNT }}
+ JOY_RUN_FLAG: ${{ secrets.JOY_RUN_FLAG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_joy_feedPets.yml b/.github/workflows/jd_joy_feedPets.yml
new file mode 100644
index 00000000..229d8096
--- /dev/null
+++ b/.github/workflows/jd_joy_feedPets.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_joy_feedPets
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '*/20 */1 * * *'
+ watch:
+ types: [started]
+ repository_dispatch:
+ types: joy_feedPets
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【宠汪汪喂食脚本】'
+ run: |
+ node jd_joy_feedPets.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ JOY_FEED_COUNT: ${{ secrets.JOY_FEED_COUNT }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_joy_reward.yml b/.github/workflows/jd_joy_reward.yml
new file mode 100644
index 00000000..bdc0b242
--- /dev/null
+++ b/.github/workflows/jd_joy_reward.yml
@@ -0,0 +1,53 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_joy_reward
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 0,4,8,16 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: joy_reward
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【宠汪汪积分兑换京豆】'
+ run: |
+ node jd_joy_reward.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ JD_JOY_REWARD_NOTIFY: ${{ secrets.JD_JOY_REWARD_NOTIFY }}
+ JD_JOY_REWARD_NAME: ${{ secrets.JD_JOY_REWARD_NAME }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_joy_steal.yml b/.github/workflows/jd_joy_steal.yml
new file mode 100644
index 00000000..0dad387a
--- /dev/null
+++ b/.github/workflows/jd_joy_steal.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_joy_steal
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 16,22 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: joy_steal
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【宠汪汪偷好友狗粮与积分】'
+ run: |
+ node jd_joy_steal.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ JOY_HELP_FEED: ${{ secrets.JOY_HELP_FEED }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_lotteryMachine.yml b/.github/workflows/jd_lotteryMachine.yml
new file mode 100644
index 00000000..f53baf49
--- /dev/null
+++ b/.github/workflows/jd_lotteryMachine.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_lotteryMachine
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '11 17 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: jd_lotteryMachine
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京东抽奖机】'
+ run: |
+ node jd_lotteryMachine.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+
diff --git a/.github/workflows/jd_moneyTree.yml b/.github/workflows/jd_moneyTree.yml
new file mode 100644
index 00000000..3fd782d2
--- /dev/null
+++ b/.github/workflows/jd_moneyTree.yml
@@ -0,0 +1,51 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_moneyTree
+
+on:
+
+ schedule:
+ - cron: '40 */3 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: moneyTree
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京东摇钱树】'
+ run: |
+ node jd_moneyTree.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_pet.yml b/.github/workflows/jd_pet.yml
new file mode 100644
index 00000000..2b176810
--- /dev/null
+++ b/.github/workflows/jd_pet.yml
@@ -0,0 +1,53 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_pet
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '35 23,4,10 * * *'
+ watch:
+ types: [started]
+ repository_dispatch:
+ types: pet
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【东东萌宠】'
+ run: |
+ node jd_pet.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ PETSHARECODES: ${{ secrets.PETSHARECODES }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ PET_NOTIFY_CONTROL: ${{ secrets.PET_NOTIFY_CONTROL }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_plantBean.yml b/.github/workflows/jd_plantBean.yml
new file mode 100644
index 00000000..478e742c
--- /dev/null
+++ b/.github/workflows/jd_plantBean.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_plantBean
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 23,0-14/1 * * *' #此处为UTC-0时间
+ watch:
+ types: started
+ repository_dispatch:
+ types: pantBean
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【种豆得豆】'
+ run: |
+ node jd_plantBean.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ PLANT_BEAN_SHARECODES: ${{ secrets.PLANT_BEAN_SHARECODES }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
diff --git a/.github/workflows/jd_rankingList.yml b/.github/workflows/jd_rankingList.yml
new file mode 100644
index 00000000..15b0f0cc
--- /dev/null
+++ b/.github/workflows/jd_rankingList.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_rankingList
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '11 18 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: jd_rankingList
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京东排行榜】'
+ run: |
+ node jd_rankingList.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+
diff --git a/.github/workflows/jd_redPacket.yml b/.github/workflows/jd_redPacket.yml
new file mode 100644
index 00000000..2472c8bd
--- /dev/null
+++ b/.github/workflows/jd_redPacket.yml
@@ -0,0 +1,51 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_redPacket
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 17 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: redPacket
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【全民开红包脚本】'
+ run: |
+ node jd_redPacket.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_shop.yml b/.github/workflows/jd_shop.yml
new file mode 100644
index 00000000..024e7432
--- /dev/null
+++ b/.github/workflows/jd_shop.yml
@@ -0,0 +1,51 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_shop
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 16 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: shop
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【进店领豆脚本】'
+ run: |
+ node jd_shop.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
diff --git a/.github/workflows/jd_speed.yml b/.github/workflows/jd_speed.yml
new file mode 100644
index 00000000..ab2d9cc0
--- /dev/null
+++ b/.github/workflows/jd_speed.yml
@@ -0,0 +1,51 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_speed
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '33 */3 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: speed
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【天天加速】'
+ run: |
+ node jd_speed.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_superMarket.yml b/.github/workflows/jd_superMarket.yml
new file mode 100644
index 00000000..f89194c7
--- /dev/null
+++ b/.github/workflows/jd_superMarket.yml
@@ -0,0 +1,55 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_superMarket
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '15 * * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: superMarket
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京小超】'
+ run: |
+ node jd_superMarket.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
+ jdSuperMarketUpgrade: ${{ secrets.SUPERMARKET_UPGRADE }}
+ jdBusinessCircleJump: ${{ secrets.BUSINESS_CIRCLE_JUMP }}
+ SUPERMARKET_SHARECODES: ${{ secrets.SUPERMARKET_SHARECODES }}
+ jdSuperMarketLottery: ${{ secrets.SUPERMARKET_LOTTERY }}
\ No newline at end of file
diff --git a/.github/workflows/jd_unsubscribe.yml b/.github/workflows/jd_unsubscribe.yml
new file mode 100644
index 00000000..0eb5cb7a
--- /dev/null
+++ b/.github/workflows/jd_unsubscribe.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_unsubscribe
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '45 15 * * *'
+ watch:
+ types: started
+ repository_dispatch:
+ types: unsubscribe
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【京东取关商品】'
+ run: |
+ node jd_unsubscribe.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ UN_SUBSCRIBES: ${{ secrets.UN_SUBSCRIBES }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
diff --git a/.github/workflows/jd_xtg.yml b/.github/workflows/jd_xtg.yml
new file mode 100644
index 00000000..496532ff
--- /dev/null
+++ b/.github/workflows/jd_xtg.yml
@@ -0,0 +1,51 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: jd_xtg
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '0 16 * * *' #北京时间0点运行,action会有延迟
+ watch:
+ types: started
+ repository_dispatch:
+ types: xtg
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ if: github.event.repository.owner.id == github.event.sender.id
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+ with:
+ repository: lxk0301/scripts
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v1
+ with:
+ node-version: ${{ matrix.node-version }}
+ - name: Cache node_modules
+ uses: actions/cache@v2 # 使用 GitHub 官方的缓存 Action。
+ env:
+ cache-name: cache-node-modules
+ with:
+ path: node_modules
+ key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('package-lock.json') }} # 使用 package-lock.json 的 Hash 作为缓存的 key。也可以使用 package.json 代替
+ - name: npm install
+ run: |
+ npm install
+ - name: '运行 【星推官脚本】'
+ run: |
+ node jd_xtg.js
+ env:
+ JD_COOKIE: ${{ secrets.JD_COOKIE }}
+ JD_DEBUG: ${{ secrets.JD_DEBUG }}
+ PUSH_KEY: ${{ secrets.PUSH_KEY }}
+ BARK_PUSH: ${{ secrets.BARK_PUSH }}
+ BARK_SOUND: ${{ secrets.BARK_SOUND }}
+ TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
+ TG_USER_ID: ${{ secrets.TG_USER_ID }}
+ DD_BOT_TOKEN: ${{ secrets.DD_BOT_TOKEN }}
+ DD_BOT_SECRET: ${{ secrets.DD_BOT_SECRET }}
+ IGOT_PUSH_KEY: ${{ secrets.IGOT_PUSH_KEY }}
diff --git a/.github/workflows/repo_sync.yml b/.github/workflows/repo_sync.yml
new file mode 100644
index 00000000..09d31558
--- /dev/null
+++ b/.github/workflows/repo_sync.yml
@@ -0,0 +1,41 @@
+# File: .github/workflows/repo-sync.yml
+name: sync-lxk0301-scripts
+on:
+ schedule:
+ - cron: '1 0,15 * * *'
+ workflow_dispatch:
+ watch:
+ types: started
+ push:
+ branches: [ master ]
+ repository_dispatch:
+ types: sync-lxk0301-scripts
+jobs:
+ repo-sync:
+ env:
+ PAT: ${{ secrets.PAT }} #此处PAT需要申请,教程详见:https://www.jianshu.com/p/bb82b3ad1d11
+ dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ with:
+ persist-credentials: false
+
+ - name: sync lxk0301-scripts
+ uses: repo-sync/github-sync@v2
+ if: env.PAT
+ with:
+ source_repo: "https://github.com/lxk0301/scripts.git"
+ source_branch: "master"
+ destination_branch: "master"
+ github_token: ${{ secrets.PAT }}
+ # 我自己同步到gitee使用,其他人可忽略
+ - name: sync github -> gitee
+ uses: Yikun/hub-mirror-action@master
+ if: env.dst_key
+ with:
+ src: github/lxk0301
+ dst: gitee/lxk0301
+ static_list: "scripts"
+ dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
+ dst_token: ${{ secrets.GITEE_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..a8ffa8bd
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,6 @@
+/node_modules/
+/.idea
+/index.js
+/.history
+/box.dat
+/CookieSet.json
diff --git a/Env.min.js b/Env.min.js
new file mode 100644
index 00000000..e478632d
--- /dev/null
+++ b/Env.min.js
@@ -0,0 +1 @@
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,o)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),h=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t))}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",o){const r=t=>{if(!t||!this.isLoon()&&this.isSurge())return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,r(o)):this.isQuanX()&&$notify(e,s,i,r(o)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/JD_extra_cookie.js b/JD_extra_cookie.js
new file mode 100644
index 00000000..2b33d046
--- /dev/null
+++ b/JD_extra_cookie.js
@@ -0,0 +1,124 @@
+/*
+感谢github@dompling的PR
+
+Author: 2Ya
+
+Github: https://github.com/domping
+
+===================
+特别说明:
+1.获取多个京东cookie文件,不和野比大佬的文件冲突。暂不支持野比大佬脚本签到。
+2.若是要使用京东多合一签到,请使用修改版地址:https://raw.githubusercontent.com/dompling/Script/master/jd/JD_extra.js
+===================
+===================
+使用方式:复制 https://home.m.jd.com/myJd/newhome.action 到浏览器打开 ,在个人中心自动获取 cookie,
+若弹出成功则正常使用。否则继续再此页面继续刷新一下试试
+===================
+
+===================
+[MITM]
+hostname = wq.jd.com
+
+【Surge脚本配置】:
+===================
+[Script]
+获取京东Cookie = type=http-request,pattern=^https:\/\/wq\.jd\.com\/user_new\/info\/GetJDUserInfoUnion,requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/JD_extra_cookie.js,script-update-interval=0
+
+===================
+【Loon脚本配置】:
+===================
+[Script]
+http-request https:\/\/wq\.jd\.com\/user_new\/info\/GetJDUserInfoUnion tag=获取京东Cookie, script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/JD_extra_cookie.js
+
+
+===================
+【 QX 脚本配置 】 :
+===================
+
+[rewrite_local]
+https:\/\/wq\.jd\.com\/user_new\/info\/GetJDUserInfoUnion url script-request-header https://raw.githubusercontent.com/lxk0301/scripts/master/JD_extra_cookie.js
+
+ */
+
+const APIKey = "CookiesJD";
+$ = new API(APIKey, true);
+const CacheKey = `#${APIKey}`;
+if ($request) GetCookie();
+
+function getCache() {
+ var cache = $.read(CacheKey) || "[]";
+ $.log(cache);
+ return JSON.parse(cache);
+}
+
+function GetCookie() {
+ try {
+ if ($request.headers && $request.url.indexOf("GetJDUserInfoUnion") > -1) {
+ var CV = $request.headers["Cookie"] || $request.headers["cookie"];
+ if (CV.match(/(pt_key=.+?pt_pin=|pt_pin=.+?pt_key=)/)) {
+ var CookieValue = CV.match(/pt_key=.+?;/) + CV.match(/pt_pin=.+?;/);
+ var UserName = CookieValue.match(/pt_pin=(.+?);/)[1];
+ var DecodeName = decodeURIComponent(UserName);
+ var CookiesData = getCache();
+ var updateCookiesData = [...CookiesData];
+ var updateIndex;
+ var CookieName = "【账号】";
+ var updateCodkie = CookiesData.find((item, index) => {
+ var ck = item.cookie;
+ var Account = ck
+ ? ck.match(/pt_pin=.+?;/)
+ ? ck.match(/pt_pin=(.+?);/)[1]
+ : null
+ : null;
+ const verify = UserName === Account;
+ if (verify) {
+ updateIndex = index;
+ }
+ return verify;
+ });
+ var tipPrefix = "";
+ if (updateCodkie) {
+ updateCookiesData[updateIndex].cookie = CookieValue;
+ CookieName = `【账号${updateIndex + 1}】`;
+ tipPrefix = "更新京东";
+ } else {
+ updateCookiesData.push({
+ userName: DecodeName,
+ cookie: CookieValue,
+ });
+ CookieName = "【账号" + updateCookiesData.length + "】";
+ tipPrefix = "首次写入京东";
+ }
+ const cacheValue = JSON.stringify(updateCookiesData, null, "\t");
+ $.write(cacheValue, CacheKey);
+ $.notify(
+ "用户名: " + DecodeName,
+ "",
+ tipPrefix + CookieName + "Cookie成功 🎉"
+ );
+ } else {
+ $.notify("写入京东Cookie失败", "", "请查看脚本内说明, 登录网页获取 ‼️");
+ }
+ $.done();
+ return;
+ } else {
+ $.notify("写入京东Cookie失败", "", "请检查匹配URL或配置内脚本类型 ‼️");
+ }
+ } catch (eor) {
+ $.write("", CacheKey);
+ $.notify("写入京东Cookie失败", "", "已尝试清空历史Cookie, 请重试 ⚠️");
+ console.log(
+ `\n写入京东Cookie出现错误 ‼️\n${JSON.stringify(
+ eor
+ )}\n\n${eor}\n\n${JSON.stringify($request.headers)}\n`
+ );
+ }
+ $.done();
+}
+
+// prettier-ignore
+function ENV(){const isQX=typeof $task!=="undefined";const isLoon=typeof $loon!=="undefined";const isSurge=typeof $httpClient!=="undefined"&&!isLoon;const isJSBox=typeof require=="function"&&typeof $jsbox!="undefined";const isNode=typeof require=="function"&&!isJSBox;const isRequest=typeof $request!=="undefined";const isScriptable=typeof importModule!=="undefined";return{isQX,isLoon,isSurge,isNode,isJSBox,isRequest,isScriptable}}
+// prettier-ignore
+function HTTP(baseURL,defaultOptions={}){const{isQX,isLoon,isSurge,isScriptable,isNode}=ENV();const methods=["GET","POST","PUT","DELETE","HEAD","OPTIONS","PATCH"];function send(method,options){options=typeof options==="string"?{url:options}:options;options.url=baseURL?baseURL+options.url:options.url;options={...defaultOptions,...options};const timeout=options.timeout;const events={...{onRequest:()=>{},onResponse:(resp)=>resp,onTimeout:()=>{},},...options.events,};events.onRequest(method,options);let worker;if(isQX){worker=$task.fetch({method,...options})}else if(isLoon||isSurge||isNode){worker=new Promise((resolve,reject)=>{const request=isNode?require("request"):$httpClient;request[method.toLowerCase()](options,(err,response,body)=>{if(err)reject(err);else resolve({statusCode:response.status||response.statusCode,headers:response.headers,body,})})})}else if(isScriptable){const request=new Request(options.url);request.method=method;request.headers=options.headers;request.body=options.body;worker=new Promise((resolve,reject)=>{request.loadString().then((body)=>{resolve({statusCode:request.response.statusCode,headers:request.response.headers,body,})}).catch((err)=>reject(err))})}let timeoutid;const timer=timeout?new Promise((_,reject)=>{timeoutid=setTimeout(()=>{events.onTimeout();return reject(`${method}URL:${options.url}exceeds the timeout ${timeout}ms`)},timeout)}):null;return(timer?Promise.race([timer,worker]).then((res)=>{clearTimeout(timeoutid);return res}):worker).then((resp)=>events.onResponse(resp))}const http={};methods.forEach((method)=>(http[method.toLowerCase()]=(options)=>send(method,options)));return http}
+// prettier-ignore
+function API(name="untitled",debug=false){const{isQX,isLoon,isSurge,isNode,isJSBox,isScriptable}=ENV();return new(class{constructor(name,debug){this.name=name;this.debug=debug;this.http=HTTP();this.env=ENV();this.node=(()=>{if(isNode){const fs=require("fs");return{fs}}else{return null}})();this.initCache();const delay=(t,v)=>new Promise(function(resolve){setTimeout(resolve.bind(null,v),t)});Promise.prototype.delay=function(t){return this.then(function(v){return delay(t,v)})}}initCache(){if(isQX)this.cache=JSON.parse($prefs.valueForKey(this.name)||"{}");if(isLoon||isSurge)this.cache=JSON.parse($persistentStore.read(this.name)||"{}");if(isNode){let fpath="root.json";if(!this.node.fs.existsSync(fpath)){this.node.fs.writeFileSync(fpath,JSON.stringify({}),{flag:"wx"},(err)=>console.log(err))}this.root={};fpath=`${this.name}.json`;if(!this.node.fs.existsSync(fpath)){this.node.fs.writeFileSync(fpath,JSON.stringify({}),{flag:"wx"},(err)=>console.log(err));this.cache={}}else{this.cache=JSON.parse(this.node.fs.readFileSync(`${this.name}.json`))}}}persistCache(){const data=JSON.stringify(this.cache);if(isQX)$prefs.setValueForKey(data,this.name);if(isLoon||isSurge)$persistentStore.write(data,this.name);if(isNode){this.node.fs.writeFileSync(`${this.name}.json`,data,{flag:"w"},(err)=>console.log(err));this.node.fs.writeFileSync("root.json",JSON.stringify(this.root),{flag:"w"},(err)=>console.log(err))}}write(data,key){this.log(`SET ${key}`);if(key.indexOf("#")!==-1){key=key.substr(1);if(isSurge||isLoon){return $persistentStore.write(data,key)}if(isQX){return $prefs.setValueForKey(data,key)}if(isNode){this.root[key]=data}}else{this.cache[key]=data}this.persistCache()}read(key){this.log(`READ ${key}`);if(key.indexOf("#")!==-1){key=key.substr(1);if(isSurge||isLoon){return $persistentStore.read(key)}if(isQX){return $prefs.valueForKey(key)}if(isNode){return this.root[key]}}else{return this.cache[key]}}delete(key){this.log(`DELETE ${key}`);if(key.indexOf("#")!==-1){key=key.substr(1);if(isSurge||isLoon){$persistentStore.write(null,key)}if(isQX){$prefs.removeValueForKey(key)}if(isNode){delete this.root[key]}}else{delete this.cache[key]}this.persistCache()}notify(title,subtitle="",content="",options={}){const openURL=options["open-url"];const mediaURL=options["media-url"];if(isQX)$notify(title,subtitle,content,options);if(isSurge){$notification.post(title,subtitle,content+`${mediaURL?"\n多媒体:"+mediaURL:""}`,{url:openURL})}if(isLoon){let opts={};if(openURL)opts["openUrl"]=openURL;if(mediaURL)opts["mediaUrl"]=mediaURL;if(JSON.stringify(opts)=="{}"){$notification.post(title,subtitle,content)}else{$notification.post(title,subtitle,content,opts)}}if(isNode||isScriptable){const content_=content+(openURL?`\n点击跳转:${openURL}`:"")+(mediaURL?`\n多媒体:${mediaURL}`:"");if(isJSBox){const push=require("push");push.schedule({title:title,body:(subtitle?subtitle+"\n":"")+content_,})}else{console.log(`${title}\n${subtitle}\n${content_}\n\n`)}}}log(msg){if(this.debug)console.log(msg)}info(msg){console.log(msg)}error(msg){console.log("ERROR: "+msg)}wait(millisec){return new Promise((resolve)=>setTimeout(resolve,millisec))}done(value={}){if(isQX||isLoon||isSurge){$done(value)}else if(isNode&&!isJSBox){if(typeof $context!=="undefined"){$context.headers=value.headers;$context.statusCode=value.statusCode;$context.body=value.body}}}})(name,debug)}
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 00000000..f288702d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/Loon/lxk0301_LoonTask.conf b/Loon/lxk0301_LoonTask.conf
new file mode 100644
index 00000000..9658b359
--- /dev/null
+++ b/Loon/lxk0301_LoonTask.conf
@@ -0,0 +1,83 @@
+# Loon软件Task配置 By lxk0301
+# GitHub主页(https://github.com/lxk0301/scripts)
+# TG讨论组 (https://t.me/JD_fruit_pet)
+# TG通知频道 (https://t.me/jdfruit)
+# Loon的Task脚本订阅链接: https://raw.githubusercontent.com/lxk0301/scripts/master/Loon/lxk0301_LoonTask.conf
+# 使用方法:打开APP,顶部的配置 -> 脚本 -> 订阅脚本- > 点击右上角+号 -> 添加url链接 (https://raw.githubusercontent.com/lxk0301/scripts/master/Loon/lxk0301_LoonTask.conf)
+
+hostname = api.m.jd.com, draw.jdfcloud.com, jdjoy.jd.com, account.huami.com
+# 东东农场
+cron "5 6-18/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_fruit.js,tag=东东农场
+
+# 东东萌宠
+cron "10 7-19/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_pet.js,tag=东东萌宠
+
+# 京东种豆得豆
+cron "1 7-21/2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_plantBean.js,tag=京东种豆得豆
+
+# 宠汪汪(主要是日常任务,不过里面也有喂食和领取三餐狗粮)
+cron "15 */2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy.js,tag=宠汪汪
+
+# 宠汪汪喂食
+cron "12 */1 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_feedPets.js,tag=宠汪汪喂食
+
+# 宠汪汪偷好友积分与狗粮
+cron "0 0,6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_steal.js,tag=宠汪汪偷好友积分与狗粮
+
+# 宠汪汪积分兑换奖品
+cron "1 0,8,12,16 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_reward.js,tag=宠汪汪积分兑换奖品
+
+# 京东天天加速
+cron "8 */3 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_speed.js,tag=京东天天加速
+
+# 京东摇钱树
+cron "3 */3 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_moneyTree.js,tag=京东摇钱树
+
+# 京小超
+cron "11 1-23/2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_superMarket.js,tag=京小超
+
+# 京小超兑换奖品
+cron "0 0 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js,tag=京小超兑换奖品
+
+# 取关京东店铺商品
+cron "55 23 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_unsubscribe.js,tag=取关京东店铺商品
+
+# 进店领豆
+cron "10 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_shop.js,tag=进店领豆
+
+#摇京豆
+cron "5 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_club_lottery.js,tag=摇京豆
+
+# 京东手机狂欢城
+cron "1 0-18/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_818.js, tag=京东手机狂欢城
+
+# 京东星推官
+cron "0 0 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_xtg.js, tag=京东星推官
+
+#京东全民开红包
+cron "1 1 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_redPacket.js, tag=京东全民开红包
+
+#京豆变动通知
+cron "2 9 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js, tag=京豆变动通知
+
+#京东全民营业领金币
+cron "20 * * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_collectProduceScore.js, tag=京东全民营业领金币
+
+#宠汪汪邀请助力与赛跑助力
+cron "15 10 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_run.js, tag=宠汪汪邀请助力与赛跑助力
+
+#宠汪汪助力更新Token
+http-response ^https:\/\/draw\.jdfcloud\.com\/\/api\/user\/addUser\?code=\w+& script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_run.js, requires-body=true, timeout=10, tag=宠汪汪助力更新Token
+
+#宠汪汪助力获取Token
+http-request ^https:\/\/draw\.jdfcloud\.com\/\/api\/user\/user\/detail\?openId=\w+& script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_run.js, requires-body=true, timeout=10, tag=宠汪汪助力获取Token
+
+# 宠汪汪强制为别人助力
+http-request ^https:\/\/draw\.jdfcloud\.com\/\/pet\/enterRoom\/h5\?reqSource=weapp&invitePin=.*+(&inviteSource=task_invite&shareSource=\w+&inviteTimeStamp=\d+&openId=\w+)?|^https:\/\/draw\.jdfcloud\.com\/\/pet\/helpFriend\?friendPin script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_help.js, requires-body=true, timeout=10, tag=宠汪汪强制为别人助力
+
+#聚宝盆投狗粮辅助(github@Zero-S1搬的)
+http-response ^https:\/\/jdjoy\.jd\.com\/pet\/getPetTreasureBox|^https:\/\/draw\.jdfcloud\.com\/\/pet\/getPetTreasureBox script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_petTreasureBox.js, requires-body=true, timeout=10, tag=聚宝盆投狗粮辅助
+
+#小米运动
+cron "25 17 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js, tag=小米运动
+http-response ^https:\/\/account\.huami\.com\/v2\/client\/login script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js, requires-body=true, timeout=10, tag=小米运动获取Token
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..a6f81e19
--- /dev/null
+++ b/README.md
@@ -0,0 +1,123 @@
+## 特别声明:
+
+* 本仓库发布的Script项目中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断.
+
+* 本项目内所有资源文件,禁止任何公众号、自媒体进行任何形式的转载、发布。
+
+* lxk0301对任何脚本问题概不负责,包括但不限于由任何脚本错误导致的任何损失或损害.
+
+* 间接使用脚本的任何用户,包括但不限于建立VPS或在某些行为违反国家/地区法律或相关法规的情况下进行传播, lxk0301 对于由此引起的任何隐私泄漏或其他后果概不负责.
+
+* 请勿将Script项目的任何内容用于商业或非法目的,否则后果自负.
+
+* 如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关脚本.
+
+* 任何以任何方式查看此项目的人或直接或间接使用该Script项目的任何脚本的使用者都应仔细阅读此声明。lxk0301 保留随时更改或补充此免责声明的权利。一旦使用并复制了任何相关脚本或Script项目的规则,则视为您已接受此免责声明.
+
+ **您必须在下载后的24小时内从计算机或手机中完全删除以上内容.**
+> ***您使用或者复制了本仓库且本人制作的任何脚本,则视为`已接受`此声明,请仔细阅读***
+
+## Script脚本列表
+
+1. 京东水果([jd_fruit.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_fruit.js))
+2. 东东萌宠([jd_pet.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_pet.js))
+4. 种豆得豆([jd_plantBean.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_plantBean.js))
+5. 天天加速([jd_speed.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_speed.js))
+6. 摇钱树([jd_moneyTree.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_moneyTree.js))
+6. 宠汪汪([jd_joy.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy.js))
+7. 宠汪汪偷好友狗粮与积分([jd_joy_steal.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_steal.js))
+8. 宠汪汪单独喂食([jd_joy_feedPets.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_feedPets.js))
+9. 宠汪汪兑换奖品([jd_joy_reward.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_reward.js))
+10. 宠汪汪强制为好友助力(刷好友)([jd_joy_help.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_help.js))
+11. 宠汪汪赛跑助力([jd_joy_run.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_run.js))
+12. 宠汪汪聚宝盆辅助脚本([jd_petTreasureBox.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_petTreasureBox.js))
+13. 取关京东店铺和商品([jd_unsubscribe.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_unsubscribe.js))
+14. 京小超([jd_superMarket.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_superMarket.js))
+15. 京小超兑换奖品([jd_blueCoin.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js))
+16. 进店领豆([jd_shop.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_shop.js))
+17. 摇京豆([jd_club_lottery.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_club_lottery.js))
+18. 全名开红包([jd_redPacket.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_redPacket.js))
+19. 京东多合一签到([jd_bean_sign.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_sign.js)) 【可N个京东账号,Node.js专用,核心脚本是JD_DailyBonus.js, IOS软件用户请使用NobyDa的 [JD_DailyBonus.js](https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js) 】
+20. 京豆变动通知([jd_bean_change.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js))
+21. 以及其他一部分在特定时间可用的薅京豆脚本,如 [手机狂欢城](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_818.js) 、[星推官](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_xtg.js) 等。
+
+**脚本兼容: [QuantumultX](https://apps.apple.com/us/app/quantumult-x/id1443988620), [Surge](https://apps.apple.com/us/app/surge-4/id1442620678), [Loon](https://apps.apple.com/us/app/loon/id1373567447), 小火箭, JSBox, Node.js**
+
+**TODO**
+
+- [x] 完善京小超脚本[jd_superMarket.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_superMarket.js)
+- [x] 京小超商圈助力功能[jd_superMarket.js](https://raw.githubusercontent.com/lxk0301/scripts/master/jd_superMarket.js)
+
+## 食用方法
+
+### 方法一:本地安装Node.js,下载本库脚本
+
+ - 教程请见:[EvineDeng/jd-base](https://github.com/EvineDeng/jd-base)
+
+### 方法二:云服务器、腾讯云函数等等
+
+ - 需自行有云服务器,云函数等
+
+ - 腾云云函数使用 [教程说明](iCloud.md)
+
+### 方法三:GitHub Action(推荐)
+
+ - 使用教程看 [GitHub Action教程](githubAction.md)
+ - GitHub Action 定时运行会有延迟(大概15分钟左右),故一些需要抢购(对时间要求比较严格)脚本不适合使用(例如`jd_joy_reward.js`, `jd_blueCoin.js`, `jd_xtg.js`等脚本)
+ - GitHub Action需要用到的[Secrets集合](https://github.com/lxk0301/scripts/blob/master/githubAction.md#%E4%B8%8B%E6%96%B9%E6%8F%90%E4%BE%9B%E4%BD%BF%E7%94%A8%E5%88%B0%E7%9A%84-secrets%E5%85%A8%E9%9B%86%E5%90%88)
+
+### 方法四:Docker(NAS或VPS用户)
+
+ - 可以精确控制任务运行时间,有三种办法:[docker办法一](https://github.com/lxk0301/scripts/tree/master/docker)、[docker办法二(和本地安装Node.js有点类似)](https://github.com/EvineDeng/jd-base)、[docker办法三](https://github.com/chinnkarahoi/jd-scripts-docker)
+ - [环境变量](https://github.com/lxk0301/scripts/blob/master/githubAction.md#%E4%B8%8B%E6%96%B9%E6%8F%90%E4%BE%9B%E4%BD%BF%E7%94%A8%E5%88%B0%E7%9A%84-secrets%E5%85%A8%E9%9B%86%E5%90%88)
+
+#### 注:以上四种运行机制都是Node.js,故您需仔细阅读下面几点
+
+
+ - 如果使用方法一与方法二,需自行提供京东cookie填写到 [jdCookie.js](https://github.com/lxk0301/scripts/blob/master/jdCookie.js) 里面
+
+ - 方法三京东cookie不要!不要!不要!填写到 [jdCookie.js](https://github.com/lxk0301/scripts/blob/master/jdCookie.js) 里面
+
+ - 获取京东cookie教程可参考 [浏览器获取京东cookie教程](https://github.com/lxk0301/scripts/blob/master/backUp/GetJdCookie.md) , [插件获取京东cookie教程](https://github.com/lxk0301/scripts/blob/master/backUp/GetJdCookie2.md)
+
+ - 方法四Docker安装Cookie请见各自的说明。
+
+### 方法五:iOS系统的代理软件(QuantumultX, Surge, Loon, 小火箭)
+
+#### 以下内容只针对iOS用户
+
+#### ios使用多个京东账号,需要使用BoxJs保存多会话进行切换
+
+##### BoxJs简单说明可看作者[BoxJs仓库地址](https://github.com/chavyleung/scripts/)
+
+使用box可以实现远程订阅助力好友(需订阅此 [链接](https://raw.githubusercontent.com/lxk0301/scripts/master/lxk0301.boxjs.json))
+
+- [BoxJs使用教程](https://chavyleung.gitbook.io/boxjs/)
+
+- [BoxJs教程视频](https://youtu.be/eIpBrRxiy0w)
+
+
+【用box订阅的好处】
+
+ 1、脚本也可以远程挂载。京东活动助力功能的分享码只需在box里面填写。以后只需远程更新就行。
+
+ 2、所有脚本的cookie都可以备份,方便你迁移到其他支持box的软件。
+
+ 3、box可以支持多账号
+
+### 赞赏码(开发维护不易,请赏杯茶水费)
+
+
+### 特别感谢(排名不分先后):
+* [@NobyDa](https://github.com/NobyDa)
+
+* [@chavyleung](https://github.com/chavyleung)
+
+* [@liuxiaoyucc](https://github.com/liuxiaoyucc)
+
+* [@Zero-S1](https://github.com/Zero-S1)
+
+* [@uniqueque](https://github.com/uniqueque)
+
+
+* [@nzw9314](https://github.com/nzw9314)
diff --git a/Surge/lxk0301_Task.sgmodule.sgmodule b/Surge/lxk0301_Task.sgmodule.sgmodule
new file mode 100644
index 00000000..a0eb2a41
--- /dev/null
+++ b/Surge/lxk0301_Task.sgmodule.sgmodule
@@ -0,0 +1,33 @@
+#!name=lxk0301 iOS Tasks Module
+#!desc=iOS Tasks 模块配置
+#!system=ios
+
+# Task模块配置 By lxk0301
+# GitHub主页(https://github.com/lxk0301/scripts)
+# TG讨论组 (https://t.me/JD_fruit_pet)
+# TG通知频道 (https://t.me/jdfruit)
+# Surge的Task脚本模块地址: https://raw.githubusercontent.com/lxk0301/scripts/master/Surge/lxk0301_Task.sgmodule.sgmodule
+
+[Script]
+
+cron "5 6-18/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_fruit.js,timeout=530, wake-system=1, tag=东东农场
+cron "20 7-19/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_pet.js,timeout=530, wake-system=1, tag=东东萌宠
+cron "10 7-21/2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_plantBean.js,timeout=630, wake-system=1, tag=京东种豆得豆
+cron "15 */2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy.js,timeout=330, wake-system=1, tag=宠汪汪
+cron "12 */1 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_feedPets.js,timeout=30, wake-system=1, tag=宠汪汪喂食
+cron "0 0,6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_steal.js,timeout=420, wake-system=1, tag=宠汪汪偷好友积分与狗粮
+cron "1 0,8,12,16 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_reward.js,timeout=30, wake-system=1, tag=宠汪汪积分兑换奖品
+cron "8 */3 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_speed.js,timeout=130, wake-system=1, tag=京东天天加速
+cron "15 */5 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_moneyTree.js,timeout=130, wake-system=1, tag=京东摇钱树
+cron "5 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_club_lottery.js, timeout=50, wake-system=1, tag=摇京豆
+cron "11 1-23/5 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_superMarket.js,timeout=530, wake-system=1, tag=京小超
+cron "0 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js,timeout=30, wake-system=1, tag=京小超领蓝币(兑换京豆)
+cron "55 23 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_unsubscribe.js,timeout=250, wake-system=1, tag=取关京东店铺商品
+cron "10 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_shop.js,timeout=30, wake-system=1, tag=进店领豆
+cron "1 0-18/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_818.js, timeout=150, wake-system=1, tag=京东手机狂欢城
+cron "15 10 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_run.js, timeout=30, wake-system=1, tag=宠汪汪邀请助力与赛跑助力
+cron "1 1 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_redPacket.js, wake-system=1, tag=京东全民开红包
+cron "0 0 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_xtg.js, timeout=550, wake-system=1, tag=京东星推官
+cron "2 9 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js, timeout=650, wake-system=1, tag=京豆变动通知
+cron "20 * * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_collectProduceScore.js, wake-system=1, tag=京东全民营业领金币
+
diff --git a/backUp/AlipayManor.js b/backUp/AlipayManor.js
new file mode 100644
index 00000000..70efa1b7
--- /dev/null
+++ b/backUp/AlipayManor.js
@@ -0,0 +1,14 @@
+// qx 及 loon 可用。
+// 半自动提醒支付宝蚂蚁庄园喂食。
+// 15 */4 * * * AlipayManor.js
+// 自用 Modified from zZPiglet
+
+const $ = new Env('蚂蚁庄园');
+const manor = "alipays://platformapi/startapp?appId=66666674";
+
+$.msg("支付宝", "蚂蚁庄园喂食啦", "alipays://platformapi/startapp?appId=66666674", manor);
+
+$.done()
+
+// prettier-ignore
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
\ No newline at end of file
diff --git a/backUp/GetJdCookie.md b/backUp/GetJdCookie.md
new file mode 100644
index 00000000..0dc377aa
--- /dev/null
+++ b/backUp/GetJdCookie.md
@@ -0,0 +1,32 @@
+## 浏览器获取京东cookie教程
+
+ **以下浏览器都行**
+
+ - Chrome浏览器
+ - 新版Edge浏览器
+ - 国产360,QQ浏览器切换到极速模式
+
+### 操作步骤
+
+1. 电脑浏览器打开京东网址 [https://m.jd.com/](https://m.jd.com/)
+2. 按键盘F12键打开开发者工具,然后点下图中的图标
+ ![切换到手机模式](../icon/jd1.jpg)
+3. 此时是未登录状态(使用手机短信验证码登录),如已登录请忽略此步骤
+ - 使用手机短信验证码登录(此方式cookie有效时长大概31天,其他登录方式比较短)
+4. 登录后,选择Network,有很多链接的话点箭头这里清空下
+ ![清空](../icon/jd2.jpg)
+5. 然后再点我的,链接就变少了
+ ![再次点击我的](../icon/jd3.jpg)
+6. 点第一个链接(log.gif)进去,找到cookie,复制出来,新建一个TXT文本临时保存一下,下面需要用到
+ ![寻找log.gi](../icon/jd4.jpg)
+7. 第六步复制出来的cookie比较长,我们只需要`pt_pin=xxxx;`和 `pt_key=xxxx;`部分的内容即可(注:英文引号`;`是必要的)。可以用下面的脚本,在Chrome浏览器按F12,console里面输入下面脚本按enter回车键
+ ```
+ var CV = '单引号里面放第六步拿到的cookie';
+ var CookieValue = CV.match(/pt_pin=.+?;/) + CV.match(/pt_key=.+?;/);
+ copy(CookieValue);
+ ```
+8. 这样子整理出关键的的cookie已经在你的剪贴板上, 可直接粘贴
+
+9. 如果需获取第二个京东账号的cookie,不要在刚才的浏览器上面退出登录账号一(否则刚才获取的cookie会失效),需另外换一个浏览器(Chrome浏览器 `ctr+shift+n` 打开无痕模式也行),然后继续按上面步骤操作即可
+
+
diff --git a/backUp/GetJdCookie2.md b/backUp/GetJdCookie2.md
new file mode 100644
index 00000000..eadf9a5b
--- /dev/null
+++ b/backUp/GetJdCookie2.md
@@ -0,0 +1,34 @@
+## 浏览器插件获取京东cookie教程
+ > 此教程内容由tg用户@wukongdada提供,特此感谢
+
+ **以下浏览器都行**
+
+ - Chrome浏览器
+ - 新版Edge浏览器(chrome内核)
+
+### 操作步骤
+
+1. 电脑浏览器打开京东网址 [https://m.jd.com/](https://m.jd.com/)
+2. Chrome类浏览器安装EditThisCookie插件
+ - Chrome插件商店搜EditThisCookie, 或者[打开此网站](https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg?utm_source=chrome-ntp-icon) 进行安装
+ - 仅使用百分浏览器,谷歌浏览器测试过,其他谷歌类浏览器请自行测试。
+ - 无法登录Chrome插件商店或者打不开网址建议使用edge chrome版。
+3. edge chrome浏览器安装Cookie Editor插件
+ - [edge插件商店](edge://extensions/)搜Cookie Editor,或[打开以下网址](https://microsoftedge.microsoft.com/addons/detail/cookie-editor/ajfboaconbpkglpfanbmlfgojgndmhmc?hl=zh-CN) 完成插件安装
+4. 以下是chrome和edge的相关设置截图,输入的网址是 ``jd.com``
+
+ ![Chrome浏览器相关设置](../icon/jd5.png)
+
+ ![Edge浏览器相关设置](../icon/jd6.png)
+
+5. 现在点击回到京东触屏版,再点击EditThisCookie/Cookie Editor,再点击搜索,输入key或pin,如下图所示的pt_key,复制pt_key的value值。此插件可以看到cookie的有效期。
+
+ ![插件显示](../icon/jd7.png)
+
+6. 按照以下格式形成自己的jd_cookie
+ - `pt_key=复制插件搜索出来的key值;pt_pin=复制插件搜索出来的pin值;` ,后面的英文引号`;`是必须要的
+ - 给一个京东cookie具体示例 `pt_key=jdDC2F833333EFDGTCE5BD4AD1A952D4F4DF84A46052;pt_pin=jd_123456;`
+
+7. 如果需获取第二个京东账号的cookie,不要在刚才的浏览器上面退出登录账号一(否则刚才获取的cookie会失效),需另外换一个浏览器(Chrome浏览器 `ctr+shift+n` 打开无痕模式也行),然后继续按上面步骤操作即可
+
+
diff --git a/backUp/box.dat b/backUp/box.dat
new file mode 100644
index 00000000..a7d5bbb8
--- /dev/null
+++ b/backUp/box.dat
@@ -0,0 +1 @@
+{"xmSportsToken":"NQVBQFJyQktGHlp6QkpbRl5LRl5qek4uXAQEBAAAAAGO7kpHjD12b7XMcMKDSBdSnFqUjo0nKgND2uVe2RU10bVRzihKr9fi1iytA--qwNLIo345eRNP9QGAi7n3r0_yx1pRNSNJo90wQTheHJ0E94wjCWzCVsyqOpdMnnJig6M_nMddl5XR-KdonsCjn-zR_W8ErxueIr4O7QH4ZXUK6Kyrj5FHU_zqW5Zqd9__ALGFOaY1c6tC4A28YNdhF9pA"}
\ No newline at end of file
diff --git a/backUp/cashSign.js b/backUp/cashSign.js
new file mode 100644
index 00000000..869d0daf
--- /dev/null
+++ b/backUp/cashSign.js
@@ -0,0 +1,197 @@
+//暂有功能:每日签到
+// nobyda大佬的京东签到里面, 已添加了此功能,如果用了京东签到脚本,此脚本可以停用了。
+const $ = new Env('天天签到领现金');
+const Key = '';//单引号内自行填写您抓取的京东Cookie
+//直接用NobyDa的jd cookie
+const cookie = Key ? Key : $.getdata('CookieJD');
+const JD_API_HOST = 'https://api.m.jd.com/client.action';
+!(async () => {
+ if (!cookie) {
+ $.msg($.name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ await cash_sign();
+ await cash_homePage();
+ // await cash_doTask(2, '1000002389')
+ await msgShow();
+ // if ($.isLogin) {
+ // if (!jdNotify || jdNotify === 'false') {
+ // $.msg($.name, subTitle, message);
+ // }
+ // }
+ // $.msg($.name, subTitle, message);
+})()
+ .catch((e) => {
+ $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
+ })
+ .finally(() => {
+ $.done();
+ })
+//每日签到
+function cash_sign() {
+ let functionId = arguments.callee.name.toString();
+ let body = {"remind":0,"inviteCode":"","type":0,"breakReward":0};
+ return new Promise((resolve) => {
+ $.post(taskUrl(functionId, body), (err, resp, data) => {
+ try {
+ data = JSON.parse(data);
+ // console.log(`data${JSON.stringify(data)}`)
+ $.data = data;
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve()
+ }
+ // if (err) {
+ // console.log("=== request error -s--");
+ // console.log("=== request error -e--");
+ // } else {
+ // try {
+ // data = JSON.parse(data);
+ // console.log(`data${JSON.stringify(data)}`)
+ // $.data = data;
+ // } catch (e) {
+ // $.logErr(e, resp);
+ // } finally {
+ // resolve()
+ // }
+ // }
+ })
+ })
+}
+//做任务
+function cash_doTask(type, taskInfo) {
+ const body = {
+ 'type': type,
+ 'taskInfo': taskInfo
+ };
+ return new Promise((resolve) => {
+ const doTaskUrl = {
+ url: JD_API_HOST + `?functionId=cash_doTask`,
+ body: `adid=3B3AD5BC-B5E6-4A08-B32A-030CD805B5DD&area=19_1601_50258_51885&body=${escape(JSON.stringify(body))}&build=167283&client=apple&clientVersion=9.0.4&d_brand=apple&d_model=iPhone11%2C8&eid=eidI42550111OTc2RjFCQzgtMTYxQy00OA%3D%3DrCYdObgFE80GYJdgxMLJ0RlHfdF1uWSVuAwDfNOV%2BH%2BArP2K4Ht7t9Cscz%2B/mkYaC70ypbQutgv8vqJr&isBackground=N&joycious=298&lang=zh_CN&networkType=wifi&networklibtype=JDNetworkBaseAF&openudid=e35caf0a69be42084e3c97eef56c3af7b0262d01&osVersion=13.5.1&partner=apple&rfs=0000&scope=01&screen=828%2A1792&sign=b2a86a0f477e65a5ea40adc4a7a296cb&st=${Date.now()}&sv=101&uts=0f31TVRjBSsqndu4/jgUPz6uymy50MQJOnkRxds9DBcksJKOMWtLozcAH/M69g0LniG6s05YlJ4C6nk%2BI1mo0gto0Kw8pej0%2BiVtbzGBGqYDTEvkT7XS8YjpNXWZmM4gEDOL2mHlGnj251JSm9QUxTwQz0qHIHeQDWSErxbtZIA45XJsDxWqIIClWOUUPgFrbDVA11WciAWXJ1lqN41m7g%3D%3D&uuid=coW0lj7vbXVin6h7ON%2BtMNFQqYBqMahr&wifiBssid=f7754c40c09909dc5fccf03e8d7e39d4`,
+ headers: {
+ // 'Cookie': cookie,
+ "Host": "api.m.jd.com",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept": "*/*",
+ "Connection": "keep-alive",
+ "Cookie": "pt_key=AAJfAv31AEBlB0UzN_9K9kXOEs2VvYg5kz8AACQyVpWZs4zInFVXVF01t-a-7ylquYGxUM5DG9F6sSddD4xs_GZV3LYKgX5I;pt_pin=%E8%A2%AB%E6%8A%98%E5%8F%A0%E7%9A%84%E8%AE%B0%E5%BF%8633;",
+ "User-Agent": "JD4iPhone/167283 (iPhone; iOS 13.5.1; Scale/2.00)",
+ "Accept-Language": "zh-Hans-CN;q=1, en-CN;q=0.9, zh-Hant-CN;q=0.8",
+ "Content-Length": "870",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.post(doTaskUrl, (err, resp, data) => {
+ try {
+ data = JSON.parse(data);
+ console.log(`做任务----data${JSON.stringify(data)}`)
+ // $.homePage = data;
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve()
+ }
+ })
+ })
+}
+function cash_homePage() {
+ const body = {};
+ return new Promise((resolve) => {
+ const homePageUrl = {
+ url: JD_API_HOST + `?functionId=cash_homePage`,
+ body: `adid=3B3AD5BC-B5E6-4A08-B32A-030CD805B5DD&area=19_1601_50258_51885&body=${escape(JSON.stringify(body))}&build=167283&client=apple&clientVersion=9.0.4&d_brand=apple&d_model=iPhone11%2C8&eid=eidI42550111OTc2RjFCQzgtMTYxQy00OA%3D%3DrCYdObgFE80GYJdgxMLJ0RlHfdF1uWSVuAwDfNOV%2BH%2BArP2K4Ht7t9Cscz%2B/mkYaC70ypbQutgv8vqJr&isBackground=N&joycious=298&lang=zh_CN&networkType=wifi&networklibtype=JDNetworkBaseAF&openudid=e35caf0a69be42084e3c97eef56c3af7b0262d01&osVersion=13.5.1&partner=apple&rfs=0000&scope=01&screen=828%2A1792&sign=216d0aa860a52ea89420293976d2ee28&st=1595926359893&sv=101&uts=0f31TVRjBSsqndu4/jgUPz6uymy50MQJcPZxWlSpDrAQ8407rzIXjarvshNNSEsnLV0tV3BB9%2B3IWXJgCfYn8yocpXrWCjeJzfA4MHUq%2BjAyQ7ZUc8ZaXvIx2JM4dUlg6P1v6IgCWZJa1u0j1YuA7IUrZzm3E1eYuNoB7UmQTgXV4%2BFyD/FzKY0DqsmdN6Fvo8yZeblZwy8sAEI//MvESQ%3D%3D&uuid=coW0lj7vbXVin6h7ON%2BtMNFQqYBqMahr&wifiBssid=f7754c40c09909dc5fccf03e8d7e39d4`,
+ headers: {
+ 'Cookie': cookie,
+ "Host": "api.m.jd.com",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept": "*/*",
+ "Connection": "keep-alive",
+ "User-Agent": "JD4iPhone/167283 (iPhone; iOS 13.5.1; Scale/2.00)",
+ "Accept-Language": "zh-Hans-CN;q=1, en-CN;q=0.9, zh-Hant-CN;q=0.8",
+ "Content-Length": "870",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.post(homePageUrl, async (err, resp, data) => {
+ try {
+ data = JSON.parse(data);
+ // console.log(`cash_homePage----data${JSON.stringify(data)}`)
+ $.homePage = data;
+ // var canDoTaskList = [];
+ // if (data.code === 0) {
+ // if (data.data.result.taskInfos && data.data.result.taskInfos.length > 0) {
+ // for (let item of data.data.result.taskInfos) {
+ // if ((item.type === 2 || item.type === 3 || item.type === 4 || item.type === 17) && item.finishFlag === 2) {
+ // canDoTaskList.push(item);
+ // console.log('type', item.type)
+ // console.log('type', item.desc)
+ // let aa = await cash_doTask(item.type, item.desc);
+ // if (aa.code === 0) {
+ // console.log('重新请求任务列表')
+ // await cash_homePage();
+ // }
+ // }
+ // }
+ // }
+ // }
+ // canDoTaskList
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve()
+ }
+ })
+ })
+}
+
+function msgShow() {
+ if ($.data.data.bizCode === 0 && $.data.data.success === 'True' ) {
+ $.msg($.name, `今日签到${$.data.data.bizMsg}`, `【签到获得现金】${$.data.data.result.signCash}元\n【现有红包】${$.homePage.data.result.totalMoney},${$.homePage.data.result.cashOutStatusTip}\\n`);
+
+ } else {
+ $.msg($.name, '今日已签到,请明日再来哦', `【现有红包】${$.homePage.data.result.totalMoney}元,${$.homePage.data.result.cashOutStatusTip}\n`);
+ }
+}
+// function request(function_id, body = {}) {
+// return new Promise((resolve) => {
+// $.post(taskurl(function_id, body), (err, resp, data) => {
+// if (err) {
+// console.log("=== request error -s--");
+// console.log("=== request error -e--");
+// } else {
+// try {
+// data = JSON.parse(data);
+// console.log(`data${JSON.stringify(data)}`)
+// $.data = data;
+// } catch (e) {
+// console.log(e);
+// } finally {
+// resolve()
+// }
+// }
+// })
+// })
+// }
+function taskUrl(function_id, body = {}) {
+ // console.log(`${JD_API_HOST}?functionId=${function_id}&body=${escape(JSON.stringify(body))}&appid=ld&client=apple&clientVersion=&networkType=&osVersion=&uuid=`)
+ return {
+ // url: `${JD_API_HOST}?functionId=${function_id}&body=${escape(JSON.stringify(body))}&appid=ld&client=apple&clientVersion=&networkType=&osVersion=&uuid=`,
+ url: JD_API_HOST + `?functionId=${function_id}`,
+ // body: `adid=3B3AD5BC-B5E6-4A08-B32A-030CD805B5DD&area=19_1601_50258_51885&body=%7B%22remind%22%3A0%2C%22inviteCode%22%3A%22%22%2C%22type%22%3A0%2C%22breakReward%22%3A0%7D&build=167283&client=apple&clientVersion=9.0.4&d_brand=apple&d_model=iPhone11%2C8&eid=eidI42550111OTc2RjFCQzgtMTYxQy00OA%3D%3DrCYdObgFE80GYJdgxMLJ0RlHfdF1uWSVuAwDfNOV%2BH%2BArP2K4Ht7t9Cscz%2B/mkYaC70ypbQutgv8vqJr&isBackground=N&joycious=298&lang=zh_CN&networkType=wifi&networklibtype=JDNetworkBaseAF&openudid=e35caf0a69be42084e3c97eef56c3af7b0262d01&osVersion=13.5.1&partner=apple&rfs=0000&scope=01&screen=828%2A1792&sign=59c1af6b257421672f1c8f6ab878084d&st=1595926377439&sv=102&uts=0f31TVRjBSsqndu4/jgUPz6uymy50MQJcPZxWlSpDrAQ8407rzIXjarvshNNSEsnLV0tV3BB9%2B3IWXJgCfYn8yocpXrWCjeJzfA4MHUq%2BjAyQ7ZUc8ZaXvIx2JM4dUlg6P1v6IgCWZJa1u0j1YuA7IUrZzm3E1eYuNoB7UmQTgXV4%2BFyD/FzKY0DqsmdN6Fvo8yZeblZwy8sAEI//MvESQ%3D%3D&uuid=coW0lj7vbXVin6h7ON%2BtMNFQqYBqMahr&wifiBssid=f7754c40c09909dc5fccf03e8d7e39d4`,
+ body: `adid=3B3AD5BC-B5E6-4A08-B32A-030CD805B5DD&area=19_1601_50258_51885&body=${escape(JSON.stringify(body))}&build=167283&client=apple&clientVersion=9.0.4&d_brand=apple&d_model=iPhone11%2C8&eid=eidI42550111OTc2RjFCQzgtMTYxQy00OA%3D%3DrCYdObgFE80GYJdgxMLJ0RlHfdF1uWSVuAwDfNOV%2BH%2BArP2K4Ht7t9Cscz%2B/mkYaC70ypbQutgv8vqJr&isBackground=N&joycious=298&lang=zh_CN&networkType=wifi&networklibtype=JDNetworkBaseAF&openudid=e35caf0a69be42084e3c97eef56c3af7b0262d01&osVersion=13.5.1&partner=apple&rfs=0000&scope=01&screen=828%2A1792&sign=59c1af6b257421672f1c8f6ab878084d&st=1595926377439&sv=102&uts=0f31TVRjBSsqndu4/jgUPz6uymy50MQJcPZxWlSpDrAQ8407rzIXjarvshNNSEsnLV0tV3BB9%2B3IWXJgCfYn8yocpXrWCjeJzfA4MHUq%2BjAyQ7ZUc8ZaXvIx2JM4dUlg6P1v6IgCWZJa1u0j1YuA7IUrZzm3E1eYuNoB7UmQTgXV4%2BFyD/FzKY0DqsmdN6Fvo8yZeblZwy8sAEI//MvESQ%3D%3D&uuid=coW0lj7vbXVin6h7ON%2BtMNFQqYBqMahr&wifiBssid=f7754c40c09909dc5fccf03e8d7e39d4`,
+ headers: {
+ 'Cookie': cookie,
+ "Host": "api.m.jd.com",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept": "*/*",
+ "Connection": "keep-alive",
+ "User-Agent": "JD4iPhone/167283 (iPhone; iOS 13.5.1; Scale/2.00)",
+ "Accept-Language": "zh-Hans-CN;q=1, en-CN;q=0.9, zh-Hant-CN;q=0.8",
+ "Content-Length": "955",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+}
+
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
\ No newline at end of file
diff --git a/backUp/gitSync.md b/backUp/gitSync.md
new file mode 100644
index 00000000..132321d5
--- /dev/null
+++ b/backUp/gitSync.md
@@ -0,0 +1,100 @@
+## 保持自己github的forks自动和上游仓库同步的教程
+ - 信息来源于 [https://github.com/wei/pull](https://github.com/wei/pull)
+ - 以下教程仅是出于个人爱好,不保证本教程的完全正确性,最终请以作者 [https://github.com/wei/pull](https://github.com/wei/pull) 的描述为准。
+ - 注:此教程由telegram用户@wukongdada提供
+### 1、只同步默认分支的教程
+
+> 当上游的仓库仅有一个默认分支。或者上游仓库有两个分支,我们仅需要同步他的默认分支,其他分支对内容对我们来说无关紧要。
+
+
+
+![git1.jpg](../icon/git1.jpg)
+
+
+
+a) 登录自己的github账号,另开网页打开 [https://github.com/wei/pull](https://github.com/wei/pull)
+
+
+
+b) 点击Pull app进行安装。
+
+![../icon/git2.jpg](../icon/git2.jpg)
+
+
+
+c) 安装过程中会让你选择要选择那一种方式,All repositories(就是同步已经frok的仓库以及未来fork的仓库),Only select repositories(仅选择要自己需要同步的仓库,其他fork的仓库不会被同步),根据自己需求选择,实在不知道怎么选择,就选All repositories;点击install,完成安装。
+
+![../icon/git3.jpg](../icon/git3.jpg)
+
+
+
+d) 后续,如果要调整1.c中的选项,打开 [https://github.com/apps/pull](https://github.com/apps/pull) ,点击Configure,输入github密码进入pull的相关设置。
+
+![../icon/git4.jpg](../icon/git4.jpg)
+
+
+
+e) 进入后,找到Repository access,根据自己的需求,重新选择:All repositories(就是同步已经frok的仓库以及未来fork的仓库),Only select repositories(仅选择要自己需要同步的仓库,其他fork的仓库不会被同步),Save后保存生效。
+
+![../icon/git5.jpg](../icon/git5.jpg)
+
+
+
+f) Pull app作者虽然在项目中写道keeps your forks up-to-date with upstream via automated pull requests,但当上游仓库有更改时,自己的仓库会在3个小时内完成与上游的同步,3个小时是Pull app作者说的最长时间。当然也可以通过手动触发同步上游仓库,手动触发方式:`https://pull.git.ci/process/你的GitHub名字/你的仓库名字` (例如:`https://pull.git.ci/process/xxxxx/test` ),手动触发可能会进行人机验证,验证通过后会显示Success。
+
+![../icon/git12.jpg](../icon/git6.jpg)
+
+![../icon/git13.jpg](../icon/git7.png)
+
+### 2、同步其他分支的教程
+
+ ![../icon/git8.jpg](../icon/git8.jpg)
+
+
+
+a) 假设你fork了上游仓库后,你fork后的地址为 `https://github.com/你的仓库名字/test` ,首先设置完成第1部分内容,注意在1.c步骤没有设置全部同步的,要回到1.e步,确认是否设置同步了 `你的仓库名字/test`,如果没有,请添加上。
+
+![../icon/git9.jpg](../icon/git9.jpg)
+
+
+
+b) 在默认分支下添加一个文件。
+
+![../icon/git10.jpg](../icon/git10.jpg)
+
+
+
+c) 复制 ``.github/pull.yml`` 粘贴后看到以下页面,注意github前面的那个.别漏掉了。
+
+![../icon/git11.jpg](../icon/git11.jpg)
+
+
+
+d) 请在https://github.com/wei/pull\#advanced-setup-with-config 页复制代码,
+
+注意:upstream处要修改为上游仓库作者名字。
+
+![../icon/git12.jpg](../icon/git12.jpg)
+
+![../icon/git13.jpg](../icon/git13.jpg)
+
+
+
+e) 最终的示例如下,假设上游作者是zhangsan,所有的注意点都用红线圈出来了,保存后生效。
+
+![../icon/git14.jpg](../icon/git14.jpg)
+
+
+
+f) Pull app作者虽然在项目中写道keeps your forks up-to-date with upstream via automated pull requests,但当上游仓库有更改时,自己的仓库会在3个小时内完成与上游的同步,3个小时是Pull app作者说的最长时间。当然也可以通过手动触发同步上游仓库,手动触发方式:`https://pull.git.ci/process/你的GitHub名字/你的仓库名字` (例如:`https://pull.git.ci/process/xxxxx/test`),手动触发可能会进行人机验证,验证通过后会显示Success。具体见1.f提供的图片。
+
+
+
+g) 本人仅测试过forks一个仓库只有2个分支的项目,如果有多个分支,不能保证是否可行,请自行测试,或者是使用本教程第3部分高级玩法。
+
+### 高级玩法
+
+>当然,作者还有其他更好的项目用于同步所有分支,例如使用 GitHub actions 进行同步。请参考原作者的项目
+
+- [https://github.com/wei/git-sync](https://github.com/wei/git-sync)
+- [https://github.com/repo-sync/github-sync](https://github.com/repo-sync/github-sync)
diff --git a/backUp/iepngs.boxjs.json b/backUp/iepngs.boxjs.json
new file mode 100644
index 00000000..7f072185
--- /dev/null
+++ b/backUp/iepngs.boxjs.json
@@ -0,0 +1,33 @@
+{
+ "id": "iepngs.app.sub",
+ "name": "iepngs脚本订阅(自用,非作者本人的订阅)",
+ "author": "@iepngs",
+ "icon": "https://avatars2.githubusercontent.com/u/10695382?s=460&u=efc97d623c7c21170e6794f367fa80a97253f87b&v=4",
+ "repo": "https://github.com/iepngs/Script",
+ "apps": [
+ {
+ "id": "lxhealth",
+ "name": "乐心健康",
+ "keys": [
+ "lxhealthCookie",
+ "lxhealthStep"
+ ],
+ "settings": [
+ {
+ "id": "lxhealthStep",
+ "name": "运动步数",
+ "val": "",
+ "type": "text",
+ "desc": "修改乐心健康运动步数"
+ }
+ ],
+ "author": "@iepngs",
+ "repo": "https://github.com/iepngs/Script",
+ "script": "https://raw.githubusercontent.com/iepngs/Script/master/lxhealth/index.js",
+ "icons": [
+ "https://avatars2.githubusercontent.com/u/10695382?s=460&u=efc97d623c7c21170e6794f367fa80a97253f87b&v=4",
+ "https://avatars2.githubusercontent.com/u/10695382?s=460&u=efc97d623c7c21170e6794f367fa80a97253f87b&v=4"
+ ]
+ }
+ ]
+}
\ No newline at end of file
diff --git a/backUp/jd_fruit_double.js b/backUp/jd_fruit_double.js
new file mode 100644
index 00000000..1fb8b18a
--- /dev/null
+++ b/backUp/jd_fruit_double.js
@@ -0,0 +1,1000 @@
+/*
+jd免费水果 搬的https://github.com/liuxiaoyucc/jd-helper/blob/a6f275d9785748014fc6cca821e58427162e9336/fruit/fruit.js
+更新时间:2020-08-25
+脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
+// quantumultx
+[task_local]
+#jd免费水果
+5 6-18/6 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_fruit.js, tag=东东农场, img-url=https://raw.githubusercontent.com/znz1992/Gallery/master/jdsg.png, enabled=true
+// Loon
+[Script]
+cron "5 6-18/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_fruit.js,tag=东东农场
+// Surge
+// 宠汪汪偷好友积分与狗粮 = type=cron,cronexp="5 6-18/6 * * *",wake-system=1,timeout=20,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_steal.js
+互助码shareCode请先手动运行脚本查看打印可看到
+一天只能帮助4个人。多出的助力码无效
+注:如果使用Node.js, 需自行安装'crypto-js,got,http-server,tough-cookie'模块. 例: npm install crypto-js http-server tough-cookie got --save
+*/
+
+let name = '东东农场';
+const retainWater = 100;//保留水滴大于多少g,默认100g;
+const $ = new Env(name);
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//ios等软件用户直接用NobyDa的jd cookie
+const cookie = jdCookieNode.CookieJD ? jdCookieNode.CookieJD : $.getdata('CookieJD');
+
+//京东接口地址
+const JD_API_HOST = 'https://api.m.jd.com/client.action';
+
+let jdNotify = $.getdata('jdFruitNotify');
+//助力好友分享码(最多4个,否则后面的助力失败),原因:京东农场每人每天只有四次助力机会
+let shareCodes = [ // 这个列表填入你要助力的好友的shareCode
+ '0a74407df5df4fa99672a037eec61f7e',
+ 'dbb21614667246fabcfd9685b6f448f3',
+ '6fbd26cc27ac44d6a7fed34092453f77',
+ '61ff5c624949454aa88561f2cd721bf6',
+]
+// 添加box功能
+// 【用box订阅的好处】
+// 1️⃣脚本也可以远程挂载了。助力功能只需在box里面设置助力码。
+// 2️⃣所有脚本的cookie都可以备份,方便你迁移到其他支持box的软件。
+let isBox = false //默认没有使用box
+const boxShareCodeArr = ['jd_fruit1', 'jd_fruit2', 'jd_fruit3', 'jd_fruit4'];
+isBox = boxShareCodeArr.some((item) => {
+ const boxShareCode = $.getdata(item);
+ return (boxShareCode !== undefined && boxShareCode !== null && boxShareCode !== '');
+});
+if (isBox) {
+ shareCodes = [];
+ for (const item of boxShareCodeArr) {
+ if ($.getdata(item)) {
+ shareCodes.push($.getdata(item));
+ }
+ }
+}
+const Task = step()
+Task.next();
+
+let farmTask = null, isFruitFinished = false;
+
+// let farmInfo = null;
+
+function* step() {
+ let message = '';
+ let subTitle = '', UserName = '';
+ let option = {};
+ if (!cookie) {
+ $.msg(name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ $.done();
+ return
+ }
+ UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ let farmInfo = yield initForFarm();
+ if (farmInfo.farmUserPro) {
+ option['media-url'] = farmInfo.farmUserPro.goodsImage;
+ subTitle = `【${UserName}】${farmInfo.farmUserPro.name}`;
+ console.log(`\n【您的互助码shareCode】 ${farmInfo.farmUserPro.shareCode}\n`);
+ console.log(`\n【已成功兑换水果】${farmInfo.farmUserPro.winTimes}次\n`)
+ if (farmInfo.treeState === 0) {
+ //已下单购买, 但未开始种植新的水果
+ $.msg(name, `【提醒⏰】请重新种植水果`, `上轮水果${farmInfo.farmUserPro.name}已兑换成功\n请去京东APP或微信小程序选购并种植新的水果\n openApp.jdMobile://`, {"open-url": "openApp.jdMobile://"});
+ $.done();
+ return;
+ } else if (farmInfo.treeState === 1){
+ console.log(`\n${farmInfo.farmUserPro.name}种植中...\n`)
+ } else if (farmInfo.treeState === 2) {
+ option['open-url'] = "openApp.jdMobile://";
+ $.msg(name, `【提醒⏰】${farmInfo.farmUserPro.name}已可领取`, '请去京东APP或微信小程序查看', option);
+ $.done();
+ return;
+ } else if (farmInfo.treeState === 3) {
+ //已成熟可去兑换,但还没去下单购买
+ option['open-url'] = "openApp.jdMobile://";
+ $.msg(name, `【提醒⏰】${farmInfo.farmUserPro.name}已可领取`, '请去京东APP或微信小程序查看', option);
+ $.done();
+ return;
+ }
+ farmTask = yield taskInitForFarm();
+ // console.log(`当前任务详情: ${JSON.stringify(farmTask)}`);
+ console.log(`开始签到`);
+ if (!farmTask.signInit.todaySigned) {
+ let signResult = yield signForFarm(); //签到
+ if (signResult.code == "0") {
+ message += `【签到成功】获得${signResult.amount}g💧\n`//连续签到${signResult.signDay}天
+ // if (signResult.todayGotWaterGoalTask.canPop) {
+ // let goalResult = yield gotWaterGoalTaskForFarm();
+ // console.log(`被水滴砸中奖励:${JSON.stringify(goalResult)}`);
+ // if (goalResult.code === '0') {
+ // message += `【被水滴砸中】获取:${goalResult.addEnergy}g\n`
+ // }
+ // }
+ } else {
+ message += `签到失败,详询日志\n`
+ console.log(`签到结果: ${JSON.stringify(signResult)}`);
+ }
+ } else {
+ console.log(`今天已签到,连续签到${farmTask.signInit.totalSigned},下次签到可得${farmTask.signInit.signEnergyEachAmount}g`);
+ // message += `今天已签到,连续签到${farmTask.signInit.totalSigned},下次签到可得${farmTask.signInit.signEnergyEachAmount}g\n`
+ }
+ // 被水滴砸中
+ console.log(`被水滴砸中: ${farmInfo.todayGotWaterGoalTask.canPop ? '是' : '否'}`);
+ if (farmInfo.todayGotWaterGoalTask.canPop) {
+ let goalResult = yield gotWaterGoalTaskForFarm();
+ //console.log(`被水滴砸中奖励:${JSON.stringify(goalResult)}`);
+ if (goalResult.code === '0') {
+ message += `【被水滴砸中】获得${goalResult.addEnergy}g💧\n`
+ }
+ }
+ console.log(`签到结束,开始广告浏览任务`);
+ if (!farmTask.gotBrowseTaskAdInit.f) {
+ let adverts = farmTask.gotBrowseTaskAdInit.userBrowseTaskAds
+ let browseReward = 0
+ let browseSuccess = 0
+ let browseFail = 0
+ for (let advert of adverts) { //开始浏览广告
+ if (advert.limit <= advert.hadFinishedTimes) {
+ // browseReward+=advert.reward
+ console.log(`${advert.mainTitle}+ ' 已完成`);//,获得${advert.reward}g
+ continue;
+ }
+ console.log('正在进行广告浏览任务: ' + advert.mainTitle);
+ let browseResult = yield browseAdTaskForFarm(advert.advertId, 0);
+ if (browseResult.code == 0) {
+ console.log(`${advert.mainTitle}浏览任务完成`);
+ //领取奖励
+ let browseRwardResult = yield browseAdTaskForFarm(advert.advertId, 1);
+ if (browseRwardResult.code == '0') {
+ console.log(`领取浏览${advert.mainTitle}广告奖励成功,获得${browseRwardResult.amount}g`)
+ browseReward += browseRwardResult.amount
+ browseSuccess++
+ } else {
+ browseFail++
+ console.log(`领取浏览广告奖励结果: ${JSON.stringify(browseRwardResult)}`)
+ }
+ } else {
+ browseFail++
+ console.log(`广告浏览任务结果: ${JSON.stringify(browseResult)}`);
+ }
+ }
+ if (browseFail > 0) {
+ message += `【广告浏览】完成${browseSuccess}个,失败${browseFail},获得${browseReward}g💧\n`
+ } else {
+ message += `【广告浏览】完成${browseSuccess}个,获得${browseReward}g💧\n`
+ }
+ } else {
+ console.log(`今天已经做过浏览任务`);
+ // message += '今天已经做过浏览任务\n'
+ }
+ //定时领水
+ if (!farmTask.gotThreeMealInit.f) {
+ //
+ let threeMeal = yield gotThreeMealForFarm();
+ if (threeMeal.code == "0") {
+ message += `【定时领水】获得${threeMeal.amount}g💧\n`
+ } else {
+ message += `【定时领水】失败,详询日志\n`
+ console.log(`定时领水成功结果: ${JSON.stringify(threeMeal)}`);
+ }
+ } else {
+ // message += '当前不在定时领水时间断或者已经领过\n'
+ console.log('当前不在定时领水时间断或者已经领过')
+ }
+ //打卡领水
+ console.log('开始打卡领水活动(签到,关注,领券)')
+ let clockInInit = yield clockInInitForFarm();
+ // console.log(`clockInInit---${JSON.stringify(clockInInit)}`)
+ if (clockInInit.code === '0') {
+ // 签到得水滴
+ if (!clockInInit.todaySigned) {
+ console.log('开始今日签到');
+ // request('clockInForFarm', {"type" : 1});
+ let clockInForFarmRes = yield clockInForFarm();
+ console.log(`打卡结果${JSON.stringify(clockInForFarmRes)}`);
+ if (clockInForFarmRes.code === '0') {
+ message += `【第${clockInForFarmRes.signDay}天签到】获得${clockInForFarmRes.amount}g💧\n`//连续签到${signResult.signDay}天
+ if (clockInForFarmRes.signDay === 7) {
+ //可以领取惊喜礼包
+ console.log('开始领取--惊喜礼包38g水滴');
+ let gotClockInGiftRes = yield gotClockInGift();
+ if (gotClockInGiftRes.code === '0') {
+ message += `【惊喜礼包】获得${gotClockInGiftRes.amount}g💧\n`
+ }
+ }
+ // if (clockInForFarmRes.todayGotWaterGoalTask.canPop) {
+ // let goalResult = yield gotWaterGoalTaskForFarm();
+ // console.log(`被水滴砸中奖励:${JSON.stringify(goalResult)}`);
+ // if (goalResult.code === '0') {
+ // message += `【被水滴砸中】${goalResult.addEnergy}g\n`;
+ // }
+ // }
+ }
+ }
+ // 连续七天签到-惊喜礼包
+ // if (!clockInInit.gotClockInGift && clockInInit.totalSigned === 7) {
+ // console.log('开始领取--惊喜礼包38g水滴');
+ // let gotClockInGiftRes = yield gotClockInGift();
+ // if (gotClockInGiftRes.code === '0') {
+ // message += `【惊喜礼包】获得${gotClockInGiftRes.amount}g💧\n`
+ // }
+ // }
+ // 限时关注得水滴
+ if (clockInInit.themes && clockInInit.themes.length > 0) {
+ for (let item of clockInInit.themes) {
+ if (!item.hadGot) {
+ console.log(`关注ID${item.id}`);
+ let themeStep1 = yield clockInFollowForFarm(item.id, "theme", "1");
+ console.log(`themeStep1--结果${JSON.stringify(themeStep1)}`);
+ if (themeStep1.code === '0') {
+ let themeStep2 = yield clockInFollowForFarm(item.id, "theme", "2");
+ console.log(`themeStep2--结果${JSON.stringify(themeStep2)}`);
+ if (themeStep2.code === '0') {
+ console.log(`关注${item.name},获得水滴${themeStep2.amount}g`);
+ }
+ }
+ }
+ }
+ }
+ // 限时领券得水滴
+ if (clockInInit.venderCoupons && clockInInit.venderCoupons.length > 0) {
+ for (let item of clockInInit.venderCoupons) {
+ if (!item.hadGot) {
+ console.log(`领券的ID${item.id}`);
+ let venderCouponStep1 = yield clockInFollowForFarm(item.id, "venderCoupon", "1");
+ console.log(`venderCouponStep1--结果${JSON.stringify(venderCouponStep1)}`);
+ if (venderCouponStep1.code === '0') {
+ let venderCouponStep2 = yield clockInFollowForFarm(item.id, "venderCoupon", "2");
+ if (venderCouponStep2.code === '0') {
+ console.log(`venderCouponStep2--结果${JSON.stringify(venderCouponStep2)}`);
+ console.log(`从${item.name}领券,获得水滴${venderCouponStep2.amount}g`);
+ }
+ }
+ }
+ }
+ }
+ }
+ console.log('\n开始打卡领水活动(签到,关注,领券)结束\n');
+ // 水滴雨
+ let executeWaterRain = !farmTask.waterRainInit.f;
+ if (executeWaterRain) {
+ console.log(`水滴雨任务,每天两次,最多可得10g水滴`);
+ console.log(`两次水滴雨任务是否全部完成:${farmTask.waterRainInit.f ? '是' : '否'}`);
+ if (farmTask.waterRainInit.lastTime) {
+ if (new Date().getTime() < (farmTask.waterRainInit.lastTime + 3 * 60 * 60 * 1000)) {
+ executeWaterRain = false;
+ message += `【第${farmTask.waterRainInit.winTimes + 1}次水滴雨】未到时间,请稍后再试\n`;
+ }
+ }
+ if (executeWaterRain) {
+ console.log(`开始水滴雨任务,这是第${farmTask.waterRainInit.winTimes + 1}次,剩余${2 - (farmTask.waterRainInit.winTimes + 1)}次`);
+ let waterRain = yield waterRainForFarm();
+ console.log('水滴雨waterRain', waterRain);
+ if (waterRain.code === '0') {
+ console.log('水滴雨任务执行成功,获得水滴:' + waterRain.addEnergy + 'g');
+ message += `【第${farmTask.waterRainInit.winTimes + 1}次水滴雨】获得${waterRain.addEnergy}g水滴\n`
+ }
+ }
+ // if (farmTask.waterRainInit.winTimes === 0) {
+ // console.log(`开始水滴雨任务,这是第${farmTask.waterRainInit.winTimes + 1}次,剩余${2 - (farmTask.waterRainInit.winTimes + 1)}次`);
+ // let waterRain = yield waterRainForFarm();
+ // console.log('水滴雨waterRain', waterRain);
+ // if (waterRain.code === '0') {
+ // console.log('水滴雨任务执行成功,获得水滴:' + waterRain.addEnergy + 'g');
+ // message += `【第${farmTask.waterRainInit.winTimes + 1}次水滴雨】获得${waterRain.addEnergy}g水滴\n`
+ // }
+ // } else {
+ // //执行了第一次水滴雨。需等待3小时候才能再次执行
+ // if (new Date().getTime() > (farmTask.waterRainInit.lastTime + 3 * 60 * 60 *1000)) {
+ // console.log(`开始水滴雨任务,这是第${farmTask.waterRainInit.winTimes + 1}次,剩余${2 - (farmTask.waterRainInit.winTimes + 1)}次`);
+ // let waterRain = yield waterRainForFarm();
+ // console.log('水滴雨waterRain', waterRain);
+ // if (waterRain.code === '0') {
+ // console.log('水滴雨任务执行成功,获得水滴:' + waterRain.addEnergy + 'g');
+ // message += `【第${farmTask.waterRainInit.winTimes + 1}次水滴雨】获得${waterRain.addEnergy}g水滴\n`
+ // }
+ // } else {
+ // console.log(`【第${farmTask.waterRainInit.winTimes + 1}次水滴雨】未到时间,请稍后再试\n`)
+ // message += `【第${farmTask.waterRainInit.winTimes + 1}次水滴雨】未到时间,请稍后再试\n`
+ // }
+ // }
+ } else {
+ message += `【水滴雨】已全部完成,获得20g💧\n`
+ }
+ const masterHelpResult = yield masterHelpTaskInitForFarm();
+ if (masterHelpResult.code === '0') {
+ if (masterHelpResult.masterHelpPeoples && masterHelpResult.masterHelpPeoples.length >= 5) {
+ // 已有五人助力。领取助力后的奖励
+ if (!masterHelpResult.masterGotFinal) {
+ const masterGotFinished = yield masterGotFinishedTaskForFarm();
+ if (masterGotFinished.code === '0') {
+ console.log(`已成功领取好友助力奖励:【${masterGotFinished.amount}】g水`);
+ message += `【额外奖励】${masterGotFinished.amount}g水领取成功\n`;
+ }
+ } else {
+ console.log("已经领取过5好友助力额外奖励");
+ message += `【额外奖励】已被领取过\n`;
+ }
+ } else {
+ console.log("助力好友未达到5个");
+ message += `【额外奖励】领取失败,原因:助力好友未达5个\n`;
+ }
+ if (masterHelpResult.masterHelpPeoples && masterHelpResult.masterHelpPeoples.length > 0) {
+ let str = '';
+ masterHelpResult.masterHelpPeoples.map((item, index) => {
+ if (index === (masterHelpResult.masterHelpPeoples.length - 1)) {
+ str += item.nickName || "匿名用户";
+ } else {
+ str += (item.nickName || "匿名用户") + ',';
+ }
+ let date = new Date(item.time);
+ let time = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date.getDate() + ' ' + date.getHours() + ':' + date.getMinutes() + ':' + date.getMinutes();
+ console.log(`\n京东昵称【${item.nickName || "匿名用户"}】 在 ${time} 给您助过力\n`);
+ })
+ message += `【助力您的好友】${str}\n`;
+ }
+ }
+ //助力
+ // masterHelpTaskInitForFarm
+ console.log('开始助力好友')
+ let salveHelpAddWater = 0;
+ let remainTimes = 4;//今日剩余助力次数,默认4次(京东农场每人每天4次助力机会)。
+ let helpSuccessPeoples = '';//成功助力好友
+ for (let code of shareCodes) {
+ if (code == farmInfo.farmUserPro.shareCode) {
+ console.log('跳过自己的shareCode')
+ continue
+ }
+ console.log(`开始助力好友: ${code}`);
+ let helpResult = yield masterHelp(code)
+ if (helpResult.code == 0) {
+ if (helpResult.helpResult.code === '0') {
+ //助力成功
+ salveHelpAddWater += helpResult.helpResult.salveHelpAddWater;
+ console.log(`【助力好友结果】: 已成功给【${helpResult.helpResult.masterUserInfo.nickName}】助力`);
+ console.log(`给好友【${helpResult.helpResult.masterUserInfo.nickName}】助力获得${helpResult.helpResult.salveHelpAddWater}g水滴`)
+ helpSuccessPeoples += (helpResult.helpResult.masterUserInfo.nickName || '匿名用户') + ',';
+ } else if (helpResult.helpResult.code === '8') {
+ console.log(`【助力好友结果】: 助力【${helpResult.helpResult.masterUserInfo.nickName}】失败,您今天助力次数已耗尽`);
+ } else if (helpResult.helpResult.code === '9') {
+ console.log(`【助力好友结果】: 之前给【${helpResult.helpResult.masterUserInfo.nickName}】助力过了`);
+ } else if (helpResult.helpResult.code === '10') {
+ console.log(`【助力好友结果】: 好友【${helpResult.helpResult.masterUserInfo.nickName}】已满五人助力`);
+ }
+ console.log(`【今日助力次数还剩】${helpResult.helpResult.remainTimes}次`);
+ remainTimes = helpResult.helpResult.remainTimes;
+ if (helpResult.helpResult.remainTimes === 0) {
+ console.log(`您当前助力次数已耗尽,跳出助力`);
+ break
+ }
+ }
+ }
+ let helpSuccessPeoplesKey = timeFormat() + farmInfo.farmUserPro.shareCode;
+ if (!$.getdata(helpSuccessPeoplesKey)) {
+ //把前一天的清除
+ $.setdata('', timeFormat(Date.now() - 24 * 60 * 60 * 1000) + farmInfo.farmUserPro.shareCode);
+ $.setdata('', helpSuccessPeoplesKey);
+ }
+ if (helpSuccessPeoples) {
+ if ($.getdata(helpSuccessPeoplesKey)) {
+ $.setdata($.getdata(helpSuccessPeoplesKey) + ',' + helpSuccessPeoples, helpSuccessPeoplesKey);
+ } else {
+ $.setdata(helpSuccessPeoples, helpSuccessPeoplesKey);
+ }
+ }
+ helpSuccessPeoples = $.getdata(helpSuccessPeoplesKey);
+ if (helpSuccessPeoples && helpSuccessPeoples.length > 0) {
+ message += `【您助力的好友👬】${helpSuccessPeoples.substr(0, helpSuccessPeoples.length - 1)}\n`;
+ }
+ if (salveHelpAddWater > 0) {
+ message += `【助力好友👬】获得${salveHelpAddWater}g💧\n`
+ }
+ message += `【今日剩余助力👬】${remainTimes}次\n`;
+ console.log('助力好友结束,即将开始每日浇水任务');
+ // console.log('当前水滴剩余: ' + farmInfo.farmUserPro.totalEnergy);
+ // farmTask = yield taskInitForFarm();
+ //天天抽奖得好礼
+ let initForTurntableFarmRes = yield initForTurntableFarm();
+ if (initForTurntableFarmRes.code === '0') {
+ //领取定时奖励 //4小时一次
+ let {timingIntervalHours, timingLastSysTime, sysTime, timingGotStatus, remainLotteryTimes, turntableInfos} = initForTurntableFarmRes;
+
+ if (!timingGotStatus) {
+ console.log(`是否到了领取免费赠送的抽奖机会----${sysTime > (timingLastSysTime + 60*60*timingIntervalHours*1000)}`)
+ if (sysTime > (timingLastSysTime + 60*60*timingIntervalHours*1000)) {
+ let timingAwardRes = yield timingAwardForTurntableFarm();
+ console.log(`领取定时奖励结果${JSON.stringify(timingAwardRes)}`);
+ initForTurntableFarmRes = yield initForTurntableFarm();
+ remainLotteryTimes = initForTurntableFarmRes.remainLotteryTimes;
+ } else {
+ console.log(`免费赠送的抽奖机会未到时间`)
+ }
+ } else {
+ console.log('4小时候免费赠送的抽奖机会已领取')
+ }
+ if (initForTurntableFarmRes.turntableBrowserAds && initForTurntableFarmRes.turntableBrowserAds.length > 0) {
+ console.log('开始浏览天天抽奖的逛会场任务')
+ if (!initForTurntableFarmRes.turntableBrowserAds[0].status) {
+ const browserForTurntableFarmRes = yield browserForTurntableFarm(initForTurntableFarmRes.turntableBrowserAds[0].adId);
+ if (browserForTurntableFarmRes.code === '0' && browserForTurntableFarmRes.status) {
+ const browserForTurntableFarm2Res = yield browserForTurntableFarm2(initForTurntableFarmRes.turntableBrowserAds[0].adId);
+ if (browserForTurntableFarm2Res.code === '0') {
+ initForTurntableFarmRes = yield initForTurntableFarm();
+ remainLotteryTimes = initForTurntableFarmRes.remainLotteryTimes;
+ }
+ }
+ } else {
+ console.log('天天抽奖浏览任务已经做完')
+ }
+ }
+ //天天抽奖助力
+ console.log('开始天天抽奖--好友助力--每人每天只有三次助力机会.')
+ for (let code of shareCodes) {
+ if (code === farmInfo.farmUserPro.shareCode) {
+ console.log('天天抽奖-不能自己给自己助力\n')
+ continue
+ }
+ let lotteryMasterHelpRes = yield lotteryMasterHelp(code);
+ // console.log('天天抽奖助力结果',lotteryMasterHelpRes.helpResult)
+ if (lotteryMasterHelpRes.helpResult.code === '0') {
+ console.log(`天天抽奖-助力${lotteryMasterHelpRes.helpResult.masterUserInfo.nickName}成功\n`)
+ } else if (lotteryMasterHelpRes.helpResult.code === '11') {
+ console.log(`天天抽奖-不要重复助力${lotteryMasterHelpRes.helpResult.masterUserInfo.nickName}\n`)
+ } else if (lotteryMasterHelpRes.helpResult.code === '13') {
+ console.log(`天天抽奖-助力${lotteryMasterHelpRes.helpResult.masterUserInfo.nickName}失败,助力次数耗尽\n`);
+ break;
+ }
+ //lotteryMasterHelp
+ }
+ console.log(`---天天抽奖次数remainLotteryTimes----${remainLotteryTimes}次`)
+ //抽奖
+ if (remainLotteryTimes > 0) {
+ console.log('开始抽奖')
+ let lotteryResult = '';
+ for (let i = 0; i < new Array(remainLotteryTimes).fill('').length; i++) {
+ let lotteryRes = yield lotteryForTurntableFarm()
+ console.log(`第${i + 1}次抽奖结果${JSON.stringify(lotteryRes)}`);
+ if (lotteryRes.code === '0') {
+ turntableInfos.map((item) => {
+ if (item.type === lotteryRes.type) {
+ console.log(`lotteryRes.type${lotteryRes.type}`);
+ if (lotteryRes.type.match(/bean/g) && lotteryRes.type.match(/bean/g)[0] === 'bean') {
+ lotteryResult += `${item.name}个,`;
+ } else if (lotteryRes.type.match(/water/g) && lotteryRes.type.match(/water/g)[0] === 'water') {
+ lotteryResult += `${item.name}g,`;
+ } else {
+ lotteryResult += `${item.name},`;
+ }
+ }
+ })
+ //没有次数了
+ if (lotteryRes.remainLotteryTimes === 0) {
+ break
+ }
+ }
+ }
+ if (lotteryResult) {
+ console.log(`【天天抽奖】${lotteryResult.substr(0, lotteryResult.length - 1)}\n`)
+ message += `【天天抽奖】${lotteryResult.substr(0, lotteryResult.length - 1)}\n`;
+ }
+ } else {
+ console.log('天天抽奖--抽奖机会为0次')
+ }
+ } else {
+ console.log('初始化天天抽奖得好礼失败')
+ }
+ //浇水10次
+ if (farmTask.totalWaterTaskInit.totalWaterTaskTimes < farmTask.totalWaterTaskInit.totalWaterTaskLimit) {
+ let waterCount = 0;
+ isFruitFinished = false;
+ for (; waterCount < farmTask.totalWaterTaskInit.totalWaterTaskLimit - farmTask.totalWaterTaskInit.totalWaterTaskTimes; waterCount++) {
+ console.log(`第${waterCount + 1}次浇水`);
+ let waterResult = yield waterGoodForFarm();
+ console.log(`本次浇水结果: ${JSON.stringify(waterResult)}`);
+ if (waterResult.code === '0') {
+ console.log(`剩余水滴${waterResult.totalEnergy}g`);
+ if (waterResult.finished) {
+ // 已证实,waterResult.finished为true,表示水果可以去领取兑换了
+ isFruitFinished = true;
+ break
+ } else {
+ if (waterResult.waterStatus === 0 && waterResult.treeEnergy === 10) {
+ console.log('果树发芽了,奖励30g水滴');
+ let gotStageAwardForFarmRes1 = yield gotStageAwardForFarm('1');
+ console.log(`浇水阶段奖励1领取结果 ${JSON.stringify(gotStageAwardForFarmRes1)}`);
+ if (gotStageAwardForFarmRes1.code === '0') {
+ message += `【果树发芽了】奖励${gotStageAwardForFarmRes1.addEnergy}`
+ }
+ } else if (waterResult.waterStatus === 1) {
+ console.log('果树开花了,奖励40g水滴');
+ let gotStageAwardForFarmRes2 = yield gotStageAwardForFarm('2');
+ console.log(`浇水阶段奖励2领取结果 ${JSON.stringify(gotStageAwardForFarmRes2)}`);
+ if (gotStageAwardForFarmRes2.code === '0') {
+ message += `【果树开花了】奖励${gotStageAwardForFarmRes2.addEnergy}g💧\n`
+ }
+ } else if (waterResult.waterStatus === 2) {
+ console.log('果树长出小果子啦, 奖励50g水滴');
+ let gotStageAwardForFarmRes3 = yield gotStageAwardForFarm('3');
+ console.log(`浇水阶段奖励3领取结果 ${JSON.stringify(gotStageAwardForFarmRes3)}`)
+ if (gotStageAwardForFarmRes3.code === '0') {
+ message += `【果树结果了】奖励${gotStageAwardForFarmRes3.addEnergy}g💧\n`
+ }
+ }
+ if (waterResult.totalEnergy < 10) {
+ console.log(`水滴不够,结束浇水`)
+ break
+ }
+ }
+ } else {
+ console.log('浇水出现失败异常,跳出不在继续浇水')
+ break;
+ }
+ }
+ if (isFruitFinished) {
+ option['open-url'] = "openApp.jdMobile://";
+ $.msg(name, `【提醒⏰】${farmInfo.farmUserPro.name}已可领取`, '请去京东APP或微信小程序查看', option);
+ $.done();
+ return;
+ }
+ farmTask = yield taskInitForFarm();
+ // message += `【自动浇水】浇水${waterCount}次,今日浇水${farmTask.totalWaterTaskInit.totalWaterTaskTimes}次\n`
+ } else {
+ console.log('今日已完成10次浇水任务');
+ }
+ //领取首次浇水奖励
+ if (!farmTask.firstWaterInit.f && farmTask.firstWaterInit.totalWaterTimes > 0) {
+ let firstWaterReward = yield firstWaterTaskForFarm();
+ if (firstWaterReward.code === '0') {
+ message += `【首次浇水奖励】获得${firstWaterReward.amount}g💧\n`
+ } else {
+ message += '【首次浇水奖励】领取奖励失败,详询日志\n'
+ console.log(`领取首次浇水奖励结果: ${JSON.stringify(firstWaterReward)}`);
+ }
+ }
+ //领取10次浇水奖励
+ if (!farmTask.totalWaterTaskInit.f && farmTask.totalWaterTaskInit.totalWaterTaskTimes >= farmTask.totalWaterTaskInit.totalWaterTaskLimit) {
+ let totalWaterReward = yield totalWaterTaskForFarm();
+ if (totalWaterReward.code === '0') {
+ // console.log(`领取10次浇水奖励结果: ${JSON.stringify(totalWaterReward)}`);
+ message += `【十次浇水奖励】获得${totalWaterReward.totalWaterTaskEnergy}g💧\n`//,
+ } else {
+ message += '【十次浇水奖励】领取奖励失败,详询日志\n'
+ console.log(`领取10次浇水奖励结果: ${JSON.stringify(totalWaterReward)}`);
+ }
+ } else if (farmTask.totalWaterTaskInit.totalWaterTaskTimes < farmTask.totalWaterTaskInit.totalWaterTaskLimit) {
+ message += `【十次浇水奖励】任务未完成,今日浇水${farmTask.totalWaterTaskInit.totalWaterTaskTimes}次\n`
+ }
+ console.log('finished 水果任务完成!');
+
+ farmInfo = yield initForFarm();
+ // 所有的浇水(10次浇水)任务,获取水滴任务完成后,如果剩余水滴大于等于60g,则继续浇水(保留部分水滴是用于完成第二天的浇水10次的任务)
+ let overageEnergy = farmInfo.farmUserPro.totalEnergy - retainWater;
+ if (farmInfo.farmUserPro.totalEnergy >= (farmInfo.farmUserPro.treeTotalEnergy - farmInfo.farmUserPro.treeEnergy)) {
+ //如果现有的水滴,大于水果可兑换所需的对滴(也就是把水滴浇完,水果就能兑换了)
+ isFruitFinished = false;
+ for (let i = 0; i < (farmInfo.farmUserPro.treeTotalEnergy - farmInfo.farmUserPro.treeEnergy) / 10; i++) {
+ let resp = yield waterGoodForFarm();
+ console.log(`本次浇水结果(水果马上就可兑换了): ${JSON.stringify(resp)}`);
+ if (resp.code === '0') {
+ console.log('\n浇水10g成功\n');
+ if (resp.finished) {
+ // 已证实,waterResult.finished为true,表示水果可以去领取兑换了
+ isFruitFinished = true;
+ break
+ } else {
+ console.log(`目前水滴【${resp.totalEnergy}】g,继续浇水,水果马上就可以兑换了`)
+ }
+ } else {
+ console.log('浇水出现失败异常,跳出不在继续浇水')
+ break;
+ }
+ }
+ if (isFruitFinished) {
+ option['open-url'] = "openApp.jdMobile://";
+ $.msg(name, `【提醒⏰】${farmInfo.farmUserPro.name}已可领取`, '请去京东APP或微信小程序查看', option);
+ $.done();
+ return;
+ }
+ } else if (overageEnergy >= 10) {
+ console.log("目前剩余水滴:【" + farmInfo.farmUserPro.totalEnergy + "】g,可继续浇水");
+ isFruitFinished = false;
+ for (let i = 0; i < parseInt(overageEnergy / 10); i++) {
+ let res = yield waterGoodForFarm();
+ if (res.code === '0') {
+ console.log('\n浇水10g成功\n')
+ if (res.finished) {
+ // 已证实,waterResult.finished为true,表示水果可以去领取兑换了
+ isFruitFinished = true;
+ break
+ } else {
+ if (res.waterStatus === 0 && res.treeEnergy === 10) {
+ console.log('果树发芽了,奖励30g水滴');
+ let gotStageAwardForFarmRes1 = yield gotStageAwardForFarm('1');
+ console.log(`浇水阶段奖励1领取结果 ${JSON.stringify(gotStageAwardForFarmRes1)}`);
+ if (gotStageAwardForFarmRes1.code === '0') {
+ message += `【果树发芽了】奖励${gotStageAwardForFarmRes1.addEnergy}g💧\n`
+ }
+ } else if (res.waterStatus === 1) {
+ console.log('果树开花了,奖励40g水滴');
+ let gotStageAwardForFarmRes2 = yield gotStageAwardForFarm('2');
+ console.log(`浇水阶段奖励2领取结果 ${JSON.stringify(gotStageAwardForFarmRes2)}`);
+ if (gotStageAwardForFarmRes2.code === '0') {
+ message += `【果树开花了】奖励${gotStageAwardForFarmRes2.addEnergy}g💧\n`
+ }
+ } else if (res.waterStatus === 2) {
+ console.log('果树长出小果子啦, 奖励50g水滴');
+ let gotStageAwardForFarmRes3 = yield gotStageAwardForFarm('3');
+ console.log(`浇水阶段奖励3领取结果 ${JSON.stringify(gotStageAwardForFarmRes3)}`)
+ if (gotStageAwardForFarmRes3.code === '0') {
+ message += `【果树结果了】奖励${gotStageAwardForFarmRes3.addEnergy}g💧\n`
+ }
+ }
+ }
+ } else {
+ console.log('浇水出现失败异常,跳出不在继续浇水')
+ break;
+ }
+ }
+ if (isFruitFinished) {
+ option['open-url'] = "openApp.jdMobile://";
+ $.msg(name, `【提醒⏰】${farmInfo.farmUserPro.name}已可领取`, '请去京东APP或微信小程序查看', option);
+ $.done();
+ return;
+ }
+ } else {
+ console.log("目前剩余水滴:【" + farmInfo.farmUserPro.totalEnergy + "】g,不再继续浇水,保留部分水滴用于完成第二天【十次浇水得水滴】任务")
+ }
+
+ farmInfo = yield initForFarm();
+ message += `【水果🍉进度】${((farmInfo.farmUserPro.treeEnergy / farmInfo.farmUserPro.treeTotalEnergy) * 100).toFixed(2)}%,已浇水${farmInfo.farmUserPro.treeEnergy / 10}次,还需${(farmInfo.farmUserPro.treeTotalEnergy - farmInfo.farmUserPro.treeEnergy) / 10}次\n`
+ if (farmInfo.toFlowTimes > (farmInfo.farmUserPro.treeEnergy / 10)) {
+ message += `【开花进度】再浇水${farmInfo.toFlowTimes - farmInfo.farmUserPro.treeEnergy / 10}次开花\n`
+ } else if (farmInfo.toFruitTimes > (farmInfo.farmUserPro.treeEnergy / 10)) {
+ message += `【结果进度】再浇水${farmInfo.toFruitTimes - farmInfo.farmUserPro.treeEnergy / 10}次结果\n`
+ }
+ // 预测n天后水果课可兑换功能
+ let waterTotalT = (farmInfo.farmUserPro.treeTotalEnergy - farmInfo.farmUserPro.treeEnergy - farmInfo.farmUserPro.totalEnergy) / 10;//一共还需浇多少次水
+ farmTask = yield taskInitForFarm();
+ let waterEveryDayT = farmTask.totalWaterTaskInit.totalWaterTaskTimes;//今天到到目前为止,浇了多少次水
+ message += `【今日共浇水】${waterEveryDayT}次\n`;
+ let waterD = Math.ceil(waterTotalT / waterEveryDayT);
+ // name += `——预测在${timeFormat(24 * 60 * 60 * 1000 * waterD + Date.now())}日可兑换🍉`;
+ // if (waterEveryDayT !== 0) {
+ // subTitle += `,预计需${waterD}天可兑换`
+ // } else {
+ // subTitle += `,预计需${Math.ceil(waterTotalT / 10)}天可兑换`
+ // }
+ message += `【剩余水滴】${farmInfo.farmUserPro.totalEnergy}g💧\n`;
+ message += `【预测】${waterD === 1 ? '明天' : waterD === 2 ? '后天' : waterD + '天之后'}(${timeFormat(24 * 60 * 60 * 1000 * waterD + Date.now())}日)可兑换水果🍉`
+// //集卡抽奖活动
+// console.log('开始集卡活动')
+//
+// //初始化集卡抽奖活动数据
+// let turntableFarm = yield initForTurntableFarm()
+// if (turntableFarm.code == 0) {
+// //浏览爆品任务
+// if (!turntableFarm.turntableBrowserAdsStatus) {
+// let browserResult1 = yield browserForTurntableFarm(1);
+// console.log(`浏览爆品任务结果${JSON.stringify(browserResult1)}`)
+// if (browserResult1.code == 0) {
+// let browserResult2 = yield browserForTurntableFarm(2);
+// console.log(`领取爆品任务奖励结果${JSON.stringify(browserResult2)}`)
+// }
+// }
+// //领取定时奖励 //4小时一次 没判断时间
+// if (!turntableFarm.timingGotStatus) {
+// let timingAward = yield timingAwardForTurntableFarm();
+// console.log(`领取定时奖励结果${JSON.stringify(timingAward)}`)
+// }
+// turntableFarm = yield initForTurntableFarm()
+// console.log('开始抽奖')
+// //抽奖
+// if (turntableFarm.remainLotteryTimes > 0) {
+// let lotteryResult = "【集卡抽奖】获得"
+// for (let i = 0; i < turntableFarm.remainLotteryTimes; i++) {
+// let lottery = yield lotteryForTurntableFarm()
+// console.log(`第${i + 1}次抽奖结果${JSON.stringify(lottery)}`)
+//
+// if (lottery.code == 0) {
+// if (lottery.type == "water") {
+// lotteryResult += `水滴${lottery.addWater}g `
+// } else if (lottery.type == "pingguo") {
+// lotteryResult += "苹果卡 "
+// } else if (lottery.type == "baixiangguo") {
+// lotteryResult += "百香果卡 "
+// } else if (lottery.type == "mangguo") {
+// lotteryResult += "芒果卡 "
+// } else if (lottery.type == "taozi") {
+// lotteryResult += "桃子卡 "
+// } else if (lottery.type == "mihoutao") {
+// lotteryResult += "猕猴桃卡 "
+// } else if (lottery.type == "pingguo") {
+// lotteryResult += "苹果卡 "
+// } else if (lottery.type == "coupon") {
+// lotteryResult += "优惠券 "
+// } else if (lottery.type == "coupon3") {
+// lotteryResult += "8斤金枕榴莲 "
+// } else if (lottery.type == "bean") {
+// lotteryResult += `京豆${lottery.beanCount}个 `
+// } else if (lottery.type == "hongbao1") {
+// lotteryResult += `${lottery.hongBao.balance}元无门槛红包 `
+// } else {
+// lotteryResult += `未知奖品${lottery.type} `
+// }
+// //没有次数了
+// if (lottery.remainLotteryTimes == 0) {
+// break
+// }
+// }
+//
+// }
+// message += lotteryResult
+// }
+// console.log('抽奖结束')
+//
+// } else {
+// console.log(`初始化集卡抽奖活动数据异常, 数据: ${JSON.stringify(farmInfo)}`);
+// message += '【集卡抽奖】初始化集卡抽奖数据异常'
+// }
+// console.log('集卡活动抽奖结束')
+
+ console.log('全部任务结束');
+ } else {
+ if (farmInfo.code === '3') {
+ $.msg(name, '【提示】京东cookie已失效,请重新登录获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ $.setdata('', 'CookieJD');//cookie失效,故清空cookie。
+ $.done();
+ return
+ } else {
+ console.log(`初始化农场数据异常, 请登录京东 app查看农场0元水果功能是否正常,农场初始化数据: ${JSON.stringify(farmInfo)}`);
+ message = '初始化农场数据异常, 请登录京东 app查看农场0元水果功能是否正常'
+ }
+ }
+ if (!jdNotify || jdNotify === 'false') {
+ $.msg(name, subTitle, message, option);
+ }
+ $.done();
+}
+
+/**
+ * 天天抽奖拿好礼-助力(每人每天三次助力机会)
+ */
+function lotteryMasterHelp() {
+ request(`initForFarm`, {
+ imageUrl: "",
+ nickName: "",
+ shareCode: arguments[0] + '-3',
+ babelChannel: "3",
+ version: 4,
+ channel: 1
+ });
+}
+/**
+ * 集卡抽奖
+ */
+async function lotteryForTurntableFarm() {
+ await $.wait(2000);
+ console.log('等待了5秒')
+ request(arguments.callee.name.toString(), {type: 1, version: 4, channel: 1});
+}
+
+function timingAwardForTurntableFarm() {
+ request(arguments.callee.name.toString(), {version: 4, channel: 1});
+}
+
+// 初始化集卡抽奖活动数据
+function initForTurntableFarm() {
+ request(arguments.callee.name.toString(), {version: 4, channel: 1});
+}
+
+function browserForTurntableFarm(type) {
+ if (type === 1) {
+ console.log('浏览爆品会场');
+ }
+ if (type === 2) {
+ console.log('领取浏览爆品会场奖励');
+ }
+ const body = {"type":1,"adId": type,"version":4,"channel":1};
+ console.log('type', type + "");
+ console.log(body)
+ // request(arguments.callee.name.toString(), {type: type});
+ request(arguments.callee.name.toString(), body);
+ // 浏览爆品会场8秒
+}
+function browserForTurntableFarm2(type) {
+ const body = {"type":2,"adId": type,"version":4,"channel":1};
+ request('browserForTurntableFarm', body);
+}
+/**
+ * 领取浇水过程中的阶段性奖励
+ */
+function gotStageAwardForFarm(type) {
+ request(arguments.callee.name.toString(), {'type': type});
+}
+
+/**
+ * 被水滴砸中
+ * 要弹出来窗口后调用才有效, 暂时不知道如何控制
+ */
+function gotWaterGoalTaskForFarm() {
+ request(arguments.callee.name.toString(), {type: 3});
+}
+
+//助力好友信息
+function masterHelpTaskInitForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+//领取5人助力后的额外奖励
+function masterGotFinishedTaskForFarm() {
+ console.log("领取助力完成后的水滴")
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+function masterHelp() {
+ request(`initForFarm`, {
+ imageUrl: "",
+ nickName: "",
+ shareCode: arguments[0],
+ babelChannel: "3",
+ version: 2,
+ channel: 1
+ });
+}
+
+/**
+ * 10次浇水
+ */
+function totalWaterTaskForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+function firstWaterTaskForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+// 浇水动作
+function waterGoodForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+/**
+ * 浏览广告任务
+ * type为0时, 完成浏览任务
+ * type为1时, 领取浏览任务奖励
+ */
+function browseAdTaskForFarm(advertId, type) {
+ let functionId = arguments.callee.name.toString();
+ request(functionId, {advertId, type});
+}
+
+//签到
+function signForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+//定时领水
+function gotThreeMealForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+// 初始化任务列表
+function taskInitForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+/**
+ * 初始化农场, 可获取果树及用户信息
+ */
+function initForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+/**
+ * 水滴雨
+ * @param function_id
+ * @param body
+ */
+function waterRainForFarm() {
+ let functionId = arguments.callee.name.toString();
+ let body = {"type": 1, "hongBaoTimes": 100, "version": 3};
+ request(functionId, body);
+}
+
+/**
+ * 打卡领水
+ */
+function clockInInitForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);
+}
+
+// 连续签到
+function clockInForFarm() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId, {"type": 1});
+}
+
+//关注,领券等
+function clockInFollowForFarm(id, type, step) {
+ let functionId = arguments.callee.name.toString();
+ let body = {
+ id,
+ type,
+ step
+ }
+ request(functionId, body);
+}
+
+// 领取连续签到7天的惊喜礼包
+function gotClockInGift() {
+ request('clockInForFarm', {"type": 2})
+}
+//获取好友列表
+function friendListInitForFarm() {
+ request('friendListInitForFarm')
+}
+function request(function_id, body = {}) {
+ $.get(taskurl(function_id, body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n东东农场: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ console.log(e);
+ } finally {
+ sleep(data);
+ }
+ })
+}
+
+function sleep(response) {
+ console.log('休息一下');
+ setTimeout(() => {
+ console.log('休息结束');
+ Task.next(response)
+ }, 1000);
+}
+
+function taskurl(function_id, body = {}) {
+ return {
+ url: `${JD_API_HOST}?functionId=${function_id}&appid=wh5&body=${escape(JSON.stringify(body))}`,
+ headers: {
+ Cookie: cookie,
+ UserAgent: `Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1`,
+ }
+ }
+}
+
+function taskPostUrl(function_id, body = {}) {
+ return {
+ url: JD_API_HOST,
+ body: `functionId=${function_id}&body=${JSON.stringify(body)}&appid=wh5`,
+ headers: {
+ Cookie: cookie,
+ }
+ }
+}
+
+function timeFormat(time) {
+ let date;
+ if (time) {
+ date = new Date(time)
+ } else {
+ date = new Date();
+ }
+ return date.getFullYear() + '-' + ((date.getMonth() + 1) >= 10 ? (date.getMonth() + 1) : '0' + (date.getMonth() + 1)) + '-' + (date.getDate() >= 10 ? date.getDate() : '0' + date.getDate());
+}
+// prettier-ignore
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
\ No newline at end of file
diff --git a/backUp/jd_joy2.js b/backUp/jd_joy2.js
new file mode 100644
index 00000000..477e15cd
--- /dev/null
+++ b/backUp/jd_joy2.js
@@ -0,0 +1,510 @@
+/*
+jd宠汪汪 搬的https://github.com/uniqueque/QuantumultX/blob/4c1572d93d4d4f883f483f907120a75d925a693e/Script/jd_joy.js
+feedCount:自定义 每次喂养数量; 等级只和喂养次数有关,与数量无关
+推荐每次投喂10个,积累狗粮,然后去聚宝盆赌每小时的幸运奖,据观察,投入3000-6000中奖概率大,超过7000基本上注定亏本,即使是第一名
+Combine from Zero-S1/JD_tools(https://github.com/Zero-S1/JD_tools)
+更新时间:2020-08-15
+注:如果使用Node.js, 需自行安装'crypto-js,got,http-server,tough-cookie'模块. 例: npm install crypto-js http-server tough-cookie got --save
+*/
+// quantumultx
+// [task_local]
+// #京东宠汪汪
+// 15 1,2 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy.js, tag=京东宠汪汪, img-url=https://raw.githubusercontent.com/znz1992/Gallery/master/jdww.png, enabled=true
+// Loon
+// [Script]
+// cron "15 1,2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy.js,tag=京东宠汪汪
+const name = '京东宠汪汪';
+const $ = new Env(name);
+const notify = $.isNode() ? require('./sendNotify') : '';
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//直接用NobyDa的jd cookie
+let cookie = jdCookieNode.CookieJD ? jdCookieNode.CookieJD : $.getdata('CookieJD');
+const cookie2 = jdCookieNode.CookieJD2 ? jdCookieNode.CookieJD2 : $.getdata('CookieJD2');
+
+const FEED_NUM = ($.getdata('joyFeedCount') * 1) || 10 //每次喂养数量 [10,20,40,80]
+
+let jdNotify = $.getdata('jdJoyNotify');
+var Task = step();
+Task.next();
+
+function* step() {
+ let message = '';
+ let subTitle = '';
+ if (cookie) {
+ //获取任务信息
+ let petTaskConfig = yield getPetTaskConfig()
+ if (petTaskConfig.success) {
+ //每日签到
+ let signEveryDayTask = petTaskConfig.datas.find(item => item.taskType === 'SignEveryDay')
+ if (signEveryDayTask && signEveryDayTask.taskStatus == 'processing' && signEveryDayTask.joinedCount == 0) {
+ let signResult = yield SignEveryDay()
+ console.log(`签到结果${JSON.stringify(signResult)}`)
+ } else {
+ console.log(`今天已签到或任务不存在`)
+ }
+ //关注店铺
+ let followShopTask = petTaskConfig.datas.find(item => item.taskType === 'FollowShop')
+ if (followShopTask && followShopTask.taskStatus == 'processing' && followShopTask.taskChance > followShopTask.joinedCount) {
+ for (let shop of followShopTask.followShops) {
+ if (!shop.status) {
+ let followShopResult = yield followShop(shop.shopId)
+ console.log(`关注店铺${shop.name}结果${JSON.stringify(followShopResult)}`)
+ }
+ }
+ } else {
+ console.log(`关注店铺今天已完成或任务不存在`)
+ }
+ //三餐
+ let threeMeals = petTaskConfig.datas.find(item => item.taskType === 'ThreeMeals')
+ if (threeMeals && threeMeals.taskStatus == 'processing') {
+ let threeMealsResult = yield ThreeMeals()
+ console.log(`三餐结果${JSON.stringify(threeMealsResult)}`)
+ } else {
+ // console.log(`今天已关注或任务不存在`)
+ }
+ //逛会场
+ let scanMarketTask = petTaskConfig.datas.find(item => item.taskType === 'ScanMarket')
+ if (scanMarketTask && scanMarketTask.taskStatus == 'processing' && scanMarketTask.taskChance > scanMarketTask.joinedCount) {
+ for (let market of scanMarketTask.scanMarketList) {
+ if (!market.status) {
+ // 解决部分商品market.marketLink为空的时候,浏览不到的bug
+ let clickResult = yield click(market.marketLinkH5)
+ console.log(`逛会场点击${market.marketName}结果${JSON.stringify(clickResult)}`)
+
+ let scanMarketResult = yield ScanMarket(market.marketLinkH5)
+ console.log(`逛会场${market.marketName}结果${JSON.stringify(scanMarketResult)}`)
+ }
+ }
+ } else {
+ console.log(`逛会场今天已完成或任务不存在`)
+ }
+ //关注商品
+ let followGoodTask = petTaskConfig.datas.find(item => item.taskType === 'FollowGood')
+ if (followGoodTask && followGoodTask.taskStatus == 'processing' && followGoodTask.taskChance > followGoodTask.joinedCount) {
+ for (let good of followGoodTask.followGoodList) {
+ if (!good.status) {
+ let followGoodResult = yield followGood(good.sku)
+ console.log(`关注商品${good.skuName}结果${JSON.stringify(followGoodResult)}`)
+ }
+ }
+ } else {
+ console.log(`关注商品今天已完成或任务不存在`)
+ }
+ //浏览频道
+ let followChannelTask = petTaskConfig.datas.find(item => item.taskType === 'FollowChannel')
+ if (followChannelTask && followChannelTask.taskStatus == 'processing' && followChannelTask.taskChance > followChannelTask.joinedCount) {
+ for (let channel of followChannelTask.followChannelList) {
+ if (!channel.status) {
+ let followChannelResult = yield FollowChannel(channel.channelId)
+ console.log(`浏览频道${channel.channelName}结果${JSON.stringify(followChannelResult)}`)
+ }
+ }
+ } else {
+ console.log(`浏览商品今天已完成或任务不存在`)
+ }
+ //浏览商品奖励积分
+ let deskGoodDetails = yield getDeskGoodDetails()
+ if (deskGoodDetails.success) {
+ if (deskGoodDetails.data.deskGoods && deskGoodDetails.data.deskGoods.length > 0) {
+ for (let deskGood of deskGoodDetails.data.deskGoods) {
+ if (!deskGood.status) {
+ let scanDeskGoodResult = yield ScanDeskGood(deskGood.sku)
+ console.log(`浏览频道${deskGood.skuName}结果${JSON.stringify(scanDeskGoodResult)}`)
+ }
+ }
+ }
+ } else {
+ console.log(`浏览商品奖励积分返回结果${JSON.stringify(deskGoodDetails)}`)
+ }
+ // 看激励视频得狗粮
+ let taskVideoRes = yield taskVideo();
+ // console.log(`视频激--任务列表--${JSON.stringify(taskVideoRes)}`);
+ // let sanVideoRes = yield sanVideo();
+ // console.log(`看视频激励结果--${JSON.stringify(sanVideoRes)}`);
+ if (taskVideoRes.success) {
+ let taskArr = {};
+ for (let item of taskVideoRes.datas) {
+ if (item.taskType === 'ViewVideo') {
+ taskArr = item;
+ }
+ }
+ let joinedCount = taskArr.joinedCount || 0;
+ if (taskArr.taskChance === joinedCount) {
+ console.log('今日激励视频已看完')
+ } else {
+ for (let i = 0; i < new Array(taskArr.taskChance - joinedCount).fill('').length; i++) {
+ console.log(`开始第${i+1}次看激励视频`);
+ let sanVideoRes = yield sanVideo();
+ console.log(`看视频激励结果--${JSON.stringify(sanVideoRes)}`);
+ }
+ }
+ }
+ // 好友列表
+ let currentPage = 1;
+ let getFriendsResult = yield getFriends(currentPage);
+ if (getFriendsResult.page && getFriendsResult.datas) {
+ const { pages } = getFriendsResult.page && getFriendsResult.page;
+ for (var i = getFriendsResult.datas.length - 1; i >= 1; i--) {
+ let friendPin = getFriendsResult.datas[i]["friendPin"]
+ console.log(friendPin)
+ // 进入好友房间
+ let enterFriendRoomResult = yield enterFriendRoom(friendPin)
+ let friendHomeCoin = enterFriendRoomResult.data["friendHomeCoin"]
+ console.log('friendHomeCoin = ' + friendHomeCoin)
+ if (enterFriendRoomResult.data["friendHomeCoin"] > 0) {
+ let getFriendCoinResult = yield getFriendCoin(friendPin)
+ console.log(`收取好友金币结果${JSON.stringify(getFriendCoinResult)}`)
+ }
+ let stealStatus = getFriendsResult.datas[i]["stealStatus"]
+ console.log('stealStatus = ' + stealStatus)
+ if (getFriendsResult.datas[i]["stealStatus"] == "can_steal") {
+ let getRandomFoodResult = yield getRandomFood(friendPin)
+ console.log(`收取好友狗粮结果${JSON.stringify(getRandomFoodResult)}`)
+ }
+ let status = getFriendsResult.datas[i]["status"]
+ console.log('status = ' + status)
+ if (getFriendsResult.datas[i]["status"] == "not_feed") {
+ let helpFeedResult = yield helpFeed(friendPin)
+ console.log(`帮忙喂食结果${JSON.stringify(helpFeedResult)}`)
+ }
+ // if (friendPin != "jd_6162cd8a30268") {
+
+ // }
+ }
+ if (pages > 1) {
+ currentPage ++;
+ getFriendsResult = yield getFriends(currentPage);
+ for (var i = getFriendsResult.datas.length - 1; i >= 1; i--) {
+ let friendPin = getFriendsResult.datas[i]["friendPin"]
+ console.log(friendPin)
+ // 进入好友房间
+ let enterFriendRoomResult = yield enterFriendRoom(friendPin)
+ let friendHomeCoin = enterFriendRoomResult.data["friendHomeCoin"]
+ console.log('friendHomeCoin = ' + friendHomeCoin)
+ if (enterFriendRoomResult.data["friendHomeCoin"] > 0) {
+ let getFriendCoinResult = yield getFriendCoin(friendPin)
+ console.log(`收取好友金币结果${JSON.stringify(getFriendCoinResult)}`)
+ }
+ let stealStatus = getFriendsResult.datas[i]["stealStatus"]
+ console.log('stealStatus = ' + stealStatus)
+ if (getFriendsResult.datas[i]["stealStatus"] == "can_steal") {
+ let getRandomFoodResult = yield getRandomFood(friendPin)
+ console.log(`收取好友狗粮结果${JSON.stringify(getRandomFoodResult)}`)
+ }
+ let status = getFriendsResult.datas[i]["status"]
+ console.log('status = ' + status)
+ if (getFriendsResult.datas[i]["status"] == "not_feed") {
+ let helpFeedResult = yield helpFeed(friendPin)
+ console.log(`帮忙喂食结果${JSON.stringify(helpFeedResult)}`)
+ }
+ // if (friendPin != "jd_6162cd8a30268") {
+
+ // }
+ }
+ }
+ }
+
+ // 领取好友助力后的狗粮
+ let getFoodRes = yield getFood();
+ console.log(`领取好友助力后的狗粮结果${JSON.stringify(getFoodRes)}`)
+ // 喂食
+ let feedPetsResult = yield feedPets()
+ console.log(`喂食结果${JSON.stringify(feedPetsResult)}`)
+ if (feedPetsResult.success) {
+ if (feedPetsResult.errorCode === 'feed_ok') {
+ console.log('喂食成功')
+ } else if (feedPetsResult.errorCode === 'time_error') {
+ console.log('喂食失败:正在食用')
+ }
+ }
+ // 喂养状态
+ let enterRoomResult = yield enterRoom()
+ console.log(`喂养状态${JSON.stringify(enterRoomResult)}`)
+ message = `现有积分: ${enterRoomResult.data.petCoin}\n现有狗粮: ${enterRoomResult.data.petFood}\n喂养次数: ${enterRoomResult.data.feedCount}\n宠物等级: ${enterRoomResult.data.petLevel}`
+ subTitle = `【用户名】${enterRoomResult.data.pin}`
+ } else {
+ console.log(`任务信息${JSON.stringify(petTaskConfig)}`)
+ if (petTaskConfig.errorCode === 'B0001') {
+ $.setdata('', 'CookieJD');//cookie失效,故清空cookie。
+ $.msg(name, '【提示】京东cookie已失效,请重新登录获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ if ($.isNode() && notify.SCKEY) {
+ notify.sendNotify(`京东账号${UserName}cookie已失效`, '请重新登录获取cookie');
+ }
+ $.done();
+ return
+ } else {
+ message += `${petTaskConfig.errorMessage}`;
+ }
+ }
+ } else {
+ $.msg(name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', { "open-url": "https://bean.m.jd.com/" });
+ $.done();
+ return
+ }
+ console.log(`jdNotify${jdNotify}`)
+ console.log(`jdNotify${jdNotify === 'false'}`)
+ if (!jdNotify || jdNotify === 'false') {
+ $.msg(name, subTitle, message);
+ }
+ $.done();
+}
+
+function click(marketLink) {
+ request(`https://jdjoy.jd.com/pet/icon/click?reqSource=h5&iconCode=scan_market&linkAddr=${marketLink}`)
+}
+
+//浏览商品
+function ScanDeskGood(sku) {
+ requestPost(`https://jdjoy.jd.com/pet/scan`, JSON.stringify({ sku: sku, taskType: 'ScanDeskGood', reqSource: 'h5' }), 'application/json')
+}
+
+//浏览商品奖励积分任务
+function getDeskGoodDetails() {
+ request(`https://jdjoy.jd.com/pet/getDeskGoodDetails?reqSource=h5`)
+}
+
+//浏览频道
+function FollowChannel(channelId) {
+ requestPost(`https://jdjoy.jd.com/pet/scan`, JSON.stringify({ channelId: channelId, taskType: 'FollowChannel', reqSource: 'h5' }), 'application/json')
+}
+
+//关注商品
+function followGood(sku) {
+ requestPost(`https://jdjoy.jd.com/pet/followGood`, `sku=${sku}&reqSource=h5`)
+}
+
+//逛会场
+function ScanMarket(marketLink,) {
+ requestPost(`https://jdjoy.jd.com/pet/scan`, JSON.stringify({ marketLink: marketLink, taskType: 'ScanMarket', reqSource: 'h5' }), 'application/json')
+}
+//关注店铺
+function followShop(shopId) {
+ requestPost(`https://jdjoy.jd.com/pet/followShop`, `shopId=${shopId}&reqSource=h5`)
+}
+
+//每日签到
+function SignEveryDay() {
+ request(`https://jdjoy.jd.com/pet/sign?taskType=SignEveryDay`)
+}
+//获取任务
+function getPetTaskConfig() {
+ request(`https://jdjoy.jd.com/pet/getPetTaskConfig?reqSource=h5`)
+}
+//三餐奖励
+function ThreeMeals() {
+ request(`https://jdjoy.jd.com/pet/getFood?taskType=ThreeMeals`)
+}
+
+//喂食
+function feedPets() {
+ request(`https://jdjoy.jd.com/pet/feed?feedCount=${FEED_NUM}`)
+}
+
+//喂养状态
+function enterRoom() {
+ request(`https://jdjoy.jd.com/pet/enterRoom?reqSource=h5`)
+}
+//看激励视频
+function taskVideo() {
+ const option = {
+ url: 'https://draw.jdfcloud.com//pet/getPetTaskConfig?reqSource=weapp',
+ headers: {
+ 'Cookie': cookie,
+ "Host": "draw.jdfcloud.com",
+ "Content-Type": "application/json",
+ "reqSource": "h5",
+ "Connection": "keep-alive",
+ "Accept": "*/*",
+ "User-Agent": "jdapp;iPhone;9.0.4;13.5.1;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;ADID/3B3AD5BC-B5E6-4A08-B32A-030CD805B5DD;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167283;supportBestPay/0;jdSupportDarkMode/0;pv/206.5;apprpd/MyJD_Main;ref/https%3A%2F%2Fjdjoy.jd.com%2Fpet%2Findex%3Fun_area%3D19_1601_50258_51885%26lng%3D113.3259241595859%26lat%3D23.20459586587208;psq/4;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|831;jdv/0|kong|t_1001777500_|jingfen|ca196c5ef31b4f7680c45e9334f94ba2|1596887714965|1596887717;adk/;app_device/IOS;pap/JA2015_311210|9.0.4|IOS 13.5.1;Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
+ "Referer": "https://jdjoy.jd.com/pet/index?un_area=19_1601_50258_51885&lng=113.3259241595859&lat=23.20459586587208",
+ "Accept-Language": "zh-cn",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ };
+ $.get(option, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ sleep(data);
+ }
+ })
+}
+
+//好友列表
+function getFriends(currentPage) {
+ request(`https://jdjoy.jd.com/pet/getFriends?itemsPerPage=20¤tPage=${currentPage}`)
+}
+
+//进入好友房间
+function enterFriendRoom(friendPin) {
+ let url = "https://jdjoy.jd.com/pet/enterFriendRoom?friendPin="+friendPin
+ let encodeURI_url = encodeURI(url)
+ request(encodeURI_url)
+}
+
+//收集好友金币
+function getFriendCoin(friendPin) {
+ let url = "https://jdjoy.jd.com/pet/getFriendCoin?friendPin="+friendPin
+ let encodeURI_url = encodeURI(url)
+ request(encodeURI_url)
+}
+
+//收集好友狗粮
+function getRandomFood(friendPin) {
+ let url = "https://jdjoy.jd.com/pet/getRandomFood?friendPin="+friendPin
+ let encodeURI_url = encodeURI(url)
+ request(encodeURI_url)
+}
+
+//帮忙喂食
+function helpFeed(friendPin) {
+ let url = "https://jdjoy.jd.com/pet/helpFeed?friendPin="+friendPin
+ let encodeURI_url = encodeURI(url)
+ request(encodeURI_url)
+}
+
+function sanVideo() {
+ const body = JSON.stringify({"taskType":"ViewVideo","reqSource":"weapp"});
+ const option = {
+ url: 'https://draw.jdfcloud.com//pet/scan',
+ body: body,
+ headers: {
+ 'Cookie': cookie,
+ "Host": "draw.jdfcloud.com",
+ "Connection": "keep-alive",
+ "Content-Length": "44",
+ "Content-Type": "application/json",
+ "reqSource": "weapp",
+ "Accept-Encoding": "gzip,compress,br,deflate",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.14(0x17000e2b) NetType/4G Language/zh_CN",
+ "Referer": "https://servicewechat.com/wxccb5c536b0ecd1bf/617/page-frame.html"
+ }
+ };
+ $.post(option, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ sleep(data);
+ }
+ })
+}
+// 领取好友助力后的狗粮
+function getFood() {
+ let url = "https://jdjoy.jd.com/pet/getFood?taskType=InviteUser";
+ request(url)
+}
+function request(url) {
+ console.log(`\n request url:::${url}\n`);
+ const option = {
+ url: url,
+ headers: {
+ 'Cookie': cookie,
+ 'reqSource': 'h5',
+ 'Host': 'jdjoy.jd.com',
+ 'Connection': 'keep-alive',
+ 'Content-Type': 'application/json',
+ 'Referer': 'https://jdjoy.jd.com/pet/index',
+ 'User-Agent': 'jdapp;iPhone;8.5.8;13.4.1;9b812b59e055cd226fd60ebb5fd0981c4d0d235d;network/wifi;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/0;model/iPhone9,2;addressid/138109592;hasOCPay/0;appBuild/167169;supportBestPay/0;jdSupportDarkMode/0;pv/200.75;apprpd/MyJD_Main;ref/MyJdMTAManager;psq/29;ads/;psn/9b812b59e055cd226fd60ebb5fd0981c4d0d235d|608;jdv/0|direct|-|none|-|1587263154256|1587263330;adk/;app_device/IOS;pap/JA2015_311210|8.5.8|IOS 13.4.1;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
+ 'Accept-Language': 'zh-cn',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ }
+ };
+ $.get(option, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ sleep(data);
+ }
+ // if (err) {
+ // console.log("\n京东宠汪汪: API查询请求失败 ‼️‼️")
+ // $.msg('京东宠汪汪', `脚本执行中断`, `京东宠汪汪: API查询请求失败 ‼️‼️`);
+ // $.done();
+ // } else {
+ // try {
+ // data = JSON.parse(data);
+ // } catch (e) {
+ // console.log(e);
+ // } finally {
+ // sleep(data);
+ // }
+ // }
+ })
+}
+
+function requestPost(url, body, ContentType) {
+ console.log(`\n request url:::${url}\n`);
+ console.log(`request body:${body}\n`);
+ console.log(`request ContentType:${ContentType}\n`);
+ const options = {
+ url: url,
+ body: body,
+ headers: {
+ Cookie: cookie,
+ UserAgent: `Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1`,
+ reqSource: 'h5',
+ 'Content-Type': ContentType,
+ 'Host': 'jdjoy.jd.com',
+ 'Referer': 'https://jdjoy.jd.com/pet/index?un_area=5_274_49707_49973&lng=116.8439659502069&lat=39.95722551778479',
+ 'Accept-Language': 'zh-cn',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ }
+ };
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n京东宠汪汪: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ sleep(data);
+ }
+ // if (err) {
+ // console.log("\n京东宠汪汪: API查询请求失败 ‼️‼️")
+ // $.msg('京东宠汪汪', `${err.name}`, `京东宠汪汪: API查询请求失败 ‼️‼️`);
+ // $.done();
+ // } else {
+ // try {
+ // data = JSON.parse(data);
+ // } catch (e) {
+ // console.log(e);
+ // } finally {
+ // sleep(data);
+ // }
+ // }
+ })
+}
+
+function sleep(response) {
+ console.log('休息一下');
+ setTimeout(() => {
+ console.log('休息结束');
+ Task.next(response)
+ }, 1000);
+}
+
+// https://jdjoy.jd.com/pet/getPetTaskConfig?reqSource=h5
+// prettier-ignore
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;$.isMute||(this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o))),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
\ No newline at end of file
diff --git a/backUp/jd_joy_help2.js b/backUp/jd_joy_help2.js
new file mode 100644
index 00000000..2a56340e
--- /dev/null
+++ b/backUp/jd_joy_help2.js
@@ -0,0 +1,45 @@
+/**
+宠汪汪强制为别人助力(助力一个好友你自己可以获得30积分,一天上限是帮助3个好友,自己获得90积分,不管助力是否成功,对方都会成为你的好友)
+更新地址:https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_help.js
+更新时间:2020-08-28
+目前提供了304位好友的friendPin供使用。脚本随机从里面获取一个,助力成功后,退出小程序重新点击进去开始助力新的好友
+欢迎大家使用 https://jdjoy.jd.com/pet/getFriends?itemsPerPage=20¤tPage=1 (currentPage=1表示第一页好友,=2表示第二页好友)
+提供各自账号列表的friendPin给我
+如果想设置固定好友,那下载下来放到本地使用,可以修改friendPin换好友(助力一好友后,更换一次friendPin里面的内容)
+感谢github @Zero-S1提供
+使用方法:
+①设置好相应软件的重写
+②从京东APP宠汪汪->领狗粮->邀请好友助力,分享给你小号微信或者微信的文件传输助手。 自己再打开刚才的分享,助力成功后,退出小程序重新进去刚才分享的小程序即可
+③如提示好友人气旺,说明此好友已满了三人助力,需重新进出小程序,重新进入来客有礼-宠汪汪。
+[MITM]
+hostname = draw.jdfcloud.com
+surge
+[Script]
+宠汪汪强制为别人助力= type=http-request,pattern=(^https:\/\/draw\.jdfcloud\.com\/\/pet\/enterRoom\?reqSource=weapp&invitePin=.*+(&inviteSource=task_invite&shareSource=\w+&inviteTimeStamp=\d+&openId=\w+)?|^https:\/\/draw\.jdfcloud\.com\/\/pet\/helpFriend\?friendPin),requires-body=1,max-size=0,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_help.js
+
+圈x
+[rewrite_local]
+^https:\/\/draw\.jdfcloud\.com\/\/pet\/enterRoom\?reqSource=weapp&invitePin=.*+(&inviteSource=task_invite&shareSource=\w+&inviteTimeStamp=\d+&openId=\w+)?|^https:\/\/draw\.jdfcloud\.com\/\/pet\/helpFriend\?friendPin url script-request-header https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_help.js
+
+ LOON:
+[Script]
+http-request ^https:\/\/draw\.jdfcloud\.com\/\/pet\/enterRoom\?reqSource=weapp&invitePin=.*+(&inviteSource=task_invite&shareSource=\w+&inviteTimeStamp=\d+&openId=\w+)?|^https:\/\/draw\.jdfcloud\.com\/\/pet\/helpFriend\?friendPin script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_help.js
+, requires-body=true, timeout=10, tag=宠汪汪强制为别人助力
+
+
+你也可从下面链接拿好友的friendPin(复制链接到有京东ck的浏览器打开即可)
+
+https://jdjoy.jd.com/pet/getFriends?itemsPerPage=20¤tPage=1
+**/
+let url = $request.url
+const friendsArr = ["jd_136833sjn","jd_131335rbv","jd_4f044bdd67a3f","jd_176968gwf","jd_136744uks","jd_139559isq","jd_151698nhe","jd_182775ekl","jd_139643ldl","jd_159166edm","jd_157100apb","jd_131843tvo","jd_152554vhs","jd_134283prpb","jd_139988mgfo","jd_133590dtg","jd_63636969e55cb","jd_135565fsg","jd_189071npd","jd_138430zvw","jd_139582hlp","jd_815411720","jd_157642zjc","jd_177753pzb","jd_137918wwl","jd_188675alaf","jd_186718otu","jd_139139bew","jd_180436ggd","jd_52315d900a88a","jd_137689rjx","jd_151106nxb","jd_153879dzp","jd_185840vwq","jd_6194e9ae2cebf","jd_186221rph","jd_153810ylu","jd_189288egp","jd_158791okv","jd_139132erd","jd_159304acn","jd_138899zum","jd_187182akf","jd_136324bjqi","jd_131616wdo","jd_155384iof","jd_186326vtm","jd_zoezhu","jd_135075ahc","jd_138141ill","jd_139773zbm","jd_158416jwas","jd_182328ujc","jd_135999wrw","jd_181325tmk","jd_188254zgv","jd_3712425","jd_153711hhx","jd_176020ylg","jd_136436iuk","jd_180430yxp","jd_159958jmr","jd_155382wjy","jd_135819ueh","jd_132125ish","jd_181196mrhz","jd_138403wnm","jd_181568lrk","jd_155785zic","jd_150712koi","jd_137012gwu","jd_137638siy","jd_183011sph","jd_158224asm","jd_1652541161","jd_137332lgt","jd_181991fgs","jd_189347opuc","jd_181898rlw","jd_136526chs","jd_152616rsg","jd_151410rti","jd_139657jxa","jd_187978fdq","jd_136039csx","jd_186029urn","jd_138681pjy","jd_138204hpd","jd_138246wgz","jd_131177aol","jd_182100ofj","jd_282335851","jd_180210xwj","jd_139400bou","jd_189751xfv","jd_133781olg","jd_155229qbl","jd_dady_a","jd_183890opj","jd_136830xsh","jd_138731rkth","jd_135476kin","jd_3302023","jd_suns932","jd_158958xju","jd_688050784","jd_177467uaf","jd_138950cao","jd_181726mer","jd_138194nvx","jd_2010wwk","jd_139295gxw","jd_173931eeb","jd_189713iss","jd_139894msf","jd_158767vct","jd_159210nml","jd_133230bpy","jd_150771igh","jd_4c9dced2ff301","jd_133025pjb","jd_184751jlf","jd_139379bhj","jd_4900071","jd_137188nnv","jd_153678kxr","jd_6b04334c27336","jd_185217cfd","jd_155892hhe","jd_gxq721","jd_duqing821","jd_185087idh","jd_181528ojs","jd_136778wigm","jd_137903zfgq","jd_134785qjj","jd_159536nii","jd_188492aqx","jd_152226ypk","jd_183815eio","jd_139250pva","jd_151739nli","jd_135202pbl","jd_138201yhi","jd_137642nzw","jd_136600ysr","jd_138220eom","jd_178595cqf","jd_186682kjk","jd_136205srq","jd_138820xtj","jd_152322tkj","jd_150225ipi","jd_133287tje","jd_guba01","jd_187568qui","jd_158753hfl","jd_159816boe","jd_139297psw","jd_138564ibo","jd_188105wjm","jd_180199ekd","jd_134164zgp","jd_181547miy","jd_137030gdm","jd_183197ekf","jd_155187jhm","jd_158363nbzh","jd_151335bxo","jd_139616ywb","jd_156600kfm","jd_352215391","jd_620475312","jd_137997ole","jd_186060jol","jd_7824770b3d748","jd_6b8ba51989353","jd_152712oax","jd_177413lgq","jd_134172lqw","jd_135035dya","jd_135388arv","jd_135013mbs","jd_150897xln","jd_133827ois","jd_133307ffi","jd_138326tzrx","jd_186639utz","jd_Thin779","jd_137173yni","jd_159843fjq","jd_152590bui","jd_180225wpx","jd_187579piq","jd_156758shb","jd_139960nex","jd_138817fsp","jd_181696mtg","jd_137911aamo","jd_135891nxk","jd_177761izc","jd_153337fyq","jd_114559761","jd_Xsgfsj","jd_139965zpe","jd_185459vvx","jd_189214its","jd_151615dmb","jd_138460bsc","jd_138618yqc","jd_187290mur","jd_151318bht","jd_155344pmg","jd_137302fjz","jd_182505eyw","jd_136416nan","jd_151651ncw","jd_137131dya","jd_133471mru","jd_181116wrh","jd_139819ahg","jd_138219eja","jd_136695iqb","jd_158215wjb","jd_107071797","jd_155664eni","jd_182384yok","jd_139611sco","jd_157652hlh","jd_137036vhs","jd_188476ctf","jd_178651ldby","jd_158107bvn","jd_150342aox","jd_150283rncu","jd_131367qhs","jd_133052bem","jd_189317gau","jd_134186sbh","jd_138637pbp","jd_glwang2","jd_189557iiq","jd_138906xlbm","jd_152360yuk","jd_134551yla","jd_135832apl","jd_155448yab","jd_138388paz","jd_1352513187","jd_135464sqz","jd_153298yxo","jd_139208nicz","jd_136608wyr","jd_133053kbn","jd_135034bbx","jd_2133952","jd_187382exm","jd_135063kvb","jd_130844lme","jd_137295ajrg","jd_136810xds","jd_182771zcmi","jd_qwertag13568370gf","jd_189200fiu","jd_159871grf","jd_q105946","jd_182028tnj","jd_153718opj","jd_136850dhv","jd_159162dxb","jd_155267dkh","jd_152763ghe","jd_137104jyuf","jd_136426poa","jd_153920qlg","jd_159715spj","jd_135772nxy","jd_321051","jd_fanm537","jd_137104vuum","jd_177212uid","jd_150312pgc","jd_152569xgz","jd_136994ddl","jd_186223kew","jd_139779ovt","jd_181193dok","jd_189461sem","jd_138245yum","jd_134136kgip","jd_189543hpt","jd_132180xif","jd_182857oox","jd_186245aal","jd_3555750","jd_188502cqy","jd_186910cwu","jd_182829qbch","jd_182297xcme","jd_159708cng","jd_133330ift","jd_131904zwu","jd_182801xpy","jd_150075wud","jd_156874jup","jd_189964qzl","jd_158132cle","jd_sun723","jd_182176mee","jd_188503acjo","jd_158537jdm","jd_159485zvu","jd_180011ejj","jd_135829xzp","jd_136921jpe","jd_152629pmx","jd_189710eck","jd_189397oeo","jd_189592sul","jd_150576adh","jd_159411rzd","jd_134601izn","jd_180053tsa","jd_138226cmgb","jd_183757gbgp","jd_139289bij","jd_lx_a","jd_138562oek","jd_183691xyg","jd_151429qhv","jd_139804lhb","jd_136042bzg","jd_138102ldq","jd_135986nkf","jd_truman","jd_181700kju","jd_151064dhx","jd_150907ahj","jd_186652jxh","jd_418fef3fab12f","jd_159527gqz","jd_138237dcn","jd_134119thub","jd_wrrr0","jd_180498ozp","jd_138531irs","jd_131136fru","jd_185228tkh","jd_131910jzm","jd_151063mhz","jd_58096918e5234","jd_187187rvl","jd_157537jpe","jd_6cebe25400109","jd_1175189","jd_42a743e0b8651","jd_153063yds","jd_177692lwq","jd_152020gzy","jd_138898puv","jd_155525lpff","jd_151123xea","jd_2672389178","jd_178258cff","jd_158191ansh","jd_153280zoy","jd_hl31450","jd_150416qyl","jd_152315mcm","jd_135648axo","jd_4cfd4439d158f","jd_134815cgd","jd_135087ela","jd_180921pam","jd_135610gth","jd_156973ipc","jd_188112gxw","jd_188110wps","jd_173589vmd","jd_135604ngz","jd_158219erd","jd_158449aru","jd_166312hcv","jd_151360sty","jd_183282vqt","jd_139208bac","jd_139276cex","jd_626010305","jd_158181bbe","jd_134339ytdb","jd_139206mkrh","jd_181579uxd","jd_137015nmi","jd_511064173","jd_182924yvbk","jd_137378axvd","jd_157351ype","jd_135161rmsc","jd_188425wum","jd_135315ofn","jd_131160xix","jd_186339gil","jd_150862gpa","jd_132385iqb","jd_138132znr","jd_384180113","jd_1362103","jd_139409xbn","jd_133146qwv","jd_132661jmj","jd_158676edk","jd_133316lld","jd_188714irz","jd_159103vma","jd_131148pkg","jd_152769boe","jd_138846yad","jd_132036kqj","jd_183813dsf","jd_189617vkq","jd_185715pgz","jd_159905euu","jd_134631ehy","jd_176278mmr","jd_5161d94861016","jd_135466mil","jd_177287yyr","jd_139720epl","jd_132037mat","jd_139830uaz","jd_138988jgl","jd_137222hds","jd_177038fca","jd_137096jyx","jd_189081vhx","jd_189985hzh","jd_151927ufa","jd_135145znf","jd_139306rrn","jd_130650d","jd_134321vtn","jd_151515epa","jd_135137jaia","jd_137164augj","jd_130024lmi","jd_139602byf","jd_183766qfi","jd_139705lek","jd_133834qau","jd_180157euk","jd_139111kud","jd_155116pea","jd_159626fgnc","jd_185154lww","jd_177435tuc","jd_137292pwe","jd_177395xqs","jd_133053jus","jd_151339jhx","jd_135087ljd","jd_53b1c5c35ac9a","jd_qiuche549","jd_158164uel","jd_138107wud","jd_199771clu","jd_186753jcs","jd_187150ylk","jd_138974rxt","jd_103433211","jd_185821hfr","jd_139502ycf","jd_137713uyd","jd_187698feo","jd_136089okg","jd_4352325","jd_139639yoj","jd_979798715","jd_131321aoc","jd_185224kzc","jd_151639rszh","jd_185669lfi","jd_lideguang_2011","jd_138725hyc","jd_qaa011","jd_135928ucx","jd_649f9eae0be6c","jd_155229vlt","jd_139885sgt","jd_136220wqh","jd_130741cki","jd_151611ebv","jd_189756rue","jd_5e95dcfd762f4","jd_6261731","jd_135495gbf","jd_150042iil","jd_137894frb","jd_135873xqmi","jd_138593nkp","jd_175412852","jd_139690dad","jd_43a2e9c6537f8","jd_138175wuk","jd_131716dfh","jd_138556pnn","jd_5020276315","jd_177316iqo","jd_181375rvj","jd_229003983","jd_180789bug","jd_150682yxz","jd_152181wlw","jd_224275759","jd_136102svi","jd_9929897714","jd_139691wvgh","jd_189305xgc","jd_133211nev","jd_138697wdw","jd_189314rid","jd_182520tcmf","jd_184399ypg","jd_156312gqm","jd_183257kbc","jd_8745170","jd_151758sra","jd_136000dfw","jd_138337tbg","jd_xishuwulu","jd_189shijz","jd_182257jvd","jd_156983msp","jd_316882724","jd_135808jxz","jd_135557shtf","jd_233102237","jd_186099qlx","jd_185263tir","jd_406bfe50a3525","jd_180669zge","jd_6402aba2128d9","jd_181335kmh","jd_137378ult","jd_150022yxf","jd_188540les","jd_133774erh","jd_138784rjl","jd_182817gcd","jd_134724ief","jd_132536dsy","jd_136604veq","jd_189715ich","jd_182876ynp","jd_177737trf","jd_186552tmg","jd_152104bbn","jd_136219qpt","jd_138262kmx","jd_176204injl","jd_183772tnk","jd_152150ixc","jd_139291nono","jd_186430qkb","jd_183182ynu","jd_135980gkl","jd_158520qfph","jd_135592ugy","jd_139445whz","jd_151308una","jd_150849jbh","jd_655789303","jd_136906lqt","jd_156206yfx","jd_137619mem","jd_152667dao","jd_138597bto","jd_189315etn","jd_151132kre","jd_239626183","jd_sdwh1","jd_136817uwz","jd_187119rqc","jd_yzztt","jd_157563ywzn","jd_zran012","jd_178280jig","jd_070889622","jd_132865tfs","jd_137098qlp","jd_159314ahj","jd_135530jsi","jd_156985tlp","jd_182109kiy","jd_183501fyv","jd_151668vpv","jd_138155ahi","jd_zwh082","jd_135647kui","jd_139149ipt","jd_186993pyi","jd_159524eku","jd_135392iff","jd_177019dfk","jd_185008kmg","jd_18259236618"];
+//随机生成m(小)到n(大)的数,包含m和n
+function randomFriendPin(m,n) {
+ return Math.round(Math.random()*(n - m) + m);
+}
+let friendPin = friendsArr[randomFriendPin(0, friendsArr.length - 1)] //强制为对方助力,可成为好友关系
+friendPin = encodeURI(friendPin);
+const timestamp = new Date().getTime()
+newUrl = url.replace(/friendPin=.*?$/i, "friendPin=" + friendPin).replace(/invitePin=.*?$/i, "invitePin=" + friendPin).replace(/inviteTimeStamp=.*?$/i, "inviteTimeStamp=" + timestamp + "&")
+console.log(newUrl)
+$done({ url: newUrl })
diff --git a/backUp/jd_moneyTree2.js b/backUp/jd_moneyTree2.js
new file mode 100644
index 00000000..dbd96fca
--- /dev/null
+++ b/backUp/jd_moneyTree2.js
@@ -0,0 +1,452 @@
+/*
+京东摇钱树 :https://gitee.com/lxk0301/scripts/raw/master/jd_moneyTree.js
+更新时间:2020-07-22
+注:如果使用Node.js, 需自行安装'crypto-js,got,http-server,tough-cookie'模块. 例: npm install crypto-js http-server tough-cookie got --save
+*/
+// quantumultx
+// [task_local]
+// #京东摇钱树
+// 3 */2 * * * https://gitee.com/lxk0301/scripts/raw/master/jd_moneyTree.js, tag=京东摇钱树, img-url=https://raw.githubusercontent.com/znz1992/Gallery/master/moneyTree.png, enabled=true
+// Loon
+// [Script]
+// cron "3 */2 * * *" script-path=https://gitee.com/lxk0301/scripts/raw/master/jd_moneyTree.js,tag=京东摇钱树
+const Notice = 2;//设置运行多少次才通知。
+const name = '京东摇钱树';
+const $ = new Env(name);
+const Key = '';//单引号内自行填写您抓取的京东Cookie
+//直接用NobyDa的jd cookie
+const cookie = Key ? Key : $.getdata('CookieJD');
+let jdNotify = $.getdata('jdMoneyTreeNotify');
+let treeMsgTime = $.getdata('treeMsgTime') >= Notice ? 0 : $.getdata('treeMsgTime') || 0;
+
+const JD_API_HOST = 'https://ms.jr.jd.com/gw/generic/uc/h5/m';
+let userInfo = null, taskInfo = [], message = '', subTitle = '', fruitTotal = 0;
+let gen = entrance();
+gen.next();
+function* entrance() {
+ if (!cookie) {
+ $.msg(name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', { "open-url": "https://bean.m.jd.com/" });
+ $.done();
+ return
+ }
+ yield user_info();
+ yield signEveryDay();//每日签到
+ yield dayWork();//做任务
+ console.log('开始做浏览任务了')
+ console.log(`浏览任务列表::${JSON.stringify(taskInfo)}`);
+ // for (let task of taskInfo) {
+ // if (task.mid && task.workStatus === 0) {
+ // console.log('开始做浏览任务');
+ // yield setUserLinkStatus(task.mid);
+ // } else if (task.mid && task.workStatus === 1){
+ // console.log(`开始领取浏览后的奖励:mid:${task.mid}`);
+ // let receiveAwardRes = await receiveAward(task.mid);
+ // console.log(`领取浏览任务奖励成功:${JSON.stringify(receiveAwardRes)}`)
+ // } else if (task.mid && task.workStatus === 2) {
+ // console.log('所有的浏览任务都做完了')
+ // }
+ // }
+ yield harvest(userInfo);//收获
+
+ if (fruitTotal > 380) {
+ //金果数量大于380,才可以卖出
+ yield sell();
+ }
+ yield myWealth();
+ // console.log(`----${treeMsgTime}`)
+ msgControl();
+ console.log('任务做完了');
+ console.log(`运行脚本次数和设置的次数是否相等::${($.getdata('treeMsgTime') * 1) === Notice}`);
+ console.log(`box订阅静默运行-是否打开::${jdNotify || jdNotify === 'true'}`);
+ console.log(`是否弹窗::${(($.getdata('treeMsgTime') * 1) === Notice) && (!jdNotify || jdNotify === 'false')}`);
+ if (!jdNotify || jdNotify === 'false') {
+ // $.msg(name, subTitle, message);
+ if (($.getdata('treeMsgTime') * 1) === Notice) {
+ $.msg(name, subTitle, message);
+ $.setdata('0', 'treeMsgTime');
+ }
+ }
+ $.done();
+}
+
+function user_info() {
+ console.log('初始化摇钱树个人信息');
+ const params = {
+ "sharePin":"",
+ "shareType":1,
+ "channelLV":"",
+ "source":0,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ params.riskDeviceParam = JSON.stringify(params.riskDeviceParam);
+ request('login', params).then((res) => {
+ console.log(`登录信息:${JSON.stringify(res)}\n`);
+ if (res && res.resultCode === 0) {
+ console.log('resultCode为0')
+ if (res.resultData.data) {
+ console.log('res.resultData.data有值')
+ userInfo = res.resultData.data;
+ if (userInfo.realName) {
+ console.log(`助力码sharePin为::${userInfo.sharePin}`);
+ subTitle = `${userInfo.nick}的${userInfo.treeInfo.treeName}`;
+ // message += `【我的金果数量】${userInfo.treeInfo.fruit}\n`;
+ // message += `【我的金币数量】${userInfo.treeInfo.coin}\n`;
+ // message += `【距离${userInfo.treeInfo.level + 1}级摇钱树还差】${userInfo.treeInfo.progressLeft}\n`;
+ gen.next();
+ } else {
+ $.msg(name, `【提示】请先去京东app参加摇钱树活动\n入口:我的->游戏与互动->查看更多`, '', {"open-url": "openApp.jdMobile://"});
+ $.done();
+ return
+ gen.return();
+ }
+ }
+ } else {
+ console.log('走了else');
+ if (res.resultCode === 3) {
+ $.setdata('', 'CookieJD');//cookie失效,故清空cookie。
+ $.msg(name, '【提示】京东cookie已失效,请重新登录获取', 'https://bean.m.jd.com/', { "open-url": "https://bean.m.jd.com/" });
+ $.done();
+ return
+ }
+ gen.return();
+ }
+ });
+}
+
+async function dayWork() {
+ console.log(`开始做任务userInfo了\n`)
+ const data = {
+ "source":0,
+ "linkMissionIds":["666","667"],
+ "LinkMissionIdValues":[7,7],
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ };
+ let response = await request('dayWork', data);
+ console.log(`获取任务的信息:${JSON.stringify(response)}\n`)
+ let canTask = [];
+ taskInfo = [];
+ if (response.resultCode === 0) {
+ if (response.resultData.code === '200') {
+ response.resultData.data.map((item) => {
+ if (item.prizeType === 2) {
+ canTask.push(item);
+ }
+ if (item.workType === 7 && item.prizeType === 0) {
+ // missionId.push(item.mid);
+ taskInfo.push(item);
+ }
+ // if (item.workType === 7 && item.prizeType === 0) {
+ // missionId2 = item.mid;
+ // }
+ })
+ }
+ }
+ console.log(`canTask::${JSON.stringify(canTask)}\n`)
+ console.log(`浏览任务列表taskInfo::${JSON.stringify(taskInfo)}\n`)
+ for (let item of canTask) {
+ if (item.workType === 1) {
+ // 签到任务
+ // let signRes = await sign();
+ // console.log(`签到结果:${JSON.stringify(signRes)}`);
+ if (item.workStatus === 0) {
+ // const data = {"source":2,"workType":1,"opType":2};
+ // let signRes = await request('doWork', data);
+ let signRes = await sign();
+ console.log(`三餐签到结果:${JSON.stringify(signRes)}`);
+ } else if (item.workStatus === 2) {
+ console.log(`三餐签到任务已经做过`)
+ }
+ } else if (item.workType === 2) {
+ // 分享任务
+ if (item.workStatus === 0) {
+ // share();
+ const data = {"source":0,"workType":2,"opType":1};
+ //开始分享
+ // let shareRes = await request('doWork', data);
+ let shareRes = await share(data);
+ console.log(`开始分享的动作:${JSON.stringify(shareRes)}`);
+ const b = {"source":0,"workType":2,"opType":2};
+ // let shareResJL = await request('doWork', b);
+ let shareResJL = await share(b);
+ console.log(`领取分享后的奖励:${JSON.stringify(shareResJL)}`)
+ } else if (item.workStatus === 2) {
+ console.log(`分享任务已经做过`)
+ }
+ }
+ }
+ for (let task of taskInfo) {
+ if (task.mid && task.workStatus === 0) {
+ console.log('开始做浏览任务');
+ // yield setUserLinkStatus(task.mid);
+ let aa = await setUserLinkStatus(task.mid);
+ console.log(`aaa${JSON.stringify(aa)}`);
+ } else if (task.mid && task.workStatus === 1){
+ console.log(`workStatus === 1开始领取浏览后的奖励:mid:${task.mid}`);
+ let receiveAwardRes = await receiveAward(task.mid);
+ console.log(`领取浏览任务奖励成功:${JSON.stringify(receiveAwardRes)}`)
+ } else if (task.mid && task.workStatus === 2) {
+ console.log('所有的浏览任务都做完了')
+ }
+ }
+ // console.log(`浏览任务列表::${JSON.stringify(taskInfo)}`);
+ // for (let task of taskInfo) {
+ // if (task.mid && task.workStatus === 0) {
+ // await setUserLinkStatus(task.mid);
+ // } else {
+ // console.log('所有的浏览任务都做完了')
+ // }
+ // }
+ gen.next();
+}
+
+function harvest(userInfo) {
+ // console.log(`收获的操作:${JSON.stringify(userInfo)}\n`)
+ if (!userInfo.userInfo && !userInfo.userToken) return
+ const data = {
+ "source": 2,
+ "sharePin": "",
+ "userId": userInfo.userInfo,
+ "userToken": userInfo.userToken
+ }
+ // return new Promise((rs, rj) => {
+ // request('harvest', data).then((response) => {
+ // console.log(`收获金果结果:${JSON.stringify(response)}`);
+ // rs(response)
+ // // gen.next();
+ // })
+ // })
+ request('harvest', data).then((harvestRes) => {
+ if (harvestRes.resultCode === 0 && harvestRes.resultData.code === '200') {
+ let data = harvestRes.resultData.data;
+ message += `【距离${data.treeInfo.level + 1}级摇钱树还差】${data.treeInfo.progressLeft}\n`;
+ fruitTotal = data.treeInfo.fruit;
+ gen.next();
+ }
+ })
+}
+//卖出金果,得到金币
+function sell() {
+ const params = {
+ "source": 2,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ params.riskDeviceParam = JSON.stringify(params.riskDeviceParam);//这一步,不可省略,否则提交会报错(和login接口一样)
+ // return new Promise((rs, rj) => {
+ // request('sell', params).then(response => {
+ // rs(response);
+ // })
+ // })
+ request('sell', params).then((sellRes) => {
+ console.log(`卖出金果结果:${JSON.stringify(sellRes)}\n`)
+ gen.next();
+ })
+}
+//获取金币和金果数量
+function myWealth() {
+ const params = {
+ "source": 2,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ params.riskDeviceParam = JSON.stringify(params.riskDeviceParam);//这一步,不可省略,否则提交会报错(和login接口一样)
+ request('myWealth', params).then(res=> {
+ if (res.resultCode === 0 && res.resultData.code === '200') {
+ console.log(`金币数量和金果::${JSON.stringify(res)}`);
+ message += `【我的金果数量】${res.resultData.data.gaAmount}\n`;
+ message += `【我的金币数量】${res.resultData.data.gcAmount}\n`;
+ gen.next();
+ }
+ })
+}
+function sign() {
+ console.log('开始三餐签到')
+ const data = {"source":2,"workType":1,"opType":2};
+ return new Promise((rs, rj) => {
+ request('doWork', data).then(response => {
+ rs(response);
+ })
+ })
+}
+function signIndex() {
+ const params = {
+ "source":0,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ return new Promise((rs, rj) => {
+ request('signIndex', params).then(response => {
+ rs(response);
+ })
+ })
+}
+async function signEveryDay() {
+ let signIndexRes = await signIndex();
+ console.log(`每日签到条件查询:${JSON.stringify(signIndexRes)}`);
+ if (signIndexRes.resultCode === 0) {
+ if (signIndexRes.resultData && signIndexRes.resultData.data.canSign == 2) {
+ console.log('准备每日签到')
+ let signOneRes = await signOne(signIndexRes.resultData.data.signDay);
+ console.log(`第${signIndexRes.resultData.data.signDay}日签到结果:${JSON.stringify(signOneRes)}`);
+ if (signIndexRes.resultData.data.signDay === 7) {
+ let getSignAwardRes = await getSignAward();
+ console.log(`店铺券(49-10)领取结果:${JSON.stringify(getSignAwardRes)}`)
+ if (getSignAwardRes.resultCode === 0 && getSignAwardRes.data.code === 0) {
+ message += `【7日签到奖励领取】${getSignAwardRes.datamessage}\n`
+ }
+ }
+ } else {
+ console.log('走了signOne的else')
+ }
+ }
+ gen.next();
+}
+function signOne(signDay) {
+ const params = {
+ "source":0,
+ "signDay": signDay,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ return new Promise((rs, rj) => {
+ request('signOne', params).then(response => {
+ rs(response);
+ })
+ })
+}
+// 领取七日签到后的奖励(店铺优惠券)
+function getSignAward() {
+ const params = {
+ "source":2,
+ "awardType": 2,
+ "deviceRiskParam": 1,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ return new Promise((rs, rj) => {
+ request('getSignAward', params).then(response => {
+ rs(response);
+ })
+ })
+}
+// 浏览任务
+async function setUserLinkStatus(missionId) {
+ let resultCode = 0, code = 200, index = 0;
+ do {
+ const params = {
+ "missionId": missionId,
+ "pushStatus": 1,
+ "keyValue": index,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ let response = await request('setUserLinkStatus', params)
+ console.log(`missionId为${missionId}::第${index + 1}次浏览活动完成: ${JSON.stringify(response)}`);
+ resultCode = response.resultCode;
+ code = response.resultData.code;
+ // if (resultCode === 0) {
+ // let sportRevardResult = await getSportReward();
+ // console.log(`领取遛狗奖励完成: ${JSON.stringify(sportRevardResult)}`);
+ // }
+ index++;
+ } while (index < 7) //不知道结束的条件,目前写死循环7次吧
+ console.log('浏览店铺任务结束');
+ console.log('开始领取浏览后的奖励');
+ let receiveAwardRes = await receiveAward(missionId);
+ console.log(`领取浏览任务奖励成功:${JSON.stringify(receiveAwardRes)}`)
+ return new Promise((resolve, reject) => {
+ resolve(receiveAwardRes);
+ })
+ // gen.next();
+}
+// 领取浏览后的奖励
+function receiveAward(mid) {
+ if (!mid) return
+ mid = mid + "";
+ const params = {
+ "source":0,
+ "workType": 7,
+ "opType": 2,
+ "mid": mid,
+ "riskDeviceParam":{"eid":"","dt":"","ma":"","im":"","os":"","osv":"","ip":"","apid":"","ia":"","uu":"","cv":"","nt":"","at":"1","fp":"","token":""}
+ }
+ return new Promise((rs, rj) => {
+ request('doWork', params).then(response => {
+ rs(response);
+ })
+ })
+}
+function share(data) {
+ if (data.opType === 1) {
+ console.log(`开始做分享任务\n`)
+ } else {
+ console.log(`开始做领取分享后的奖励\n`)
+ }
+ return new Promise((rs, rj) => {
+ request('doWork', data).then(response => {
+ rs(response);
+ })
+ })
+ // const data = 'reqData={"source":0,"workType":2,"opType":1}';
+ // request('doWork', data).then(res => {
+ // console.log(`分享111:${JSON.stringify(res)}`)
+ // setTimeout(() => {
+ // const data2 = 'reqData={"source":0,"workType":2,"opType":2}';
+ // request('doWork', data2).then(res => {
+ // console.log(`分享222:${JSON.stringify(res)}`)
+ // })
+ // }, 2000)
+ // })
+ // await sleep(3);
+}
+function msgControl() {
+ console.log('控制弹窗');
+ console.log(treeMsgTime);
+ // console.log(typeof (treeMsgTime));
+ treeMsgTime++;
+ // console.log(treeMsgTime);
+ $.setdata(`${treeMsgTime}`, 'treeMsgTime');
+ console.log(`${$.getdata('treeMsgTime')}`);
+ // console.log(`${typeof (Number($hammer.read('treeMsgTime')))}`)
+ // console.log(`${($hammer.read('treeMsgTime') * 1) === Notice}`)
+ // if (($.getdata('treeMsgTime') * 1) === Notice) {
+ // $.msg(name, subTitle, message);
+ // $.setdata('0', 'treeMsgTime');
+ // }
+ // gen.next()
+}
+
+async function request(function_id, body = {}) {
+ await $.wait(1000); //歇口气儿, 不然会报操作频繁
+ return new Promise((resolve, reject) => {
+ $.post(taskurl(function_id,body), (err, resp, data) => {
+ if (err) {
+ console.log("=== request error -s--");
+ console.log("=== request error -e--");
+ } else {
+ try {
+ data = JSON.parse(data);
+ } catch (e) {
+ console.log(e)
+ } finally {
+ resolve(data)
+ }
+ }
+ })
+ })
+}
+
+function taskurl(function_id, body) {
+ return {
+ url: JD_API_HOST + '/' + function_id + '?_=' + new Date().getTime()*1000,
+ body: `reqData=${function_id === 'harvest' || function_id === 'login' || function_id === 'signIndex' || function_id === 'signOne' || function_id === 'setUserLinkStatus' || function_id === 'dayWork' || function_id === 'getSignAward' || function_id === 'sell' ? encodeURIComponent(JSON.stringify(body)) : JSON.stringify(body)}`,
+ headers: {
+ 'Accept' : `application/json`,
+ 'Origin' : `https://uua.jr.jd.com`,
+ 'Accept-Encoding' : `gzip, deflate, br`,
+ 'Cookie' : cookie,
+ 'Content-Type' : `application/x-www-form-urlencoded;charset=UTF-8`,
+ 'Host' : `ms.jr.jd.com`,
+ 'Connection' : `keep-alive`,
+ 'User-Agent' : `jdapp;iPhone;9.0.0;13.4.1;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;ADID/F75E8AED-CB48-4EAC-A213-E8CE4018F214;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167237;supportBestPay/0;jdSupportDarkMode/0;pv/1287.19;apprpd/MyJD_GameMain;ref/https%3A%2F%2Fuua.jr.jd.com%2Fuc-fe-wxgrowing%2Fmoneytree%2Findex%2F%3Fchannel%3Dyxhd%26lng%3D113.325843%26lat%3D23.204628%26sid%3D2d98e88cf7d182f60d533476c2ce777w%26un_area%3D19_1601_50258_51885;psq/1;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|3485;jdv/0|kong|t_1000170135|tuiguang|notset|1593059927172|1593059927;adk/;app_device/IOS;pap/JA2015_311210|9.0.0|IOS 13.4.1;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`,
+ 'Referer' : `https://uua.jr.jd.com/uc-fe-wxgrowing/moneytree/index/?channel=yxhd&lng=113.325896&lat=23.204600&sid=2d98e88cf7d182f60d533476c2ce777w&un_area=19_1601_50258_51885`,
+ 'Accept-Language' : `zh-cn`
+ }
+ }
+}
+// prettier-ignore
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
\ No newline at end of file
diff --git a/backUp/jd_pet_double.js b/backUp/jd_pet_double.js
new file mode 100644
index 00000000..a9f11db5
--- /dev/null
+++ b/backUp/jd_pet_double.js
@@ -0,0 +1,530 @@
+//备份之前单账号的萌宠脚本
+const name = '东东萌宠';
+const $ = new Env(name);
+
+// =======node.js使用说明======
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//ios等软件用户直接用NobyDa的jd cookie
+const cookie = jdCookieNode.CookieJD ? jdCookieNode.CookieJD : $.getdata('CookieJD');
+//京东接口地址
+const JD_API_HOST = 'https://api.m.jd.com/client.action';
+let jdNotify = $.getdata('jdPetNotify');
+let shareCodes = [ // 这个列表填入你要助力的好友的shareCode, 最多可能是5个
+ 'MTAxODc2NTEzMjAwMDAwMDAzMDI3MTMyOQ==',
+ 'MTAxODcxOTI2NTAwMDAwMDAyNjA4ODQyMQ==',
+ 'MTAxODc2NTEzMDAwMDAwMDAwNTUwNDUxMw==',
+ 'MTAxODc2NTEzOTAwMDAwMDAxODQ5MDg5NQ==',
+ 'MTAxODcxOTI2NTAwMDAwMDAxOTQ3MjkzMw=='
+]
+// 添加box功能
+// 【用box订阅的好处】
+// 1️⃣脚本也可以远程挂载了。助力功能只需在box里面设置助力码。
+// 2️⃣所有脚本的cookie都可以备份,方便你迁移到其他支持box的软件。
+let isBox = false //默认没有使用box
+const boxShareCodeArr = ['jd_pet1', 'jd_pet2', 'jd_pet3', 'jd_pet4', 'jd_pet5'];
+isBox = boxShareCodeArr.some((item) => {
+ const boxShareCode = $.getdata(item);
+ return (boxShareCode !== undefined && boxShareCode !== null && boxShareCode !== '');
+});
+if (isBox) {
+ shareCodes = [];
+ for (const item of boxShareCodeArr) {
+ if ($.getdata(item)) {
+ shareCodes.push($.getdata(item));
+ }
+ }
+}
+let petInfo = null, taskInfo = null, message = '', subTitle = '', goodsUrl = '', taskInfoKey = [], option = {};
+
+//按顺序执行, 尽量先执行不消耗狗粮的任务, 避免中途狗粮不够, 而任务还没做完
+let function_map = {
+ signInit: signInit, //每日签到
+ threeMealInit: threeMealInit, //三餐
+ browseSingleShopInit: browseSingleShopInit, //浏览店铺1
+ browseSingleShopInit2: browseSingleShopInit2, //浏览店铺2
+ browseSingleShopInit3: browseSingleShopInit3, //浏览店铺3
+ browseShopsInit: browseShopsInit, //浏览店铺s, 目前只有一个店铺
+ firstFeedInit: firstFeedInit, //首次喂食
+ inviteFriendsInit: inviteFriendsInit, //邀请好友, 暂未处理
+ feedReachInit: feedReachInit, //喂食10次任务 最后执行投食10次任务, 提示剩余狗粮是否够投食10次完成任务, 并询问要不要继续执行
+}
+
+let gen = entrance();
+gen.next();
+/**
+ * 入口函数
+ */
+function* entrance() {
+ if (!cookie) {
+ $.msg(name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', { "open-url": "https://bean.m.jd.com/" });
+ $.done();
+ return
+ }
+ console.log('任务开始');
+ yield initPetTown(); //初始化萌宠
+ yield taskInit(); // 初始化任务
+
+ yield petSport(); // 遛弯
+ yield slaveHelp(); // 助力, 在顶部shareCodes中填写需要助力的shareCode
+ yield masterHelpInit();//获取助力信息
+ taskInfo['taskList'].forEach((val) => {
+ taskInfoKey.push(val);
+ })
+ // 任务开始
+ for (let task_name in function_map) {
+ if (taskInfoKey.indexOf(task_name) !== -1) {
+ taskInfoKey.splice(taskInfoKey.indexOf(task_name), 1);
+ }
+ if (taskInfo[task_name] && !taskInfo[task_name].finished) {
+ console.log('任务' + task_name + '开始');
+ // yield eval(task_name + '()');
+ yield function_map[task_name]();
+ } else {
+ console.log('任务' + task_name + '已完成');
+ }
+ }
+ for (let item of taskInfoKey) {
+ console.log(`新任务 【${taskInfo[item].title}】 功能未开发,请反馈给脚本维护者@lxk0301\n`);
+ $.msg($.name, subTitle, `新的任务 【${taskInfo[item].title}】 功能未开发,请反馈给脚本维护者@lxk0301\n`, {"open-url": "https://t.me/JD_fruit_pet"})
+ }
+ yield feedPetsAgain();//所有任务做完后,检测剩余狗粮是否大于110g,大于就继续投食
+ yield energyCollect();
+ option['media-url'] = goodsUrl;
+ if (!jdNotify || jdNotify === 'false') {
+ $.msg(name, subTitle, message, option);
+ }
+ // $notify(name, subTitle, message);
+ console.log('全部任务完成, 如果帮助到您可以点下🌟STAR鼓励我一下, 明天见~');
+ $.done();
+}
+
+
+// 收取所有好感度
+function energyCollect() {
+ console.log('开始收取任务奖励好感度');
+
+ let function_id = arguments.callee.name.toString();
+ request(function_id).then(response => {
+ console.log(`收取任务奖励好感度完成:${JSON.stringify(response)}`);
+ if (response.code === '0') {
+ // message += `【第${petInfo.medalNum + 2}块勋章完成进度】:${response.result.medalPercent}%,还需投食${response.result.needCollectEnergy}g狗粮\n`;
+ // message += `【已获得勋章】${petInfo.medalNum + 1}块,还需收集${petInfo.goodsInfo.exchangeMedalNum - petInfo.medalNum - 1}块即可兑换奖品“${petInfo.goodsInfo.goodsName}”\n`;
+ message += `【第${response.result.medalNum + 1}块勋章完成进度】${response.result.medalPercent}%,还需收集${response.result.needCollectEnergy}好感\n`;
+ message += `【已获得勋章】${response.result.medalNum}块,还需收集${response.result.needCollectMedalNum}块即可兑换奖品“${petInfo.goodsInfo.goodsName}”\n`;
+ }
+ gen.next();
+ })
+}
+
+// 首次投食 任务
+function firstFeedInit() {
+ console.log('首次投食任务合并到10次喂食任务中');
+ setTimeout(() => {
+ gen.next();
+ }, 2000);
+}
+
+/**
+ * 投食10次 任务
+ */
+async function feedReachInit() {
+ console.log('投食任务开始...');
+
+ // let foodAmount = petInfo.foodAmount; //剩余狗粮
+ let finishedTimes = taskInfo.feedReachInit.hadFeedAmount / 10; //已经喂养了几次
+ let needFeedTimes = 10 - finishedTimes; //还需要几次
+ // let canFeedTimes = foodAmount / 10;
+ // if (canFeedTimes < needFeedTimes) {
+ // if (confirm('当前剩余狗粮' + foodAmount + 'g, 已不足投食' + needFeedTimes + '次, 确定要继续吗?') === false) {
+ // console.log('你拒绝了执行喂养十次任务');
+ // gen.next();
+ // }
+ // }
+
+ let tryTimes = 20; //尝试次数
+ do {
+ console.log(`还需要投食${needFeedTimes}次`);
+ let response = await feedPets();
+ console.log(`本次投食结果: ${JSON.stringify(response)}`);
+ if (response.resultCode == 0 && response.code == 0) {
+ needFeedTimes--;
+ }
+ if (response.resultCode == 3003 && response.code == 0) {
+ console.log('剩余狗粮不足, 投食结束');
+ needFeedTimes = 0;
+ }
+
+ tryTimes--;
+ } while (needFeedTimes > 0 && tryTimes > 0)
+
+ console.log('投食任务结束...');
+ gen.next();
+
+}
+
+// 遛狗, 每天次数上限10次, 随机给狗粮, 每次遛狗结束需调用getSportReward领取奖励, 才能进行下一次遛狗
+async function petSport() {
+ console.log('开始遛弯');
+
+ var times = 1;
+ var code = 0;
+ var resultCode = 0;
+
+ do {
+ let response = await request(arguments.callee.name.toString())
+ console.log(`第${times}次遛狗完成: ${JSON.stringify(response)}`);
+ resultCode = response.resultCode;
+
+ if (resultCode == 0) {
+ let sportRevardResult = await getSportReward();
+ console.log(`领取遛狗奖励完成: ${JSON.stringify(sportRevardResult)}`);
+ }
+
+ times++;
+ } while (resultCode == 0 && code == 0)
+ if (times > 1) {
+ message += '【十次遛狗】已完成\n';
+ }
+ gen.next();
+
+}
+
+/**
+ * 助力好友, 暂时支持一个好友, 需要拿到shareCode
+ * shareCode为你要助力的好友的
+ * 运行脚本时你自己的shareCode会在控制台输出, 可以将其分享给他人
+ */
+async function slaveHelp() {
+ let functionId = arguments.callee.name.toString();
+ let helpPeoples = '';
+ for (let code of shareCodes) {
+ console.log(`开始助力好友: ${code}`);
+ let response = await request(functionId, {
+ shareCode: code
+ });
+ if (response.code === '0' && response.resultCode === '0') {
+ if (response.result.helpStatus === 0) {
+ console.log('已给好友: 【' + response.result.masterNickName + '】助力');
+ helpPeoples += response.result.masterNickName + ',';
+ } else if (response.result.helpStatus === 1) {
+ // 您今日已无助力机会
+ console.log(`助力好友${response.result.masterNickName}失败,您今日已无助力机会`);
+ break;
+ } else if (response.result.helpStatus === 2) {
+ //该好友已满5人助力,无需您再次助力
+ console.log(`该好友${response.result.masterNickName}已满5人助力,无需您再次助力`);
+ }
+ } else {
+ console.log(`助理好友结果: ${response.message}`);
+ }
+ }
+ if (helpPeoples && helpPeoples.length > 0) {
+ message += `【您助力的好友】${helpPeoples.substr(0, helpPeoples.length - 1)}\n`;
+ }
+
+ gen.next();
+}
+
+
+// 领取遛狗奖励
+function getSportReward() {
+ return new Promise((rs, rj) => {
+ request(arguments.callee.name.toString()).then(response => {
+ rs(response);
+ })
+ })
+}
+
+// 浏览店铺任务, 任务可能为多个? 目前只有一个
+async function browseShopsInit() {
+ console.log('开始浏览店铺任务');
+ let times = 0;
+ let resultCode = 0;
+ let code = 0;
+
+ do {
+ let response = await request("getBrowseShopsReward");
+ console.log(`第${times}次浏览店铺结果: ${JSON.stringify(response)}`);
+ code = response.code;
+ resultCode = response.resultCode;
+ times++;
+ } while (resultCode == 0 && code == 0 && times < 5)
+
+ console.log('浏览店铺任务结束');
+ gen.next();
+}
+
+// 浏览指定店铺 任务
+function browseSingleShopInit() {
+ console.log('准备浏览指定店铺');
+ const body = {"index":0,"version":1,"type":1};
+ request("getSingleShopReward", body).then(response => {
+ console.log(`response::${JSON.stringify(response)}`);
+ if (response.code === '0' && response.resultCode === '0') {
+ const body2 = {"index":0,"version":1,"type":2};
+ request("getSingleShopReward", body2).then(response2 => {
+ console.log(`response2::${JSON.stringify(response)}`);
+ if (response2.code === '0' && response2.resultCode === '0') {
+ message += `【浏览指定店铺】获取${response2.result.reward}g\n`;
+ }
+ gen.next();
+ })
+ }
+ })
+}
+// 临时新增任务--冰淇淋会场
+function browseSingleShopInit2() {
+ console.log('准备浏览指定店铺--冰淇淋会场');
+ const body = {"index":1,"version":1,"type":1};
+ const body2 = {"index":1,"version":1,"type":2}
+ request("getSingleShopReward", body).then(response => {
+ console.log(`①点击浏览指定店铺结果: ${JSON.stringify(response)}`);
+ if (response.code === '0' && response.resultCode === '0') {
+ request("getSingleShopReward", body2).then(response2 => {
+ console.log(`②浏览指定店铺结果: ${JSON.stringify(response2)}`);
+ if (response2.code === '0' && response2.resultCode === '0') {
+ message += `【冰淇淋会场】获取狗粮${response2.result.reward}g\n`;
+ }
+ })
+ }
+ gen.next();
+ })
+}
+function browseSingleShopInit3() {
+ console.log('准备完成 去参与星品解锁计划');
+ const body = {"index":2,"version":1,"type":1};
+ const body2 = {"index":2,"version":1,"type":2}
+ request("getSingleShopReward", body).then(response => {
+ console.log(`①点击浏览指定店铺结果: ${JSON.stringify(response)}`);
+ if (response.code === '0' && response.resultCode === '0') {
+ request("getSingleShopReward", body2).then(response2 => {
+ console.log(`②浏览指定店铺结果: ${JSON.stringify(response2)}`);
+ if (response2.code === '0' && response2.resultCode === '0') {
+ message += `【去参与星品解锁计划】获取狗粮${response2.result.reward}g\n`;
+ }
+ })
+ }
+ gen.next();
+ })
+}
+// 三餐签到, 每天三段签到时间
+function threeMealInit() {
+ console.log('准备三餐签到');
+ request("getThreeMealReward").then(response => {
+ console.log(`三餐签到结果: ${JSON.stringify(response)}`);
+ if (response.code === '0' && response.resultCode === '0') {
+ message += `【定时领狗粮】获得${response.result.threeMealReward}g\n`;
+ } else {
+ message += `【定时领狗粮】${response.message}\n`;
+ }
+ gen.next();
+ })
+}
+
+// 每日签到, 每天一次
+function signInit() {
+ console.log('准备每日签到');
+ request("getSignReward").then(response => {
+ console.log(`每日签到结果: ${JSON.stringify(response)}`);
+ message += `【每日签到成功】奖励${response.result.signReward}g狗粮\n`;
+ gen.next();
+ })
+
+}
+
+// 投食
+function feedPets() {
+ console.log('开始投食');
+ return new Promise((rs, rj) => {
+ request(arguments.callee.name.toString()).then(response => {
+ rs(response);
+ })
+ })
+}
+
+//查询jd宠物信息
+function initPetTown() {
+ request(arguments.callee.name.toString()).then((response) => {
+ // console.log(`初始化萌宠信息${JSON.stringify(response)}`)
+ if (response.code === '0' && response.resultCode === '0' && response.message === 'success') {
+ petInfo = response.result;
+ if (petInfo.userStatus === 0) {
+ $.msg(name, '【提示】此账号萌宠活动未开始,请手动去京东APP开启活动\n入口:我的->游戏与互动->查看更多', '', { "open-url": "openapp.jdmoble://" });
+ $.done();
+ return
+ }
+ goodsUrl = petInfo.goodsInfo && petInfo.goodsInfo.goodsUrl;
+ // console.log(`初始化萌宠信息完成: ${JSON.stringify(petInfo)}`);
+ if (petInfo.petStatus === 5 && petInfo.showHongBaoExchangePop) {
+ option['open-url'] = "openApp.jdMobile://";
+ option['media-url'] = goodsUrl;
+ $.msg($.name, `【提醒⏰】${petInfo.goodsInfo.goodsName}已可领取`, '请去京东APP或微信小程序查看', option);
+ $.done();
+ return
+ }
+ console.log(`\n【您的互助码shareCode】 ${petInfo.shareCode}\n`);
+ gen.next();
+ } else if (response.code === '0' && response.resultCode === '2001'){
+ console.log(`初始化萌宠失败: ${response.message}`);
+ $.setdata('', 'CookieJD');//cookie失效,故清空cookie。
+ $.msg(name, '【提示】京东cookie已失效,请重新登录获取', 'https://bean.m.jd.com/', { "open-url": "https://bean.m.jd.com/" });
+ $.done();
+ }
+ })
+
+}
+//再次投食
+async function feedPetsAgain() {
+ const response = await secondInitPetTown(); //再次初始化萌宠
+ if (response.code === '0' && response.resultCode === '0' && response.message === 'success') {
+ let secondPetInfo = response.result;
+ let foodAmount = secondPetInfo.foodAmount; //剩余狗粮
+ if (foodAmount - 100 >= 10) {
+ for (let i = 0; i < parseInt((foodAmount - 100) / 10); i++) {
+ const feedPetRes = await feedPets();
+ console.log(`投食feedPetRes`);
+ if (feedPetRes.resultCode == 0 && feedPetRes.code == 0) {
+ console.log('投食成功')
+ }
+ }
+ const response2 = await secondInitPetTown();
+ subTitle = response2.result.goodsInfo.goodsName;
+ message += `【与爱宠相识】${response2.result.meetDays}天\n`;
+ message += `【剩余狗粮】${response2.result.foodAmount}g\n`;
+ } else {
+ console.log("目前剩余狗粮:【" + foodAmount + "】g,不再继续投食,保留100g用于完成第二天任务");
+ subTitle = secondPetInfo.goodsInfo.goodsName;
+ message += `【与爱宠相识】${secondPetInfo.meetDays}天\n`;
+ message += `【剩余狗粮】${secondPetInfo.foodAmount}g\n`;
+ }
+ } else {
+ console.log(`初始化萌宠失败: ${JSON.stringify(petInfo)}`);
+ }
+ gen.next();
+}
+// 再次查询萌宠信息
+function secondInitPetTown() {
+ console.log('开始再次初始化萌宠信息');
+ return new Promise((rs, rj) => {
+ request("initPetTown").then(response => {
+ rs(response);
+ })
+ })
+}
+// 邀请新用户
+function inviteFriendsInit() {
+ console.log('邀请新用户功能未实现');
+ if (taskInfo.inviteFriendsInit.status == 1 && taskInfo.inviteFriendsInit.inviteFriendsNum > 0) {
+ // 如果有邀请过新用户,自动领取60gg奖励
+ request('getInviteFriendsReward').then((res) => {
+ try {
+ if (res.code == 0 && res.resultCode == 0) {
+ console.log(`领取邀请新用户奖励成功,获得狗粮现有狗粮${taskInfo.inviteFriendsInit.reward}g,${res.result.foodAmount}g`);
+ message += `【邀请新用户】获取${taskInfo.inviteFriendsInit.reward}g\n`;
+ }
+ gen.next();
+ } catch (e) {
+ console.log('领取邀请新用户奖励失败')
+ }
+ });
+ } else {
+ setTimeout(() => {
+ gen.next();
+ }, 2000);
+ }
+}
+
+// 好友助力信息
+async function masterHelpInit() {
+ let res = await request(arguments.callee.name.toString());
+ console.log('助力信息: ' , res);
+ if (res.code === '0' && res.resultCode === '0') {
+ if (res.result.masterHelpPeoples && res.result.masterHelpPeoples.length >= 5) {
+ if(!res.result.addedBonusFlag) {
+ console.log("开始领取额外奖励");
+ let getHelpAddedBonusResult = await getHelpAddedBonus();
+ console.log(`领取30g额外奖励结果:【${getHelpAddedBonusResult.message}】`);
+ message += `【额外奖励${getHelpAddedBonusResult.result.reward}领取】${getHelpAddedBonusResult.message}\n`;
+ } else {
+ console.log("已经领取过5好友助力额外奖励");
+ message += `【额外奖励】已领取\n`;
+ }
+ } else {
+ console.log("助力好友未达到5个")
+ message += `【额外奖励】领取失败,原因:助力好友未达5个\n`;
+ }
+ if (res.result.masterHelpPeoples && res.result.masterHelpPeoples.length > 0) {
+ console.log('帮您助力的好友的名单开始')
+ let str = '';
+ res.result.masterHelpPeoples.map((item, index) => {
+ if (index === (res.result.masterHelpPeoples.length - 1)) {
+ str += item.nickName || "匿名用户";
+ } else {
+ str += (item.nickName || "匿名用户") + ',';
+ }
+ })
+ message += `【助力您的好友】${str}\n`;
+ }
+ }
+ gen.next();
+}
+// 领取5好友助力后的奖励
+function getHelpAddedBonus() {
+ return new Promise((rs, rj)=> {
+ request(arguments.callee.name.toString()).then(response=> {
+ rs(response);
+ })
+ })
+}
+
+// 初始化任务, 可查询任务完成情况
+function taskInit() {
+ console.log('开始任务初始化');
+ const body = {"version":1};
+ request(arguments.callee.name.toString(), body).then(response => {
+ if (response.resultCode === '9999' || !response.result) {
+ console.log('初始化任务异常, 请稍后再试');
+ gen.return();
+ }
+ taskInfo = response.result;
+ // function_map = taskInfo.taskList;
+ // console.log(`任务初始化完成: ${JSON.stringify(taskInfo)}`);
+ gen.next();
+ })
+
+}
+
+// 请求
+async function request(function_id, body = {}) {
+ await $.wait(3000); //歇口气儿, 不然会报操作频繁
+ return new Promise((resolve, reject) => {
+ $.get(taskurl(function_id, body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n东东萌宠: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ console.log(e)
+ } finally {
+ resolve(data)
+ }
+ })
+ })
+}
+
+function taskurl(function_id, body = {}) {
+ return {
+ url: `${JD_API_HOST}?functionId=${function_id}&appid=wh5&loginWQBiz=pet-town&body=${escape(JSON.stringify(body))}`,
+ headers: {
+ Cookie: cookie,
+ UserAgent: `Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1`,
+ }
+ };
+}
+
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,o)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),h=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t))}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",o){const r=t=>{if(!t||!this.isLoon()&&this.isSurge())return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,r(o)):this.isQuanX()&&$notify(e,s,i,r(o)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/backUp/jd_plantBean_double.js b/backUp/jd_plantBean_double.js
new file mode 100644
index 00000000..503a6a54
--- /dev/null
+++ b/backUp/jd_plantBean_double.js
@@ -0,0 +1,595 @@
+
+/*
+种豆得豆 搬的https://github.com/uniqueque/QuantumultX/blob/4c1572d93d4d4f883f483f907120a75d925a693e/Script/jd_joy.js
+更新时间:2020-08-25
+脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
+会自动关注任务中的店铺跟商品
+互助码shareCode请先手动运行脚本查看打印可看到
+// quantumultx
+[task_local]
+1 7-21/2 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_plantBean.js, tag=种豆得豆, img-url=https://raw.githubusercontent.com/58xinian/icon/master/jdzd.png, enabled=true
+// Loon
+[Script]
+cron "1 7-21/2 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_plantBean.js,tag=京东种豆得豆
+// Surge
+// 京东种豆得豆 = type=cron,cronexp="1 7-21/2 * * *",wake-system=1,timeout=20,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_joy_steal.js
+一天只能帮助3个人。多出的助力码无效
+注:如果使用Node.js, 需自行安装'crypto-js,got,http-server,tough-cookie'模块. 例: npm install crypto-js http-server tough-cookie got --save
+*/
+
+const name = '京东种豆得豆';
+const $ = new Env(name);
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//ios等软件用户直接用NobyDa的jd cookie
+const cookie = jdCookieNode.CookieJD ? jdCookieNode.CookieJD : $.getdata('CookieJD');
+let jdNotify = $.getdata('jdPlantBeanNotify');
+
+//京东接口地址
+const JD_API_HOST = 'https://api.m.jd.com/client.action';
+
+let plantUuids = [ // 这个列表填入你要助力的好友的plantUuid
+ '66j4yt3ebl5ierjljoszp7e4izzbzaqhi5k2unz2afwlyqsgnasq',
+ 'olmijoxgmjutyrsovl2xalt2tbtfmg6sqldcb3q',
+ 'qawf5ls3ucw25yhfulu32xekqy3h7wlwy7o5jii'
+]
+let currentRoundId = null;//本期活动id
+let lastRoundId = null;//上期id
+let roundList = [];
+let awardState = '';//上期活动的京豆是否收取
+// 添加box功能
+// 【用box订阅的好处】
+// 1️⃣脚本也可以远程挂载了。助力功能只需在box里面设置助力码。
+// 2️⃣所有脚本的cookie都可以备份,方便你迁移到其他支持box的软件。
+let isBox = false //默认没有使用box
+const boxShareCodeArr = ['jd_plantBean1', 'jd_plantBean2', 'jd_plantBean3'];
+isBox = boxShareCodeArr.some((item) => {
+ const boxShareCode = $.getdata(item);
+ return (boxShareCode !== undefined && boxShareCode !== null && boxShareCode !== '');
+});
+if (isBox) {
+ plantUuids = [];
+ for (const item of boxShareCodeArr) {
+ if ($.getdata(item)) {
+ plantUuids.push($.getdata(item));
+ }
+ }
+}
+
+var Task = step();
+Task.next();
+
+function* step() {
+ let message = '', subTitle = '';
+ if (cookie) {
+ console.log(`获取任务及基本信息`)
+ let plantBeanIndexResult = yield plantBeanIndex()
+ if (plantBeanIndexResult.code != "0") {
+ console.log(`plantBeanIndexResult:${JSON.stringify(plantBeanIndexResult)}`)
+ if (plantBeanIndexResult.code === '3') {
+ $.setdata('', 'CookieJD');//cookie失效,故清空cookie。
+ $.msg(name, '【提示】京东cookie已失效,请重新登录获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ $.done();
+ return
+ }
+ //todo
+ return
+ }
+ roundList = plantBeanIndexResult.data.roundList;
+ currentRoundId = roundList[1].roundId;
+ lastRoundId = roundList[0].roundId;
+ awardState = roundList[0].awardState;
+ subTitle = `【京东昵称】${plantBeanIndexResult.data.plantUserInfo.plantNickName}`;
+ message += `【上期时间】${roundList[0].dateDesc}\n`;
+ message += `【上期成长值】${roundList[0].growth}\n`;
+ //定时领取--放到前面执行收取自动生产的营养液
+ if (plantBeanIndexResult.data.timeNutrientsRes.state == 1 && plantBeanIndexResult.data.timeNutrientsRes.nutrCount > 0) {
+ console.log(`开始领取定时产生的营养液`)
+ let receiveNutrientsResult = yield receiveNutrients(currentRoundId)
+ console.log(`receiveNutrientsResult:${JSON.stringify(receiveNutrientsResult)}`)
+ }
+ console.log(`【上轮京豆】${awardState === '4' ? '采摘中' : awardState === '5' ? '可收获了' : '已领取'}`);
+ if (awardState === '4') {
+ //京豆采摘中...
+ message += `【上期状态】${roundList[0].tipBeanEndTitle}\n`;
+ } else if (awardState === '5') {
+ //收获
+ let res = yield getReward();
+ // console.log(`种豆得豆收获的京豆情况---res,${JSON.stringify(res)}`);
+ console.log('开始领取京豆');
+ if (res.code === '0') {
+ console.log('京豆领取成功');
+ message += `【上期兑换京豆】${res.data.awardBean}个\n`;
+ $.msg(name, subTitle, message);
+ }
+ } else if (awardState === '6') {
+ //京豆已领取
+ message += `【上期兑换京豆】${roundList[0].awardBeans}个\n`;
+ }
+ if (roundList[1].dateDesc.indexOf('本期 ') > -1) {
+ roundList[1].dateDesc = roundList[1].dateDesc.substr(roundList[1].dateDesc.indexOf('本期 ') + 3, roundList[1].dateDesc.length);
+ }
+ message += `【本期时间】${roundList[1].dateDesc}\n`;
+ message += `【本期成长值】${roundList[1].growth}\n`;
+ let shareUrl = plantBeanIndexResult.data.jwordShareInfo.shareUrl
+ let myPlantUuid = getParam(shareUrl, 'plantUuid')
+ // console.log(`你的plantUuid为${myPlantUuid}`)
+ console.log(`\n【您的互助码plantUuid】 ${myPlantUuid}\n`);
+ for (let task of plantBeanIndexResult.data.taskList) {
+ console.log(`开始【${task.taskName}】任务`)
+ if (task.taskType == 7 || task.taskType == 17 || task.taskType == 18) {
+ //具体每个人可能不一样
+ //7金融双签,18疯抢爆品,17叠蛋糕
+ if (task.isFinished != 1) {
+ console.log(task.taskName)
+ let receiveNutrientsTaskResult = yield receiveNutrientsTask(task.taskType)
+ console.log(`receiveNutrientsTaskResult:${JSON.stringify(receiveNutrientsTaskResult)}`)
+ }
+ } else if (task.awardType == 3) {
+ //浏览店铺
+ if (task.isFinished != 1) {
+ let shopTaskListResult = yield shopTaskList()
+ if (shopTaskListResult.code == '0') {
+ let shops = shopTaskListResult.data.goodShopList.concat(shopTaskListResult.data.moreShopList)
+ let nutrCount = 0
+ for (let shop of shops) {
+ console.log(shop.shopName)
+ if (shop.taskState == '2') {
+ let shopNutrientsTaskResult = yield shopNutrientsTask(shop.shopTaskId, shop.shopId)
+ if (shopNutrientsTaskResult.code == 0) {
+ if (shopNutrientsTaskResult.data.nutrState && shopNutrientsTaskResult.data.nutrState == '1' && shopNutrientsTaskResult.data.nutrCount > 0) {
+ console.log(`关注店铺${shop.shopName}获得${shopNutrientsTaskResult.data.nutrCount}营养液`)
+ nutrCount += shopNutrientsTaskResult.data.nutrCount
+ if (nutrCount >= task.totalNum - task.gainedNum) {
+ break
+ }
+ } else {
+ console.log(`关注店铺${shop.shopName}未获得营养液`)
+ }
+ } else {
+ console.log(`${shop.shopName},shopNutrientsTaskResult:${JSON.stringify(shopNutrientsTaskResult)}`)
+ }
+ }
+ }
+ } else {
+ console.log(`shopTaskListResult:${JSON.stringify(shopTaskListResult)}`)
+ }
+ }
+ } else if (task.awardType == 10) {
+ //浏览频道
+ if (task.isFinished != 1) {
+ let plantChannelTaskListResult = yield plantChannelTaskList()
+ if (plantChannelTaskListResult.code == '0') {
+ let channelList = plantChannelTaskListResult.data.goodChannelList.concat(plantChannelTaskListResult.data.normalChannelList)
+ let nutrCount = 0
+ for (let channel of channelList) {
+ // console.log(channel.channelName)
+ if (channel.taskState == '2') {
+ let plantChannelNutrientsTaskResult = yield plantChannelNutrientsTask(channel.channelTaskId, channel.channelId)
+ if (plantChannelNutrientsTaskResult.code == '0') {
+ if (plantChannelNutrientsTaskResult.data.nutrState && plantChannelNutrientsTaskResult.data.nutrState == '1' && plantChannelNutrientsTaskResult.data.nutrNum > 0) {
+ console.log(`浏览频道${channel.channelName}获得${plantChannelNutrientsTaskResult.data.nutrNum}营养液`)
+ nutrCount += plantChannelNutrientsTaskResult.data.nutrNum
+ if (nutrCount >= task.totalNum - task.gainedNum) {
+ break
+ }
+ } else {
+ console.log(`浏览频道${channel.channelName}未获得营养液`)
+ }
+ } else {
+ console.log(`${channel.channelName},plantChannelNutrientsTaskResult:${JSON.stringify(plantChannelNutrientsTaskResult)}`)
+
+ }
+ }
+ }
+ } else {
+ console.log(`plantChannelTaskListResult:${JSON.stringify(plantChannelTaskListResult)}`)
+ }
+ }
+ } else if (task.awardType == 5) {
+ //关注商品
+ if (task.isFinished != 1) {
+ let productTaskListResult = yield productTaskList()
+ if (productTaskListResult.code == '0') {
+ let productInfoList = productTaskListResult.data.productInfoList.map(([item]) => item)
+ let nutrCount = 0
+ for (let productInfo of productInfoList) {
+ console.log(productInfo.productName)
+ if (productInfo.taskState == '2') {
+ let productNutrientsTaskResult = yield productNutrientsTask(productInfo.productTaskId, productInfo.skuId)
+ if (productNutrientsTaskResult.code == '0') {
+ if (productNutrientsTaskResult.data.nutrState && productNutrientsTaskResult.data.nutrState == '1' && productNutrientsTaskResult.data.nutrCount > 0) {
+ console.log(`关注商品${productInfo.productName}获得${productNutrientsTaskResult.data.nutrCount}营养液`)
+ nutrCount += productNutrientsTaskResult.data.nutrCount
+ if (nutrCount >= task.totalNum - task.gainedNum) {
+ break
+ }
+ } else {
+ console.log(`关注商品${productInfo.productName}未获得营养液`)
+ }
+ } else {
+ console.log(`productNutrientsTaskResult:${JSON.stringify(productNutrientsTaskResult)}`)
+ }
+ }
+ }
+ } else {
+ console.log(`productTaskListResult:${JSON.stringify(productTaskListResult)}`)
+ }
+ }
+ } else if (task.taskType == 4) {
+ //逛逛会场
+ if (task.isFinished != 1 && task.gainedNum == '0') {
+ if (plantBeanIndexResult.data.roundList[1].roundState == 2) {
+ let purchaseRewardTaskResult = yield purchaseRewardTask(plantBeanIndexResult.data.roundList[1].roundId)
+ console.log(`purchaseRewardTaskResult:${JSON.stringify(purchaseRewardTaskResult)}`)
+ }
+ }
+ } else if (task.taskType == 19) {
+ // 低价包邮
+ if (task.isFinished !== 1) {
+ let plantReceiveNutrientsTaskRes = yield plantReceiveNutrientsTask();
+ console.log(`${task.taskName}获取营养液::${plantReceiveNutrientsTaskRes.data && plantReceiveNutrientsTaskRes.data.nutrNum}`)
+ }
+ } else if (task.taskType == 20) {
+ // 助力高考
+ if (task.isFinished !== 1) {
+ let plantReceiveNutrientsTaskRes = yield receiveNutrientsTask(task.taskType);
+ console.log(`${task.taskName}获取营养液::${plantReceiveNutrientsTaskRes.data && plantReceiveNutrientsTaskRes.data.nutrNum}`)
+ }
+ } else if (task.taskType == 1) {
+ console.log('跳过签到,NobyDa的会签')
+ // console.log(`【${task.taskName}】未开发${task.awardType},${task.taskType}`)
+ } else {
+ console.log(`【${task.taskName}】未开发${task.awardType},${task.taskType}`)
+ }
+ console.log(`【${task.taskName}】任务结束`)
+ }
+
+ //任务列表少了金融双签,拉出来执行下
+ console.log(`金融双签`)
+ let receiveNutrientsTaskResult = yield receiveNutrientsTask(7)
+ console.log(`receiveNutrientsTaskResult:${JSON.stringify(receiveNutrientsTaskResult)}`)
+
+ //助力好友
+ console.log('开始助力好友')
+ for (let plantUuid of plantUuids) {
+ if (plantUuid == myPlantUuid) {
+ console.log('跳过自己的plantUuid')
+ continue
+ }
+ console.log(`开始助力好友: ${plantUuid}`);
+ let helpResult = yield helpShare(plantUuid)
+ if (helpResult.code === '0') {
+ console.log(`助力好友结果: ${JSON.stringify(helpResult.data.helpShareRes)}`);
+ if (helpResult.data.helpShareRes && helpResult.data.helpShareRes.state === '2') {
+ console.log('今日助力机会已耗尽,跳出助力');
+ break;
+ }
+ } else {
+ console.log(`助力好友失败: ${JSON.stringify(helpResult)}`);
+ }
+ }
+
+ //天天扭蛋功能
+ let eggChance = yield egg();
+ if (eggChance.code == 0) {
+ if (eggChance.data.restLotteryNum > 0) {
+ const eggL = new Array(eggChance.data.restLotteryNum).fill('');
+ for (let i = 0; i < eggL.length; i++) {
+ console.log(`开始第${i + 1}次扭蛋`);
+ let plantEggDoLotteryRes = yield plantEggDoLottery();
+ console.log(`天天扭蛋成功:${JSON.stringify(plantEggDoLotteryRes)}`);
+ }
+ } else {
+ console.log('暂无扭蛋机会')
+ }
+ } else {
+ console.log('查询天天扭蛋的机会失败')
+ }
+ plantBeanIndexResult = yield plantBeanIndex()
+ if (plantBeanIndexResult.code == '0') {
+ let plantBeanRound = plantBeanIndexResult.data.roundList[1]
+ if (plantBeanRound.roundState == 2) {
+ //收取营养液
+ console.log(`开始收取营养液`)
+ for (let bubbleInfo of plantBeanRound.bubbleInfos) {
+ console.log(`收取营养液${bubbleInfo.name}`)
+ let cultureBeanResult = yield cultureBean(plantBeanRound.roundId, bubbleInfo.nutrientsType)
+ console.log(`cultureBeanResult:${JSON.stringify(cultureBeanResult)}`)
+ }
+ }
+ } else {
+ console.log(`plantBeanIndexResult:${JSON.stringify(plantBeanIndexResult)}`)
+ }
+ // 偷大于等于3瓶好友的营养液
+ let stealRes = yield steal();
+ if (stealRes.code == 0) {
+ if (stealRes.data.tips) {
+ console.log('今日已达上限');
+ }
+ if (stealRes.data && stealRes.data.friendInfoList && stealRes.data.friendInfoList.length > 0) {
+ for (let item of stealRes.data.friendInfoList) {
+ if (item.nutrCount >= 3) {
+ console.log(`可以偷的好友的信息::${JSON.stringify(item)}`);
+ console.log(`可以偷的好友的信息paradiseUuid::${JSON.stringify(item.paradiseUuid)}`);
+ let stealFriendRes = yield collectUserNutr(item.paradiseUuid);
+ console.log(`偷取好友营养液情况:${JSON.stringify(stealFriendRes)}`)
+ if (stealFriendRes.code == '0') {
+ console.log(`偷取好友营养液成功`)
+ }
+ }
+ }
+ }
+ }
+ console.log('结束')
+ } else {
+ $.msg(name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ $.done();
+ return
+ }
+ if (!jdNotify || jdNotify === 'false') {
+ $.msg(name, subTitle, message);
+ }
+ $.done();
+}
+
+function purchaseRewardTask(roundId) {
+ let functionId = arguments.callee.name.toString();
+ let body = {
+ "monitor_refer": "plant_receiveNutrients",
+ "monitor_source": "plant_app_plant_index",
+ "roundId": roundId,
+ "version": "9.0.0.1"
+ }
+ request(functionId, body);// `body=${escape(JSON.stringify(body))}&uuid=&appid=ld`
+}
+
+//低价包邮
+function plantReceiveNutrientsTask() {
+ const body = {
+ "monitor_refer": "plant_receiveNutrientsTask",
+ "monitor_source": "plant_app_plant_index",
+ "awardType": "19",
+ "version": "9.0.0.1"
+ };
+ request('receiveNutrientsTask', body);
+}
+
+function receiveNutrientsTask(awardType) {
+ // let functionId = arguments.callee.name.toString();
+ // let body = {
+ // "monitor_refer": "plant_receiveNutrientsTask",
+ // "monitor_source": "plant_m_plant_index",//plant_app_plant_index,plant_m_plant_index
+ // "awardType": `"${awardType}"`,
+ // "version": "9.0.0.1"// "9.0.0.1", "8.4.0.0"
+ // }
+ //这里很奇怪,试了很多情况都不行,直接这样了
+ requestGet(`https://api.m.jd.com/client.action?functionId=receiveNutrientsTask&body=%7B%22awardType%22%3A%22${awardType}%22%2C%22monitor_source%22%3A%22plant_m_plant_index%22%2C%22monitor_refer%22%3A%22plant_receiveNutrientsTask%22%2C%22version%22%3A%228.4.0.0%22%7D&appid=ld&client=apple&clientVersion=&networkType=&osVersion=&uuid=`)
+ // request(functionId, body);// `body=${escape(JSON.stringify(body))}&client=apple&appid=ld`
+}
+
+//https://api.m.jd.com/client.action?functionId=receiveNutrients
+function receiveNutrients(roundId) {
+
+ let functionId = arguments.callee.name.toString();
+ let body = {
+ "monitor_refer": "plant_receiveNutrients",
+ "monitor_source": "plant_app_plant_index",
+ "roundId": roundId,
+ "version": "9.0.0.1"
+ }
+
+ request(functionId, body);//`body=${escape(JSON.stringify(body))}&uuid=&appid=ld`
+
+}
+
+// https://api.m.jd.com/client.action?functionId=cultureBean
+//收取营养液
+function cultureBean(roundId, nutrientsType) {
+ let functionId = arguments.callee.name.toString();
+ let body = {
+ "monitor_refer": "plant_index",
+ "monitor_source": "plant_app_plant_index",
+ "roundId": roundId,
+ "nutrientsType": nutrientsType,
+ "version": "9.0.0.1"
+ }
+ request(functionId, body);//`body=${escape(JSON.stringify(body))}&uuid=&appid=ld`
+}
+
+function productNutrientsTask(productTaskId, skuId) {
+ let functionId = arguments.callee.name.toString();
+ let body = {
+ "monitor_refer": "plant_productNutrientsTask",
+ "monitor_source": "plant_app_plant_index",
+ "productTaskId": productTaskId,
+ "skuId": skuId,
+ "version": "9.0.0.1"
+ }
+ request(functionId, body);//`body=${escape(JSON.stringify(body))}&uuid=&appid=ld`
+}
+
+function productTaskList() {
+ //https://api.m.jd.com/client.action?functionId=productTaskList&body=%7B%7D&uuid=&appid=ld
+ let functionId = arguments.callee.name.toString();
+ request(functionId);// `body=%7B%7D&uuid=&appid=ld`
+}
+
+function plantChannelNutrientsTask(channelTaskId, channelId) {
+ let functionId = arguments.callee.name.toString();
+ let body = {"channelTaskId": channelTaskId, "channelId": channelId}
+ request(functionId, body);//`body=${escape(JSON.stringify(body))}&uuid=&appid=ld`
+}
+
+function plantChannelTaskList() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);// `body=%7B%7D&uuid=&appid=ld`
+}
+
+function shopNutrientsTask(shopTaskId, shopId) {
+ let functionId = arguments.callee.name.toString();
+ let body = {
+ "version": "9.0.0.1",
+ "monitor_refer": "plant_shopNutrientsTask",
+ "monitor_source": "plant_app_plant_index",
+ "shopId": shopId,
+ "shopTaskId": shopTaskId
+ }
+
+ request(functionId, body);// `body=${escape(JSON.stringify(body))}&uuid=&appid=ld`
+}
+
+function shopTaskList() {
+ let functionId = arguments.callee.name.toString();
+ request(functionId);//`body=%7B%7D&uuid=&appid=ld`
+}
+
+function helpShare(plantUuid) {
+ let body = {
+ "plantUuid": plantUuid,
+ "monitor_refer": "",
+ "wxHeadImgUrl": "",
+ "shareUuid": "",
+ "followType": "0",
+ "monitor_source": "plant_m_plant_index",
+ "version": "9.0.0.1"
+ }
+ request(`plantBeanIndex`, body);
+}
+
+//查询天天扭蛋的机会
+function egg() {
+ request('plantEggLotteryIndex');
+}
+
+// 调用扭蛋api
+function plantEggDoLottery() {
+ request('plantEggDoLottery');
+}
+
+function plantBeanIndex() {
+ // https://api.m.jd.com/client.action?functionId=plantBeanIndex
+ let functionId = arguments.callee.name.toString();
+ let body = {"monitor_source": "plant_app_plant_index", "monitor_refer": "", "version": "9.0.0.1"}
+ request(functionId, body);//plantBeanIndexBody
+}
+
+//偷营养液大于等于3瓶的好友
+//①查询好友列表
+function steal() {
+ const body = {
+ pageNum: '1'
+ }
+ request('plantFriendList', body);
+}
+
+//②执行偷好友营养液的动作
+function collectUserNutr(paradiseUuid) {
+ console.log('开始偷好友');
+ console.log(paradiseUuid);
+ let functionId = arguments.callee.name.toString();
+ const body = {
+ "paradiseUuid": paradiseUuid,
+ "roundId": currentRoundId
+ }
+ request(functionId, body);
+}
+
+//每轮种豆活动获取结束后,自动收取京豆
+function getReward() {
+ const body = {
+ "roundId": lastRoundId
+ }
+ request('receivedBean', body);
+}
+
+function requestGet(url) {
+ const option = {
+ url: url,
+ headers: {
+ Cookie: cookie,
+ }
+ };
+ $.get(option, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n种豆得豆: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ sleep(data);
+ }
+ // try {
+ // sleep(JSON.parse(data))
+ // } catch (e) {
+ // $.logErr(e, resp)
+ // }
+ })
+}
+
+function request(function_id, body = {}) {
+ $.post(taskurl(function_id, body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n种豆得豆: API查询请求失败 ‼️‼️')
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ sleep(data);
+ }
+ })
+}
+
+function taskurl(function_id, body) {
+ // console.log(`${JD_API_HOST}?functionId=${function_id}&body=${escape(JSON.stringify(body))}&appid=ld&client=apple&clientVersion=&networkType=&osVersion=&uuid=`)
+ return {
+ // url: `${JD_API_HOST}?functionId=${function_id}&body=${escape(JSON.stringify(body))}&appid=ld&client=apple&clientVersion=&networkType=&osVersion=&uuid=`,
+ url: JD_API_HOST,
+ body: `functionId=${function_id}&body=${JSON.stringify(body)}&appid=ld&client=apple&clientVersion=&networkType=&osVersion=&uuid=`,
+ headers: {
+ 'Cookie': cookie,
+ 'Host': 'api.m.jd.com',
+ 'Accept': '*/*',
+ 'Connection': 'keep-alive',
+ 'User-Agent': 'JD4iPhone/167249 (iPhone;iOS 13.5.1;Scale/3.00)',
+ 'Accept-Language': 'zh-Hans-CN;q=1,en-CN;q=0.9',
+ 'Accept-Encoding': 'gzip, deflate, br',
+ 'Content-Type': "application/x-www-form-urlencoded"
+ }
+ }
+}
+
+// function taskurl(function_id, body) {
+// return {
+// url: `${JD_API_HOST}?functionId=${function_id}`,
+// body: body, //escape`functionId=${function_id}&body=${JSON.stringify(body)}&appid=wh5`
+// headers: {
+// Cookie: cookie,
+// },
+// method: "POST",
+// }
+// }
+
+function sleep(response) {
+ console.log('休息一下');
+ setTimeout(() => {
+ console.log('休息结束');
+ Task.next(response)
+ }, 2000);
+}
+
+function getParam(url, name) {
+ var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
+ var r = url.match(reg);
+ if (r != null) return unescape(r[2]);
+ return null;
+}
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,o)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),h=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t))}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",o){const r=t=>{if(!t||!this.isLoon()&&this.isSurge())return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,r(o)):this.isQuanX()&&$notify(e,s,i,r(o)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/backUp/jd_speed2.js b/backUp/jd_speed2.js
new file mode 100644
index 00000000..04baaae2
--- /dev/null
+++ b/backUp/jd_speed2.js
@@ -0,0 +1,321 @@
+/*
+京东天天加速活动 国内gitee链接:https://gitee.com/lxk0301/scripts/raw/master/jd_speed.js
+更新时间:2020-08-15
+每天4京豆,再小的苍蝇也是肉
+从 https://github.com/Zero-S1/JD_tools/blob/master/JD_speed.py 改写来的
+建议3小时运行一次,打卡时间间隔是6小时
+注:如果使用Node.js, 需自行安装'crypto-js,got,http-server,tough-cookie'模块. 例: npm install crypto-js http-server tough-cookie got --save
+*/
+// quantumultx
+// [task_local]
+// #天天加速
+// 8 */3 * * * https://gitee.com/lxk0301/scripts/raw/master/jd_speed.js, tag=京东天天加速, img-url=https://raw.githubusercontent.com/znz1992/Gallery/master/jdttjs.png, enabled=true
+// Loon
+// [Script]
+// cron "8 */3 * * *" script-path=https://gitee.com/lxk0301/scripts/raw/master/jd_speed.js,tag=京东天天加速
+const name = '天天加速';
+const $ = new Env(name);
+const Key = '';//单引号内自行填写您抓取的京东Cookie
+//直接用NobyDa的jd cookie
+const cookie = Key ? Key : $.getdata('CookieJD');
+let jdNotify = $.getdata('jdSpeedNotify');
+const JD_API_HOST = 'https://api.m.jd.com/';
+let gen = entrance();
+gen.next();
+
+let indexState = 0;
+let message = '', subTitle = '';
+let beans_num = null;
+let distance = null;
+let destination = null;
+let source_id = null;
+let done_distance = null;
+let task_status = null, able_energeProp_list = [], spaceEvents = [], energePropUsale = [];
+function* entrance() {
+ if (!cookie) {
+ $.msg(name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', { "open-url": "https://bean.m.jd.com/" });
+ $.done();
+ return
+ }
+ console.log(`start...`);
+ yield flyTask_state();
+ console.log(`task_status::${task_status}`)
+ if (task_status === 0) {
+ console.log(`开启新任务:${JSON.stringify(destination)}`);
+ yield flyTask_start(source_id)
+ } else if (task_status === 1) {
+ console.log(`任务进行中:${JSON.stringify(destination)}`);
+ } else if (task_status === 2) {
+ $.msg(name, subTitle, '天天加速2个京豆已到账');
+ yield flyTask_state();
+ console.log(`task_status::${task_status}`)
+ console.log(`开启新任务:${JSON.stringify(destination)}`);
+ yield flyTask_start(source_id);
+ }
+
+ yield spaceEvent_list();//检查太空特殊事件
+ console.log(`可处理的太空特殊事件信息:${spaceEvents.length}个`);
+ if (spaceEvents && spaceEvents.length > 0) {
+ yield spaceEvent();//处理太空特殊事件
+ }
+ console.log('开始检查可领取燃料')
+ yield energyPropList();
+ console.log(`可领取燃料::${able_energeProp_list.length}个`)
+ if (able_energeProp_list && able_energeProp_list.length > 0) {
+ yield receiveeEergyProp();
+ }
+ yield energePropUsaleList();//检查剩余可用的燃料
+ console.log(`可使用燃料${energePropUsale.length}个`)
+ if (energePropUsale && energePropUsale.length > 0) {
+ yield useEnergy();
+ }
+ //执行上面操作后,再进行一次检测
+ yield flyTask_state();
+ if (task_status === 0) {
+ console.log(`开启新任务:${JSON.stringify(destination)}`);
+ yield flyTask_start(source_id);
+ // fix bug ,开启新任务后,再次检查可用的燃料,如果有可用的,继续使用
+ yield energePropUsaleList();//检查剩余可用的燃料
+ console.log(`可使用燃料${energePropUsale.length}个`)
+ if (energePropUsale && energePropUsale.length > 0) {
+ yield useEnergy();
+ }
+ } else if (task_status === 1) {
+ console.log(`任务进行中:${JSON.stringify(destination)}`);
+ } else if (task_status === 2) {
+ $.msg(name, subTitle, '天天加速2个京豆已到账');
+ yield flyTask_state();
+ console.log(`task_status::${task_status}`)
+ console.log(`开启新任务:${JSON.stringify(destination)}`);
+ yield flyTask_start(source_id);
+ }
+ if (!jdNotify || jdNotify === 'false') {
+ $.msg(name, subTitle, message);
+ }
+ $.done();
+}
+//检查燃料
+function energyPropList() {
+ const body = {
+ "source":"game",
+ }
+ request('energyProp_list', body).then(response => {
+ // console.log(`检查燃料列表:${JSON.stringify(response)}`);
+ if (response.code === 0 && response.data && response.data.length > 0) {
+ for (let item of response.data) {
+ if (item.thaw_time === 0) {
+ able_energeProp_list.push(item);
+ }
+ }
+ }
+ gen.next();
+ })
+}
+
+async function receiveeEergyProp() {
+ //开始领取燃料
+ for (let i of able_energeProp_list) {
+ let memberTaskCenterRes = await _energyProp_gain(i.id);
+ console.log(`领取燃料结果:::${memberTaskCenterRes.message}`)
+ }
+ gen.next();
+}
+// 领取燃料调用的api
+function _energyProp_gain(energy_id) {
+ console.log('energy_id', energy_id)
+ if (!energy_id) return;
+ const body = {
+ "source":"game",
+ "energy_id": energy_id
+ }
+ return new Promise((res, rej) => {
+ request('energyProp_gain', body).then((response) => {
+ res(response);
+ })
+ })
+}
+//检查特殊事件
+function spaceEvent_list() {
+ const body = {
+ "source":"game",
+ }
+ request('spaceEvent_list', body).then(response => {
+ console.log(`开始检查特殊事件`);
+ if (response.code === 0 && response.data && response.data.length > 0) {
+ for (let item of response.data) {
+ if (item.status === 1) {
+ for (let j of item.options) {
+ if(j.type === 1) {
+ spaceEvents.push({
+ "id": item.id,
+ "value": j.value
+ })
+ }
+ }
+ }
+ }
+ }
+ gen.next();
+ })
+}
+// 处理太空特殊事件
+async function spaceEvent() {
+ for (let item of spaceEvents) {
+ let spaceEventRes = await spaceEventHandleEvent(item.id, item.value);
+ console.log(`处理特殊事件的结果::${JSON.stringify(spaceEventRes)}`)
+ }
+ gen.next();
+}
+//处理太空特殊事件调用的api
+function spaceEventHandleEvent(id, value) {
+ if (!id && !value) return;
+ const body = {
+ "source":"game",
+ "eventId": id,
+ "option": value
+ }
+ return new Promise((res, rej) => {
+ request('spaceEvent_handleEvent', body).then((response) => {
+ res(response);
+ })
+ })
+}
+function energePropUsaleList() {
+ const body = {
+ "source":"game"
+ };
+ request('energyProp_usalbeList', body).then(res => {
+ console.log(`检查剩余燃料`);
+ energePropUsale = [];
+ if (res.code === 0 && res.data && res.data.length > 0) {
+ res.data.map(item => {
+ energePropUsale.push(item)
+ })
+ }
+ gen.next();
+ });
+}
+
+//使用能源
+async function useEnergy() {
+ for (let i of energePropUsale) {
+ let _energyProp_use = await energyPropUse(i.id);
+ console.log(`使用燃料的结果::${_energyProp_use.message}`)
+ if (_energyProp_use.code !== 0) {
+ console.log(`${_energyProp_use.message},跳出循环`);
+ $.msg($.name, '', "【上轮太空旅行】2 🐶京豆已到账");
+ break
+ }
+ }
+ gen.next();
+}
+//使用能源调用的api
+function energyPropUse(id) {
+ if (!id) return
+ const body = {
+ "source":"game",
+ "energy_id": id
+ }
+ return new Promise((res, rej) => {
+ request('energyProp_use', body).then((response) => {
+ res(response);
+ })
+ })
+}
+//开始新的任务
+function flyTask_start(source_id) {
+ if (!source_id) return;
+ const functionId = arguments.callee.name.toString();
+ const body = {
+ "source":"game",
+ "source_id": source_id
+ }
+ request(functionId, body).then(res => {
+ console.log(`新的任务结束时间:${res.data.end_time}`);
+ gen.next();
+ })
+}
+function flyTask_state() {
+ const functionId = arguments.callee.name.toString();
+ const body = {
+ "source":"game"
+ }
+ request(functionId, body).then((res) => {
+ // console.log(`初始化信息flyTask_state:${JSON.stringify(res)}`)
+ if (res.code === 0) {
+ if (res.info.isLogin === 0) {
+ $.setdata('', 'CookieJD');//cookie失效,故清空cookie。
+ $.msg(name, '【提示】京东cookie已失效,请重新登录获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ $.done();
+ return
+ }
+ let data = res.data;
+ if (data.beans_num) {
+ beans_num = data.beans_num
+ distance = data.distance
+ destination = data.destination
+ done_distance = data.done_distance
+ source_id = data.source_id//根据source_id 启动flyTask_start()
+ task_status = data.task_status //0,没开始;1,已开始
+ subTitle = `【奖励】${beans_num}京豆`
+ if (indexState === 1) {
+ message += `【空间站】 ${destination}\n`;
+ message += `【结束时间】 ${data['end_time']}\n`;
+ message += `【进度】 ${((res.data.done_distance / res.data.distance) * 100).toFixed(2)}%\n`;
+ }
+ indexState++;
+ }
+ gen.next();
+ } else {
+ gen.return()
+ }
+ })
+}
+
+async function request(function_id, body = {}) {
+ await $.wait(300);//延迟两秒
+ return new Promise((resolve, reject) => {
+ $.get(taskurl(function_id, body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log("=== request error -s--");
+ console.log("=== request error -e--");
+ } else {
+ data = JSON.parse(_jsonpToJson(data))
+ }
+ } catch (e) {
+ console.log(e)
+ } finally {
+ resolve(data)
+ }
+ })
+ })
+}
+
+function _jsonpToJson(v) {
+ return v.match(/{.*}/)[0]
+}
+function taskurl(function_id, body) {
+ let url = '';
+ if (function_id === 'spaceEvent_handleEvent') {
+ url = `${JD_API_HOST}?appid=memberTaskCenter&functionId=${function_id}&body=${escape(JSON.stringify(body))}&jsonp=__jsonp1593330783690&_=${new Date().getTime()}&t=${new Date().getTime()}`
+ } else {
+ url = `${JD_API_HOST}?appid=memberTaskCenter&functionId=${function_id}&body=${escape(JSON.stringify(body))}&jsonp=__jsonp1593330783690&_=${new Date().getTime()}`;
+ }
+ return {
+ url,
+ headers: {
+ 'Cookie': cookie,
+ 'Host': 'api.m.jd.com',
+ 'Accept': '*/*',
+ 'Connection': 'keep-alive',
+ 'User-Agent': 'jdapp;iPhone;8.5.5;13.4;9b812b59e055cd226fd60ebb5fd0981c4d0d235d;network/wifi;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/0;model/iPhone9,2;addressid/138109592;hasOCPay/0;appBuild/167121;supportBestPay/0;jdSupportDarkMode/0;pv/104.43;apprpd/MyJD_GameMain;ref/MyJdGameEnterPageController;psq/9;ads/;psn/9b812b59e055cd226fd60ebb5fd0981c4d0d235d|272;jdv/0|direct|-|none|-|1583449735697|1583796810;adk/;app_device/IOS;pap/JA2015_311210|8.5.5|IOS 13.4;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
+ 'Accept-Language': 'zh-cn',
+ 'Referer': 'https://h5.m.jd.com/babelDiy/Zeus/6yCQo2eDJPbyPXrC3eMCtMWZ9ey/index.html?lng=116.845095&lat=39.957701&sid=ea687233c5e7d226b30940ed7382c5cw&un_area=5_274_49707_49973',
+ 'Accept-Encoding': 'gzip, deflate, br'
+ }
+ }
+}
+
+// prettier-ignore
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
\ No newline at end of file
diff --git a/backUp/webhook.js b/backUp/webhook.js
new file mode 100644
index 00000000..18e12294
--- /dev/null
+++ b/backUp/webhook.js
@@ -0,0 +1,82 @@
+/*
+ * @Author: lxk0301 https://github.com/lxk0301
+ * @Date: 2020-10-24 18:53:29
+ * @Last Modified by: lxk0301
+ * @Last Modified time: 2020-11-05 18:54:13
+ */
+
+const $ = new Env('Webhook触发Action');
+let ACTIONS_TRIGGER_TOKEN = '';//Personal access tokens,申请教程:https://www.jianshu.com/p/bb82b3ad1d11 记得勾选repo权限就行
+let TRIGGER_KEYWORDS = '';//.github/workflows/路径里面yml文件里面repository_dispatch项目的types值,例如jd_fruit.yml里面的值为fruit
+let githubUser = '';//github用户名,例:lxk0301
+let repo = '';//需要触发的 Github Action 所在的仓库名称 例:scripts
+
+!(async () => {
+ ACTIONS_TRIGGER_TOKEN = $.getdata('ACTIONS_TRIGGER_TOKEN') ? $.getdata('ACTIONS_TRIGGER_TOKEN') : ACTIONS_TRIGGER_TOKEN;
+ githubUser = $.getdata('githubUser') ? $.getdata('githubUser') : githubUser;
+ repo = $.getdata('repo') ? $.getdata('repo') : repo;
+ TRIGGER_KEYWORDS = $.getdata('TRIGGER_KEYWORDS') ? $.getdata('TRIGGER_KEYWORDS') : TRIGGER_KEYWORDS;
+ TRIGGER_KEYWORDS = TRIGGER_KEYWORDS.split(',');
+ for (let item of TRIGGER_KEYWORDS) {
+ if (!item) {
+ $.msg($.name, `失败`, `触发关键词未提供`)
+ return
+ }
+ if (!ACTIONS_TRIGGER_TOKEN) {
+ $.msg($.name, `失败`, `github token未提供`)
+ return
+ }
+ if (!githubUser) {
+ $.msg($.name, `失败`, `github 用户名未提供`)
+ return
+ }
+ if (!repo) {
+ $.msg($.name, `失败`, `需触发的github仓库名未提供`)
+ return
+ }
+ if (ACTIONS_TRIGGER_TOKEN && githubUser && repo && item) {
+ await hook(item);
+ }
+ }
+})()
+ .catch((e) => {
+ $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
+ })
+ .finally(() => {
+ $.done();
+ })
+
+function hook(key) {
+ const options = {
+ 'url': `https://api.github.com/repos/${githubUser}/${repo}/dispatches`,
+ 'body': `${JSON.stringify({"event_type": key})}`,
+ 'headers': {
+ 'Accept': 'application/vnd.github.everest-preview+json',
+ 'Authorization': `token ${ACTIONS_TRIGGER_TOKEN}`
+ }
+ }
+ return new Promise((resolve) => {
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ if (data && data.match('404')) {
+ $.msg($.name, ``, `触发[${key}]失败,请仔细检查提供的参数`, {"open-url": `https://github.com/${githubUser}/${repo}`})
+ } else if (data && data.match('401')) {
+ $.msg($.name, ``, `触发[${key}]失败,github token权限不足`, {"open-url": `https://github.com/settings/tokens`})
+ } else {
+ console.log(`${JSON.stringify(err)}`)
+ }
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ $.msg($.name, ``, `触发[${key}]成功`, {"open-url": `https://github.com/${githubUser}/${repo}/actions`})
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/backUp/xmSports.js b/backUp/xmSports.js
new file mode 100644
index 00000000..ff55b8c8
--- /dev/null
+++ b/backUp/xmSports.js
@@ -0,0 +1,175 @@
+/*
+ * @Author: lxk0301 https://github.com/lxk0301
+ * @Date: 2020-11-01 13:43:28
+ * @Last Modified by: lxk0301
+ * @Last Modified time: 2020-11-03 13:43:28
+ */
+/*
+小米运动修改微信支付宝运动步数
+APP Store下载小米运动APP
+登入小米运动(登录方式必须是手机号码+密码(没有就用手机号码注册),下面的第三方账号(小米账号,Apple,微信)授权登录不行)
+登录成功后在 我的->第三方接入->绑定支付宝,微信
+小米运动只要不退出登录,就会自动获取新的token,即永久有效
+[MITM]
+hostname = account.huami.com
+Surge
+[Script]
+小米运动 = type=cron,cronexp="15 17 * * *",wake-system=1,timeout=20,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js
+小米运动获取Token = type=http-response,pattern=^https:\/\/account\.huami\.com\/v2\/client\/login, requires-body=1, max-size=0, script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js
+圈X
+[task_local]
+# 小米运动
+15 17 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js, tag=小米运动, enabled=true
+[rewrite_local]
+# 小米运动获取Token
+^https:\/\/account\.huami\.com\/v2\/client\/login url script-response-body https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js
+Loon
+[Script]
+cron "15 17 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js, tag=小米运动
+http-response ^https:\/\/account\.huami\.com\/v2\/client\/login script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmSports.js, requires-body=true, timeout=10, tag=小米运动获取Token
+ */
+
+const $ = new Env('小米运动');
+const isRequest = typeof $request != "undefined"
+let dataJSON = "%5B%7B%22data_hr%22%3A%22%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9L%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FVv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0v%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9e%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0n%5C%2Fa%5C%2F%5C%2F%5C%2FS%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0b%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F1FK%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FR%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9PTFFpaf9L%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FR%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0j%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9K%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FOv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fzf%5C%2F%5C%2F%5C%2F86%5C%2Fzr%5C%2FOv88%5C%2Fzf%5C%2FPf%5C%2F%5C%2F%5C%2F0v%5C%2FS%5C%2F8%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FSf%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fz3%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0r%5C%2FOv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FS%5C%2F9L%5C%2Fzb%5C%2FSf9K%5C%2F0v%5C%2FRf9H%5C%2Fzj%5C%2FSf9K%5C%2F0%5C%2F%5C%2FN%5C%2F%5C%2F%5C%2F%5C%2F0D%5C%2FSf83%5C%2Fzr%5C%2FPf9M%5C%2F0v%5C%2FOv9e%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FS%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fzv%5C%2F%5C%2Fz7%5C%2FO%5C%2F83%5C%2Fzv%5C%2FN%5C%2F83%5C%2Fzr%5C%2FN%5C%2F86%5C%2Fz%5C%2F%5C%2FNv83%5C%2Fzn%5C%2FXv84%5C%2Fzr%5C%2FPP84%5C%2Fzj%5C%2FN%5C%2F9e%5C%2Fzr%5C%2FN%5C%2F89%5C%2F03%5C%2FP%5C%2F89%5C%2Fz3%5C%2FQ%5C%2F9N%5C%2F0v%5C%2FTv9C%5C%2F0H%5C%2FOf9D%5C%2Fzz%5C%2FOf88%5C%2Fz%5C%2F%5C%2FPP9A%5C%2Fzr%5C%2FN%5C%2F86%5C%2Fzz%5C%2FNv87%5C%2F0D%5C%2FOv84%5C%2F0v%5C%2FO%5C%2F84%5C%2Fzf%5C%2FMP83%5C%2FzH%5C%2FNv83%5C%2Fzf%5C%2FN%5C%2F84%5C%2Fzf%5C%2FOf82%5C%2Fzf%5C%2FOP83%5C%2Fzb%5C%2FMv81%5C%2FzX%5C%2FR%5C%2F9L%5C%2F0v%5C%2FO%5C%2F9I%5C%2F0T%5C%2FS%5C%2F9A%5C%2Fzn%5C%2FPf89%5C%2Fzn%5C%2FNf9K%5C%2F07%5C%2FN%5C%2F83%5C%2Fzn%5C%2FNv83%5C%2Fzv%5C%2FO%5C%2F9A%5C%2F0H%5C%2FOf8%5C%2F%5C%2Fzj%5C%2FPP83%5C%2Fzj%5C%2FS%5C%2F87%5C%2Fzj%5C%2FNv84%5C%2Fzf%5C%2FOf83%5C%2Fzf%5C%2FOf83%5C%2Fzb%5C%2FNv9L%5C%2Fzj%5C%2FNv82%5C%2Fzb%5C%2FN%5C%2F85%5C%2Fzf%5C%2FN%5C%2F9J%5C%2Fzf%5C%2FNv83%5C%2Fzj%5C%2FNv84%5C%2F0r%5C%2FSv83%5C%2Fzf%5C%2FMP%5C%2F%5C%2F%5C%2Fzb%5C%2FMv82%5C%2Fzb%5C%2FOf85%5C%2Fz7%5C%2FNv8%5C%2F%5C%2F0r%5C%2FS%5C%2F85%5C%2F0H%5C%2FQP9B%5C%2F0D%5C%2FNf89%5C%2Fzj%5C%2FOv83%5C%2Fzv%5C%2FNv8%5C%2F%5C%2F0f%5C%2FSv9O%5C%2F0ZeXv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F1X%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9B%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FTP%5C%2F%5C%2F%5C%2F1b%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9N%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%22%2C%22date%22%3A%222020-08-14%22%2C%22data%22%3A%5B%7B%22start%22%3A0%2C%22stop%22%3A1439%2C%22value%22%3A%22UA8AUBQAUAwAUBoAUAEAYCcAUBkAUB4AUBgAUCAAUAEAUBkAUAwAYAsAYB8AYB0AYBgAYCoAYBgAYB4AUCcAUBsAUB8AUBwAUBIAYBkAYB8AUBoAUBMAUCEAUCIAYBYAUBwAUCAAUBgAUCAAUBcAYBsAYCUAATIPYD0KECQAYDMAYB0AYAsAYCAAYDwAYCIAYB0AYBcAYCQAYB0AYBAAYCMAYAoAYCIAYCEAYCYAYBsAYBUAYAYAYCIAYCMAUB0AUCAAUBYAUCoAUBEAUC8AUB0AUBYAUDMAUDoAUBkAUC0AUBQAUBwAUA0AUBsAUAoAUCEAUBYAUAwAUB4AUAwAUCcAUCYAUCwKYDUAAUUlEC8IYEMAYEgAYDoAYBAAUAMAUBkAWgAAWgAAWgAAWgAAWgAAUAgAWgAAUBAAUAQAUA4AUA8AUAkAUAIAUAYAUAcAUAIAWgAAUAQAUAkAUAEAUBkAUCUAWgAAUAYAUBEAWgAAUBYAWgAAUAYAWgAAWgAAWgAAWgAAUBcAUAcAWgAAUBUAUAoAUAIAWgAAUAQAUAYAUCgAWgAAUAgAWgAAWgAAUAwAWwAAXCMAUBQAWwAAUAIAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWREAWQIAUAMAWSEAUDoAUDIAUB8AUCEAUC4AXB4AUA4AWgAAUBIAUA8AUBAAUCUAUCIAUAMAUAEAUAsAUAMAUCwAUBYAWgAAWgAAWgAAWgAAWgAAWgAAUAYAWgAAWgAAWgAAUAYAWwAAWgAAUAYAXAQAUAMAUBsAUBcAUCAAWwAAWgAAWgAAWgAAWgAAUBgAUB4AWgAAUAcAUAwAWQIAWQkAUAEAUAIAWgAAUAoAWgAAUAYAUB0AWgAAWgAAUAkAWgAAWSwAUBIAWgAAUC4AWSYAWgAAUAYAUAoAUAkAUAIAUAcAWgAAUAEAUBEAUBgAUBcAWRYAUA0AWSgAUB4AUDQAUBoAXA4AUA8AUBwAUA8AUA4AUA4AWgAAUAIAUCMAWgAAUCwAUBgAUAYAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAWwAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAeSEAeQ8AcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBcAcAAAcAAAcCYOcBUAUAAAUAAAUAAAUAAAUAUAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCgAeQAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcBgAeQAAcAAAcAAAegAAegAAcAAAcAcAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCkAeQAAcAcAcAAAcAAAcAwAcAAAcAAAcAIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCIAeQAAcAAAcAAAcAAAcAAAcAAAeRwAeQAAWgAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcBoAeScAeQAAegAAcBkAeQAAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAegAAegAAcAAAcAAAcBgAeQAAcAAAcAAAcAAAcAAAcAAAcAkAegAAegAAcAcAcAAAcAcAcAAAcAAAcAAAcAAAcA8AeQAAcAAAcAAAeRQAcAwAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcBEAcA0AcAAAWQsAUAAAUAAAUAAAUAAAUAAAcAAAcAoAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBYAegAAcAAAcAAAegAAcAcAcAAAcAAAcAAAcAAAcAAAeRkAegAAegAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAEAcAAAcAAAcAAAcAUAcAQAcAAAcBIAeQAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBsAcAAAcAAAcBcAeQAAUAAAUAAAUAAAUAAAUAAAUBQAcBYAUAAAUAAAUAoAWRYAWTQAWQAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAMAcAAAcAQAcAAAcAAAcAAAcDMAeSIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBQAeQwAcAAAcAAAcAAAcAMAcAAAeSoAcA8AcDMAcAYAeQoAcAwAcFQAcEMAeVIAaTYAbBcNYAsAYBIAYAIAYAIAYBUAYCwAYBMAYDYAYCkAYDcAUCoAUCcAUAUAUBAAWgAAYBoAYBcAYCgAUAMAUAYAUBYAUA4AUBgAUAgAUAgAUAsAUAsAUA4AUAMAUAYAUAQAUBIAASsSUDAAUDAAUBAAYAYAUBAAUAUAUCAAUBoAUCAAUBAAUAoAYAIAUAQAUAgAUCcAUAsAUCIAUCUAUAoAUA4AUB8AUBkAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAA%22%2C%22tz%22%3A32%2C%22did%22%3A%22DA932FFFFE8816E7%22%2C%22src%22%3A24%7D%5D%2C%22summary%22%3A%22%7B%5C%22v%5C%22%3A6%2C%5C%22slp%5C%22%3A%7B%5C%22st%5C%22%3A1597349880%2C%5C%22ed%5C%22%3A1597369860%2C%5C%22dp%5C%22%3A39%2C%5C%22lt%5C%22%3A294%2C%5C%22wk%5C%22%3A0%2C%5C%22usrSt%5C%22%3A-1440%2C%5C%22usrEd%5C%22%3A-1440%2C%5C%22wc%5C%22%3A0%2C%5C%22is%5C%22%3A169%2C%5C%22lb%5C%22%3A10%2C%5C%22to%5C%22%3A23%2C%5C%22dt%5C%22%3A0%2C%5C%22rhr%5C%22%3A58%2C%5C%22ss%5C%22%3A69%2C%5C%22stage%5C%22%3A%5B%7B%5C%22start%5C%22%3A1698%2C%5C%22stop%5C%22%3A1711%2C%5C%22mode%5C%22%3A4%7D%2C%7B%5C%22start%5C%22%3A1712%2C%5C%22stop%5C%22%3A1728%2C%5C%22mode%5C%22%3A5%7D%2C%7B%5C%22start%5C%22%3A1729%2C%5C%22stop%5C%22%3A1818%2C%5C%22mode%5C%22%3A4%7D%2C%7B%5C%22start%5C%22%3A1819%2C%5C%22stop%5C%22%3A1832%2C%5C%22mode%5C%22%3A5%7D%2C%7B%5C%22start%5C%22%3A1833%2C%5C%22stop%5C%22%3A1920%2C%5C%22mode%5C%22%3A4%7D%2C%7B%5C%22start%5C%22%3A1921%2C%5C%22stop%5C%22%3A1928%2C%5C%22mode%5C%22%3A5%7D%2C%7B%5C%22start%5C%22%3A1929%2C%5C%22stop%5C%22%3A2030%2C%5C%22mode%5C%22%3A4%7D%5D%7D%2C%5C%22stp%5C%22%3A%7B%5C%22ttl%5C%22%3A125%2C%5C%22dis%5C%22%3A82%2C%5C%22cal%5C%22%3A5%2C%5C%22wk%5C%22%3A7%2C%5C%22rn%5C%22%3A0%2C%5C%22runDist%5C%22%3A23%2C%5C%22runCal%5C%22%3A3%7D%2C%5C%22goal%5C%22%3A8000%2C%5C%22tz%5C%22%3A%5C%2228800%5C%22%2C%5C%22sn%5C%22%3A%5C%22e716882f93da%5C%22%7D%22%2C%22source%22%3A24%2C%22type%22%3A0%7D%5D";
+const headers = {
+ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'
+}
+let login_token = '';
+//需要修改的运动步数波动范围,脚本默认修改步数范围为1w9到2w5
+const step = randomFriendPin($.getdata('xmMinStep')*1 || 19000, $.getdata('xmMaxStep')*1 || 25000);
+function getToken() {
+ if ($response.body) {
+ const body = JSON.parse($response.body);
+ const loginToken = body.token_info.login_token;
+ $.log(`${$.name}token\n${loginToken}\n`)
+ if ($.getdata('xmSportsToken')) {
+ $.msg($.name, '更新Token: 成功🎉', ``);
+ } else {
+ $.msg($.name, '获取Token: 成功🎉', '');
+ }
+ $.setdata(loginToken, 'xmSportsToken');
+ }
+ $.done({})
+}
+
+async function start() {
+ login_token = $.getdata('xmSportsToken') ? $.getdata('xmSportsToken') : login_token;
+ // console.log(`login_token:::${login_token}`)
+ if (login_token) {
+ await get_app_token(login_token);
+ // console.log(`$.tokenInfo${JSON.stringify($.tokenInfo)}`)
+ if ($.tokenInfo && $.tokenInfo.result === 'ok') {
+ const {app_token, user_id} = $.tokenInfo.token_info;
+ await get_time();
+ await change_step(app_token, user_id);
+ if ($.changeStepRes && $.changeStepRes.code === 1) {
+ console.log(`步数修改成功:${step}步`);
+ $.msg($.name, `${step}步🏃修改成功`, `时间:${timeFormat(localtime())}`, { "open-url": "alipays://platformapi/startapp?appId=20000869" })
+ } else {
+ console.log(`修改运动步数失败`)
+ }
+ } else {
+ $.msg($.name, '失败', `Token已失效,请重新获取`)
+ }
+ } else {
+ $.msg($.name, `失败`, '暂无Token')
+ }
+ $.done()
+}
+
+function change_step(app_token, user_id) {
+ const date = dataJSON.match(/.*?date%22%3A%22(.*?)%22%2C%22data.*?/)[1];
+ const ttf = dataJSON.match(/.*?ttl%5C%22%3A(.*?)%2C%5C%22dis.*?/)[1];
+ dataJSON = dataJSON.replace(date, timeFormat(localtime()));
+ dataJSON = dataJSON.replace(ttf, step.toString());
+ console.log(timeFormat(localtime()))
+ return new Promise(resolve => {
+ const options = {
+ "url": `https://api-mifit-cn2.huami.com/v1/data/band_data.json?&t=${$.t}`,
+ "body": `userid=${user_id.toString()}&last_sync_data_time=1597306380&device_type=0&last_deviceid=DA932FFFFE8816E7&data_json=${dataJSON}`,
+ "headers": {
+ "Content-Type":"application/x-www-form-urlencoded;charset=UTF-8",
+ "apptoken": app_token,
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ console.log(`修改步数结果:${data}`);
+ $.changeStepRes = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+
+function get_app_token(login_token, headers) {
+ return new Promise(resolve => {
+ $.get({url: `https://account-cn.huami.com/v1/client/app_tokens?app_name=com.xiaomi.hm.health&dn=api-user.huami.com%2Capi-mifit.huami.com%2Capp-analytics.huami.com&login_token=${login_token}&os_version=4.1.0`, headers}, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ console.log(data)
+ if (data) {
+ $.tokenInfo = JSON.parse(data);
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function get_time() {
+ return new Promise(resolve => {
+ $.get({url: `http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp`}, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ console.log(data)
+ if (data) {
+ data = JSON.parse(data);
+ $.t = data.data.t;
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function localtime() {
+ return new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000;
+}
+function timeFormat(time) {
+ let date;
+ if (time) {
+ date = new Date(time)
+ } else {
+ date = new Date();
+ }
+ return date.getFullYear() + '-' + ((date.getMonth() + 1) >= 10 ? (date.getMonth() + 1) : '0' + (date.getMonth() + 1)) + '-' + (date.getDate() >= 10 ? date.getDate() : '0' + date.getDate());
+}
+//随机生成m(小)到n(大)的数,包含m和n
+function randomFriendPin(m,n) {
+ return Math.round(Math.random()*(n - m) + m);
+}
+isRequest ? getToken() : start();
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
diff --git a/backUp/xmly_speed_ccokie.js b/backUp/xmly_speed_ccokie.js
new file mode 100644
index 00000000..d9a5699c
--- /dev/null
+++ b/backUp/xmly_speed_ccokie.js
@@ -0,0 +1,34 @@
+/**
+ 获取Cookie方法:
+ 1.将下方设置和[MITM]地址复制的代理软件的相应的区域下
+ 2.APP登陆账号后,点击右下角'福利'选项,即可获取Cookie.获取成功后,去代理软件的日志里面寻找 ’喜马拉雅极速版cookie‘
+ [MITM]
+ hostname = m.ximalaya.com
+ Surge
+ 喜马拉雅极速版Cookie = type=http-request,pattern=https:\/\/m\.ximalaya\.com\/speed\/task-center\/account\/coin,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmly_speed_ccokie.js
+ Loon:
+ http-request https:\/\/m\.ximalaya\.com\/speed\/task-center\/account\/coin script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmly_speed_ccokie.js
+ , requires-body=true, timeout=10, tag=喜马拉雅极速版Cookie
+ QX:
+ [rewrite_local]
+ # 喜马拉雅极速版Cookie
+ https:\/\/m\.ximalaya\.com\/speed\/task-center\/account\/coin url script-request-header https://raw.githubusercontent.com/lxk0301/scripts/master/backUp/xmly_speed_ccokie.js
+ */
+
+const $ = new Env('喜马拉雅极速版获取cookie')
+const CookieKey = 'xmlySpeedCookie';
+const isRequest = typeof $request !== 'undefined'
+if (isRequest) {
+ GetCookie();
+}
+
+function GetCookie() {
+ if ($request && $request.method != 'OPTIONS') {
+ const cookieVal = $request.headers['Cookie'];
+ console.log(`喜马拉雅极速版cookie\n\n${cookieVal}\n\n`);
+ if (cookieVal) $.setdata(cookieVal, CookieKey);
+ $.msg($.name, `获取Cookie: 成功🎉`, `请去代理软件的日志里面寻找复制`);
+ $.done();
+ }
+}
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,o)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),h=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t))}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",o){const r=t=>{if(!t||!this.isLoon()&&this.isSurge())return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,r(o)):this.isQuanX()&&$notify(e,s,i,r(o)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 00000000..e510eb95
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,23 @@
+FROM alpine
+MAINTAINER Akira
+
+RUN set -ex \
+ && apk update && apk upgrade\
+ && apk add --no-cache tzdata git nodejs npm\
+ && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
+ && echo "Asia/Shanghai" > /etc/timezone
+
+RUN git clone https://github.com/lxk0301/scripts /scripts \
+ && cd /scripts \
+ && mkdir logs \
+ && npm install \
+ && cd ~ \
+ && npm install request
+
+ENV CDN_JD_DAILYBONUS true
+
+RUN crontab /scripts/docker/crontab_list.sh
+
+WORKDIR /scripts
+
+CMD ["node"]
diff --git a/docker/Readme.md b/docker/Readme.md
new file mode 100644
index 00000000..c7fc543f
--- /dev/null
+++ b/docker/Readme.md
@@ -0,0 +1,103 @@
+### Usage
+> 推荐使用`docker-compose`所以这里只介绍`docker-compose`使用方式
+
+- `docker-compose` 安装(群晖nas docker自带安装了docker-compose)
+```
+sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
+sudo chmod +x /usr/local/bin/docker-compose
+```
+### 如果需要使用 docker 多个账户独立并发执行定时任务,[参考这里](https://github.com/iouAkira/scripts/blob/patch-1/docker/docker%E5%A4%9A%E8%B4%A6%E6%88%B7%E4%BD%BF%E7%94%A8%E7%8B%AC%E7%AB%8B%E5%AE%B9%E5%99%A8%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E.md#%E4%BD%BF%E7%94%A8%E6%AD%A4%E6%96%B9%E5%BC%8F%E8%AF%B7%E5%85%88%E7%90%86%E8%A7%A3%E5%AD%A6%E4%BC%9A%E4%BD%BF%E7%94%A8docker%E5%8A%9E%E6%B3%95%E4%B8%80%E7%9A%84%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F)
+> 注⚠️:前提先理解学会使用这下面的教程
+### 创建一个目录`jd_scripts`用于存放备份配置等数据,迁移重装的时候只需要备份整个jd_scripts目录即可
+需要新建的目录文件结构参考如下:
+```
+jd_scripts
+├── logs
+│ ├── XXXX.log
+│ └── XXXX.log
+├── my_crontab_list.sh
+└── docker-compose.yml
+```
+- `jd_scripts/logs`建一个空文件夹就行
+- `jd_scripts/docker-compose.yml` 参考内容如下:
+- `jd_scripts/docker-compose.yml`里面的环境变量(`environment:`)配置[参考这里](https://github.com/lxk0301/scripts/blob/master/githubAction.md#%E4%B8%8B%E6%96%B9%E6%8F%90%E4%BE%9B%E4%BD%BF%E7%94%A8%E5%88%B0%E7%9A%84-secrets%E5%85%A8%E9%9B%86%E5%90%88)
+```yaml
+jd_scripts:
+ image: akyakya/jd_scripts
+ container_name: jd_scripts
+ restart: always
+ #如果需要自定定义定时任务的需要自己写好`my_crontab_list.sh`文件 ,取消下面的注释 ,通过 `volumes`挂载进去。
+ volumes:
+ - ./logs:/scripts/logs
+ # - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh
+ tty: true
+ environment:
+ # 注意环境变量填写值的时候一律不需要引号(")下面这些只是事例,根据自己的需求增加删除
+ #jd cookies
+ - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5;
+ #微信server酱通
+ - PUSH_KEY=""
+ #Bark App通知
+ - BARK_PUSH=""
+ #telegram机器人通知
+ - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ
+ - TG_USER_ID=12xxxx206
+ #钉钉机器人通知
+ - DD_BOT_TOKEN=""
+ - DD_BOT_SECRET=""
+ #京东种豆得豆
+ - PLANT_BEAN_SHARECODES=""
+ #京东农场
+ - FRUITSHARECODES=""
+ #京东萌宠
+ - PETSHARECODES=""
+ - JOY_FEED_COUNT=""
+ #京小超
+ - SUPERMARKET_SHARECODES=""
+ #兑换多少数量的京豆(1-20之间,或者1000),0默认兑换不兑换,如需兑换把0改成1-20之间的数字或者1000即可
+ - MARKET_COIN_TO_BEANS=""
+ #是否开启debug模式打印日志
+ - JD_DEBUG=""
+ #该字段必须配置是否使用了自定义定时任务列表,使用了需要把这个名字改成my_crontab_list.sh
+ - CRONTAB_LIST_FILE=crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ #crontab /scripts/docker/my_crontab_list.sh #如果挂载了自定义任务文件 需要在 crond 的上面加行
+ crond
+ node
+```
+- `jd_scripts/my_crontab_list.sh` 参考内容如下:
+```shell
+0 */1 * * * git -C /scripts/ pull >> /scripts/logs/pull.log 2>&1
+2 0 * * * node /scripts/jd_bean_sign.js >> /scripts/logs/jd_bean_sign.log 2>&1
+2 0 * * * node /scripts/jd_blueCoin.js >> /scripts/logs/jd_blueCoin.log 2>&1
+2 0 * * * node /scripts/jd_club_lottery.js >> /scripts/logs/jd_club_lottery.log 2>&1
+20 6-18/6 * * * node /scripts/jd_fruit.js >> /scripts/logs/jd_fruit.log 2>&1
+*/20 */1 * * * node /scripts/jd_joy_feedPets.js >> /scripts/logs/jd_joy_feedPets.log 2>&1
+0 0,4,8,16 * * * node /scripts/jd_joy_reward.js >> /scripts/logs/jd_joy_reward.log 2>&1
+0 1,6 * * * node /scripts/jd_joy_steal.js >> /scripts/logs/jd_joy_steal.log 2>&1
+0 0,1,4,10,15,16 * * * node /scripts/jd_joy.js >> /scripts/logs/jd_joy.log 2>&1
+40 */3 * * * node /scripts/jd_moneyTree.js >> /scripts/logs/jd_moneyTree.log 2>&1
+35 23,4,10 * * * node /scripts/jd_pet.js >> /scripts/logs/jd_pet.log 2>&1
+0 23,0-13/1 * * * node /scripts/jd_plantBean.js >> /scripts/logs/jd_plantBean.log 2>&1
+2 0 * * * node /scripts/jd_redPacket.js >> /scripts/logs/jd_redPacket.log 2>&1
+3 0 * * * node /scripts/jd_shop.js >> /scripts/logs/jd_shop.log 2>&1
+15 * * * * node /scripts/jd_superMarket.js >> /scripts/logs/jd_superMarket.log 2>&1
+55 23 * * * node /scripts/jd_unsubscribe.js >> /scripts/logs/jd_unsubscribe.log 2>&1
+```
+- 目录文件配置好之后在 `jd_scripts`目录执行
+ `docker-compose up -d` 启动;
+ `docker-compose logs` 打印日志;
+ `docker-compose pull` 更新镜像;
+ `docker-compose stop` 停止容器;
+ `docker-compose restart` 重启容器;
+ `docker-compose down` 停止并删除容器;
+
+- 如果是群晖用户,在docker注册表搜jd_scripts,双击下载映像。
+不需要docker-compose.yml,只需建个logs/目录,调整`jd_scripts.syno.json`里面对应的配置值,然后导入json配置新建容器。
+若要自定义my_crontab_list.sh,再建个my_crontab_list.sh文件,配置参考`jd_scripts.my_crontab_list.syno.json`。
+![image](./info.png)
+![image](./dir.png)
+![image](./import.png)
diff --git a/docker/crontab_list.sh b/docker/crontab_list.sh
new file mode 100644
index 00000000..528045d9
--- /dev/null
+++ b/docker/crontab_list.sh
@@ -0,0 +1,26 @@
+0 */1 * * * git -C /scripts/ pull >> /scripts/logs/pull.log 2>&1
+# 每3天的23:50分清理一次日志
+50 23 */3 * * rm -rf /scripts/logs/*.log
+2 */1 * * * crontab /scripts/docker/${CRONTAB_LIST_FILE}
+0 0-18/6,9 * * * node /scripts/jd_818.js >> /scripts/logs/jd_818.log 2>&1
+0,10 0 * * * node /scripts/jd_xtg.js >> /scripts/logs/jd_xtg.log 2>&1
+0 0,12,18 * * * node /scripts/jd_bean_sign.js >> /scripts/logs/jd_bean_sign.log 2>&1
+0 0 * * * node /scripts/jd_blueCoin.js >> /scripts/logs/jd_blueCoin.log 2>&1
+0 0 * * * node /scripts/jd_club_lottery.js >> /scripts/logs/jd_club_lottery.log 2>&1
+5 6-18/6 * * * node /scripts/jd_fruit.js >> /scripts/logs/jd_fruit.log 2>&1
+15 */2 * * * node /scripts/jd_joy.js >> /scripts/logs/jd_joy.log 2>&1
+15 */1 * * * node /scripts/jd_joy_feedPets.js >> /scripts/logs/jd_joy_feedPets.log 2>&1
+0 0-16/8 * * * node /scripts/jd_joy_reward.js >> /scripts/logs/jd_joy_reward.log 2>&1
+0 0,6 * * * node /scripts/jd_joy_steal.js >> /scripts/logs/jd_joy_steal.log 2>&1
+0 */2 * * * node /scripts/jd_moneyTree.js >> /scripts/logs/jd_moneyTree.log 2>&1
+5 6-18/6 * * * node /scripts/jd_pet.js >> /scripts/logs/jd_pet.log 2>&1
+0 7-22/1 * * * node /scripts/jd_plantBean.js >> /scripts/logs/jd_plantBean.log 2>&1
+1 1 * * * node /scripts/jd_redPacket.js >> /scripts/logs/jd_redPacket.log 2>&1
+10 0 * * * node /scripts/jd_shop.js >> /scripts/logs/jd_shop.log 2>&1
+8 */3 * * * node /scripts/jd_speed.js >> /scripts/logs/jd_speed.log 2>&1
+11 1-23/5 * * * node /scripts/jd_superMarket.js >> /scripts/logs/jd_superMarket.log 2>&1
+55 23 * * * node /scripts/jd_unsubscribe.js >> /scripts/logs/jd_unsubscribe.log 2>&1
+0 */1 * * * node /scripts/jd_collectProduceScore.js >> /scripts/logs/jd_collectProduceScore.log 2>&1
+0 2 * * * node /scripts/jd_bean_change.js >> /scripts/logs/jd_bean_change.log 2>&1
+11 1 * * * node /scripts/jd_lotteryMachine.js >> /scripts/logs/jd_lotteryMachine.log 2>&1
+11 9 * * * node /scripts/jd_rankingList.js >> /scripts/logs/jd_rankingList.log 2>&1
diff --git a/docker/dir.png b/docker/dir.png
new file mode 100644
index 00000000..91b973eb
Binary files /dev/null and b/docker/dir.png differ
diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml
new file mode 100644
index 00000000..6154555f
--- /dev/null
+++ b/docker/docker-compose.yml
@@ -0,0 +1,52 @@
+jd_scripts:
+ image: akyakya/jd_scripts
+ container_name: jd_scripts
+ restart: always
+ #如果需要自定定义定时任务的需要自己写好`my_crontab_list.sh`文件 ,取消下面的挂载注释 ,通过 `volumes`挂载进去。
+ volumes:
+ # - ./my_crontab_list.sh:/scripts/docker/my_crontab_list.sh
+ - ./logs:/scripts/logs
+ tty: true
+ environment:
+ # 注意环境变量填写值的时候一律不需要引号(""或者'')下面这些只是事例,根据自己的需求增加删除
+ #jd cookies
+ # 例: JD_COOKIE=pt_key=XXX;pt_pin=XXX
+ - JD_COOKIE=
+ #微信server酱通
+ - PUSH_KEY=
+ #Bark App通知
+ - BARK_PUSH=
+ #telegram机器人通知
+ - TG_BOT_TOKEN=
+ - TG_USER_ID=
+ #钉钉机器人通知
+ - DD_BOT_TOKEN=
+ - DD_BOT_SECRET=
+ #京东种豆得豆
+ - PLANT_BEAN_SHARECODES=
+ #京东农场
+ # 例: FRUITSHARECODES=京东农场的互助码
+ - FRUITSHARECODES=
+ #京东萌宠
+ # 例: PETSHARECODES=东东萌宠的互助码
+ - PETSHARECODES=
+ # 宠汪汪的喂食数量
+ - JOY_FEED_COUNT=
+ #京小超
+ # - SUPERMARKET_SHARECODES=
+ #兑换多少数量的京豆(20,或者1000京豆,或者其他奖品的文字)
+ # 例: MARKET_COIN_TO_BEANS=1000
+ - MARKET_COIN_TO_BEANS=
+ #是否开启debug模式打印日志
+ # 例: JD_DEBUG=false
+ - JD_DEBUG=
+ #是否使用了自定义定时任务,这个名字改成my_crontab_list.sh
+ - CRONTAB_LIST_FILE=crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ #crontab /scripts/docker/my_crontab_list.sh #如果挂载了自定义任务文件,取消此条注释即可
+ crond
+ git -C /scripts/ pull
+ node
diff --git "a/docker/docker\345\244\232\350\264\246\346\210\267\344\275\277\347\224\250\347\213\254\347\253\213\345\256\271\345\231\250\344\275\277\347\224\250\350\257\264\346\230\216.md" "b/docker/docker\345\244\232\350\264\246\346\210\267\344\275\277\347\224\250\347\213\254\347\253\213\345\256\271\345\231\250\344\275\277\347\224\250\350\257\264\346\230\216.md"
new file mode 100644
index 00000000..4031200f
--- /dev/null
+++ "b/docker/docker\345\244\232\350\264\246\346\210\267\344\275\277\347\224\250\347\213\254\347\253\213\345\256\271\345\231\250\344\275\277\347\224\250\350\257\264\346\230\216.md"
@@ -0,0 +1,123 @@
+### 使用此方式,请先理解学会使用[docker办法一](https://github.com/lxk0301/scripts/tree/master/docker#%E5%88%9B%E5%BB%BA%E4%B8%80%E4%B8%AA%E7%9B%AE%E5%BD%95jd_scripts%E7%94%A8%E4%BA%8E%E5%AD%98%E6%94%BE%E5%A4%87%E4%BB%BD%E9%85%8D%E7%BD%AE%E7%AD%89%E6%95%B0%E6%8D%AE%E8%BF%81%E7%A7%BB%E9%87%8D%E8%A3%85%E7%9A%84%E6%97%B6%E5%80%99%E5%8F%AA%E9%9C%80%E8%A6%81%E5%A4%87%E4%BB%BD%E6%95%B4%E4%B8%AAjd_scripts%E7%9B%AE%E5%BD%95%E5%8D%B3%E5%8F%AF)的使用方式
+> 发现有人好像希望不同账户任务并发执行,不想一个账户执行完了才能再执行另一个,这里写一个`docker办法一`的基础上实现方式,其实就是不同账户创建不同的容器,他们互不干扰单独定时执行自己的任务。
+配置使用起来还是比较简单的,具体往下看
+### 文件夹目录参考
+![image](https://user-images.githubusercontent.com/6993269/97781779-885ae700-1bc8-11eb-93a4-b274cbd6062c.png)
+### 具体使用说明直接在图片标注了,文件参考[图片下方](https://github.com/lxk0301/scripts/new/master/docker#docker-composeyml%E6%96%87%E4%BB%B6%E5%8F%82%E8%80%83),配置完成后的[执行命令]()
+![image](https://user-images.githubusercontent.com/6993269/97781610-a1af6380-1bc7-11eb-9397-903b47f5ad6b.png)
+#### `docker-compose.yml`文件参考
+```yaml
+version: '3'
+services:
+ jd_scripts1:
+ image: akyakya/jd_scripts
+ restart: always
+ container_name: jd_scripts1
+ tty: true
+ volumes:
+ - ./logs1:/scripts/logs
+ environment:
+ - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5;
+ - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ
+ - TG_USER_ID=12xxxx206
+ - CRONTAB_LIST_FILE=crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ git -C /scripts/ pull
+ crond
+ node
+ jd_scripts2:
+ image: akyakya/jd_scripts
+ restart: always
+ container_name: jd_scripts2
+ tty: true
+ volumes:
+ - ./logs2:/scripts/logs
+ environment:
+ - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5;
+ - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ
+ - TG_USER_ID=12xxxx206
+ - CRONTAB_LIST_FILE=crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ git -C /scripts/ pull
+ crond
+ node
+ jd_scripts3:
+ image: akyakya/jd_scripts
+ restart: always
+ container_name: jd_scripts3
+ tty: true
+ volumes:
+ - ./logs3:/scripts/logs
+ - ./my_crontab_list3.sh:/scripts/docker/my_crontab_list.sh
+ environment:
+ - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5;
+ - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ
+ - TG_USER_ID=12xxxx206
+ - CRONTAB_LIST_FILE=my_crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ crontab /scripts/docker/my_crontab_list.sh
+ git -C /scripts/ pull
+ crond
+ node
+ jd_scripts4:
+ image: akyakya/jd_scripts
+ restart: always
+ container_name: jd_scripts4
+ tty: true
+ volumes:
+ - ./logs4:/scripts/logs
+ - ./my_crontab_list4.sh:/scripts/docker/my_crontab_list.sh
+ environment:
+ - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5;
+ - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ
+ - TG_USER_ID=12xxxx206
+ - CRONTAB_LIST_FILE=my_crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ crontab /scripts/docker/my_crontab_list.sh
+ git -C /scripts/ pull
+ crond
+ node
+ jd_scripts5:
+ image: akyakya/jd_scripts
+ restart: always
+ container_name: jd_scripts5
+ tty: true
+ volumes:
+ - ./logs5:/scripts/logs
+ - ./my_crontab_list5.sh:/scripts/docker/my_crontab_list.sh
+ environment:
+ - JD_COOKIE=pt_key=AAJfjaNrADAS8ygfgIsOxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxxx5;
+ - TG_BOT_TOKEN=130xxxx280:AAExxxxxxWP10zNf91WQ
+ - TG_USER_ID=12xxxx206
+ - CRONTAB_LIST_FILE=my_crontab_list.sh
+ command:
+ - /bin/sh
+ - -c
+ - |
+ crontab /scripts/docker/my_crontab_list.sh
+ git -C /scripts/ pull
+ crond
+ node
+```
+#### 目录文件配置好之后在 `jd_scripts_multi`目录执行
+ `docker-compose up -d` 启动;
+ `docker-compose logs` 打印日志;
+ `docker-compose pull` 更新镜像;
+ `docker-compose stop` 停止容器;
+ `docker-compose restart` 重启容器;
+ `docker-compose down` 停止并删除容器;
+ ![image](https://user-images.githubusercontent.com/6993269/97781935-8fcec000-1bc9-11eb-9d1a-d219e7a1caa9.png)
+
+
diff --git a/docker/import.png b/docker/import.png
new file mode 100644
index 00000000..df1cbe52
Binary files /dev/null and b/docker/import.png differ
diff --git a/docker/info.png b/docker/info.png
new file mode 100644
index 00000000..ace2bd88
Binary files /dev/null and b/docker/info.png differ
diff --git a/docker/jd_scripts.my_crontab_list.syno.json b/docker/jd_scripts.my_crontab_list.syno.json
new file mode 100644
index 00000000..2fddb6b1
--- /dev/null
+++ b/docker/jd_scripts.my_crontab_list.syno.json
@@ -0,0 +1,65 @@
+{
+ "cap_add" : [],
+ "cap_drop" : [],
+ "cmd" : "/bin/sh -c 'crontab /scripts/docker/my_crontab_list.sh && crond && node'",
+ "cpu_priority" : 50,
+ "devices" : null,
+ "enable_publish_all_ports" : false,
+ "enable_restart_policy" : true,
+ "enabled" : true,
+ "env_variables" : [
+ {
+ "key" : "PATH",
+ "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ },
+ {
+ "key" : "CDN_JD_DAILYBONUS",
+ "value" : "true"
+ },
+ {
+ "key" : "JD_COOKIE",
+ "value" : "pt_key=xxx;pt_pin=xxx;"
+ },
+ {
+ "key" : "PUSH_KEY",
+ "value" : ""
+ },
+ {
+ "key" : "CRONTAB_LIST_FILE",
+ "value" : "my_crontab_list.sh"
+ }
+ ],
+ "exporting" : false,
+ "id" : "3a2f6f27c23f93bc104585c22569c760cc9ce82df09cdb41d53b491fe1d0341c",
+ "image" : "akyakya/jd_scripts",
+ "is_ddsm" : false,
+ "is_package" : false,
+ "links" : [],
+ "memory_limit" : 0,
+ "name" : "jd_scripts",
+ "network" : [
+ {
+ "driver" : "bridge",
+ "name" : "bridge"
+ }
+ ],
+ "network_mode" : "default",
+ "port_bindings" : [],
+ "privileged" : false,
+ "shortcut" : {
+ "enable_shortcut" : false
+ },
+ "use_host_network" : false,
+ "volume_bindings" : [
+ {
+ "host_volume_file" : "/docker/jd_scripts/my_crontab_list.sh",
+ "mount_point" : "/scripts/docker/my_crontab_list.sh",
+ "type" : "rw"
+ },
+ {
+ "host_volume_file" : "/docker/jd_scripts/logs",
+ "mount_point" : "/scripts/logs",
+ "type" : "rw"
+ }
+ ]
+}
diff --git a/docker/jd_scripts.syno.json b/docker/jd_scripts.syno.json
new file mode 100644
index 00000000..042b6def
--- /dev/null
+++ b/docker/jd_scripts.syno.json
@@ -0,0 +1,83 @@
+{
+ "cap_add" : null,
+ "cap_drop" : null,
+ "cmd" : "/bin/sh -c 'crond && node'",
+ "cpu_priority" : 0,
+ "devices" : null,
+ "enable_publish_all_ports" : false,
+ "enable_restart_policy" : true,
+ "enabled" : false,
+ "env_variables" : [
+ {
+ "key" : "PATH",
+ "value" : "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
+ },
+ {
+ "key" : "CDN_JD_DAILYBONUS",
+ "value" : "true"
+ },
+ {
+ "key" : "JD_COOKIE",
+ "value" : "pt_key=AAJfjaNrADASxxxxxxxKpfDaZ2pSBOYTxtPqLK8U1Q;pt_pin=lxxxxx5;"
+ },
+ {
+ "key" : "TG_BOT_TOKEN",
+ "value" : "13xxxxxx80:AAEkNxxxxxxzNf91WQ"
+ },
+ {
+ "key" : "TG_USER_ID",
+ "value" : "12xxxx206"
+ },
+ {
+ "key" : "PLANT_BEAN_SHARECODES",
+ "value" : ""
+ },
+ {
+ "key" : "FRUITSHARECODES",
+ "value" : ""
+ },
+ {
+ "key" : "PETSHARECODES",
+ "value" : ""
+ },
+ {
+ "key" : "SUPERMARKET_SHARECODES",
+ "value" : ""
+ },
+ {
+ "key" : "CRONTAB_LIST_FILE",
+ "value" : "crontab_list.sh"
+ }
+ ],
+ "exporting" : false,
+ "id" : "18af38bc0ac37a40e4b9608a86fef56c464577cc160bbdddec90155284fcf4e5",
+ "image" : "akyakya/jd_scripts",
+ "is_ddsm" : false,
+ "is_package" : false,
+ "links" : [],
+ "memory_limit" : 0,
+ "name" : "jd_scripts",
+ "network" : [
+ {
+ "driver" : "bridge",
+ "name" : "bridge"
+ }
+ ],
+ "network_mode" : "default",
+ "port_bindings" : [],
+ "privileged" : false,
+ "shortcut" : {
+ "enable_shortcut" : false,
+ "enable_status_page" : false,
+ "enable_web_page" : false,
+ "web_page_url" : ""
+ },
+ "use_host_network" : false,
+ "volume_bindings" : [
+ {
+ "host_volume_file" : "/docker/jd_scripts/logs",
+ "mount_point" : "/scripts/logs",
+ "type" : "rw"
+ }
+ ]
+}
diff --git a/githubAction.md b/githubAction.md
new file mode 100644
index 00000000..2d733716
--- /dev/null
+++ b/githubAction.md
@@ -0,0 +1,220 @@
+## Github Action使用教程说明
+ - Fork [此仓库项目](https://github.com/lxk0301/scripts) > 点击右上角fork按钮即可, [再不会可看此图](icon/fork.png)
+
+ - 然后参考github@ruicky写的特别详细的小白教程[@ruicky教程](https://ruicky.me/2020/06/05/jd-sign/) (**注:此 [@ruicky教程](https://ruicky.me/2020/06/05/jd-sign/) 里面获取ck的方法不对。参考下面两种获取京东cookie的方式才对.**)
+
+
+
+### 注意几个地方就行
+
+
+
+#### **fork后必须修改一下文件,才能执行定时任务**
+ - 比如修改一下`README.md`文件(enter键回车),再提交
+ - 不知怎么修改README.md文件的看[这个图](icon/action3.png);
+
+
+
+
+#### 京东Cookie
+
+ - Secret新增`JD_COOKIE`,填入cookie信息,多账号的cookie, 使用`&`或者换行隔开(两种方法)
+
+ - 方式已一:`&`号隔开示例(注:后面的英文引号`;`不可缺失)
+ 如 `账号一cookie&账号二cookie&账号三cookie`,再多账号就依次类推即可
+ ```
+ pt_key=xxx1;pt_pin=xxx1;&pt_key=xxx2;pt_pin=xxx2;&pt_key=xxx3;pt_pin=xxx3;
+ ```
+ - 方式二:按`Enter`键换行隔开示例(这里给下三个账号的示例)
+ ```
+ pt_key=bbbbbbbbbbbbbb;pt_pin=aaaaaaa;
+ pt_key=cccccccc;pt_pin=dddddddd;
+ pt_key=eeeeeeeee;pt_pin=ffffffff;
+ ```
+ - 京东cookie获取看这里
+ - [浏览器获取京东cookie教程](https://github.com/lxk0301/scripts/blob/master/backUp/GetJdCookie.md) 或者 [插件获取京东cookie教程](https://github.com/lxk0301/scripts/blob/master/backUp/GetJdCookie2.md)
+ - IOS代理软件(Surge, Quantumult X, Loon)等用户有使用过BoxJs的,可在BoxJs里面提取京东cookie(打开BoxJs -> 底部中间的 `应用` -> NobyDa脚本订阅 -> 京东(多合一签到) -> 点击会话右上方的三个点点 -> 修改会话 -> 全选复制即可),再不会看此[图文教程](icon/jd8.png)
+
+
+#### Action里面cron时间
+
+ - 此时间是国际标准时间,与北京时间不同,github action写16点才表示北京时间0点,具体可参考下面两个链接写cron
+
+ - [参考链接一](https://datetime360.com/cn/utc-beijing-time/) , [参考链接二](http://www.timebie.com/cn/universalbeijing.php)
+
+ - 根据使用经验发现github action 会有延迟现象,一般会延迟15分钟左右吧。比如action设置`北京时间16:00`运行,action其实要`16:15左右`才会执行脚本的。
+
+
+
+#### 如何查看Action运行情况
+
+ - [查看运行状态](https://raw.githubusercontent.com/lxk0301/scripts/master/icon/action1.png)
+
+ - [查看运行日志](https://raw.githubusercontent.com/lxk0301/scripts/master/icon/action2.png)
+
+
+
+#### 如何禁用单个或者多个脚本(Action)
+
+ - 操作步骤[看此图](./icon/disable-action.jpg)
+
+
+
+#### Fork后Action未运行
+
+ > 是因为`/.github/workflows/`路径里面的`.yml`后缀文件里面的cron时间未到,如需立马看到效果
+
+ - 方法:在自己仓库,手动点击仓库的右上角`star图标按钮`即可,稍后就能看到运行
+ - 注:之后如果想单独运行某一个脚本(此处的前提条件是执行过上面的方法),手动点击 Run workflow [根据此图片示例操作](https://user-images.githubusercontent.com/21308593/93980945-e28ab000-fdb1-11ea-977c-c50705e79ac3.png) ,再次点一下`Actions`图标即可看到效果(或者等待10秒左右也可)
+
+
+
+#### 自动同步Fork后的代码
+
+ > 此部分内容由tg@wukongdada和tg@goukey提供
+
+ - 方案A - 强制远程分支覆盖自己的分支(**新手推荐使用**)
+
+ 1. 参考tg@wukongdada这篇教程 [保持自己github的forks自动和上游仓库同步的教程](https://github.com/lxk0301/scripts/blob/master/backUp/gitSync.md) , 安装[pull插件](https://github.com/apps/pull) 并确认此项目已在pull插件的作用下(参考@twukongdada这篇教程文中1-d)
+
+ 2. 确保.github/pull.yml文件正常存在,yml内上游作者填写正确(此项目已填好,无需更改)。
+
+ 3. 确保pull.yml里面是`mergeMethod: hardreset`(默认就是`hardreset`)。
+
+ 4. ENJOY!上游更改三小时左右就会自动发起同步。
+ ```
+ # 方案A可参考这里
+ version: "1"
+ rules: # Array of rules
+ - base: master # Required. Target branch
+ upstream: lxk0301:master # Required. Must be in the same fork network.
+ mergeMethod: hardreset # Optional, one of [none, merge, squash, rebase, hardreset], Default: none.
+ mergeUnstable: true # Optional, merge pull request even when the mergeable_state is not clean. Default: false
+ ```
+ - 方案B - 保留自己仓库已修改过的文件(**需修改脚本或者提PR的使用**)
+
+ > 上游变动后pull插件会自动发起pr,但如果有冲突需要自行**手动**确认。
+ > 如果上游更新涉及workflow里的文件内容改动,需要自行**手动**确认。
+
+ 1. 参考tg@wukongdada这篇教程 [保持自己github的forks自动和上游仓库同步的教程](https://github.com/lxk0301/scripts/blob/master/backUp/gitSync.md) , 安装[pull插件](https://github.com/apps/pull) 并确认此项目已在pull插件的作用下(参考@twukongdada这篇教程文中1-d)
+ 2. 确保.github/pull.yml文件正常存在,yml内上游作者填写正确(此项目已填好,无需更改)。
+ 3. 将pull.yml里面的`mergeMethod: hardreset`修改为`mergeMethod: merge`保存。
+ 4. ENJOY!上游更改三小时左右就会自动发起同步。
+ ```
+ # 方案B可参考这里
+ version: "1"
+ rules: # Array of rules
+ - base: master # Required. Target branch
+ upstream: lxk0301:master # Required. Must be in the same fork network.
+ mergeMethod: merge # Optional, one of [none, merge, squash, rebase, hardreset], Default: none.
+ mergeUnstable: true # Optional, merge pull request even when the mergeable_state is not clean. Default: false
+ ```
+ - 方案C - 利用github-action定时cron更新同步(**新手推荐使用**)
+
+ > 效果和方案A一样(即:强制更新覆盖)
+
+ 新建secret,`Name`为`PAT`,填写的`Value`值需要去申请Personal access tokens,申请教程[看此处](https://www.jianshu.com/p/bb82b3ad1d11) 记得勾选`repo`权限就行
+
+
+
+#### 下方提供使用到的 **Secrets全集合**
+
+| Name | 归属 | 属性 | 说明 |
+| :---------------------: | :----------: | --------- | ------------------------------------------------------------ |
+| `JD_COOKIE` | 京东 | 必须 | 京东cookie,多个账号的cookie使用`&`隔开或者换行。具体获取参考[浏览器获取京东cookie教程](https://github.com/lxk0301/scripts/blob/master/backUp/GetJdCookie.md) 或者 [插件获取京东cookie教程](https://github.com/lxk0301/scripts/blob/master/backUp/GetJdCookie2.md) |
+| `JD_BEAN_STOP` | 京东 | 非必须 | 自定义延迟签到,单位毫秒. 默认分批并发无延迟. 延迟作用于每个签到接口, 如填入延迟则切换顺序签到(耗时较长),如需填写建议输入数字`1` |
+| `JD_BEAN_SIGN_STOP_NOTIFY`| 京东 | 非必须 | `jd_bean_sign.js`脚本运行后不推送签到结果通知,默认推送,填`true`表示不发送通知 |
+| `JD_BEAN_SIGN_NOTIFY_SIMPLE`| 京东 | 非必须 | `jd_bean_sign.js`脚本运行后推送签到结果简洁版通知,默认推送全部签到结果,填`true`表示推送简洁通知,[效果图](./icon/bean_sign_simple.jpg) |
+| `JD_DEBUG` | 脚本打印log | 非必须 | 运行脚本时,是否显示log,默认显示。改成false表示不显示,注重隐私的人可以在设置secret -> `Name:JD_DEBUG,Value:false` |
+| `PUSH_KEY` | 微信推送 | 非必须 | cookie失效推送[server酱的微信通知](http://sc.ftqq.com/3.version) |
+| `BARK_PUSH` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | 非必须 | cookie失效推送BARK这个APP,填写内容是app提供的`设备码`,例如:https://api.day.app/123 ,那么此处的设备码就是`123`,再不懂看 [这个图](icon/bark.jpg) |
+| `BARK_SOUND` | [BARK推送](https://apps.apple.com/us/app/bark-customed-notifications/id1403753865) | 非必须 | bark推送声音设置,例如`choo`,具体值请在`bark`-`推送铃声`-`查看所有铃声` |
+| `TG_BOT_TOKEN` | telegram推送 | 非必须 | tg推送,填写自己申请[@BotFather](https://t.me/BotFather)的Token,如`10xxx4:AAFcqxxxxgER5uw` , [具体教程](https://github.com/lxk0301/scripts/pull/37#issuecomment-692415594) |
+| `TG_USER_ID` | telegram推送 | 非必须 | tg推送,填写[@getuseridbot](https://t.me/getuseridbot)中获取到的纯数字ID, [具体教程](https://github.com/lxk0301/scripts/pull/37#issuecomment-692415594) |
+| `DD_BOT_TOKEN` | 钉钉推送 | 非必须 | 钉钉推送[官方文档](https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq) ,只需`https://oapi.dingtalk.com/robot/send?access_token=XXX` 等于符号后面的XXX, 注:如果钉钉推送只填写`DD_BOT_TOKEN`,那么安全设置需勾选`自定义关键词`,内容输入输入`账号`即可,其他安全设置不要勾选 |
+| `DD_BOT_SECRET` | 钉钉推送 | 非必须 | 密钥,机器人安全设置页面,加签一栏下面显示的SEC开头的字符串 , 注:填写了`DD_BOT_TOKEN`和`DD_BOT_SECRET`,钉钉机器人安全设置只需勾选`加签`即可,其他选项不要勾选,再不懂看 [这个图](icon/DD_bot.png) |
+| `IGOT_PUSH_KEY` | iGot推送 | 非必须 | iGot聚合推送,支持多方式推送,确保消息可达。 [参考文档](https://wahao.github.io/Bark-MP-helper ) |
+| `PET_NOTIFY_CONTROL` | 东东萌宠推送开关 | 非必须 | 控制京东萌宠是否静默运行,`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) |
+| `FRUIT_NOTIFY_CONTROL` | 东东农场推送开关 | 非必须 | 控制京东农场是否静默运行,`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) |
+| `JD_JOY_REWARD_NOTIFY` | 宠汪汪兑换京豆推送开关 | 非必须 | 控制jd_joy_reward.js脚本是否静默运行,`false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息)
+| `JD_818_SHAREID_NOTIFY` | 京东818互助码通知开关 | 非必须 | 控制jd_818.js脚本是否在获取互助码后通知,`true`为是(发送推送通知消息),`false`为否(即:不发送推送通知消息) |
+| `JOY_FEED_COUNT` | 宠汪汪喂食数量 | 非必须 | 控制jd_joy_feedPets.js脚本喂食数量 ,可以填的数字10,20,40,80 , 其他数字不可. |
+| `JOY_HELP_FEED` | 宠汪汪帮好友喂食 | 非必须 | 控制jd_joy_steal.js脚本是否给好友喂食,`false`为否,`true`为是(给好友喂食) |
+| `JOY_RUN_FLAG` | 宠汪汪参加双人赛跑 | 非必须 | 控制jd_joy.js脚本是否参加双人赛跑,`false`为否,`true`为是,脚本默认是`true` |
+| `JD_JOY_REWARD_NAME` | 宠汪汪积分兑换多少京豆 | 非必须 | 目前可填值为`20`或者`500`,脚本默认`20`,`0`表示不兑换京豆 |
+| `MARKET_COIN_TO_BEANS` | 京小超兑换京豆数量 | 非必须 | 控制jd_blueCoin.js兑换京豆数量,可输入值为`20`或者`1000`的数字或者其他商品的名称,例如`碧浪洗衣凝珠` |
+| `MARKET_REWARD_NOTIFY` | 京小超兑换奖品推送开关 | 非必须 | 控制jd_blueCoin.js兑换奖品成功后是否静默运行, `false`为否(发送推送通知消息),`true`为是(即:不发送推送通知消息) |
+| `SUPERMARKET_UPGRADE` | 京小超自动升级 | 非必须 | 自动升级,顺序:解锁升级商品、升级货架,`true`表示自动升级,`false`表示关闭自动升级 |
+| `BUSINESS_CIRCLE_JUMP` | 京小超自动更换商圈 | 非必须 | 小于对方300热力值自动更换商圈队伍,`true`表示运行,`false`表示禁止 |
+| `SUPERMARKET_LOTTERY` | 京小超抽奖 | 非必须 | 每天运行脚本是否使用金币去抽奖,`true`表示抽奖,`false`表示不抽奖 |
+| `FRUIT_BEAN_CARD` | 农场使用水滴换豆卡 | 非必须 | 农场使用水滴换豆卡(如果出现限时活动时100g水换20豆,此时比浇水划算,推荐换豆),`true`表示换豆(不浇水),`false`表示不换豆(继续浇水),脚本默认是浇水 |
+| `UN_SUBSCRIBES` | jd_unsubscribe.js | 非必须 | 共四个参数,换行隔开. 四个参数分别表示`取关商品数量`,`取关店铺数量`,`遇到此商品不再进行取关`, `遇到此店铺不再进行取关`,[具体使用往下看](#取关店铺secret的说明)|
+| `FruitShareCodes` | 东东农场互助码 | 非必须 | 填写规则请看 [jdFruitShareCodes.js](https://github.com/lxk0301/scripts/blob/master/jdFruitShareCodes.js) 或见下方[互助码的填写规则](#互助码的填写规则) |
+| `PETSHARECODES` | 东东萌宠互助码 | 非必须 | 填写规则请看 [jdPetShareCodes.js](https://github.com/lxk0301/scripts/blob/master/jdPetShareCodes.js) 或见下方[互助码的填写规则](#互助码的填写规则) |
+| `PLANT_BEAN_SHARECODES` | 种豆得豆互助码 | 非必须 | 填写规则请看 [jdPlantBeanShareCodes.js](https://github.com/lxk0301/scripts/blob/master/jdPlantBeanShareCodes.js) 或见下方[互助码的填写规则](#互助码的填写规则) |
+| `SUPERMARKET_SHARECODES`| 京小超商圈互助码 | 非必须 | 填写规则请看 [jdSuperMarketShareCodes.js](https://github.com/lxk0301/scripts/blob/master/jdSuperMarketShareCodes.js) 或见下方[互助码的填写规则](#互助码的填写规则) |
+
+
+
+##### 互助码的填写规则
+
+ > 互助码如何获取:运行相应脚本后,在日志里面可以找到。(如何查看日志上面有写,详见 如何查看action运行情况)
+
+同一个京东账号的好友互助码用@隔开,不同京东账号互助码用&或者换行隔开,下面给一个文字示例和具体互助码示例说明
+
+两个账号各两个互助码的文字示例:
+
+ ```
+京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2
+ ```
+
+ 两个账号各两个互助码的真实示例:
+ ```
+0a74407df5df4fa99672a037eec61f7e@dbb21614667246fabcfd9685b6f448f3&6fbd26cc27ac44d6a7fed34092453f77@61ff5c624949454aa88561f2cd721bf6&6fbd26cc27ac44d6a7fed34092453f77@61ff5c624949454aa88561f2cd721bf6
+ ```
+
+
+
+#### 取关店铺secret的说明
+
+ > secret依次是`取关商品数`,`取关店铺数`,`遇到此商品不再进行取关`,`遇到此店铺不再进行取关`
+
+例如我要取关 `100`个商品,`100`个店铺,商品遇到商品关键字 `iPhone12` 停止取关,店铺遇到 `Apple京东自营旗舰店` 不再取关
+则使用`换行`或者`&`隔开即可,
+下面给出换行隔开示例:
+
+ ```
+100
+100
+iPhone12
+Apple京东自营旗舰店
+ ```
+
+下面给出`&`符号隔开示例:
+ ```
+100&100&iPhone12&Apple京东自营旗舰店
+ ```
+
+#### 关于脚本推送通知(微信server酱推送通知,bark app推送通知,telegram机器人推送通知,钉钉机器人推送通知,iGot聚合推送)
+
+ > 如果你填写了上面五种推送通知方式中的某一个通知所需secret,那么脚本通知情况如下:
+
+ > 目前默认只有jd_fruit.js,jd_pet.js,jd_bean_sign.js,jd_818.js四个脚本每次运行后都通知
+
+ ```
+jd_plantBean.js是每周一收集京豆后通知一次,
+jd_joy_reward.js是每次兑换到了京豆通知一次,
+jd_blueCoin.js是每次兑换到了奖品通知一次,
+jd_818.js是每次获取新的互助码会通知一次,以帮助您快速上车,
+其余的脚本平常运行都是不通知,只有在京东cookie失效后,才会推送通知
+ ```
+ - 如果填写了推送通知所需的secret后,运行上面有通知的脚本,还没收到通知的话,请自行查看action运行日志(如何查看日志教程请看上面的`如何查看action运行情况`),里面会推送通知发送失败的log
+
+
+
+##### 参考文献
+[GitHub Actions 手动触发方式进化史](https://p3terx.com/archives/github-actions-manual-trigger.html)
+
+[GitHub Actions 入门教程](https://p3terx.com/archives/github-actions-started-tutorial.html)
+
+[github@ruicky教程](https://ruicky.me/2020/06/05/jd-sign/)
diff --git a/iCloud.md b/iCloud.md
new file mode 100644
index 00000000..5c8bd4c2
--- /dev/null
+++ b/iCloud.md
@@ -0,0 +1,140 @@
+## 1.安装 Node.js 环境
+
+[下载地址](https://nodejs.org/zh-tw/download/ )
+
+根据自己的操作系统下载
+
+傻瓜式安装,一直下一步即可。
+
+
+
+## 2.下载源码
+
+![BclSld.png](https://s1.ax1x.com/2020/11/04/BclSld.png)
+
+点击红框处下载压缩包
+
+## 3.安装依赖、增加入口文件、增加cookie
+
+压缩包解压后进入项目文件夹
+
+- Windows 用户按住 **shift** 点击右键,点击 **在此处打开命令窗口**
+- Mac 用户通过终端,自行进入该文件夹
+
+在命令行内输入 `npm i `,等待运行完成。
+
+此时,项目文件夹内会多出一个 `node_modules`文件夹
+
+ **增加入口文件**
+
+方案一:同一个仓库下同一个时间,执行多个脚本
+
+在项目文件夹内新建 `index.js`
+
+编辑文件
+
+```javascript
+'use strict';
+exports.main_handler = async (event, context, callback) => {
+ require('./jd_xtg1.js') //这里写你想要的脚本
+ require('./jd_xtg2.js') //这里写你想要的脚本
+ require('./jd_xtg3.js') //这里写你想要的脚本
+}
+
+```
+此时,同一时间点下,会同时执行多个脚本,触发器触发后,index.js文件中require()下的所有脚本都会被执行
+
+方案二:同一个仓库下不同的时间点,分别执行不同的脚本(类似GitHub Action执行机制)
+
+在项目文件夹内新建 `index.js`
+
+编辑文件
+
+```javascript
+'use strict';
+exports.main_handler = async (event, context, callback) => {
+ for (const v of event["Message"].split("\r\n")) {
+ console.log(v);
+ require(`./${v}.js`)
+ }
+}
+
+```
+
+此时触发管理按照下图中进行设置,附加信息选择“是”,内容填写需要传递执行的具体脚本文件名,以回车键换行。触发器触发后,附加信息栏内的脚本会被执行,设置多个不同时间点的触发器达到类似GitHub Action的效果
+
+
+[![B20KxI.png](https://s1.ax1x.com/2020/11/05/B20KxI.png)](https://imgchr.com/i/B20KxI)
+[![BRCG0H.png](https://s1.ax1x.com/2020/11/05/BRCG0H.png)](https://imgchr.com/i/BRCG0H)
+
+注意:方案一与方案二不能混合到同一个index.js文件中使用,同一个仓库下,二者只能选择其一
+
+
+ **增加cookie**
+
+打开项目文件内的 `jdCookie.js`
+
+在最上面的 `CookieJDs`里写入 cookie ,多个账号以逗号分隔
+
+例如
+
+```javascript
+let CookieJDs = [
+ 'pt_key=xxx;pt_pin=xxx;',
+ 'pt_key=zzz;pt_pin=zzz;',
+ 'pt_key=aaa;pt_pin=xxxaaa'
+]
+```
+
+
+
+## 4.上传至腾讯云
+
+[腾讯云函数地址]( https://console.cloud.tencent.com/scf/index )
+
+编写函数
+
+登录后,点击管理控制台
+
+单击左侧导航栏**函数服务**,进入“函数服务”页面。
+在页面上方选择一个地域,最好选择离你常用地区近点的,不至于导致账号异常。单击**新建**。如下图所示:
+
+![iCloud1](./icon/iCloud1.png)
+
+在“新建函数”页面填写函数基础信息,单击**下一步**。如下图所示:
+
+![iCloud2](./icon/iCloud2.png)
+
+函数名称:可以自定义,比如为jd。
+运行环境:选择 “Nodejs 12.16”。
+创建方式:选择 “空白函数”。
+
+确保环境为Nodejs 12.16,执行方法改为:index.main_handler,提交方式建议选本地文件夹,然后从GitHub项目克隆Zip压缩包,解压成文件夹,然后点击这个上传把文件夹上传进来(记得node_modules文件夹一并上传),完了后点击下面的高级设置。
+
+![iCloud3](./icon/iCloud3.png)
+
+内存用不了太大,64MB就够了(64M内存,免费时长6,400,000秒,内存与免费时长大致关系可以参看云函数官方说明),超时时间改为最大的900秒,然后点击最下面的完成。
+
+![iCloud4](./icon/iCloud4.png)
+
+## 5.设置触发器
+
+点击刚创建的函数
+
+![BcGa8O.png](https://s1.ax1x.com/2020/11/04/BcGa8O.png)
+
+点击如图所示
+
+![BcGvM4.png](https://s1.ax1x.com/2020/11/04/BcGvM4.png)
+
+![UTOOLS1604471299130.png](https://img01.sogoucdn.com/app/a/100520146/f8d70ea4f8e08d9e87ec8c13474f22c3)
+
+想进阶使用触发器的自行查看本文中方案一和方案二中的说明
+
+关于触发周期中的自定义触发周期,使用的是 Cron表达式,这个自行学习下吧
+
+[Corn文档](https://cloud.tencent.com/document/product/583/9708#cron-.E8.A1.A8.E8.BE.BE.E5.BC.8F)
+
+
+
+点击提交,所有流程就结束了。
diff --git a/icon/DD_bot.png b/icon/DD_bot.png
new file mode 100644
index 00000000..d3cdc58e
Binary files /dev/null and b/icon/DD_bot.png differ
diff --git a/icon/Snipaste_2020-08-28_09-31-42.png b/icon/Snipaste_2020-08-28_09-31-42.png
new file mode 100644
index 00000000..073f989d
Binary files /dev/null and b/icon/Snipaste_2020-08-28_09-31-42.png differ
diff --git a/icon/action1.png b/icon/action1.png
new file mode 100644
index 00000000..ca1ab739
Binary files /dev/null and b/icon/action1.png differ
diff --git a/icon/action2.png b/icon/action2.png
new file mode 100644
index 00000000..78749585
Binary files /dev/null and b/icon/action2.png differ
diff --git a/icon/action3.png b/icon/action3.png
new file mode 100644
index 00000000..32b2db37
Binary files /dev/null and b/icon/action3.png differ
diff --git a/icon/bark.jpg b/icon/bark.jpg
new file mode 100644
index 00000000..0cbdadf0
Binary files /dev/null and b/icon/bark.jpg differ
diff --git a/icon/bean_sign_simple.jpg b/icon/bean_sign_simple.jpg
new file mode 100644
index 00000000..1c01c7c2
Binary files /dev/null and b/icon/bean_sign_simple.jpg differ
diff --git a/icon/disable-action.jpg b/icon/disable-action.jpg
new file mode 100644
index 00000000..93109081
Binary files /dev/null and b/icon/disable-action.jpg differ
diff --git a/icon/fork.png b/icon/fork.png
new file mode 100644
index 00000000..46b5b720
Binary files /dev/null and b/icon/fork.png differ
diff --git a/icon/git1.jpg b/icon/git1.jpg
new file mode 100644
index 00000000..aeaf461f
Binary files /dev/null and b/icon/git1.jpg differ
diff --git a/icon/git10.jpg b/icon/git10.jpg
new file mode 100644
index 00000000..d0dd7d8c
Binary files /dev/null and b/icon/git10.jpg differ
diff --git a/icon/git11.jpg b/icon/git11.jpg
new file mode 100644
index 00000000..313c4560
Binary files /dev/null and b/icon/git11.jpg differ
diff --git a/icon/git12.jpg b/icon/git12.jpg
new file mode 100644
index 00000000..e8809198
Binary files /dev/null and b/icon/git12.jpg differ
diff --git a/icon/git13.jpg b/icon/git13.jpg
new file mode 100644
index 00000000..65c0f69b
Binary files /dev/null and b/icon/git13.jpg differ
diff --git a/icon/git14.jpg b/icon/git14.jpg
new file mode 100644
index 00000000..bd7f3771
Binary files /dev/null and b/icon/git14.jpg differ
diff --git a/icon/git2.jpg b/icon/git2.jpg
new file mode 100644
index 00000000..7cb7642c
Binary files /dev/null and b/icon/git2.jpg differ
diff --git a/icon/git3.jpg b/icon/git3.jpg
new file mode 100644
index 00000000..603c79c5
Binary files /dev/null and b/icon/git3.jpg differ
diff --git a/icon/git4.jpg b/icon/git4.jpg
new file mode 100644
index 00000000..ae2f4279
Binary files /dev/null and b/icon/git4.jpg differ
diff --git a/icon/git5.jpg b/icon/git5.jpg
new file mode 100644
index 00000000..3bfa3fab
Binary files /dev/null and b/icon/git5.jpg differ
diff --git a/icon/git6.jpg b/icon/git6.jpg
new file mode 100644
index 00000000..8bf8551e
Binary files /dev/null and b/icon/git6.jpg differ
diff --git a/icon/git7.png b/icon/git7.png
new file mode 100644
index 00000000..d40f2c0b
Binary files /dev/null and b/icon/git7.png differ
diff --git a/icon/git8.jpg b/icon/git8.jpg
new file mode 100644
index 00000000..db30fa44
Binary files /dev/null and b/icon/git8.jpg differ
diff --git a/icon/git9.jpg b/icon/git9.jpg
new file mode 100644
index 00000000..e44757e9
Binary files /dev/null and b/icon/git9.jpg differ
diff --git a/icon/iCloud1.png b/icon/iCloud1.png
new file mode 100644
index 00000000..669ac59c
Binary files /dev/null and b/icon/iCloud1.png differ
diff --git a/icon/iCloud2.png b/icon/iCloud2.png
new file mode 100644
index 00000000..fae44857
Binary files /dev/null and b/icon/iCloud2.png differ
diff --git a/icon/iCloud3.png b/icon/iCloud3.png
new file mode 100644
index 00000000..dcb6b0d0
Binary files /dev/null and b/icon/iCloud3.png differ
diff --git a/icon/iCloud4.png b/icon/iCloud4.png
new file mode 100644
index 00000000..41e852b3
Binary files /dev/null and b/icon/iCloud4.png differ
diff --git a/icon/jd1.jpg b/icon/jd1.jpg
new file mode 100644
index 00000000..33a9f8f5
Binary files /dev/null and b/icon/jd1.jpg differ
diff --git a/icon/jd2.jpg b/icon/jd2.jpg
new file mode 100644
index 00000000..cd6f8391
Binary files /dev/null and b/icon/jd2.jpg differ
diff --git a/icon/jd3.jpg b/icon/jd3.jpg
new file mode 100644
index 00000000..264ea71a
Binary files /dev/null and b/icon/jd3.jpg differ
diff --git a/icon/jd4.jpg b/icon/jd4.jpg
new file mode 100644
index 00000000..7f6f4c8a
Binary files /dev/null and b/icon/jd4.jpg differ
diff --git a/icon/jd5.png b/icon/jd5.png
new file mode 100644
index 00000000..f7972667
Binary files /dev/null and b/icon/jd5.png differ
diff --git a/icon/jd6.png b/icon/jd6.png
new file mode 100644
index 00000000..a49b69db
Binary files /dev/null and b/icon/jd6.png differ
diff --git a/icon/jd7.png b/icon/jd7.png
new file mode 100644
index 00000000..d05a36c8
Binary files /dev/null and b/icon/jd7.png differ
diff --git a/icon/jd8.png b/icon/jd8.png
new file mode 100644
index 00000000..d763579c
Binary files /dev/null and b/icon/jd8.png differ
diff --git a/icon/jd_moneyTree.png b/icon/jd_moneyTree.png
new file mode 100644
index 00000000..69024fac
Binary files /dev/null and b/icon/jd_moneyTree.png differ
diff --git a/icon/jd_pet.png b/icon/jd_pet.png
new file mode 100644
index 00000000..bb231e4a
Binary files /dev/null and b/icon/jd_pet.png differ
diff --git a/icon/thanks.jpg b/icon/thanks.jpg
new file mode 100644
index 00000000..2b9e8054
Binary files /dev/null and b/icon/thanks.jpg differ
diff --git a/icon/txy.png b/icon/txy.png
new file mode 100644
index 00000000..2c58d391
Binary files /dev/null and b/icon/txy.png differ
diff --git a/jdCookie.js b/jdCookie.js
new file mode 100644
index 00000000..bd5affd8
--- /dev/null
+++ b/jdCookie.js
@@ -0,0 +1,34 @@
+/*
+此文件为Node.js专用。其他用户请忽略
+ */
+//此处填写京东账号cookie。
+//注:github action用户cookie填写到Settings-Secrets里面,新增JD_COOKIE,多个账号的cookie使用`&`隔开或者换行
+let CookieJDs = [
+ 'pt_pin=%E8%A2%AB%E6%8A%98%E5%8F%A0%E7%9A%84%E8%AE%B0%E5%BF%8633;pt_key=AAJfiEZzAEDRcGffuD7SjMtkggHav_tLEGQKrHATc0-csk8i8YmsFG61dBic6NcF_nzF1KafS8Qk6ifcsjZlccpY4Rol4A6M;',//账号一ck,例:pt_key=XXX;pt_pin=XXX;
+ 'pt_key=AAJfqJhcADACx6FPR_HewSd5qCm4U6lFrP3ReM_8DVmk2eM7I9F56fchBgR8-c4OUksXLJvmCJI;pt_pin=jd_6cd93e613b0e5;',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推
+ 'pt_key=AAJfjkvZADB1lVyfAmTB_If3sJx1mg-Me8lkuh5abTAdKyf49gjluPmpk4SHM-XPr8uHK9YfLgk;pt_pin=jd_45a6b5953b15b;',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推
+ 'pt_key=AAJfgq5SADBPKbwp5VJnCH-W6EmlrD--P602-NGWVGqQXxw4dYeu42B9VYq6XanrCHOsa7_HSuU;pt_pin=jd_704a2e5e28a66;',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推
+ 'pt_key=AAJfjE-CADDTKbmisaX-EPer8Ybbasq1GuhYteIiL59Hka9tLLm-RilSF9Viprwqmj9x2jWcMG0;pt_pin=zooooo58;',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推
+ 'pt_key=AAJfkAlBADBm3nXsIQiNrFmv2gqs0EBTiKBcqglVoA6B22Shhbdx7Pf6275G7ouuZNk7dhgcXfc;pt_pin=jd_5851f32d4a083;',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推
+
+ 'pt_key=AAJfn9QgADC_R9SmgqVGq1RY2612YbvEOx5hk7_3yRLnfULIyQ-VXVo5DXa4ff6BpqnvN7Y4dVA;pt_pin=jd_479264ad454f0;',//账号二ck,例:pt_key=XXX;pt_pin=XXX;如有更多,依次类推
+]
+// 判断github action里面是否有京东ck
+if (process.env.JD_COOKIE) {
+ if (process.env.JD_COOKIE.indexOf('&') > -1) {
+ console.log(`您的cookie选择的是用&隔开\n`)
+ CookieJDs = process.env.JD_COOKIE.split('&');
+ } else if (process.env.JD_COOKIE.indexOf('\n') > -1) {
+ console.log(`您的cookie选择的是用换行隔开\n`)
+ CookieJDs = process.env.JD_COOKIE.split('\n');
+ } else {
+ CookieJDs = process.env.JD_COOKIE.split();
+ }
+ console.log(`\n====================共有${CookieJDs.length}个京东账号Cookie=========\n`);
+ console.log(`==================脚本执行- 北京时间(UTC+8):${new Date(new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000).toLocaleString()}=====================\n`)
+ // console.log(`\n==================脚本执行来自 github action=====================\n`)
+}
+for (let i = 0; i < CookieJDs.length; i++) {
+ const index = (i + 1 === 1) ? '' : (i + 1);
+ exports['CookieJD' + index] = CookieJDs[i];
+}
diff --git a/jdFruitShareCodes.js b/jdFruitShareCodes.js
new file mode 100644
index 00000000..17199e02
--- /dev/null
+++ b/jdFruitShareCodes.js
@@ -0,0 +1,31 @@
+/*
+水果互助码
+此文件为Node.js专用。其他用户请忽略
+支持京东N个账号
+ */
+//云服务器腾讯云函数等NOde.js用户在此处填写京东东农场的好友码。
+// github action用户的好友互助码填写到Action->Settings->Secrets->new Secret里面(Name填写 FruitShareCodes(此处的Name必须按此来写,不能随意更改),内容处填写互助码,填写规则如下)
+// 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例
+// 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2
+let FruitShareCodes = [
+ '0a74407df5df4fa99672a037eec61f7e@dbb21614667246fabcfd9685b6f448f3@6fbd26cc27ac44d6a7fed34092453f77@61ff5c624949454aa88561f2cd721bf6',//账号一的好友shareCode,不同好友中间用@符号隔开
+ '6fbd26cc27ac44d6a7fed34092453f77@61ff5c624949454aa88561f2cd721bf6@9c52670d52ad4e1a812f894563c746ea@8175509d82504e96828afc8b1bbb9cb3',//账号二的好友shareCode,不同好友中间用@符号隔开
+]
+// 判断github action里面是否有水果互助码
+if (process.env.FRUITSHARECODES) {
+ if (process.env.FRUITSHARECODES.indexOf('&') > -1) {
+ console.log(`您的东东农场互助码选择的是用&隔开\n`)
+ FruitShareCodes = process.env.FRUITSHARECODES.split('&');
+ } else if (process.env.FRUITSHARECODES.indexOf('\n') > -1) {
+ console.log(`您的东东农场互助码选择的是用换行隔开\n`)
+ FruitShareCodes = process.env.FRUITSHARECODES.split('\n');
+ } else {
+ FruitShareCodes = process.env.FRUITSHARECODES.split();
+ }
+} else if (process.env.JD_COOKIE) {
+ console.log(`由于您secret里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`)
+}
+for (let i = 0; i < FruitShareCodes.length; i++) {
+ const index = (i + 1 === 1) ? '' : (i + 1);
+ exports['FruitShareCode' + index] = FruitShareCodes[i];
+}
diff --git a/jdPetShareCodes.js b/jdPetShareCodes.js
new file mode 100644
index 00000000..f910ca29
--- /dev/null
+++ b/jdPetShareCodes.js
@@ -0,0 +1,31 @@
+/*
+东东萌宠互助码
+此文件为Node.js专用。其他用户请忽略
+支持京东N个账号
+ */
+//云服务器腾讯云函数等NOde.js用户在此处填写东东萌宠的好友码。
+// github action用户的好友互助码填写到Action->Settings->Secrets->new Secret里面(Name填写 PetShareCodes(此处的Name必须按此来写,不能随意更改),内容处填写互助码,填写规则如下)
+// 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例
+// 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2
+let PetShareCodes = [
+ 'MTAxODc2NTEzNTAwMDAwMDAwMjg3MDg2MA==@MTAxODc2NTEzMzAwMDAwMDAyNzUwMDA4MQ==@MTAxODc2NTEzMjAwMDAwMDAzMDI3MTMyOQ==@MTAxODc2NTEzNDAwMDAwMDAzMDI2MDI4MQ==',//账号一的好友shareCode,不同好友中间用@符号隔开
+ 'MTAxODc2NTEzMjAwMDAwMDAzMDI3MTMyOQ==@MTAxODcxOTI2NTAwMDAwMDAyNjA4ODQyMQ==@MTAxODc2NTEzOTAwMDAwMDAyNzE2MDY2NQ==',//账号二的好友shareCode,不同好友中间用@符号隔开
+]
+// 判断github action里面是否有东东萌宠互助码
+if (process.env.PETSHARECODES) {
+ if (process.env.PETSHARECODES.indexOf('&') > -1) {
+ console.log(`您的东东萌宠互助码选择的是用&隔开\n`)
+ PetShareCodes = process.env.PETSHARECODES.split('&');
+ } else if (process.env.PETSHARECODES.indexOf('\n') > -1) {
+ console.log(`您的东东萌宠互助码选择的是用换行隔开\n`)
+ PetShareCodes = process.env.PETSHARECODES.split('\n');
+ } else {
+ PetShareCodes = process.env.PETSHARECODES.split();
+ }
+} else if (process.env.JD_COOKIE) {
+ console.log(`由于您secret里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`)
+}
+for (let i = 0; i < PetShareCodes.length; i++) {
+ const index = (i + 1 === 1) ? '' : (i + 1);
+ exports['PetShareCode' + index] = PetShareCodes[i];
+}
\ No newline at end of file
diff --git a/jdPlantBeanShareCodes.js b/jdPlantBeanShareCodes.js
new file mode 100644
index 00000000..356cc89f
--- /dev/null
+++ b/jdPlantBeanShareCodes.js
@@ -0,0 +1,31 @@
+/*
+京东种豆得豆互助码
+此文件为Node.js专用。其他用户请忽略
+支持京东N个账号
+ */
+//云服务器腾讯云函数等NOde.js用户在此处填写东东萌宠的好友码。
+// github action用户的好友互助码填写到Action->Settings->Secrets->new Secret里面(Name填写 PLANT_BEAN_SHARECODES(此处的Name必须按此来写,不能随意更改),内容处填写互助码,填写规则如下)
+// 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例
+// 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2
+let PlantBeanShareCodes = [
+ '66j4yt3ebl5ierjljoszp7e4izzbzaqhi5k2unz2afwlyqsgnasq@olmijoxgmjutyrsovl2xalt2tbtfmg6sqldcb3q@e7lhibzb3zek27amgsvywffxx7hxgtzstrk2lba',//账号一的好友shareCode,不同好友中间用@符号隔开
+ '4npkonnsy7xi3p6pjfxg6ct5gll42gmvnz7zgoy@6dygkptofggtp6ffhbowku3xgu@mlrdw3aw26j3wgzjipsxgonaoyr2evrdsifsziy@mlrdw3aw26j3wgzjipsxgonaoyr2evrdsifsziy',//账号二的好友shareCode,不同好友中间用@符号隔开
+]
+// 判断github action里面是否有东东萌宠互助码
+if (process.env.PLANT_BEAN_SHARECODES) {
+ if (process.env.PLANT_BEAN_SHARECODES.indexOf('&') > -1) {
+ console.log(`您的种豆互助码选择的是用&隔开\n`)
+ PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split('&');
+ } else if (process.env.PLANT_BEAN_SHARECODES.indexOf('\n') > -1) {
+ console.log(`您的种豆互助码选择的是用换行隔开\n`)
+ PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split('\n');
+ } else {
+ PlantBeanShareCodes = process.env.PLANT_BEAN_SHARECODES.split();
+ }
+} else if (process.env.JD_COOKIE) {
+ console.log(`由于您secret里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`)
+}
+for (let i = 0; i < PlantBeanShareCodes.length; i++) {
+ const index = (i + 1 === 1) ? '' : (i + 1);
+ exports['PlantBeanShareCodes' + index] = PlantBeanShareCodes[i];
+}
\ No newline at end of file
diff --git a/jdSuperMarketShareCodes.js b/jdSuperMarketShareCodes.js
new file mode 100644
index 00000000..880c8c86
--- /dev/null
+++ b/jdSuperMarketShareCodes.js
@@ -0,0 +1,31 @@
+/*
+京小超互助码
+此文件为Node.js专用。其他用户请忽略
+支持京东N个账号
+ */
+//云服务器腾讯云函数等Node.js用户在此处填写京小超商圈的好友码。
+// github action用户的好友互助码填写到Action->Settings->Secrets->new Secret里面(Name填写 SuperMarketShareCodes(此处的Name必须按此来写,不能随意更改),内容处填写互助码,填写规则如下)
+// 同一个京东账号的好友互助码用@符号隔开,不同京东账号之间用&符号或者换行隔开,下面给一个示例
+// 如: 京东账号1的shareCode1@京东账号1的shareCode2&京东账号2的shareCode1@京东账号2的shareCode2
+let SuperMarketShareCodes = [
+ '-4msulYas0O2JsRhE-2TA5XZmBQ@eU9Yar_mb_9z92_WmXNG0w@eU9YaejjYv4g8T2EwnsVhQ',//账号一的好友shareCode,不同好友中间用@符号隔开
+ 'aURoM7PtY_Q@eU9Ya-y2N_5z9DvXwyIV0A@eU9YaOnjYK4j-GvWmXIWhA',//账号二的好友shareCode,不同好友中间用@符号隔开
+]
+// 判断github action里面是否有京小超商圈互助码
+if (process.env.SUPERMARKET_SHARECODES) {
+ if (process.env.SUPERMARKET_SHARECODES.indexOf('&') > -1) {
+ console.log(`您的京小超商圈互助码选择的是用&隔开\n`)
+ SuperMarketShareCodes = process.env.SUPERMARKET_SHARECODES.split('&');
+ } else if (process.env.SUPERMARKET_SHARECODES.indexOf('\n') > -1) {
+ console.log(`您的京小超商圈互助码选择的是用换行隔开\n`)
+ SuperMarketShareCodes = process.env.SUPERMARKET_SHARECODES.split('\n');
+ } else {
+ SuperMarketShareCodes = process.env.SUPERMARKET_SHARECODES.split();
+ }
+} else if (process.env.JD_COOKIE) {
+ console.log(`由于您secret里面未提供助力码,故此处运行将会给脚本内置的码进行助力,请知晓!`)
+}
+for (let i = 0; i < SuperMarketShareCodes.length; i++) {
+ const index = (i + 1 === 1) ? '' : (i + 1);
+ exports['SuperMarketShareCode' + index] = SuperMarketShareCodes[i];
+}
\ No newline at end of file
diff --git a/jd_818.js b/jd_818.js
new file mode 100644
index 00000000..9563049c
--- /dev/null
+++ b/jd_818.js
@@ -0,0 +1,917 @@
+/*
+ * @Author: lxk0301 https://github.com/lxk0301
+ * @Date: 2020-11-03 09:25:47
+ * @Last Modified by: lxk0301
+ * @Last Modified time: 2020-11-02 09:26:12
+ */
+/*
+京东手机狂欢城活动,每日可获得30+以上京豆(其中20京豆是往期奖励,需第一天参加活动后,第二天才能拿到)
+活动时间10.21日-11.12日结束,活动23天,保底最少可以拿到690京豆
+活动地址: https://rdcseason.m.jd.com/#/index
+
+其中有20京豆是往期奖励,需第一天参加活动后,第二天才能拿到!!!!
+
+
+每天0/6/12/18点逛新品/店铺/会场可获得京豆,京豆先到先得
+往期奖励一般每天都能拿20京豆
+
+注:脚本运行会给我提供的助力码助力,介意者可删掉脚本第48行helpCode里面的东西。留空即可(const helpCode = []);
+
+支持京东双账号
+脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
+// quantumultx
+[task_local]
+#京东手机狂欢城
+1 0-18/6 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_818.js, tag=京东手机狂欢城, enabled=true
+// Loon
+[Script]
+cron "1 0-18/6 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_818.js,tag=京东手机狂欢城
+// Surge
+京东手机狂欢城 = type=cron,cronexp=1 0-18/6 * * *,wake-system=1,timeout=20,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_818.js
+ */
+const $ = new Env('京东手机狂欢城');
+
+const notify = $.isNode() ? require('./sendNotify') : '';
+let jdNotify = false;//是否开启推送互助码
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//IOS等用户直接用NobyDa的jd cookie
+let cookiesArr = [], cookie = '';
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
+} else {
+ cookiesArr.push($.getdata('CookieJD'));
+ cookiesArr.push($.getdata('CookieJD2'));
+}
+
+const JD_API_HOST = 'https://rdcseason.m.jd.com/api/';
+const activeEndTime = '2020/11/13 01:00:00';
+const addUrl = 'http://jd.turinglabs.net/helpcode/create/';
+const printUrl = `http://jd.turinglabs.net/helpcode/print/20/`;
+let helpCode = []
+!(async () => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ $.temp = [];
+ for (let i = 0; i < cookiesArr.length; i++) {
+ if (cookiesArr[i]) {
+ cookie = cookiesArr[i];
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ $.isLogin = true;
+ $.nickName = '';
+ await TotalBean();
+ console.log(`\n开始【京东账号${$.index}】${$.nickName || $.UserName}\n`);
+ if (!$.isLogin) {
+ $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
+ $.setdata('', `CookieJD${i ? i + 1 : "" }`);//cookie失效,故清空cookie。
+ if ($.isNode()) await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
+ continue
+ }
+ message = '';
+ subTitle = '';
+ await JD818();
+ // await getHelp();
+ // await doHelp();
+ // await main();
+ }
+ }
+ // console.log($.temp)
+})()
+ .catch((e) => {
+ $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
+ })
+ .finally(() => {
+ $.done();
+ })
+async function main() {
+ // await getHelp();
+ await Promise.all([
+ getHelp(),
+ listGoods(),
+ shopInfo(),
+ listMeeting(),
+ ]);
+ await $.wait(10000);
+ await Promise.all([
+ listGoods(),
+ shopInfo(),
+ listMeeting(),
+ doHelp(),
+ myRank(),
+ ]);
+ await Promise.all([
+ getListJbean(),
+ getListRank(),
+ getListIntegral(),
+ ]);
+ await showMsg()
+}
+async function JD818() {
+ await getHelp();
+ await listGoods();//逛新品
+ await shopInfo();//逛店铺
+ await listMeeting();//逛会场
+ await $.wait(10000);
+ //再次运行一次,避免出现遗漏的问题
+ await listGoods();//逛新品
+ await shopInfo();//逛店铺
+ await listMeeting();//逛会场
+ await doHelp();
+ await myRank();//领取往期排名奖励
+ await getListJbean();
+ await getListRank();
+ await getListIntegral();
+ await showMsg()
+}
+function listMeeting() {
+ const options = {
+ 'url': `${JD_API_HOST}task/listMeeting?t=${Date.now()}`,
+ 'headers': {
+ 'Host': 'rdcseason.m.jd.com',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Connection':' keep-alive',
+ 'Cookie': cookie,
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.14(0x17000e2a) NetType/4G Language/zh_CN',
+ 'Accept-Language': 'zh-cn',
+ 'Referer': `https://rdcseason.m.jd.com/?reloadWQPage=t_${Date.now()}`,
+ 'Accept-Encoding': 'gzip, deflate, br'
+ }
+ }
+ return new Promise((resolve) => {
+ $.get(options, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ // console.log('ddd----ddd', data.code)
+ if (data.code === 200 && data.data.meetingList) {
+ let integralNum = 0, jdNum = 0;
+ for (let item of data.data.meetingList) {
+ let res = await browseMeeting(item.id);
+ if (res.code === 200) {
+ let res2 = await getMeetingPrize(item.id);
+ integralNum += res2.data.integralNum * 1;
+ jdNum += res2.data.jdNum * 1;
+ }
+ // await browseMeeting('1596206323911');
+ // await getMeetingPrize('1596206323911');
+ }
+ console.log(`逛会场--获得积分:${integralNum}`)
+ console.log(`逛会场--获得京豆:${jdNum}`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function listGoods() {
+ const options = {
+ 'url': `${JD_API_HOST}task/listGoods?t=${Date.now()}`,
+ 'headers': {
+ 'Host': 'rdcseason.m.jd.com',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Connection':' keep-alive',
+ 'Cookie': cookie,
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.14(0x17000e2a) NetType/4G Language/zh_CN',
+ 'Accept-Language': 'zh-cn',
+ 'Referer': `https://rdcseason.m.jd.com/?reloadWQPage=t_${Date.now()}`,
+ 'Accept-Encoding': 'gzip, deflate, br'
+ }
+ }
+ return new Promise( (resolve) => {
+ $.get(options, async (err, resp, data) => {
+ try {
+ // console.log('data1', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200 && data.data.goodsList) {
+ let integralNum = 0, jdNum = 0;
+ for (let item of data.data.goodsList) {
+ let res = await browseGoods(item.id);
+ if (res.code === 200) {
+ let res2 = await getGoodsPrize(item.id);
+ // console.log('逛新品领取奖励res2', res2);
+ integralNum += res2.data.integralNum * 1;
+ jdNum += res2.data.jdNum * 1;
+ }
+ }
+ console.log(`逛新品获得积分:${integralNum}`)
+ console.log(`逛新品获得京豆:${jdNum}`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ });
+}
+function shopInfo() {
+ const options = {
+ 'url': `${JD_API_HOST}task/shopInfo?t=${Date.now()}`,
+ 'headers': {
+ 'Host': 'rdcseason.m.jd.com',
+ 'Accept': 'application/json, text/plain, */*',
+ 'Connection':' keep-alive',
+ 'Cookie': cookie,
+ 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/7.0.14(0x17000e2a) NetType/4G Language/zh_CN',
+ 'Accept-Language': 'zh-cn',
+ 'Referer': `https://rdcseason.m.jd.com/?reloadWQPage=t_${Date.now()}`,
+ 'Accept-Encoding': 'gzip, deflate, br'
+ }
+ }
+ return new Promise( (resolve) => {
+ $.get(options, async (err, resp, data) => {
+ try {
+ // console.log('data1', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200 && data.data) {
+ let integralNum = 0, jdNum = 0;
+ for (let item of data.data) {
+ let res = await browseShop(item.shopId);
+ // console.log('res', res)
+ // res = JSON.parse(res);
+ // console.log('res', res.code)
+ if (res.code === 200) {
+ // console.log('---')
+ let res2 = await getShopPrize(item.shopId);
+ // console.log('res2', res2);
+ // res2 = JSON.parse(res2);
+ integralNum += res2.data.integralNum * 1;
+ jdNum += res2.data.jdNum * 1;
+ }
+ }
+ console.log(`逛店铺获得积分:${integralNum}`)
+ console.log(`逛店铺获得京豆:${jdNum}`)
+ }
+ }
+ // console.log('data1', data);
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve()
+ }
+ })
+ })
+
+}
+function browseGoods(id) {
+ const options = {
+ "url": `${JD_API_HOST}task/browseGoods?t=${Date.now()}&skuId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ return new Promise( (resolve) => {
+ $.get(options, (err, resp, data) => {
+ try {
+ // console.log('data1', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ // console.log('data1', data);
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+
+function getGoodsPrize(id) {
+ const options = {
+ "url": `${JD_API_HOST}task/getGoodsPrize?t=${Date.now()}&skuId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ return new Promise( (resolve) => {
+ $.get(options, (err, resp, data) => {
+ try {
+ // console.log('data1', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function browseShop(id) {
+ const options2 = {
+ "url": `${JD_API_HOST}task/browseShop`,
+ "body": `shopId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ return new Promise( (resolve) => {
+ $.post(options2, (err, resp, data) => {
+ try {
+ // console.log('data1', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function getShopPrize(id) {
+ const options = {
+ "url": `${JD_API_HOST}task/getShopPrize`,
+ "body": `shopId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ return new Promise( (resolve) => {
+ $.post(options, (err, resp, data) => {
+ try {
+ // console.log('getShopPrize', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+
+function browseMeeting(id) {
+ const options2 = {
+ "url": `${JD_API_HOST}task/browseMeeting`,
+ "body": `meetingId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ return new Promise( (resolve) => {
+ $.post(options2, (err, resp, data) => {
+ try {
+ // console.log('点击浏览会场', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function getMeetingPrize(id) {
+ const options = {
+ "url": `${JD_API_HOST}task/getMeetingPrize`,
+ "body": `meetingId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ return new Promise( (resolve) => {
+ $.post(options, (err, resp, data) => {
+ try {
+ // console.log('getMeetingPrize', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function myRank() {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/myRank?t=${Date.now()}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.jbeanNum = '';
+ $.get(options, async (err, resp, data) => {
+ try {
+ // console.log('查询获奖列表data', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200 && data.data.myHis) {
+ for (let i = 0; i < data.data.myHis.length; i++) {
+ $.date = data.data.myHis[0].date;
+ if (data.data.myHis[i].status === '21') {
+ await $.wait(1000);
+ console.log('开始领奖')
+ let res = await saveJbean(data.data.myHis[i].id);
+ // console.log('领奖结果', res)
+ if (res.code === 200 && res.data.rsCode === 200) {
+ // $.jbeanNum += Number(res.data.jbeanNum);
+ console.log(`${data.data.myHis[i].date}日奖励领取成功${JSON.stringify(res.data.jbeanNum)}`)
+ }
+ }
+ if (i === 0 && data.data.myHis[i].status === '22') {
+ $.jbeanNum = data.data.myHis[i].prize;
+ }
+ }
+ // for (let item of data.data.myHis){
+ // if (item.status === '21') {
+ // await $.wait(1000);
+ // console.log('开始领奖')
+ // let res = await saveJbean(item.id);
+ // // console.log('领奖结果', res)
+ // if (res.code === 200 && res.data.rsCode === 200) {
+ // $.jbeanNum += Number(res.data.jbeanNum);
+ // }
+ // }
+ // }
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function saveJbean(id) {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/saveJbean`,
+ "body": `prizeId=${id}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ // console.log('领取京豆结果', data);
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+async function doHelp() {
+ console.log(`脚本自带助力码数量:${helpCode.length}`)
+ let body = '', nowTime = Date.now(), tempCode = [];
+ const zone = new Date().getTimezoneOffset();
+ if (zone === 0) {
+ nowTime += 28800000;//UTC-0时区加上8个小时
+ }
+ await updateShareCodes();
+ if (!$.updatePkActivityIdRes) await updateShareCodesCDN();
+ tempCode = $.updatePkActivityIdRes.shareCodes;
+ console.log(`是否大于当天九点🕘:${nowTime > new Date(nowTime).setHours(9, 0, 0, 0)}`)
+ //当天大于9:00才从API里面取收集的助力码
+ if (nowTime > new Date(nowTime).setHours(9, 0, 0, 0)) body = await printAPI();//访问收集的互助码
+ if (body) {
+ console.log(`printAPI返回助力码数量:${body.replace(/"/g, '').split(',').length}`)
+ tempCode = tempCode.concat(body.replace(/"/g, '').split(','))
+ }
+ console.log(`累计助力码数量:${tempCode.length}`)
+ //去掉重复的
+ tempCode = [...new Set(tempCode)];
+ console.log(`去重后总助力码数量:${tempCode.length}`)
+ for (let item of tempCode) {
+ if (!item) continue;
+ const helpRes = await toHelp(item.trim());
+ if (helpRes.data.status === 5) {
+ console.log(`助力机会已耗尽,跳出助力`);
+ break;
+ }
+ }
+}
+function printAPI() {
+ return new Promise(resolve => {
+ $.get({url: `${printUrl}`}, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ // data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function toHelp(code) {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/toHelp`,
+ "body": `shareId=${code}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Origin": "https://rdcseason.m.jd.com",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Cookie": cookie,
+ "Connection": "keep-alive",
+ "Accept": "application/json, text/plain, */*",
+ "User-Agent": "jdapp;iPhone;9.1.0;14.0;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167348;supportBestPay/0;jdSupportDarkMode/0;pv/252.3;apprpd/Home_Main;ref/JDWebViewController;psq/2;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|695;jdv/0|kong|t_2010957099_|jingfen|3b5422e836e74037862fea3dcf1a6802|1600647811440|1600647814;adk/;app_device/IOS;pap/JA2015_311210|9.1.0|IOS 14.0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
+ "Referer": "https://rdcseason.m.jd.com/",
+ "Content-Length": "44",
+ "Accept-Language": "zh-cn"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ console.log(`助力结果:${data}`);
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function getHelp() {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/getHelp?t=${Date.now()}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "jdapp;iPhone;9.1.0;14.0;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167348;supportBestPay/0;jdSupportDarkMode/0;pv/255.2;apprpd/Home_Main;ref/JDMainPageViewController;psq/1;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|701;jdv/0|kong|t_2010957099_|jingfen|3b5422e836e74037862fea3dcf1a6802|1600647811440|1600647814;adk/;app_device/IOS;pap/JA2015_311210|9.1.0|IOS 14.0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.get(options, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200) {
+ console.log(`\n您的助力码shareId(互助码每天都是变化的)\n\n"${data.data.shareId}",\n`);
+ console.log(`每日9:00以后复制下面的URL链接在浏览器里面打开一次就能自动上车\n\n${addUrl}${data.data.shareId}\n`);
+ let ctrTemp;
+ if ($.isNode() && process.env.JD_818_SHAREID_NOTIFY) {
+ console.log(`环境变量JD_818_SHAREID_NOTIFY::${process.env.JD_818_SHAREID_NOTIFY}`)
+ ctrTemp = `${process.env.JD_818_SHAREID_NOTIFY}` === 'true';
+ } else {
+ ctrTemp = `${jdNotify}` === 'true';
+ }
+ console.log(`是否发送上车推送链接:${ctrTemp ? '是': '否'}`)
+ // 只在早晨9点钟触发一次
+ let NowHours = new Date().getHours();
+ const zone = new Date().getTimezoneOffset();
+ if (zone === 0) {
+ NowHours += 8;//UTC-0时区加上8个小时
+ }
+ if(ctrTemp && NowHours === 9 && $.isNode()) await notify.sendNotify(`${$.name} - 账号${$.index} - ${$.nickName}互助码自动上车`, `[9:00之后上车]您的互助码上车链接是 ↓↓↓ \n\n ${addUrl}${data.data.shareId} \n\n ↑↑↑`, {
+ url: `${addUrl}${data.data.shareId}`
+ })
+ // await $.http.get({url: `http://jd.turinglabs.net/helpcode/add/${data.data.shareId}/`}).then((resp) => {
+ // console.log(resp);
+ // return
+ // if (resp.statusCode === 200) {
+ // const { body } = resp;
+ // }
+ // });
+ $.temp.push(data.data.shareId);
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+//获取当前活动总京豆数量
+function getListJbean() {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/listJbean?pageNum=1`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "jdapp;iPhone;9.1.0;14.0;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167348;supportBestPay/0;jdSupportDarkMode/0;pv/255.2;apprpd/Home_Main;ref/JDMainPageViewController;psq/1;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|701;jdv/0|kong|t_2010957099_|jingfen|3b5422e836e74037862fea3dcf1a6802|1600647811440|1600647814;adk/;app_device/IOS;pap/JA2015_311210|9.1.0|IOS 14.0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.get(options, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200) {
+ $.jbeanCount = data.data.jbeanCount;
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+
+function getListIntegral() {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/listIntegral?pageNum=1`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "jdapp;iPhone;9.1.0;14.0;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167348;supportBestPay/0;jdSupportDarkMode/0;pv/255.2;apprpd/Home_Main;ref/JDMainPageViewController;psq/1;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|701;jdv/0|kong|t_2010957099_|jingfen|3b5422e836e74037862fea3dcf1a6802|1600647811440|1600647814;adk/;app_device/IOS;pap/JA2015_311210|9.1.0|IOS 14.0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.get(options, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200) {
+ $.integralCount = data.data.integralCount;
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+
+//查询今日累计积分与排名
+function getListRank() {
+ return new Promise(resolve => {
+ const options = {
+ "url": `${JD_API_HOST}task/listRank?t=${Date.now()}`,
+ "headers": {
+ "Host": "rdcseason.m.jd.com",
+ "Accept": "application/json, text/plain, */*",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "User-Agent": "jdapp;iPhone;9.1.0;14.0;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167348;supportBestPay/0;jdSupportDarkMode/0;pv/255.2;apprpd/Home_Main;ref/JDMainPageViewController;psq/1;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|701;jdv/0|kong|t_2010957099_|jingfen|3b5422e836e74037862fea3dcf1a6802|1600647811440|1600647814;adk/;app_device/IOS;pap/JA2015_311210|9.1.0|IOS 14.0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1",
+ "Accept-Language": "zh-cn",
+ "Referer": "https://rdcseason.m.jd.com",
+ "Accept-Encoding": "gzip, deflate, br"
+ }
+ }
+ $.get(options, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data.code === 200) {
+ if (data.data.my) {
+ $.integer = data.data.my.integer;
+ $.num = data.data.my.num;
+ }
+ if (data.data.last) {
+ $.lasNum = data.data.last.num;
+ }
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function updateShareCodes(url = 'https://raw.githubusercontent.com/lxk0301/updateTeam/master/jd_shareCodes.json') {
+ return new Promise(resolve => {
+ //https://cdn.jsdelivr.net/gh/lxk0301/updateTeam@master/jd_shareCodes.json
+ //https://raw.githubusercontent.com/lxk0301/updateTeam/master/jd_shareCodes.json
+ $.get({url}, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ } else {
+ $.updatePkActivityIdRes = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function updateShareCodesCDN(url = 'https://cdn.jsdelivr.net/gh/lxk0301/updateTeam@master/jd_shareCodes.json') {
+ return new Promise(resolve => {
+ //https://cdn.jsdelivr.net/gh/lxk0301/updateTeam@master/jd_shareCodes.json
+ //https://raw.githubusercontent.com/lxk0301/updateTeam/master/jd_shareCodes.json
+ $.get({url}, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ $.updatePkActivityIdRes = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function TotalBean() {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
+ "headers": {
+ "Accept": "application/json,text/plain, */*",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Accept-Language": "zh-cn",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data['retcode'] === 13) {
+ $.isLogin = false; //cookie过期
+ return
+ }
+ $.nickName = data['base'].nickname;
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+async function showMsg() {
+ if (Date.now() > new Date(activeEndTime).getTime()) {
+ $.msg($.name, '活动已结束', `该活动累计获得京豆:${$.jbeanCount}个\niOS用户请删除此脚本\ngithub action用户请删除.github/workflows/jd_818.yml文件\n如果帮助到您可以点下🌟STAR鼓励我一下,谢谢\n咱江湖再见\nhttps://github.com/lxk0301/scripts`, {"open-url": "https://github.com/lxk0301/scripts"});
+ if ($.isNode()) await notify.sendNotify($.name + '活动已结束', `请删除此脚本\ngithub action用户请删除.github/workflows/jd_818.yml文件\n如果帮助到您可以点下🌟STAR鼓励我一下,谢谢\n咱江湖再见\n https://github.com/lxk0301/scripts`)
+ } else {
+ $.msg($.name, `京东账号${$.index} ${$.nickName || $.UserName}`, `${$.jbeanCount ? `${$.integer ? `今日获得积分:${$.integer}个\n` : ''}${$.num ? `今日排名:${$.num}\n` : ''}今日参数人数:${$.lasNum}人\n累计获得京豆:${$.jbeanCount}个🐶\n` : ''}${$.jbeanCount ? `累计获得积分:${$.integralCount}个\n` : ''}${$.jbeanNum ? `${$.date}日奖品:${$.jbeanNum}\n` : ''}具体详情点击弹窗跳转后即可查看`, {"open-url": "https://rdcseason.m.jd.com/#/hame"});
+ }
+}
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
diff --git a/jd_bean_change.js b/jd_bean_change.js
new file mode 100644
index 00000000..021fca6e
--- /dev/null
+++ b/jd_bean_change.js
@@ -0,0 +1,202 @@
+/*
+ * @Author: lxk0301 https://github.com/lxk0301
+ * @Date: 2020-11-01 16:25:41
+ * @Last Modified by: lxk0301
+ * @Last Modified time: 2020-11-03 16:25:41
+ */
+/*
+京豆变动通知脚本:https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js
+统计昨日京豆的变化情况,包括收入,支出,以及显示当前京豆数量,目前小问题:下单使用京豆后,退款重新购买会出现异常
+网页查看地址 : https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean
+支持京东双账号
+脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
+quantumultx
+[task_local]
+#京豆变动通知
+2 9 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js, tag=京豆变动通知, enabled=true
+Loon
+[Script]
+cron "2 9 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js, tag=京豆变动通知
+Surge
+京豆变动通知 = type=cron,cronexp=2 9 * * *,wake-system=1,timeout=440,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_bean_change.js
+ */
+const $ = new Env('京豆变动通知');
+const notify = $.isNode() ? require('./sendNotify') : '';
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//IOS等用户直接用NobyDa的jd cookie
+let cookiesArr = [], cookie = '';
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
+} else {
+ cookiesArr.push($.getdata('CookieJD'));
+ cookiesArr.push($.getdata('CookieJD2'));
+}
+!(async () => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ for (let i = 0; i < cookiesArr.length; i++) {
+ if (cookiesArr[i]) {
+ cookie = cookiesArr[i];
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ $.beanCount = 0;
+ $.incomeBean = 0;
+ $.expenseBean = 0;
+ $.errorMsg = '';
+ $.isLogin = true;
+ $.nickName = '';
+ await TotalBean();
+ console.log(`\n开始【京东账号${$.index}】${$.nickName || $.UserName}\n`);
+ if (!$.isLogin) {
+ $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
+ $.setdata('', `CookieJD${i ? i + 1 : "" }`);//cookie失效,故清空cookie。
+ if ($.isNode()) await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
+ continue
+ }
+ await bean();
+ await showMsg();
+ }
+ }
+})()
+ .catch((e) => {
+ $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
+ })
+ .finally(() => {
+ $.done();
+ })
+async function showMsg() {
+ if ($.errorMsg) return
+ if ($.isNode()) {
+ await notify.sendNotify(`${$.name} - 账号${$.index} - ${$.nickName}`, `账号${$.index}:${$.nickName || $.UserName}\n昨日收入:${$.incomeBean}京豆 🐶\n昨日支出:${$.expenseBean}京豆 🐶\n当前京豆:${$.beanCount}京豆 🐶`, { url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean` })
+ }
+ $.msg($.name, '', `账号${$.index}:${$.nickName || $.UserName}\n昨日收入:${$.incomeBean}京豆 🐶\n昨日支出:${$.expenseBean}京豆 🐶\n当前京豆:${$.beanCount}京豆 🐶`, {"open-url": "https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean"});
+}
+async function bean() {
+ //前一天的0:0:0时间戳
+ // console.log(`北京时间零点时间戳:${parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000}`);
+ // console.log(`北京时间2020-10-28 06:16:05::${new Date("2020/10/28 06:16:05+08:00").getTime()}`)
+ // 不管哪个时区。得到都是当前时刻北京时间的时间戳 new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000
+ const tm = parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000 - (24 * 60 * 60 * 1000);
+ // 今天0:0:0时间戳
+ const tm1 = parseInt((Date.now() + 28800000) / 86400000) * 86400000 - 28800000;
+ let page = 1, t = 0, yesterdayArr = [];
+ do {
+ let response = await getJingBeanBalanceDetail(page);
+ console.log(`第${page}页: ${JSON.stringify(response)}`);
+ if (response && response.code === "0") {
+ page++;
+ let detailList = response.detailList;
+ if (detailList && detailList.length > 0) {
+ for (let item of detailList) {
+ const date = item.date.replace(/-/g, '/') + "+08:00";
+ if (tm <= new Date(date).getTime() && new Date(date).getTime() < tm1) {
+ //昨日的
+ yesterdayArr.push(item);
+ } else if (tm > new Date(date).getTime()) {
+ //前天的
+ t = 1;
+ break;
+ }
+ }
+ } else {
+ $.errorMsg = `数据异常`;
+ $.msg($.name, ``, `账号${$.index}:${$.nickName}\n${$.errorMsg}`);
+ t = 1;
+ }
+ }
+ } while (t === 0);
+ for (let item of yesterdayArr) {
+ if (Number(item.amount) > 0) {
+ $.incomeBean += Number(item.amount);
+ } else if (Number(item.amount) < 0) {
+ $.expenseBean += Number(item.amount);
+ }
+ }
+ // console.log(`昨日收入:${$.incomeBean}个京豆 🐶`);
+ // console.log(`昨日支出:${$.expenseBean}个京豆 🐶`)
+}
+function TotalBean() {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
+ "headers": {
+ "Accept": "application/json,text/plain, */*",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Accept-Language": "zh-cn",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data['retcode'] === 13) {
+ $.isLogin = false; //cookie过期
+ return
+ }
+ $.nickName = data['base'].nickname;
+ if (data['retcode'] === 0) {
+ $.beanCount = data['base'].jdNum;
+ }
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function getJingBeanBalanceDetail(page) {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://api.m.jd.com/client.action?functionId=getJingBeanBalanceDetail`,
+ "body": `body=${escape(JSON.stringify({"pageSize": "20", "page": page.toString()}))}&appid=ld`,
+ "headers": {
+ 'User-Agent': 'JD4iPhone/167169 (iPhone; iOS 13.4.1; Scale/3.00)',
+ 'Host': 'api.m.jd.com',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Cookie': cookie,
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ // console.log(data)
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,r)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.isNeedRewrite=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let r=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");r=r?1*r:20,r=e&&e.timeout?e.timeout:r;const[o,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:r},headers:{"X-Key":o,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),r=JSON.stringify(this.data);s?this.fs.writeFileSync(t,r):i?this.fs.writeFileSync(e,r):this.fs.writeFileSync(t,r)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let r=t;for(const t of i)if(r=Object(r)[t],void 0===r)return s;return r}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),r=s?this.getval(s):"";if(r)try{const t=JSON.parse(r);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,r]=/^@(.*?)\.(.*?)$/.exec(e),o=this.getval(i),h=i?"null"===o?null:o||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,r,t),s=this.setval(JSON.stringify(e),i)}catch(e){const o={};this.lodash_set(o,r,t),s=this.setval(JSON.stringify(o),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?(this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)})):this.isQuanX()?(this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t))):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{if(t.headers["set-cookie"]){const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)}))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())this.isSurge()&&this.isNeedRewrite&&(t.headers=t.headers||{},Object.assign(t.headers,{"X-Surge-Skip-Scripting":!1})),$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",this.isNeedRewrite&&(t.opts=t.opts||{},Object.assign(t.opts,{hints:!1})),$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:r,body:o}=t;e(null,{status:s,statusCode:i,headers:r,body:o},o)},t=>{const{message:s,response:i}=t;e(s,i,i&&i.body)})}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",r){const o=t=>{if(!t)return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:this.isSurge()?{url:t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t.url||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.url||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}if(this.isSurge()){let e=t.url||t.openUrl||t["open-url"];return{url:e}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,o(r)):this.isQuanX()&&$notify(e,s,i,o(r)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/jd_bean_sign.js b/jd_bean_sign.js
new file mode 100644
index 00000000..65a9a2fa
--- /dev/null
+++ b/jd_bean_sign.js
@@ -0,0 +1,213 @@
+/*
+京豆签到,自用,可N个京东账号,IOS软件用户请使用 https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js
+Node.JS专用
+更新时间:2020-11-09
+从 github @ruicky改写而来
+version v0.0.1
+create by ruicky
+detail url: https://github.com/ruicky/jd_sign_bot
+ */
+const $ = new Env('京豆签到');
+const notify = $.isNode() ? require('./sendNotify') : '';
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+const exec = require('child_process').execSync
+const fs = require('fs')
+const download = require('download');
+const path = "./result.txt";
+const JD_DailyBonusPath = "./JD_DailyBonus.js";
+let cookiesArr = [], cookie = '';
+
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
+}
+!(async() => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ // 下载最新代码
+ await downFile();
+ const content = await fs.readFileSync('./JD_DailyBonus.js', 'utf8')
+ for (let i =0; i < cookiesArr.length; i++) {
+ cookie = cookiesArr[i];
+ if (cookie) {
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ $.nickName = '';
+ await TotalBean();
+ console.log(`*****************开始京东账号${$.index} ${$.nickName || $.UserName}京豆签到*******************\n`);
+ console.log(`⚠⚠⚠⚠⚠⚠⚠⚠ 如遇到Bark APP推送通知消息失败的,请换用其他通知方式,Bark对推送内容长度有限制 ⚠⚠⚠⚠⚠⚠⚠⚠⚠\n`)
+ await changeFile(content);
+ await execSign();
+ }
+ }
+})()
+ .catch((e) => $.logErr(e))
+ .finally(() => $.done())
+async function execSign() {
+ console.log(`\n开始执行脚本签到,请稍等`)
+ try {
+ if (notify.SCKEY || notify.BARK_PUSH || notify.DD_BOT_TOKEN || (notify.TG_BOT_TOKEN && notify.TG_USER_ID) || notify.IGOT_PUSH_KEY) {
+ await exec("node JD_DailyBonus.js >> result.txt");
+ } else {
+ // 如果没有提供通知推送,则打印日志
+ console.log('没有提供通知推送,则打印脚本执行日志')
+ await exec(`node JD_DailyBonus.js`, { stdio: "inherit" });
+ }
+ // await exec("node JD_DailyBonus.js", { stdio: "inherit" });
+ // console.log('执行完毕', new Date(new Date().getTime() + 8 * 60 * 60 * 1000).toLocaleDateString())
+ //发送通知
+ if ($.isNode()) {
+ let notifyContent = "";
+ let BarkContent = '';
+ if (fs.existsSync(path)) {
+ notifyContent = await fs.readFileSync(path, "utf8");
+ const barkContentStart = notifyContent.indexOf('【签到概览】')
+ const barkContentEnd = notifyContent.length;
+ if (process.env.JD_BEAN_SIGN_STOP_NOTIFY === 'true') return
+ if (process.env.JD_BEAN_SIGN_NOTIFY_SIMPLE === 'true') {
+ if (barkContentStart > -1 && barkContentEnd > -1) {
+ BarkContent = notifyContent.substring(barkContentStart, barkContentEnd);
+ }
+ BarkContent = BarkContent.split('\n\n')[0];
+ } else {
+ if (barkContentStart > -1 && barkContentEnd > -1) {
+ BarkContent = notifyContent.substring(barkContentStart, barkContentEnd);
+ }
+ }
+ }
+ //不管哪个时区,这里得到的都是北京时间的时间戳;
+ const UTC8 = new Date().getTime() + new Date().getTimezoneOffset()*60*1000 + 8*60*60*1000;
+ $.beanSignTime = timeFormat(UTC8);
+ console.log(`脚本执行完毕时间:${$.beanSignTime}`)
+ if (BarkContent) {
+ await notify.sendNotify(`京豆签到 - 账号${$.index} - ${$.nickName || $.UserName}`, `【签到号 ${$.index}】: ${$.nickName || $.UserName}\n【签到时间】: ${$.beanSignTime}\n${BarkContent}`);
+ }
+ }
+ //运行完成后,删除下载的文件
+ console.log('运行完成后,删除下载的文件\n')
+ await deleteFile(path);//删除result.txt
+ await deleteFile(JD_DailyBonusPath);//删除JD_DailyBonus.js
+ console.log(`*****************京东账号${$.index} ${$.nickName || $.UserName}京豆签到完成*******************\n`);
+ } catch (e) {
+ console.log("京东签到脚本执行异常:" + e);
+ }
+}
+async function downFile () {
+ let url = '';
+ // if (process.env.CDN_JD_DAILYBONUS) {
+ // url = 'https://cdn.jsdelivr.net/gh/NobyDa/Script@master/JD-DailyBonus/JD_DailyBonus.js';
+ // } else if (process.env.JD_COOKIE) {
+ // url = 'https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js';
+ // } else {
+ // url = 'https://cdn.jsdelivr.net/gh/NobyDa/Script@master/JD-DailyBonus/JD_DailyBonus.js';
+ // }
+ await downloadUrl();
+ if ($.body) {
+ url = 'https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js';
+ } else {
+ url = 'https://cdn.jsdelivr.net/gh/NobyDa/Script@master/JD-DailyBonus/JD_DailyBonus.js';
+ }
+ await download(url, './')
+}
+
+async function changeFile (content) {
+ console.log(`开始替换变量`)
+ let newContent = content.replace(/var Key = ''/, `var Key = '${cookie}'`);
+ if (process.env.JD_BEAN_STOP && process.env.JD_BEAN_STOP !== '0') {
+ newContent = newContent.replace(/var stop = 0/, `var stop = ${process.env.JD_BEAN_STOP * 1}`);
+ }
+ const zone = new Date().getTimezoneOffset();
+ if (zone === 0) {
+ //此处针对UTC-0时区用户做的
+ newContent = newContent.replace(/tm\s=.*/, `tm = new Date(new Date().toLocaleDateString()).getTime() - 28800000;`);
+ }
+ try {
+ await fs.writeFileSync( './JD_DailyBonus.js', newContent, 'utf8');
+ console.log('替换变量完毕');
+ } catch (e) {
+ console.log("京东签到写入文件异常:" + e);
+ }
+}
+async function deleteFile(path) {
+ // 查看文件result.txt是否存在,如果存在,先删除
+ const fileExists = await fs.existsSync(path);
+ // console.log('fileExists', fileExists);
+ if (fileExists) {
+ const unlinkRes = await fs.unlinkSync(path);
+ // console.log('unlinkRes', unlinkRes)
+ }
+}
+function TotalBean() {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
+ "headers": {
+ "Accept": "application/json,text/plain, */*",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Accept-Language": "zh-cn",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data['retcode'] === 13) {
+ $.isLogin = false; //cookie过期
+ return
+ }
+ $.nickName = data['base'].nickname;
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function downloadUrl(url = 'https://raw.githubusercontent.com/NobyDa/Script/master/JD-DailyBonus/JD_DailyBonus.js') {
+ return new Promise(resolve => {
+ $.get({url}, async (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`检测到您不能访问外网,将使用CDN下载JD_DailyBonus.js文件`)
+ } else {
+ $.body = data;
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+
+function timeFormat(time) {
+ let date;
+ if (time) {
+ date = new Date(time)
+ } else {
+ date = new Date();
+ }
+ return date.getFullYear() + '-' + ((date.getMonth() + 1) >= 10 ? (date.getMonth() + 1) : '0' + (date.getMonth() + 1)) + '-' + (date.getDate() >= 10 ? date.getDate() : '0' + date.getDate());
+}
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
diff --git a/jd_blueCoin.js b/jd_blueCoin.js
new file mode 100644
index 00000000..5d68b6ae
--- /dev/null
+++ b/jd_blueCoin.js
@@ -0,0 +1,372 @@
+/*
+京小超兑换奖品 脚本地址:https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js
+感谢@yangtingxiao提供PR
+更新时间:2020-11-05
+支持京东多个账号
+脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
+======================quantumultx===============
+[task_local]
+#京小超兑换奖品
+0 0 0 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js, tag=京小超兑换奖品, img-url=https://raw.githubusercontent.com/58xinian/icon/master/jxc.png, enabled=true
+====================Loon=================
+[Script]
+cron "0 0 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js,tag=京小超兑换奖品
+===================Surge==================
+京小超兑换奖品 = type=cron,cronexp="0 0 0 * * *",wake-system=1,timeout=20,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_blueCoin.js
+ */
+const $ = new Env('京小超兑换奖品');
+const notify = $.isNode() ? require('./sendNotify') : '';
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+let coinToBeans = $.getdata('coinToBeans') || 0; //兑换多少数量的京豆(20或者1000),0默认兑换不兑换,如需兑换把0改成20或者1000,或者'商品名称'(商品名称放到单引号内)即可
+let jdNotify = false;//是否开启静默运行,默认false关闭(即:奖品兑换成功后会发出通知提示)
+//IOS等用户直接用NobyDa的jd cookie
+let cookiesArr = [], cookie = '';
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
+} else {
+ cookiesArr.push($.getdata('CookieJD'));
+ cookiesArr.push($.getdata('CookieJD2'));
+}
+
+const JD_API_HOST = `https://api.m.jd.com/api?appid=jdsupermarket`;
+!(async () => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ for (let i =0; i < cookiesArr.length; i++) {
+ cookie = cookiesArr[i];
+ if (cookie) {
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ $.data = {};
+ $.coincount = 0;
+ $.beanscount = 0;
+ $.blueCost = 0;
+ $.coinerr = "";
+ $.beanerr = "";
+ $.title = '';
+ //console.log($.coincount);
+ $.isLogin = true;
+ $.nickName = '';
+ await TotalBean();
+ console.log(`\n开始【京东账号${$.index}】${$.nickName || $.UserName}\n`);
+ if (!$.isLogin) {
+ $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
+ $.setdata('', `CookieJD${i ? i + 1 : "" }`);//cookie失效,故清空cookie。
+ if ($.isNode()) await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
+ continue
+ }
+ //先兑换京豆
+ if ($.isNode()) {
+ if (process.env.MARKET_COIN_TO_BEANS) {
+ coinToBeans = process.env.MARKET_COIN_TO_BEANS;
+ }
+ }
+ if (`${coinToBeans}` !== '0') {
+ await smtgHome();//查询蓝币数量,是否满足兑换的条件
+ await smtg_queryPrize();
+ } else {
+ console.log('查询到您设置的是不兑换京豆选项,现在为您跳过兑换京豆。如需兑换,请去BoxJs设置或者修改脚本coinToBeans\n')
+ }
+ await msgShow();
+ }
+ }
+})()
+ .catch((e) => $.logErr(e))
+ .finally(() => $.done())
+
+//查询任务
+function smtg_queryPrize(timeout = 0){
+ return new Promise((resolve) => {
+ setTimeout( ()=>{
+ let url = {
+ url : `${JD_API_HOST}&functionId=smtg_queryPrize&clientVersion=8.0.0&client=m&body=%7B%7D&t=${Date.now()}`,
+ headers : {
+ 'Origin' : `https://jdsupermarket.jd.com`,
+ 'Cookie' : cookie,
+ 'Connection' : `keep-alive`,
+ 'Accept' : `application/json, text/plain, */*`,
+ 'Referer' : `https://jdsupermarket.jd.com/game/?tt=1597540727225`,
+ 'Host' : `api.m.jd.com`,
+ 'Accept-Encoding' : `gzip, deflate, br`,
+ 'Accept-Language' : `zh-cn`
+ }
+ }
+ $.post(url, async (err, resp, data) => {
+ try {
+ if (safeGet(data)) {
+ data = JSON.parse(data);
+ $.queryPrizeData = data;
+ if (data.data.bizCode !== 0) {
+ $.beanerr = `${data.data.bizMsg}`;
+ return
+ }
+ if (data.data.bizCode === 0) {
+ const { prizeList } = data.data.result;
+ if (`${coinToBeans}` === '1000') {
+ if (prizeList[1].beanType === 'BeanPackage') {
+ console.log(`查询换${prizeList[1].title}ID成功,ID:${prizeList[1].prizeId}`)
+ $.title = prizeList[1].title;
+ $.blueCost = prizeList[1].blueCost;
+ } else {
+ console.log(`查询换1000京豆ID失败`)
+ $.beanerr = `东哥今天不给换`;
+ return ;
+ }
+ if (prizeList[1].inStock === 506) {
+ $.beanerr = `失败,1000京豆领光了,请明天再来`;
+ return ;
+ }
+ if (prizeList[1].targetNum === prizeList[1].finishNum) {
+ $.beanerr = `${prizeList[1].subTitle}`;
+ return ;
+ }
+ //兑换1000京豆
+ if ($.totalBlue > $.blueCost) {
+ await smtg_obtainPrize(prizeList[1].prizeId);
+ } else {
+ console.log(`兑换失败,您目前蓝币${$.totalBlue}个,不足以兑换${$.title}所需的${$.blueCost}个`);
+ $.beanerr = `兑换失败,您目前蓝币${$.totalBlue}个,不足以兑换${$.title}所需的${$.blueCost}个`;
+ }
+ } else if (`${coinToBeans}` === '20') {
+ if (prizeList[0].beanType === 'Bean') {
+ console.log(`查询换${prizeList[0].title}ID成功,ID:${prizeList[0].prizeId}`)
+ $.title = prizeList[0].title;
+ $.blueCost = prizeList[0].blueCost;
+ } else {
+ console.log(`查询换万能的京豆ID失败`)
+ $.beanerr = `东哥今天不给换`;
+ return ;
+ }
+ if (prizeList[0].inStock === 506) {
+ console.log(`失败,万能的京豆领光了,请明天再来`);
+ $.beanerr = `失败,万能的京豆领光了,请明天再来`;
+ return ;
+ }
+ if (prizeList[0].targetNum === prizeList[0].finishNum) {
+ $.beanerr = `${prizeList[0].subTitle}`;
+ return ;
+ }
+ //兑换万能的京豆(1-20京豆)
+ if ($.totalBlue > $.blueCost) {
+ await smtg_obtainPrize(prizeList[0].prizeId,1000);
+ } else {
+ console.log(`兑换失败,您目前蓝币${$.totalBlue}个,不足以兑换${$.title}所需的${$.blueCost}个`);
+ $.beanerr = `兑换失败,您目前蓝币${$.totalBlue}个,不足以兑换${$.title}所需的${$.blueCost}个`;
+ }
+ } else {
+ //自定义输入兑换
+ let prizeId = '', i;
+ for (let index = 0; index < prizeList.length; index ++) {
+ if (prizeList[index].title.indexOf(coinToBeans) > -1) {
+ prizeId = prizeList[index].prizeId;
+ i = index;
+ $.title = prizeList[index].title;
+ $.blueCost = prizeList[index].blueCost;
+ }
+ }
+ if (prizeId) {
+ if (prizeList[i].inStock === 506) {
+ console.log(`失败,您输入设置的${coinToBeans}领光了,请明天再来`);
+ $.beanerr = `失败,您输入设置的${coinToBeans}领光了,请明天再来`;
+ return ;
+ }
+ if (prizeList[i].targetNum === prizeList[i].finishNum) {
+ $.beanerr = `${prizeList[0].subTitle}`;
+ return ;
+ }
+ if ($.totalBlue > $.blueCost) {
+ await smtg_obtainPrize(prizeId);
+ } else {
+ console.log(`兑换失败,您目前蓝币${$.totalBlue}个,不足以兑换${$.title}所需的${$.blueCost}个`);
+ $.beanerr = `兑换失败,您目前蓝币${$.totalBlue}个,不足以兑换${$.title}所需的${$.blueCost}个`;
+ }
+ } else {
+ console.log(`奖品兑换列表[${coinToBeans}]已下架,请检查APP是否存在此商品,如存在请检查您的输入是否正确`);
+ $.beanerr = `奖品兑换列表[${coinToBeans}]已下架`;
+ }
+ }
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve()
+ }
+ })
+ },timeout)
+ })
+}
+//换京豆
+function smtg_obtainPrize(prizeId, timeout = 0) {
+ //1000京豆,prizeId为4401379726
+ return new Promise((resolve) => {
+ setTimeout( ()=>{
+ let url = {
+ url : `${JD_API_HOST}&functionId=smtg_obtainPrize&clientVersion=8.0.0&client=m&body=%7B%22prizeId%22:%22${prizeId}%22%7D&t=${Date.now()}`,
+ headers : {
+ 'Origin' : `https://jdsupermarket.jd.com`,
+ 'Cookie' : cookie,
+ 'Connection' : `keep-alive`,
+ 'Accept' : `application/json, text/plain, */*`,
+ 'Referer' : `https://jdsupermarket.jd.com/game/?tt=1597540727225`,
+ 'Host' : `api.m.jd.com`,
+ 'Accept-Encoding' : `gzip, deflate, br`,
+ 'Accept-Language' : `zh-cn`
+ }
+ }
+ $.post(url, async (err, resp, data) => {
+ try {
+ console.log(`兑换结果:${data}`);
+ if (safeGet(data)) {
+ data = JSON.parse(data);
+ $.data = data;
+ if ($.data.data.bizCode !== 0) {
+ $.beanerr = `${$.data.data.bizMsg}`;
+ //console.log(`【京东账号${$.index}】${$.nickName} 换取京豆失败:${$.data.data.bizMsg}`)
+ return
+ }
+ if ($.data.data.bizCode === 0) {
+ if (`${coinToBeans}` === '1000') {
+ $.beanscount ++;
+ console.log(`【京东账号${$.index}】${$.nickName} 第${$.data.data.result.exchangeNum}次换${$.title}成功`)
+ if ($.beanscount === 1) return;
+ } else if (`${coinToBeans}` === '20') {
+ $.beanscount ++;
+ console.log(`【京东账号${$.index}】${$.nickName} 第${$.data.data.result.exchangeNum}次换${$.title}成功`)
+ if ($.data.data.result.exchangeNum === 20 || $.beanscount === coinToBeans || $.data.data.result.blue < 500) return;
+ } else {
+ $.beanscount ++;
+ console.log(`【京东账号${$.index}】${$.nickName} 第${$.data.data.result.exchangeNum}次换${$.title}成功`)
+ if ($.beanscount === 1) return;
+ }
+ }
+ }
+ await smtg_obtainPrize(prizeId,3000);
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve()
+ }
+ })
+ },timeout)
+ })
+}
+function smtgHome() {
+ return new Promise((resolve) => {
+ $.get(taskUrl('smtg_home'), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log('\n京小超兑换奖品: API查询请求失败 ‼️‼️')
+ console.log(JSON.stringify(err));
+ } else {
+ if (safeGet(data)) {
+ data = JSON.parse(data);
+ if (data.data.bizCode === 0) {
+ const { result } = data.data;
+ $.totalGold = result.totalGold;
+ $.totalBlue = result.totalBlue;
+ console.log(`【总金币】${$.totalGold}个\n`);
+ console.log(`【总蓝币】${$.totalBlue}个\n`);
+ }
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+
+//通知
+async function msgShow() {
+ // $.msg($.name, ``, `【京东账号${$.index}】${$.nickName}\n【收取蓝币】${$.coincount ? `${$.coincount}个` : $.coinerr }${coinToBeans ? `\n【兑换京豆】${ $.beanscount ? `${$.beanscount}个` : $.beanerr}` : ""}`);
+ $.log(`\n【京东账号${$.index}】${$.nickName}\n${coinToBeans ? `【兑换${$.title}】${$.beanscount ? `成功` : $.beanerr}` : "您设置的是不兑换奖品"}\n`);
+ let ctrTemp;
+ if ($.isNode() && process.env.MARKET_REWARD_NOTIFY) {
+ ctrTemp = `${process.env.MARKET_REWARD_NOTIFY}` === 'false';
+ } else if ($.getdata('jdSuperMarketRewardNotify')) {
+ ctrTemp = $.getdata('jdSuperMarketRewardNotify') === 'false';
+ } else {
+ ctrTemp = `${jdNotify}` === 'false';
+ }
+ //默认只在兑换奖品成功后弹窗提醒。情况情况加,只打印日志,不弹窗
+ if ($.beanscount && ctrTemp) {
+ $.msg($.name, ``, `【京东账号${$.index}】${$.nickName}\n${coinToBeans ? `【兑换${$.title}】${ $.beanscount ? `成功,数量:${$.beanscount}个` : $.beanerr}` : "您设置的是不兑换奖品"}`);
+ if ($.isNode()) {
+ await notify.sendNotify(`${$.name} - 账号${$.index} - ${$.nickName}`, `【京东账号${$.index}】${$.UserName}\n${coinToBeans ? `【兑换${$.title}】${$.beanscount ? `成功,数量:${$.beanscount}个` : $.beanerr}` : "您设置的是不兑换奖品"}`)
+ }
+ }
+}
+function TotalBean() {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
+ "headers": {
+ "Accept": "application/json,text/plain, */*",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Accept-Language": "zh-cn",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data['retcode'] === 13) {
+ $.isLogin = false; //cookie过期
+ return
+ }
+ $.nickName = data['base'].nickname;
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function safeGet(data) {
+ try {
+ if (typeof JSON.parse(data) == "object") {
+ return true;
+ }
+ } catch (e) {
+ console.log(e);
+ console.log(`京东服务器访问数据为空,请检查自身设备网络情况`);
+ return false;
+ }
+}
+function taskUrl(function_id, body = {}) {
+ return {
+ url: `${JD_API_HOST}&functionId=${function_id}&clientVersion=8.0.0&client=m&body=${escape(JSON.stringify(body))}&t=${Date.now()}`,
+ headers: {
+ 'User-Agent': 'jdapp;iPhone;9.0.8;13.6;Mozilla/5.0 (iPhone; CPU iPhone OS 13_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
+ 'Host': 'api.m.jd.com',
+ 'Cookie': cookie,
+ 'Referer': 'https://jdsupermarket.jd.com/game',
+ 'Origin': 'https://jdsupermarket.jd.com',
+ }
+ }
+}
+
+function Env(t,s){return new class{constructor(t,s){this.name=t,this.data=null,this.dataFile="box.dat",this.logs=[],this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,s),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}getScript(t){return new Promise(s=>{$.get({url:t},(t,e,i)=>s(i))})}runScript(t,s){return new Promise(e=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=s&&s.timeout?s.timeout:o;const[h,a]=i.split("@"),r={url:`http://${a}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":h,Accept:"*/*"}};$.post(r,(t,s,i)=>e(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s);if(!e&&!i)return{};{const i=e?t:s;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),s=this.path.resolve(process.cwd(),this.dataFile),e=this.fs.existsSync(t),i=!e&&this.fs.existsSync(s),o=JSON.stringify(this.data);e?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(s,o):this.fs.writeFileSync(t,o)}}lodash_get(t,s,e){const i=s.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return e;return o}lodash_set(t,s,e){return Object(t)!==t?t:(Array.isArray(s)||(s=s.toString().match(/[^.[\]]+/g)||[]),s.slice(0,-1).reduce((t,e,i)=>Object(t[e])===t[e]?t[e]:t[e]=Math.abs(s[i+1])>>0==+s[i+1]?[]:{},t)[s[s.length-1]]=e,t)}getdata(t){let s=this.getval(t);if(/^@/.test(t)){const[,e,i]=/^@(.*?)\.(.*?)$/.exec(t),o=e?this.getval(e):"";if(o)try{const t=JSON.parse(o);s=t?this.lodash_get(t,i,""):s}catch(t){s=""}}return s}setdata(t,s){let e=!1;if(/^@/.test(s)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(s),h=this.getval(i),a=i?"null"===h?null:h||"{}":"{}";try{const s=JSON.parse(a);this.lodash_set(s,o,t),e=this.setval(JSON.stringify(s),i)}catch(s){const h={};this.lodash_set(h,o,t),e=this.setval(JSON.stringify(h),i)}}else e=$.setval(t,s);return e}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,s){return this.isSurge()||this.isLoon()?$persistentStore.write(t,s):this.isQuanX()?$prefs.setValueForKey(t,s):this.isNode()?(this.data=this.loaddata(),this.data[s]=t,this.writedata(),!0):this.data&&this.data[s]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,s=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,s)=>{try{const e=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(e,null),s.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t)))}post(t,s=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,e,i)=>{!t&&e&&(e.body=i,e.statusCode=e.status),s(t,e,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t));else if(this.isNode()){this.initGotEnv(t);const{url:e,...i}=t;this.got.post(e,i).then(t=>{const{statusCode:e,statusCode:i,headers:o,body:h}=t;s(null,{status:e,statusCode:i,headers:o,body:h},h)},t=>s(t))}}time(t){let s={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let e in s)new RegExp("("+e+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?s[e]:("00"+s[e]).substr((""+s[e]).length)));return t}msg(s=t,e="",i="",o){const h=t=>!t||!this.isLoon()&&this.isSurge()?t:"string"==typeof t?this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0:"object"==typeof t&&(t["open-url"]||t["media-url"])?this.isLoon()?t["open-url"]:this.isQuanX()?t:void 0:void 0;this.isSurge()||this.isLoon()?$notification.post(s,e,i,h(o)):this.isQuanX()&&$notify(s,e,i,h(o)),this.logs.push("","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="),this.logs.push(s),e&&this.logs.push(e),i&&this.logs.push(i)}log(...t){t.length>0?this.logs=[...this.logs,...t]:console.log(this.logs.join(this.logSeparator))}logErr(t,s){const e=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();e?$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):$.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(s=>setTimeout(s,t))}done(t={}){const s=(new Date).getTime(),e=(s-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,s)}
diff --git a/jd_club_lottery.js b/jd_club_lottery.js
new file mode 100644
index 00000000..0b76a1c8
--- /dev/null
+++ b/jd_club_lottery.js
@@ -0,0 +1,272 @@
+/*
+ * @Author: lxk0301
+ * @Date: 2020-11-03 20:35:07
+ * @Last Modified by: lxk0301
+ * @Last Modified time: 2020-10-12 20:37:10
+ 摇京豆(京东APP首页-领京豆-摇京豆)
+ 更新时间:2020-10-12
+ Modified from https://github.com/Zero-S1/JD_tools/blob/master/JD_vvipclub.py
+ 已支持IOS双京东账号,Node.js支持N个京东账号
+ 脚本兼容: QuantumultX, Surge, Loon, JSBox, Node.js
+ // QuantumultX
+ [task_local]
+ #摇京豆
+ 5 0 * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_club_lottery.js, tag=摇京豆, img-url=https://raw.githubusercontent.com/58xinian/icon/master/jdyjd.png, enabled=true
+ //Loon
+ [Script]
+ cron "5 0 * * *" script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_club_lottery.js,tag=摇京豆
+ //Surge
+ 摇京豆 = type=cron,cronexp="5 0 * * *",wake-system=1,timeout=20,script-path=https://raw.githubusercontent.com/lxk0301/scripts/master/jd_club_lottery.js
+ * */
+
+const $ = new Env('摇京豆');
+const notify = $.isNode() ? require('./sendNotify') : '';
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+
+//IOS等用户直接用NobyDa的jd cookie
+let cookiesArr = [], cookie = '';
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
+} else {
+ cookiesArr.push($.getdata('CookieJD'));
+ cookiesArr.push($.getdata('CookieJD2'));
+}
+const JD_API_HOST = 'https://api.m.jd.com/client.action';
+!(async () => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ for (let i = 0; i < cookiesArr.length; i++) {
+ if (cookiesArr[i]) {
+ cookie = cookiesArr[i];
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ $.freeTimes = 0;
+ $.prizeBeanCount = 0;
+ $.totalBeanCount = 0;
+ $.isLogin = true;
+ $.nickName = '';
+ await TotalBean();
+ console.log(`\n开始【京东账号${$.index}】${$.nickName || $.UserName}\n`);
+ if (!$.isLogin) {
+ $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
+ $.setdata('', `CookieJD${i ? i + 1 : "" }`);//cookie失效,故清空cookie。
+ if ($.isNode()) await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
+ continue
+ }
+ await clubLottery();
+ await showMsg();
+ }
+ }
+})()
+ .catch((e) => {
+ $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
+ })
+ .finally(() => {
+ $.done();
+ })
+
+async function clubLottery() {
+ await doTasks();//做任务
+ await getFreeTimes();//获取摇奖次数
+ await shaking();//开始摇奖
+}
+async function doTasks() {
+ const browseTaskRes = await getTask('browseTask');
+ if (browseTaskRes.success) {
+ const { totalPrizeTimes, currentFinishTimes, taskItems } = browseTaskRes.data[0];
+ const taskTime = totalPrizeTimes - currentFinishTimes;
+ if (taskTime > 0) {
+ let taskID = [];
+ taskItems.map(item => {
+ if (!item.finish) {
+ taskID.push(item.id);
+ }
+ });
+ console.log(`开始做浏览页面任务`)
+ for (let i = 0; i < new Array(taskTime).fill('').length; i++) {
+ await $.wait(1000);
+ await doTask('browseTask', taskID[i]);
+ }
+ }
+ } else {
+ console.log(`${JSON.stringify(browseTaskRes)}`)
+ }
+ const attentionTaskRes = await getTask('attentionTask');
+ if (attentionTaskRes.success) {
+ const { totalPrizeTimes, currentFinishTimes, taskItems } = attentionTaskRes.data[0];
+ const taskTime = totalPrizeTimes - currentFinishTimes;
+ if (taskTime > 0) {
+ let taskID = [];
+ taskItems.map(item => {
+ if (!item.finish) {
+ taskID.push(item.id);
+ }
+ });
+ console.log(`开始做关注店铺任务`)
+ for (let i = 0; i < new Array(taskTime).fill('').length; i++) {
+ await $.wait(1000);
+ await doTask('attentionTask', taskID[i].toString());
+ }
+ }
+ }
+}
+async function shaking() {
+ for (let i = 0; i < new Array($.freeTimes).fill('').length; i++) {
+ console.log(`开始摇奖`)
+ await $.wait(1000);
+ const shakeBeanRes = await shakeBean();
+ if (shakeBeanRes.success) {
+ console.log(`剩余摇奖次数:${shakeBeanRes.data.luckyBox.freeTimes}`)
+ if (shakeBeanRes.data && shakeBeanRes.data.prizeBean) {
+ $.prizeBeanCount += shakeBeanRes.data.prizeBean.count;
+ $.totalBeanCount = shakeBeanRes.data.luckyBox.totalBeanCount;
+ }
+ }
+ }
+}
+function showMsg() {
+ if ($.prizeBeanCount) {
+ $.msg(`${$.name}`, `京东账号${$.index} ${$.nickName}`, `【获得】${$.prizeBeanCount}京豆\n【账号总计】${$.totalBeanCount}京豆`);
+ }
+}
+//====================API接口=================
+//查询多少次机会
+function getFreeTimes() {
+ return new Promise(resolve => {
+ $.get(taskUrl('vvipclub_luckyBox', { "info": "freeTimes" }), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`\n${$.name}: API查询请求失败 ‼️‼️`)
+ $.logErr(err);
+ } else {
+ // console.log(data)
+ data = JSON.parse(data);
+ if (data.success) {
+ $.freeTimes = data.data.freeTimes;
+ console.log(`摇奖次数${$.freeTimes}`);
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function getTask(info) {
+ return new Promise(resolve => {
+ $.get(taskUrl('vvipclub_lotteryTask', { info, "withItem": true }), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`\n${$.name}: API查询请求失败 ‼️‼️`)
+ $.logErr(err);
+ } else {
+ // console.log(data)
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function doTask(taskName, taskItemId) {
+ return new Promise(resolve => {
+ $.get(taskUrl('vvipclub_doTask', { taskName, taskItemId }), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`\n${$.name}: API查询请求失败 ‼️‼️`)
+ $.logErr(err);
+ } else {
+ // console.log(data)
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function shakeBean() {
+ return new Promise(resolve => {
+ $.get(taskUrl('vvipclub_shaking', { "type": '0' }), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`\n${$.name}: API查询请求失败 ‼️‼️`)
+ $.logErr(err);
+ } else {
+ console.log(`摇奖结果:${data}`)
+ data = JSON.parse(data);
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve(data);
+ }
+ })
+ })
+}
+function TotalBean() {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
+ "headers": {
+ "Accept": "application/json,text/plain, */*",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Accept-Language": "zh-cn",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data['retcode'] === 13) {
+ $.isLogin = false; //cookie过期
+ return
+ }
+ $.nickName = data['base'].nickname;
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function taskUrl(function_id, body = {}) {
+ return {
+ url: `${JD_API_HOST}?functionId=${function_id}&appid=vip_h5&body=${escape(JSON.stringify(body))}&_=${Date.now()}`,
+ headers: {
+ 'Cookie': cookie,
+ 'Host': 'api.m.jd.com',
+ 'User-Agent': `Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1`,
+ 'Referer': 'https://vip.m.jd.com/newPage/reward/123dd/slideContent?page=focus',
+ }
+ }
+}
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,o)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),h=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t))}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",o){const r=t=>{if(!t||!this.isLoon()&&this.isSurge())return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,r(o)):this.isQuanX()&&$notify(e,s,i,r(o)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/jd_collectProduceScore.js b/jd_collectProduceScore.js
new file mode 100644
index 00000000..8ee59250
--- /dev/null
+++ b/jd_collectProduceScore.js
@@ -0,0 +1,136 @@
+/*
+京东全民营业领金币
+仅仅是收集一下京东双十一全名营业每秒产生的金币
+
+每小时的第20分运行一次
+20 * * * * https://raw.githubusercontent.com/lxk0301/scripts/master/jd_collectProduceScore.js
+ */
+const $ = new Env('京东全民营业领金币');
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+//IOS等用户直接用NobyDa的jd cookie
+let cookiesArr = [], cookie = '';
+
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {
+ };
+} else {
+ cookiesArr.push($.getdata('CookieJD'));
+ cookiesArr.push($.getdata('CookieJD2'));
+}
+let UserName = '';
+const JD_API_HOST = `https://api.m.jd.com/client.action`;
+!(async () => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ console.log(`\n小功能::仅仅是收集一下京东双十一全名营业每秒产生的金币,建议一个小时跑一次脚本\n`)
+ for (let i = 0; i < cookiesArr.length; i++) {
+ cookie = cookiesArr[i];
+ if (cookie) {
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ await collectProduceScore()
+ }
+ }
+})()
+ .catch((e) => $.logErr(e))
+ .finally(() => $.done())
+
+async function collectProduceScore() {
+ await getHomeData();
+ if ($.secretp) {
+ const temp = {
+ "taskId": "collectProducedCoin",
+ "rnd": getRnd(),
+ "inviteId": "-1",
+ "stealId": "-1"
+ }
+ const extraData = {
+ "jj": 6,
+ "buttonid": "jmdd-react-smash_0",
+ "sceneid": "homePageh5",
+ "appid": '50073'
+ }
+ const body = encode(temp, $.secretp, extraData);
+ await stall_collectProduceScore(body);
+ }
+}
+function stall_collectProduceScore(body) {
+ return new Promise((resolve) => {
+ $.post(taskPostUrl('stall_collectProduceScore', body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data && data.data.bizCode === 0) {
+ console.log(`京东账号${$.index} ${$.UserName}成功收集金币:${data.data.result.produceScore}个`)
+ } else {
+ console.log(`京东账号${$.index} ${$.UserName}成功收集金币失败:${data.data.bizMsg}`)
+ }
+ } else {
+ console.log(`请检查自身设备原因`);
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function getHomeData() {
+ return new Promise((resolve) => {
+ $.post(taskPostUrl('stall_getHomeData'), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ data = JSON.parse(data);
+ if (data && data.data['bizCode'] === 0) {
+ $.secretp = data.data.result.homeMainInfo.secretp;
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp);
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function encode(data, aa, extraData) {
+ const temp = {
+ "extraData": JSON.stringify(extraData),
+ "businessData": JSON.stringify(data),
+ "secretp": aa,
+ }
+ return { "ss": (JSON.stringify(temp)) };
+}
+function getRnd() {
+ return Math.floor(1e6 * Math.random()).toString();
+}
+function taskPostUrl(functionId, body = {}) {
+ return {
+ url: `${JD_API_HOST}?functionId=${functionId}`,
+ body: `functionId=${functionId}&body=${escape(JSON.stringify(body))}&client=wh5&clientVersion=1.0.0`,
+ headers: {
+ 'User-Agent': 'jdapp;iPhone;9.2.0;14.1;;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
+ 'Content-Type': 'application/x-www-form-urlencoded',
+ 'Host': 'api.m.jd.com',
+ 'Cookie': cookie,
+ 'Origin': 'https://wbbny.m.jd.com',
+ 'Referer': 'https://wbbny.m.jd.com/babelDiy/Zeus/4SJUHwGdUQYgg94PFzjZZbGZRjDd/index.html',
+ }
+ }
+}
+function Env(t, s) { return new class { constructor(t, s) { this.name = t, this.data = null, this.dataFile = "box.dat", this.logs = [], this.logSeparator = "\n", this.startTime = (new Date).getTime(), Object.assign(this, s), this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`) } isNode() { return "undefined" != typeof module && !!module.exports } isQuanX() { return "undefined" != typeof $task } isSurge() { return "undefined" != typeof $httpClient && "undefined" == typeof $loon } isLoon() { return "undefined" != typeof $loon } getScript(t) { return new Promise(s => { $.get({ url: t }, (t, e, i) => s(i)) }) } runScript(t, s) { return new Promise(e => { let i = this.getdata("@chavy_boxjs_userCfgs.httpapi"); i = i ? i.replace(/\n/g, "").trim() : i; let o = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout"); o = o ? 1 * o : 20, o = s && s.timeout ? s.timeout : o; const [h, a] = i.split("@"), r = { url: `http://${a}/v1/scripting/evaluate`, body: { script_text: t, mock_type: "cron", timeout: o }, headers: { "X-Key": h, Accept: "*/*" } }; $.post(r, (t, s, i) => e(i)) }).catch(t => this.logErr(t)) } loaddata() { if (!this.isNode()) return {}; { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s); if (!e && !i) return {}; { const i = e ? t : s; try { return JSON.parse(this.fs.readFileSync(i)) } catch (t) { return {} } } } } writedata() { if (this.isNode()) { this.fs = this.fs ? this.fs : require("fs"), this.path = this.path ? this.path : require("path"); const t = this.path.resolve(this.dataFile), s = this.path.resolve(process.cwd(), this.dataFile), e = this.fs.existsSync(t), i = !e && this.fs.existsSync(s), o = JSON.stringify(this.data); e ? this.fs.writeFileSync(t, o) : i ? this.fs.writeFileSync(s, o) : this.fs.writeFileSync(t, o) } } lodash_get(t, s, e) { const i = s.replace(/\[(\d+)\]/g, ".$1").split("."); let o = t; for (const t of i) if (o = Object(o)[t], void 0 === o) return e; return o } lodash_set(t, s, e) { return Object(t) !== t ? t : (Array.isArray(s) || (s = s.toString().match(/[^.[\]]+/g) || []), s.slice(0, -1).reduce((t, e, i) => Object(t[e]) === t[e] ? t[e] : t[e] = Math.abs(s[i + 1]) >> 0 == +s[i + 1] ? [] : {}, t)[s[s.length - 1]] = e, t) } getdata(t) { let s = this.getval(t); if (/^@/.test(t)) { const [, e, i] = /^@(.*?)\.(.*?)$/.exec(t), o = e ? this.getval(e) : ""; if (o) try { const t = JSON.parse(o); s = t ? this.lodash_get(t, i, "") : s } catch (t) { s = "" } } return s } setdata(t, s) { let e = !1; if (/^@/.test(s)) { const [, i, o] = /^@(.*?)\.(.*?)$/.exec(s), h = this.getval(i), a = i ? "null" === h ? null : h || "{}" : "{}"; try { const s = JSON.parse(a); this.lodash_set(s, o, t), e = this.setval(JSON.stringify(s), i) } catch (s) { const h = {}; this.lodash_set(h, o, t), e = this.setval(JSON.stringify(h), i) } } else e = $.setval(t, s); return e } getval(t) { return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null } setval(t, s) { return this.isSurge() || this.isLoon() ? $persistentStore.write(t, s) : this.isQuanX() ? $prefs.setValueForKey(t, s) : this.isNode() ? (this.data = this.loaddata(), this.data[s] = t, this.writedata(), !0) : this.data && this.data[s] || null } initGotEnv(t) { this.got = this.got ? this.got : require("got"), this.cktough = this.cktough ? this.cktough : require("tough-cookie"), this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar, t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar)) } get(t, s = (() => { })) { t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]), this.isSurge() || this.isLoon() ? $httpClient.get(t, (t, e, i) => { !t && e && (e.body = i, e.statusCode = e.status), s(t, e, i) }) : this.isQuanX() ? $task.fetch(t).then(t => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, t => s(t)) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, s) => { try { const e = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString(); this.ckjar.setCookieSync(e, null), s.cookieJar = this.ckjar } catch (t) { this.logErr(t) } }).then(t => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, t => s(t))) } post(t, s = (() => { })) { if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), delete t.headers["Content-Length"], this.isSurge() || this.isLoon()) $httpClient.post(t, (t, e, i) => { !t && e && (e.body = i, e.statusCode = e.status), s(t, e, i) }); else if (this.isQuanX()) t.method = "POST", $task.fetch(t).then(t => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, t => s(t)); else if (this.isNode()) { this.initGotEnv(t); const { url: e, ...i } = t; this.got.post(e, i).then(t => { const { statusCode: e, statusCode: i, headers: o, body: h } = t; s(null, { status: e, statusCode: i, headers: o, body: h }, h) }, t => s(t)) } } time(t) { let s = { "M+": (new Date).getMonth() + 1, "d+": (new Date).getDate(), "H+": (new Date).getHours(), "m+": (new Date).getMinutes(), "s+": (new Date).getSeconds(), "q+": Math.floor(((new Date).getMonth() + 3) / 3), S: (new Date).getMilliseconds() }; /(y+)/.test(t) && (t = t.replace(RegExp.$1, ((new Date).getFullYear() + "").substr(4 - RegExp.$1.length))); for (let e in s) new RegExp("(" + e + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? s[e] : ("00" + s[e]).substr(("" + s[e]).length))); return t } msg(s = t, e = "", i = "", o) { const h = t => !t || !this.isLoon() && this.isSurge() ? t : "string" == typeof t ? this.isLoon() ? t : this.isQuanX() ? { "open-url": t } : void 0 : "object" == typeof t && (t["open-url"] || t["media-url"]) ? this.isLoon() ? t["open-url"] : this.isQuanX() ? t : void 0 : void 0; this.isSurge() || this.isLoon() ? $notification.post(s, e, i, h(o)) : this.isQuanX() && $notify(s, e, i, h(o)), this.logs.push("", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="), this.logs.push(s), e && this.logs.push(e), i && this.logs.push(i) } log(...t) { t.length > 0 ? this.logs = [...this.logs, ...t] : console.log(this.logs.join(this.logSeparator)) } logErr(t, s) { const e = !this.isSurge() && !this.isQuanX() && !this.isLoon(); e ? $.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : $.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t) } wait(t) { return new Promise(s => setTimeout(s, t)) } done(t = {}) { const s = (new Date).getTime(), e = (s - this.startTime) / 1e3; this.log("", `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${e} \u79d2`), this.log(), (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t) } }(t, s) }
\ No newline at end of file
diff --git a/jd_daily_egg.js b/jd_daily_egg.js
new file mode 100644
index 00000000..f2f695e6
--- /dev/null
+++ b/jd_daily_egg.js
@@ -0,0 +1,221 @@
+/*
+京东金融-天天提鹅
+定时收鹅蛋,兑换金币
+先这样子吧
+ */
+//0 */3 * * *
+const $ = new Env('天天提鹅');
+let cookiesArr = [], cookie = '';
+const JD_API_HOST = 'https://ms.jr.jd.com/gw/generic/uc/h5/m';
+const notify = $.isNode() ? require('./sendNotify') : '';
+let jdNotify = false;//是否开启推送互助码
+//Node.js用户请在jdCookie.js处填写京东ck;
+const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
+if ($.isNode()) {
+ Object.keys(jdCookieNode).forEach((item) => {
+ cookiesArr.push(jdCookieNode[item])
+ })
+ if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false') console.log = () => {};
+} else {
+ cookiesArr.push(...[$.getdata('CookieJD'), $.getdata('CookieJD2')])
+}
+!(async () => {
+ if (!cookiesArr[0]) {
+ $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {"open-url": "https://bean.m.jd.com/"});
+ return;
+ }
+ for (let i = 0; i < cookiesArr.length; i++) {
+ if (cookiesArr[i]) {
+ cookie = cookiesArr[i];
+ $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1])
+ $.index = i + 1;
+ $.isLogin = true;
+ $.nickName = '';
+ await TotalBean();
+ console.log(`\n***********开始【京东账号${$.index}】${$.nickName || $.UserName}********\n`);
+ if (!$.isLogin) {
+ $.msg($.name, `【提示】cookie已失效`, `京东账号${$.index} ${$.nickName || $.UserName}\n请重新登录获取\nhttps://bean.m.jd.com/`, {"open-url": "https://bean.m.jd.com/"});
+ $.setdata('', `CookieJD${i ? i + 1 : "" }`);//cookie失效,故清空cookie。
+ if ($.isNode()) await notify.sendNotify(`${$.name}cookie已失效 - ${$.UserName}`, `京东账号${$.index} ${$.UserName}\n请重新登录获取cookie`);
+ continue
+ }
+ message = '';
+ subTitle = '';
+ goodsUrl = '';
+ taskInfoKey = [];
+ option = {};
+ await jdDailyEgg();
+ }
+ }
+})()
+ .catch((e) => {
+ $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
+ })
+ .finally(() => {
+ $.done();
+ })
+async function jdDailyEgg() {
+ await toDailyHome()
+ await toWithdraw()
+ await toGoldExchange();
+}
+function toGoldExchange() {
+ return new Promise(async resolve => {
+ const body = {
+ "timeSign": 0,
+ "environment": "jrApp",
+ "riskDeviceInfo": "{}"
+ }
+ $.post(taskUrl('toGoldExchange', body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ // console.log(data)
+ data = JSON.parse(data);
+ if (data.resultCode === 0) {
+ if (data.resultData.code === '0000') {
+ console.log(`兑换金币:${data.resultData.data.cnumber}`);
+ console.log(`当前总金币:${data.resultData.data.goldTotal}`);
+ } else if (data.resultData.code !== '0000') {
+ console.log(`兑换金币失败:${data.resultData.msg}`)
+ }
+ }
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function toWithdraw() {
+ return new Promise(async resolve => {
+ const body = {
+ "timeSign": 0,
+ "environment": "jrApp",
+ "riskDeviceInfo": "{}"
+ }
+ $.post(taskUrl('toWithdraw', body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ // console.log(data)
+ data = JSON.parse(data);
+ if (data.resultCode === 0) {
+ if (data.resultData.code === '0000') {
+ console.log(`收取鹅蛋:${data.resultData.data.eggTotal}个成功`);
+ console.log(`当前总鹅蛋数量:${data.resultData.data.userLevelDto.userHaveEggNum}`);
+ } else if (data.resultData.code !== '0000') {
+ console.log(`收取鹅蛋失败:${data.resultData.msg}`)
+ }
+ }
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function toDailyHome() {
+ return new Promise(async resolve => {
+ const body = {
+ "timeSign": 0,
+ "environment": "jrApp",
+ "riskDeviceInfo": "{}"
+ }
+ $.post(taskUrl('toDailyHome', body), (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ // console.log(data)
+ data = JSON.parse(data);
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function TotalBean() {
+ return new Promise(async resolve => {
+ const options = {
+ "url": `https://wq.jd.com/user/info/QueryJDUserInfo?sceneval=2`,
+ "headers": {
+ "Accept": "application/json,text/plain, */*",
+ "Content-Type": "application/x-www-form-urlencoded",
+ "Accept-Encoding": "gzip, deflate, br",
+ "Accept-Language": "zh-cn",
+ "Connection": "keep-alive",
+ "Cookie": cookie,
+ "Referer": "https://wqs.jd.com/my/jingdou/my.shtml?sceneval=2",
+ "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1"
+ }
+ }
+ $.post(options, (err, resp, data) => {
+ try {
+ if (err) {
+ console.log(`${JSON.stringify(err)}`)
+ console.log(`${$.name} API请求失败,请检查网路重试`)
+ } else {
+ if (data) {
+ data = JSON.parse(data);
+ if (data['retcode'] === 13) {
+ $.isLogin = false; //cookie过期
+ return
+ }
+ $.nickName = data['base'].nickname;
+ } else {
+ console.log(`京东服务器返回空数据`)
+ }
+ }
+ } catch (e) {
+ $.logErr(e, resp)
+ } finally {
+ resolve();
+ }
+ })
+ })
+}
+function taskUrl(function_id, body) {
+ return {
+ url: `${JD_API_HOST}/${function_id}`,
+ body: `reqData=${encodeURIComponent(JSON.stringify(body))}`,
+ headers: {
+ 'Accept' : `application/json`,
+ 'Origin' : `https://uua.jr.jd.com`,
+ 'Accept-Encoding' : `gzip, deflate, br`,
+ 'Cookie' : cookie,
+ 'Content-Type' : `application/x-www-form-urlencoded;charset=UTF-8`,
+ 'Host' : `ms.jr.jd.com`,
+ 'Connection' : `keep-alive`,
+ 'User-Agent' : `jdapp;iPhone;9.0.0;13.4.1;e35caf0a69be42084e3c97eef56c3af7b0262d01;network/4g;ADID/F75E8AED-CB48-4EAC-A213-E8CE4018F214;supportApplePay/3;hasUPPay/0;pushNoticeIsOpen/1;model/iPhone11,8;addressid/2005183373;hasOCPay/0;appBuild/167237;supportBestPay/0;jdSupportDarkMode/0;pv/1287.19;apprpd/MyJD_GameMain;ref/https%3A%2F%2Fuua.jr.jd.com%2Fuc-fe-wxgrowing%2Fmoneytree%2Findex%2F%3Fchannel%3Dyxhd%26lng%3D113.325843%26lat%3D23.204628%26sid%3D2d98e88cf7d182f60d533476c2ce777w%26un_area%3D19_1601_50258_51885;psq/1;ads/;psn/e35caf0a69be42084e3c97eef56c3af7b0262d01|3485;jdv/0|kong|t_1000170135|tuiguang|notset|1593059927172|1593059927;adk/;app_device/IOS;pap/JA2015_311210|9.0.0|IOS 13.4.1;Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1`,
+ 'Referer' : `https://uua.jr.jd.com/uc-fe-wxgrowing/moneytree/index`,
+ 'Accept-Language' : `zh-cn`
+ }
+ }
+}
+// prettier-ignore
+function Env(t,e){class s{constructor(t){this.env=t}send(t,e="GET"){t="string"==typeof t?{url:t}:t;let s=this.get;return"POST"===e&&(s=this.post),new Promise((e,i)=>{s.call(this,t,(t,s,o)=>{t?i(t):e(s)})})}get(t){return this.send.call(this.env,t)}post(t){return this.send.call(this.env,t,"POST")}}return new class{constructor(t,e){this.name=t,this.http=new s(this),this.data=null,this.dataFile="box.dat",this.logs=[],this.isMute=!1,this.logSeparator="\n",this.startTime=(new Date).getTime(),Object.assign(this,e),this.log("",`\ud83d\udd14${this.name}, \u5f00\u59cb!`)}isNode(){return"undefined"!=typeof module&&!!module.exports}isQuanX(){return"undefined"!=typeof $task}isSurge(){return"undefined"!=typeof $httpClient&&"undefined"==typeof $loon}isLoon(){return"undefined"!=typeof $loon}toObj(t,e=null){try{return JSON.parse(t)}catch{return e}}toStr(t,e=null){try{return JSON.stringify(t)}catch{return e}}getjson(t,e){let s=e;const i=this.getdata(t);if(i)try{s=JSON.parse(this.getdata(t))}catch{}return s}setjson(t,e){try{return this.setdata(JSON.stringify(t),e)}catch{return!1}}getScript(t){return new Promise(e=>{this.get({url:t},(t,s,i)=>e(i))})}runScript(t,e){return new Promise(s=>{let i=this.getdata("@chavy_boxjs_userCfgs.httpapi");i=i?i.replace(/\n/g,"").trim():i;let o=this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");o=o?1*o:20,o=e&&e.timeout?e.timeout:o;const[r,h]=i.split("@"),a={url:`http://${h}/v1/scripting/evaluate`,body:{script_text:t,mock_type:"cron",timeout:o},headers:{"X-Key":r,Accept:"*/*"}};this.post(a,(t,e,i)=>s(i))}).catch(t=>this.logErr(t))}loaddata(){if(!this.isNode())return{};{this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e);if(!s&&!i)return{};{const i=s?t:e;try{return JSON.parse(this.fs.readFileSync(i))}catch(t){return{}}}}}writedata(){if(this.isNode()){this.fs=this.fs?this.fs:require("fs"),this.path=this.path?this.path:require("path");const t=this.path.resolve(this.dataFile),e=this.path.resolve(process.cwd(),this.dataFile),s=this.fs.existsSync(t),i=!s&&this.fs.existsSync(e),o=JSON.stringify(this.data);s?this.fs.writeFileSync(t,o):i?this.fs.writeFileSync(e,o):this.fs.writeFileSync(t,o)}}lodash_get(t,e,s){const i=e.replace(/\[(\d+)\]/g,".$1").split(".");let o=t;for(const t of i)if(o=Object(o)[t],void 0===o)return s;return o}lodash_set(t,e,s){return Object(t)!==t?t:(Array.isArray(e)||(e=e.toString().match(/[^.[\]]+/g)||[]),e.slice(0,-1).reduce((t,s,i)=>Object(t[s])===t[s]?t[s]:t[s]=Math.abs(e[i+1])>>0==+e[i+1]?[]:{},t)[e[e.length-1]]=s,t)}getdata(t){let e=this.getval(t);if(/^@/.test(t)){const[,s,i]=/^@(.*?)\.(.*?)$/.exec(t),o=s?this.getval(s):"";if(o)try{const t=JSON.parse(o);e=t?this.lodash_get(t,i,""):e}catch(t){e=""}}return e}setdata(t,e){let s=!1;if(/^@/.test(e)){const[,i,o]=/^@(.*?)\.(.*?)$/.exec(e),r=this.getval(i),h=i?"null"===r?null:r||"{}":"{}";try{const e=JSON.parse(h);this.lodash_set(e,o,t),s=this.setval(JSON.stringify(e),i)}catch(e){const r={};this.lodash_set(r,o,t),s=this.setval(JSON.stringify(r),i)}}else s=this.setval(t,e);return s}getval(t){return this.isSurge()||this.isLoon()?$persistentStore.read(t):this.isQuanX()?$prefs.valueForKey(t):this.isNode()?(this.data=this.loaddata(),this.data[t]):this.data&&this.data[t]||null}setval(t,e){return this.isSurge()||this.isLoon()?$persistentStore.write(t,e):this.isQuanX()?$prefs.setValueForKey(t,e):this.isNode()?(this.data=this.loaddata(),this.data[e]=t,this.writedata(),!0):this.data&&this.data[e]||null}initGotEnv(t){this.got=this.got?this.got:require("got"),this.cktough=this.cktough?this.cktough:require("tough-cookie"),this.ckjar=this.ckjar?this.ckjar:new this.cktough.CookieJar,t&&(t.headers=t.headers?t.headers:{},void 0===t.headers.Cookie&&void 0===t.cookieJar&&(t.cookieJar=this.ckjar))}get(t,e=(()=>{})){t.headers&&(delete t.headers["Content-Type"],delete t.headers["Content-Length"]),this.isSurge()||this.isLoon()?$httpClient.get(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)}):this.isQuanX()?$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)):this.isNode()&&(this.initGotEnv(t),this.got(t).on("redirect",(t,e)=>{try{const s=t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();this.ckjar.setCookieSync(s,null),e.cookieJar=this.ckjar}catch(t){this.logErr(t)}}).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t)))}post(t,e=(()=>{})){if(t.body&&t.headers&&!t.headers["Content-Type"]&&(t.headers["Content-Type"]="application/x-www-form-urlencoded"),t.headers&&delete t.headers["Content-Length"],this.isSurge()||this.isLoon())$httpClient.post(t,(t,s,i)=>{!t&&s&&(s.body=i,s.statusCode=s.status),e(t,s,i)});else if(this.isQuanX())t.method="POST",$task.fetch(t).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t));else if(this.isNode()){this.initGotEnv(t);const{url:s,...i}=t;this.got.post(s,i).then(t=>{const{statusCode:s,statusCode:i,headers:o,body:r}=t;e(null,{status:s,statusCode:i,headers:o,body:r},r)},t=>e(t))}}time(t){let e={"M+":(new Date).getMonth()+1,"d+":(new Date).getDate(),"H+":(new Date).getHours(),"m+":(new Date).getMinutes(),"s+":(new Date).getSeconds(),"q+":Math.floor(((new Date).getMonth()+3)/3),S:(new Date).getMilliseconds()};/(y+)/.test(t)&&(t=t.replace(RegExp.$1,((new Date).getFullYear()+"").substr(4-RegExp.$1.length)));for(let s in e)new RegExp("("+s+")").test(t)&&(t=t.replace(RegExp.$1,1==RegExp.$1.length?e[s]:("00"+e[s]).substr((""+e[s]).length)));return t}msg(e=t,s="",i="",o){const r=t=>{if(!t||!this.isLoon()&&this.isSurge())return t;if("string"==typeof t)return this.isLoon()?t:this.isQuanX()?{"open-url":t}:void 0;if("object"==typeof t){if(this.isLoon()){let e=t.openUrl||t["open-url"],s=t.mediaUrl||t["media-url"];return{openUrl:e,mediaUrl:s}}if(this.isQuanX()){let e=t["open-url"]||t.openUrl,s=t["media-url"]||t.mediaUrl;return{"open-url":e,"media-url":s}}}};this.isMute||(this.isSurge()||this.isLoon()?$notification.post(e,s,i,r(o)):this.isQuanX()&&$notify(e,s,i,r(o)));let h=["","==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];h.push(e),s&&h.push(s),i&&h.push(i),console.log(h.join("\n")),this.logs=this.logs.concat(h)}log(...t){t.length>0&&(this.logs=[...this.logs,...t]),console.log(t.join(this.logSeparator))}logErr(t,e){const s=!this.isSurge()&&!this.isQuanX()&&!this.isLoon();s?this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t.stack):this.log("",`\u2757\ufe0f${this.name}, \u9519\u8bef!`,t)}wait(t){return new Promise(e=>setTimeout(e,t))}done(t={}){const e=(new Date).getTime(),s=(e-this.startTime)/1e3;this.log("",`\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),this.log(),(this.isSurge()||this.isQuanX()||this.isLoon())&&$done(t)}}(t,e)}
\ No newline at end of file
diff --git a/jd_dreamFactory.js b/jd_dreamFactory.js
new file mode 100644
index 00000000..29b6119e
--- /dev/null
+++ b/jd_dreamFactory.js
@@ -0,0 +1,265 @@
+/*
+京东京喜工厂
+未完,待续
+ */
+const $hammer = (() => {
+ const isRequest = "undefined" != typeof $request,
+ isSurge = "undefined" != typeof $httpClient,
+ isQuanX = "undefined" != typeof $task;
+
+ const log = (...n) => { for (let i in n) console.log(n[i]) };
+ const alert = (title, body = "", subtitle = "", link = "", option) => {
+ if (isSurge) return $notification.post(title, subtitle, body, link);
+ if (isQuanX) return $notify(title, subtitle, (link && !body ? link : body), option);
+ log("==============📣系统通知📣==============");
+ log("title:", title, "subtitle:", subtitle, "body:", body, "link:", link);
+ };
+ const read = key => {
+ if (isSurge) return $persistentStore.read(key);
+ if (isQuanX) return $prefs.valueForKey(key);
+ },
+ write = (key, val) => {
+ if (isSurge) return $persistentStore.write(key, val);
+ if (isQuanX) return $prefs.setValueForKey(key, val);
+ };
+ const request = (method, params, callback) => {
+ /**
+ *
+ * params(