[
  {
    "path": ".github/ISSUE_TEMPLATE/1_bug_report.yml",
    "content": "name: '🐛 签到失败 BUG'\ndescription: '反馈一个签到失败的 BUG'\ntitle: '[Bug] '\nlabels: ['🐛 Bug']\nbody:\n  - type: dropdown\n    attributes:\n      label: '💻 系统环境'\n      options:\n        - Windows\n        - macOS\n        - Ubuntu\n        - Other Linux\n    validations:\n      required: true\n\n  - type: dropdown\n    attributes:\n      label: '📦 部署环境'\n      options:\n        - 本地\n        - 青龙\n        - Docker\n        - 群晖\n        - 云函数\n    validations:\n      required: true\n\n  - type: textarea\n    attributes:\n      label: '🐛 问题描述'\n      description: 请提供一个清晰且简洁的问题描述。并贴上图片\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: '📝 运行日志'\n      description: 请提供运行的详细日志，隐私数据请马赛克。\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2_feature_request.yml",
    "content": "name: '🌠 功能需求'\ndescription: '提出需求或建议'\ntitle: '[Request] '\nlabels: ['🌠 功能需求']\nbody:\n  - type: textarea\n    attributes:\n      label: '🥰 需求描述'\n      description: 请添加一个清晰且简洁的问题描述，阐述您希望通过这个功能需求解决的问题。\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: '🧐 解决方案'\n      description: 请清晰且简洁地描述您想要的解决方案。例如：已有的签到脚本代码。\n    validations:\n      required: true\n  - type: textarea\n    attributes:\n      label: '📝 补充信息'\n      description: 在这里添加关于问题的任何其他背景信息。\n"
  },
  {
    "path": ".github/workflows/docker-publish.yml",
    "content": "name: Docker Push\n\non:\n  workflow_dispatch:\n\njobs:\n  docker:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n      - name: Set up QEMU\n        uses: docker/setup-qemu-action@v3\n      - name: Set up Docker Buildx\n        uses: docker/setup-buildx-action@v3\n      - name: Login to Docker Hub\n        uses: docker/login-action@v3\n        with:\n          username: ${{ secrets.DOCKERHUB_USERNAME }}\n          password: ${{ secrets.DOCKERHUB_TOKEN }}\n      - name: Build and push\n        uses: docker/build-push-action@v5\n        with:\n          context: '{{defaultContext}}:docker'\n          platforms: linux/amd64,linux/arm64,linux/arm/v6,linux/arm/v7\n          push: true\n          tags: sitoi/dailycheckin:latest\n"
  },
  {
    "path": ".github/workflows/docs-publish.yml",
    "content": "name: Deploy\n\non:\n  push:\n    paths:\n      - 'docs/**'\ndefaults:\n  run:\n    shell: bash\n    working-directory: ./docs\n\njobs:\n  github_pages_deploy:\n    runs-on: ubuntu-latest\n    steps:\n      - name: Cancel Previous Runs\n        uses: styfle/cancel-workflow-action@0.9.1\n      - uses: actions/checkout@v3\n      - name: Use Node.js 20.x\n        uses: actions/setup-node@v3\n        with:\n          node-version: 20.x\n      - name: Install dependencies\n        run: |\n          npm install\n          npm run export\n      - name: Deploy with gh-pages\n        run: |\n          git remote set-url origin https://git:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git\n          npm run deploy -- -u \"github-actions-bot <support+actions@github.com>\"\n        env:\n          GITHUB_TOKEN: ${{ secrets.TOKEN }}\n"
  },
  {
    "path": ".github/workflows/release-publish.yml",
    "content": "# This workflow will upload a Python Package using Twine when a release is published\n# For more information see: https://packaging.python.org/guides/publishing-package-distribution-releases-using-github-actions-ci-cd-workflows/\n\nname: Upload Release to PyPi\n\non:\n  release:\n    types: [published]\n\njobs:\n  deploy:\n    runs-on: ubuntu-latest\n    permissions:\n      id-token: write\n\n    environment:\n      name: pypi\n      url: https://pypi.org/p/dailycheckin\n\n    steps:\n      - uses: actions/checkout@v4\n      - name: Set up Python 3.9\n        uses: actions/setup-python@v6\n        with:\n          python-version: 3.9\n\n      - name: Install pypa/build\n        run: python -m pip install build --user\n\n      - name: Build a binary wheel and a source tarball\n        run: python -m build --sdist --wheel --outdir dist/ .\n\n      - name: Publish distribution 📦 to PyPI\n        uses: pypa/gh-action-pypi-publish@release/v1\n        with:\n            skip-existing: true\n        #   password: ${{ secrets.PYPI_API_TOKEN }}\n"
  },
  {
    "path": ".gitignore",
    "content": "# Created by .ignore support plugin (hsz.mobi)\n### Python template\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packaging\n.Python\nbuild/\ndevelop-eggs/\ndist/\ndownloads/\neggs/\n.eggs/\nlib/\nlib64/\nparts/\nsdist/\nvar/\nwheels/\npip-wheel-metadata/\nshare/python-wheels/\n*.egg-info/\n.installed.cfg\n*.egg\nMANIFEST\n\n# PyInstaller\n#  Usually these files are written by a python script from a template\n#  before PyInstaller builds the exe, so as to inject date/other infos into it.\n*.manifest\n*.spec\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# Unit test / coverage reports\nhtmlcov/\n.tox/\n.nox/\n.coverage\n.coverage.*\n.cache\nnosetests.xml\ncoverage.xml\n*.cover\n*.py,cover\n.hypothesis/\n.pytest_cache/\n\n# Translations\n*.mo\n*.pot\n\n# Django stuff:\n*.log\nlocal_settings.py\ndb.sqlite3\ndb.sqlite3-journal\n\n# Flask stuff:\ninstance/\n.webassets-cache\n\n# Scrapy stuff:\n.scrapy\n\n# Sphinx documentation\ndocs/_build/\n\n# PyBuilder\ntarget/\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# IPython\nprofile_default/\nipython_config.py\n\n# pyenv\n.python-version\n\n# pipenv\n#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.\n#   However, in case of collaboration, if having platform-specific dependencies or dependencies\n#   having no cross-platform support, pipenv may install dependencies that don't work, or not\n#   install all needed dependencies.\n#Pipfile.lock\n\n# PEP 582; used by e.g. github.com/David-OConnor/pyflow\n__pypackages__/\n\n# Celery stuff\ncelerybeat-schedule\ncelerybeat.pid\n\n# SageMath parsed files\n*.sage.py\n\n# Environments\n.env\n.venv\nenv/\nvenv/\nENV/\nenv.bak/\nvenv.bak/\n\n# Spyder project settings\n.spyderproject\n.spyproject\n\n# Rope project settings\n.ropeproject\n\n# mkdocs documentation\n/site\n\n# mypy\n.mypy_cache/\n.dmypy.json\ndmypy.json\n\n# Pyre type checker\n.pyre/\n.idea\nconfig.json\n\n.next\nnode_modules\n\n.DS_Store"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v5.0.0\n    hooks:\n      - id: check-added-large-files\n        args: [--maxkb=100000]\n      - id: check-json\n        exclude: .vscode\n      - id: check-case-conflict\n      - id: detect-private-key\n      - id: mixed-line-ending\n      - id: trailing-whitespace\n      - id: fix-encoding-pragma\n        args:\n          - --remove\n      - id: requirements-txt-fixer\n      - id: trailing-whitespace\n\n  - repo: https://github.com/asottile/pyupgrade\n    rev: v3.20.0\n    hooks:\n      - id: pyupgrade\n        args: [--py39-plus]\n\n  - repo: https://github.com/MarcoGorelli/auto-walrus\n    rev: 0.3.4\n    hooks:\n      - id: auto-walrus\n\n  - repo: https://github.com/astral-sh/ruff-pre-commit\n    rev: v0.12.1\n    hooks:\n      - id: ruff-check\n        args: [--fix]\n      - id: ruff-format\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2021 Sitoi\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n"
  },
  {
    "path": "Makefile",
    "content": ".PHONY: clean sdist upload pre-commit mkdocs\n\nsdist: clean\n\tpython3 setup.py sdist bdist_wheel --universa\n\nupload: clean\n\tpython3 setup.py upload\n\nclean:\n\trm -rf build dailycheckin.egg-info dist\n\npre-commit:\n\tpre-commit run --all-files\n"
  },
  {
    "path": "README.md",
    "content": "<div align=\"center\">\n\n<img src=\"https://socialify.git.ci/Sitoi/dailycheckin/image?font=Rokkitt&forks=1&issues=1&language=1&name=1&owner=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Dark\">\n\n<h1>DailyCheckIn</h1>\n\n基于「Docker」/「青龙面板」/「群晖」/「本地」的每日签到脚本\n\n<!-- SHIELD GROUP -->\n<div id=\"shield\">\n\n[![][github-releases-shield]][github-releases-link]\n[![][pypi-version-shield]][pypi-version-link]\n[![][github-release-date-shield]][github-release-date-link]\n[![][github-stars-shield]][github-stars-link]\n[![][github-forks-shield]][github-forks-link]\n[![][github-issues-shield]][github-issues-link]\n[![][github-contributors-shield]][github-contributors-link]\n\n[![][python-version-shield]][python-version-link]\n[![][pypi-dm-shield]][pypi-dm-link]\n[![][docker-pull-shield]][docker-pull-link]\n[![][docker-size-shield]][docker-size-link]\n[![][docker-stars-shield]][docker-stars-link]\n[![][github-license-shield]][github-license-link]\n\n<!-- SHIELD GROUP -->\n</div>\n</div>\n\n## ✨ 特性\n\n- 📦 支持 Pypi 包安装\n- 💻 支持多个平台部署\n- ⚙️ 支持多个平台签到\n- 📢 支持多个平台通知\n- ♾️ 支持多个账号签到\n- 🕙 支持定时任务设置\n- 🆙 支持项目自动更新\n\n## 🦄 教程\n\n[https://sitoi.github.io/dailycheckin/](https://sitoi.github.io/dailycheckin/)\n\n## 🧾 列表\n\n🟢: 正常运行 🔴: 脚本暂不可用 🔵: 可以执行(需更新) 🟡: 待测试 🟤: 看脸\n\n| 状态 | 任务名称  | 名称网站                                                   | 检查日期 | 备注                                                                         |\n| ---- | --------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |\n| 🟢️  | KGQQ      | [全民 K 歌](https://kg.qq.com/index-pc.html)               | 25.09.28 | 每日签到获取鲜花 每日大约 120 鲜花左右                                       |\n| 🟢️  | YOUDAO    | [有道云笔记](https://note.youdao.com/web/)                 | 25.09.28 | 每日签到获取存储空间                                                         |\n| 🟢️  | TIEBA     | [百度贴吧](https://tieba.baidu.com/index.html)             | 25.09.28 | 贴吧每日签到                                                                 |\n| 🟢️  | BAIDUWP   | [百度网盘](https://pan.baidu.com/wap/svip/growth/task)     | 25.09.28 | 百度网盘会员签到和答题功能                                                   |\n| 🟢️  | BILIBILI  | [BiliBili](https://www.bilibili.com/)                      | 25.09.28 | 漫画签到，每日经验任务，自动投币，银瓜子换硬币等功能                         |\n| 🟢️  | V2EX      | [V2EX](https://www.v2ex.com/)                              | 25.09.28 | 铜币奖励                                                                     |\n| 🟢️  | ACFUN     | [AcFun](https://www.acfun.cn/)                             | 25.09.28 | 每日签到香蕉                                                                 |\n| 🟢️  | IQIYI     | [爱奇艺](https://www.iqiyi.com/)                           | 25.09.28 | ① VIP7 每月免费领白金会员；② 抽白金会员 5 次；③ 摇一摇抽奖 3 次；④ 抽奖 3 次 |\n| 🟢️  | SMZDM     | [什么值得买](https://www.smzdm.com/)                       | 24.02.20 | 签到和抽奖                                                                   |\n| 🟢️  | ALIYUN    | [阿里云盘](https://www.aliyundrive.com/drive/)             | 24.02.20 | 签到获取免费会员和空间                                                       |\n| 🟢️  | ENSHAN    | [恩山无线论坛](https://www.right.com.cn/forum/)            | 24.02.20 | 签到获取硬币和积分                                                           |\n| 🟢️  | FNNASCLUB | [飞牛 Nas](https://club.fnnas.com/)                        | 25.12.09 | 签到奖励                                                                     |\n| 🟢️  | AOLAXING  | [奥拉星](http://www.100bt.com/m/creditMall/?gameId=2#task) | 24.02.20 | 签到获取积分                                                                 |\n| 🟢️  | IMAOTAI   | i 茅台                                                     | 25.09.28 | 申购生肖茅台                                                                 |\n| 🟤   | MIMOTION  | 小米运动                                                   | 25.09.28 | 每日小米运动刷步数                                                           |\n| 🟢️  | BAIDU     | [百度站点](https://ziyuan.baidu.com/site/index#/)          | 25.09.28 | 提交网站页面供百度收录                                                       |\n\n## 💬 通知列表\n\n- dingtalk（钉钉）\n- 企业微信群机器人（企业微信）\n- 企业微信应用消息（企业微信）\n- telegram（TG）\n- Bark（iOS）\n- server 酱（微信）\n- server 酱 TURBO（微信）\n- pushplus（微信）\n- Cool Push（QQ,微信,邮箱）\n- qmsg 酱（QQ）\n- 飞书（飞书）\n\n## 🤝 参与贡献\n\n我们非常欢迎各种形式的贡献。如果你对贡献代码感兴趣，可以查看我们的 GitHub [Issues][github-issues-link]，大展身手，向我们展示你的奇思妙想。\n\n[![][pr-welcome-shield]][pr-welcome-link]\n\n### 💗 感谢我们的贡献者\n\n[![][github-contrib-shield]][github-contrib-link]\n\n## ✨ Star 数\n\n[![][starchart-shield]][starchart-link]\n\n---\n\n## 📝 License\n\nCopyright © 2021 [Sitoi][profile-link]. <br />\nThis project is [MIT](https://github.com/Sitoi/dailycheckin/blob/main/LICENSE) licensed.\n\n<!-- LINK GROUP -->\n\n[profile-link]: https://github.com/sitoi\n[github-codespace-link]: https://codespaces.new/sitoi/dailycheckin\n[github-codespace-shield]: https://github.com/sitoi/dailycheckin/blob/main/images/codespaces.png?raw=true\n[github-contributors-link]: https://github.com/sitoi/dailycheckin/graphs/contributors\n[github-contributors-shield]: https://img.shields.io/github/contributors/sitoi/dailycheckin?color=c4f042&labelColor=black&style=flat-square\n[github-forks-link]: https://github.com/sitoi/dailycheckin/network/members\n[github-forks-shield]: https://img.shields.io/github/forks/sitoi/dailycheckin?color=8ae8ff&labelColor=black&style=flat-square\n[github-issues-link]: https://github.com/sitoi/dailycheckin/issues\n[github-issues-shield]: https://img.shields.io/github/issues/sitoi/dailycheckin?color=ff80eb&labelColor=black&style=flat-square\n[github-license-link]: https://github.com/sitoi/dailycheckin/blob/main/LICENSE\n[github-license-shield]: https://img.shields.io/github/license/sitoi/dailycheckin?labelColor=black&style=flat-square\n[github-stars-link]: https://github.com/sitoi/dailycheckin/stargazers\n[github-stars-shield]: https://img.shields.io/github/stars/sitoi/dailycheckin?color=ffcb47&labelColor=black&style=flat-square\n[github-releases-link]: https://github.com/sitoi/dailycheckin/releases\n[github-releases-shield]: https://img.shields.io/github/v/release/sitoi/dailycheckin?labelColor=black&style=flat-square\n[github-release-date-link]: https://github.com/sitoi/dailycheckin/releases\n[github-release-date-shield]: https://img.shields.io/github/release-date/sitoi/dailycheckin?labelColor=black&style=flat-square\n[pr-welcome-link]: https://github.com/sitoi/dailycheckin/pulls\n[pr-welcome-shield]: https://img.shields.io/badge/🤯_pr_welcome-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge\n[github-contrib-link]: https://github.com/sitoi/dailycheckin/graphs/contributors\n[github-contrib-shield]: https://contrib.rocks/image?repo=sitoi%2Fdailycheckin\n[docker-pull-shield]: https://img.shields.io/docker/pulls/sitoi/dailycheckin?labelColor=black&style=flat-square\n[docker-pull-link]: https://hub.docker.com/repository/docker/sitoi/dailycheckin\n[docker-size-shield]: https://img.shields.io/docker/image-size/sitoi/dailycheckin?labelColor=black&style=flat-square\n[docker-size-link]: https://hub.docker.com/repository/docker/sitoi/dailycheckin\n[docker-stars-shield]: https://img.shields.io/docker/stars/sitoi/dailycheckin?labelColor=black&style=flat-square\n[docker-stars-link]: https://hub.docker.com/repository/docker/sitoi/dailycheckin\n[pypi-dm-shield]: https://img.shields.io/pypi/dm/dailycheckin?label=pypi&labelColor=black&style=flat-square\n[pypi-dm-link]: https://pypi.org/project/dailycheckin/\n[python-version-link]: https://pypi.org/project/dailycheckin/\n[python-version-shield]: https://img.shields.io/pypi/pyversions/dailycheckin?labelColor=black&style=flat-square\n[pypi-version-shield]: https://img.shields.io/pypi/v/dailycheckin?labelColor=black&style=flat-square\n[pypi-version-link]: https://pypi.org/project/dailycheckin/\n[starchart-shield]: https://api.star-history.com/svg?repos=sitoi/dailycheckin&type=Date\n[starchart-link]: https://star-history.com/#sitoi/dailycheckin&Date\n"
  },
  {
    "path": "dailycheckin/__init__.py",
    "content": "import pkgutil as _pkgutil\n\n\nclass CheckIn:\n    name = \"Base\"\n\n\n__path__ = _pkgutil.extend_path(__path__, __name__)\nfor _, _modname, _ in _pkgutil.walk_packages(path=__path__, prefix=__name__ + \".\"):\n    if _modname not in [\"dailycheckin.main\", \"dailycheckin.configs\"]:\n        __import__(_modname)\n"
  },
  {
    "path": "dailycheckin/__version__.py",
    "content": "__version__ = \"25.12.9\"\n"
  },
  {
    "path": "dailycheckin/acfun/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/acfun/main.py",
    "content": "import json\nimport os\nimport re\n\nimport requests\nimport urllib3\n\nfrom dailycheckin import CheckIn\n\nurllib3.disable_warnings()\n\n\nclass AcFun(CheckIn):\n    name = \"AcFun\"\n\n    def __init__(self, check_item: dict):\n        self.check_item = check_item\n        self.contentid = \"27259341\"\n        self.st = None\n\n    @staticmethod\n    def login(phone, password, session):\n        url = \"https://id.app.acfun.cn/rest/web/login/signin\"\n        body = f\"username={phone}&password={password}&key=&captcha=\"\n        res = session.post(url=url, data=body).json()\n        return (True, res) if res.get(\"result\") == 0 else (False, res.get(\"err_msg\"))\n\n    @staticmethod\n    def get_cookies(session, phone, password):\n        url = \"https://id.app.acfun.cn/rest/app/login/signin\"\n        headers = {\n            \"Host\": \"id.app.acfun.cn\",\n            \"user-agent\": \"AcFun/6.39.0 (iPhone; iOS 14.3; Scale/2.00)\",\n            \"devicetype\": \"0\",\n            \"accept-language\": \"zh-Hans-CN;q=1, en-CN;q=0.9, ja-CN;q=0.8, zh-Hant-HK;q=0.7, io-Latn-CN;q=0.6\",\n            \"accept\": \"application/json\",\n            \"content-type\": \"application/x-www-form-urlencoded\",\n        }\n        data = f\"password={password}&username={phone}\"\n        response = session.post(url=url, data=data, headers=headers, verify=False)\n        acpasstoken = response.json().get(\"acPassToken\")\n        auth_key = str(response.json().get(\"auth_key\"))\n        if acpasstoken and auth_key:\n            cookies = {\"acPasstoken\": acpasstoken, \"auth_key\": auth_key}\n            return cookies\n        else:\n            return False\n\n    def get_token(self, session):\n        url = \"https://id.app.acfun.cn/rest/web/token/get?sid=acfun.midground.api\"\n        res = session.post(url=url).json()\n        self.st = res.get(\"acfun.midground.api_st\") if res.get(\"result\") == 0 else \"\"\n        return self.st\n\n    def get_video(self, session):\n        url = \"https://www.acfun.cn/rest/pc-direct/rank/channel\"\n        res = session.get(url=url).json()\n        self.contentid = res.get(\"rankList\")[0].get(\"contentId\")\n        return self.contentid\n\n    @staticmethod\n    def sign(session):\n        url = \"https://www.acfun.cn/rest/pc-direct/user/signIn\"\n        response = session.post(url=url)\n        return {\"name\": \"签到信息\", \"value\": response.json().get(\"msg\")}\n\n    def danmu(self, session):\n        url = \"https://www.acfun.cn/rest/pc-direct/new-danmaku/add\"\n        data = {\n            \"mode\": \"1\",\n            \"color\": \"16777215\",\n            \"size\": \"25\",\n            \"body\": \"123321\",\n            \"videoId\": \"26113662\",\n            \"position\": \"2719\",\n            \"type\": \"douga\",\n            \"id\": \"31224739\",\n            \"subChannelId\": \"1\",\n            \"subChannelName\": \"动画\",\n        }\n        response = session.get(url=f\"https://www.acfun.cn/v/ac{self.contentid}\")\n        video_id = re.findall(r'\"currentVideoId\":(\\d+),', response.text)\n        sub_channel = re.findall(r'{subChannelId:(\\d+),subChannelName:\"([\\u4e00-\\u9fa5]+)\"}', response.text)\n        if video_id:\n            data[\"videoId\"] = video_id[0]\n            data[\"subChannelId\"] = sub_channel[0][0]\n            data[\"subChannelName\"] = sub_channel[0][1]\n        res = session.post(url=url, data=data).json()\n        msg = \"弹幕成功\" if res.get(\"result\") == 0 else \"弹幕失败\"\n        return {\"name\": \"弹幕任务\", \"value\": msg}\n\n    def throwbanana(self, session):\n        url = \"https://www.acfun.cn/rest/pc-direct/banana/throwBanana\"\n        data = {\"resourceId\": self.contentid, \"count\": \"1\", \"resourceType\": \"2\"}\n        res = session.post(url=url, data=data).json()\n        msg = \"投🍌成功\" if res.get(\"result\") == 0 else \"投🍌失败\"\n        return {\"name\": \"香蕉任务\", \"value\": msg}\n\n    def like(self, session):\n        like_url = \"https://kuaishouzt.com/rest/zt/interact/add\"\n        unlike_url = \"https://kuaishouzt.com/rest/zt/interact/delete\"\n        body = (\n            f\"kpn=ACFUN_APP&kpf=PC_WEB&subBiz=mainApp&interactType=1&\"\n            f\"objectType=2&objectId={self.contentid}&acfun.midground.api_st={self.st}&\"\n            f\"extParams%5BisPlaying%5D=false&extParams%5BshowCount%5D=1&extParams%5B\"\n            f\"otherBtnClickedCount%5D=10&extParams%5BplayBtnClickedCount%5D=0\"\n        )\n        res = session.post(url=like_url, data=body).json()\n        session.post(url=unlike_url, data=body)\n        msg = \"点赞成功\" if res.get(\"result\") == 1 else \"点赞失败\"\n        return {\"name\": \"点赞任务\", \"value\": msg}\n\n    def share(self, session, cookies):\n        url = \"https://api-ipv6.acfunchina.com/rest/app/task/reportTaskAction?taskType=1&market=tencent&product=ACFUN_APP&appMode=0\"\n        headers = {\n            \"Content-Type\": \"application/x-www-form-urlencoded\",\n        }\n        response = session.get(url=url, headers=headers, cookies=cookies, verify=False)\n        if response.json().get(\"result\") == 0:\n            msg = \"分享成功\"\n        else:\n            msg = \"分享失败\"\n        return {\"name\": \"分享任务\", \"value\": msg}\n\n    @staticmethod\n    def get_info(session):\n        url = \"https://www.acfun.cn/rest/pc-direct/user/personalInfo\"\n        res = session.get(url=url).json()\n        if res.get(\"result\") != 0:\n            return [{\"name\": \"当前等级\", \"value\": \"查询失败\"}]\n        info = res.get(\"info\")\n        return [\n            {\"name\": \"当前等级\", \"value\": info.get(\"level\")},\n            {\"name\": \"持有香蕉\", \"value\": info.get(\"banana\")},\n        ]\n\n    def main(self):\n        phone = self.check_item.get(\"phone\")\n        password = self.check_item.get(\"password\")\n        session = requests.session()\n        session.headers.update(\n            {\n                \"accept\": \"*/*\",\n                \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n                \"content-type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n                \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) \"\n                \"AppleWebKit/537.36 (KHTML, like Gecko) \"\n                \"Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70\",\n                \"Referer\": \"https://www.acfun.cn/\",\n            }\n        )\n        flag, res = self.login(phone, password, session)\n        if flag is True:\n            self.get_video(session=session)\n            self.get_token(session=session)\n            sign_msg = self.sign(session=session)\n            like_msg = self.like(session=session)\n            danmu_msg = self.danmu(session=session)\n            throwbanana_msg = self.throwbanana(session=session)\n            info_msg = self.get_info(session=session)\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": phone},\n                sign_msg,\n                like_msg,\n                danmu_msg,\n                throwbanana_msg,\n                *info_msg,\n            ]\n        else:\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": phone},\n                {\"name\": \"错误信息\", \"value\": res},\n            ]\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"ACFUN\", [])[0]\n    print(AcFun(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/aliyun/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/aliyun/main.py",
    "content": "import json\nimport os\n\nimport requests\nimport urllib3\n\nfrom dailycheckin import CheckIn\n\nurllib3.disable_warnings()\n\n\nclass AliYun(CheckIn):\n    name = \"阿里云盘\"\n\n    def __init__(self, check_item: dict):\n        self.check_item = check_item\n\n    def update_token(self, refresh_token):\n        url = \"https://auth.aliyundrive.com/v2/account/token\"\n        data = {\"grant_type\": \"refresh_token\", \"refresh_token\": refresh_token}\n        response = requests.post(url=url, json=data).json()\n        access_token = response.get(\"access_token\")\n        return access_token\n\n    def sign(self, access_token):\n        url = \"https://member.aliyundrive.com/v1/activity/sign_in_list\"\n        headers = {\"Authorization\": access_token, \"Content-Type\": \"application/json\"}\n        result = requests.post(url=url, headers=headers, json={}).json()\n        sign_days = result[\"result\"][\"signInCount\"]\n        data = {\"signInDay\": sign_days}\n        url_reward = \"https://member.aliyundrive.com/v1/activity/sign_in_reward\"\n        requests.post(url=url_reward, headers=headers, data=json.dumps(data))\n        if \"success\" in result:\n            print(\"签到成功\")\n            for i, j in enumerate(result[\"result\"][\"signInLogs\"]):\n                if j[\"status\"] == \"miss\":\n                    day_json = result[\"result\"][\"signInLogs\"][i - 1]\n                    if not day_json[\"isReward\"]:\n                        msg = [\n                            {\n                                \"name\": \"阿里云盘\",\n                                \"value\": \"签到成功，今日未获得奖励\",\n                            }\n                        ]\n                    else:\n                        msg = [\n                            {\n                                \"name\": \"累计签到\",\n                                \"value\": result[\"result\"][\"signInCount\"],\n                            },\n                            {\n                                \"name\": \"阿里云盘\",\n                                \"value\": \"获得奖励：{}{}\".format(\n                                    day_json[\"reward\"][\"name\"],\n                                    day_json[\"reward\"][\"description\"],\n                                ),\n                            },\n                        ]\n\n                    return msg\n\n    def main(self):\n        refresh_token = self.check_item.get(\"refresh_token\")\n        access_token = self.update_token(refresh_token)\n        if not access_token:\n            return [{\"name\": \"阿里云盘\", \"value\": \"token 过期\"}]\n        msg = self.sign(access_token)\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"ALIYUN\", [])[0]\n    print(AliYun(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/aolaxing/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/aolaxing/main.py",
    "content": "import json\nimport os\nimport time\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass AoLaXing(CheckIn):\n    name = \"奥拉星\"\n\n    def __init__(self, check_item: dict):\n        self.check_item = check_item\n\n    def user(self, headers):\n        url = \"http://service.100bt.com/creditmall/my/user_info.jsonp\"\n        user_json = requests.get(url, headers=headers).json()\n        user_data = user_json[\"jsonResult\"][\"data\"]\n        try:\n            credit = user_data[\"credit\"]\n            credit_history = user_data[\"creditHistory\"]\n            phone_num = user_data[\"phoneNum\"]\n            signin_total = user_data[\"signInTotal\"]\n        except Exception as e:\n            return [{\"name\": \"签到\", \"value\": str(e)}]\n        msgs = [\n            {\"name\": \"用户\", \"value\": phone_num},\n            {\"name\": \"当前积分\", \"value\": credit},\n            {\"name\": \"总共获得积分\", \"value\": credit_history},\n            {\"name\": \"总签到\", \"value\": signin_total},\n        ]\n        return msgs\n\n    def practise(self, headers, task_id):\n        url = f\"http://service.100bt.com/creditmall/activity/do_task.jsonp?taskId={task_id}&gameId=2&_=1643440166690\"\n        task_json = requests.get(url, headers=headers).json()\n        try:\n            message = task_json[\"jsonResult\"][\"message\"]\n        except Exception:\n            message = \"NO\"\n        return message\n\n    def task(self, headers, msg: bool = False):\n        url = \"http://service.100bt.com/creditmall/activity/daily_task_list.jsonp?gameId=2&_=1643437206026\"\n        task_json = requests.get(url, headers=headers).json()\n        task_data = task_json[\"jsonResult\"][\"data\"]\n        task_finish_count = 0\n        for task_item in task_data:\n            name = task_item[\"name\"]\n            status_desc = task_item[\"status_desc\"]\n            task_id = task_item[\"taskID\"]\n            if msg:\n                if status_desc == \"已完成\":\n                    task_finish_count += 1\n            elif status_desc == \"未完成\":\n                print(f\"开始任务：{name}\")\n                res = self.practise(task_id=task_id, headers=headers)\n                print(f\"返回状态：{res}\")\n                time.sleep(2.5)\n        msgs = [\n            {\"name\": \"今日任务总数\", \"value\": len(task_data)},\n            {\"name\": \"今日任务完成数\", \"value\": task_finish_count},\n        ]\n        return msgs\n\n    def main(self):\n        cookie = self.check_item.get(\"cookie\")\n        headers = {\n            \"Host\": \"service.100bt.com\",\n            \"Proxy-Connection\": \"keep-alive\",\n            \"Accept\": \"*/*\",\n            \"Referer\": \"http://www.100bt.com/\",\n            \"Accept-Encoding\": \"gzip, deflate\",\n            \"Accept-Language\": \"zh-CN,zh;q=0.9\",\n            \"Cookie\": cookie,\n        }\n        _ = self.task(headers)\n        task_msgs = self.task(headers=headers, msg=True)\n        user_msgs = self.user(headers=headers)\n        msgs = task_msgs + user_msgs\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msgs])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"AOLAXING\", [])[0]\n    print(AoLaXing(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/baidu/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/baidu/main.py",
    "content": "import json\nimport os\nfrom urllib import parse\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass Baidu(CheckIn):\n    name = \"百度站点提交\"\n\n    def __init__(self, check_item: dict):\n        self.check_item = check_item\n\n    @staticmethod\n    def url_submit(data_url: str, submit_url: str, times: int = 100) -> str:\n        site = parse.parse_qs(parse.urlsplit(submit_url).query).get(\"site\")[0]\n        urls_data = requests.get(url=data_url)\n        remain = 100000\n        success_count = 0\n        error_count = 0\n        for one in range(times):\n            try:\n                response = requests.post(url=submit_url, data=urls_data)\n                if response.json().get(\"success\"):\n                    remain = response.json().get(\"remain\")\n                    success_count += response.json().get(\"success\")\n                else:\n                    error_count += 1\n            except Exception as e:\n                print(e)\n                error_count += 1\n        msg = [\n            {\"name\": \"站点地址\", \"value\": site},\n            {\"name\": \"剩余条数\", \"value\": remain},\n            {\"name\": \"成功条数\", \"value\": success_count},\n            {\"name\": \"成功次数\", \"value\": times - error_count},\n            {\"name\": \"失败次数\", \"value\": error_count},\n        ]\n        return msg\n\n    def main(self):\n        data_url = self.check_item.get(\"data_url\")\n        submit_url = self.check_item.get(\"submit_url\")\n        times = int(self.check_item.get(\"times\", 100))\n        if data_url and submit_url:\n            msg = self.url_submit(data_url=data_url, submit_url=submit_url, times=times)\n        else:\n            msg = {\"name\": \"站点配置\", \"value\": \"配置错误\"}\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"BAIDU\", [])[0]\n    print(Baidu(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/baiduwp/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/baiduwp/main.py",
    "content": "import json\nimport os\nimport re\nimport time\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass BaiduWP(CheckIn):\n    name = \"百度网盘\"\n    \"\"\"\n    百度网盘会员成长值签到和答题功能。\n    传入cookie 自动完成签到、答题和会员信息查询。\n    \"\"\"\n\n    def __init__(self, check_item: dict):\n        self.cookie = check_item.get(\"cookie\")\n        self.session = requests.Session()\n        self.headers = {\n            \"User-Agent\": \"Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36\",\n            \"Referer\": \"https://pan.baidu.com/wap/svip/growth/task\",\n            \"Accept\": \"application/json, text/plain, */*\",\n            \"X-Requested-With\": \"XMLHttpRequest\",\n            \"Connection\": \"keep-alive\",\n            \"Accept-Encoding\": \"gzip, deflate\",\n            \"Accept-Language\": \"zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7\",\n            \"Cookie\": self.cookie,\n        }\n\n    def signin(self):\n        url = \"https://pan.baidu.com/rest/2.0/membership/level?app_id=250528&web=5&method=signin\"\n        resp = self.session.get(url, headers=self.headers)\n        sign_point = None\n        signin_error_msg = \"\"\n        if resp.status_code == 200:\n            m = re.search(r'points\":(\\d+)', resp.text)\n            if m:\n                sign_point = m.group(1)\n            m2 = re.search(r'\"error_msg\":\"(.*?)\",', resp.text)\n            if m2:\n                signin_error_msg = m2.group(1)\n        else:\n            signin_error_msg = f\"签到请求失败: {resp.status_code} {self.cookie}\"\n        return sign_point, signin_error_msg\n\n    def get_question(self):\n        url = \"https://pan.baidu.com/act/v2/membergrowv2/getdailyquestion?app_id=250528&web=5\"\n        resp = self.session.get(url, headers=self.headers)\n        answer = None\n        ask_id = None\n        if resp.status_code == 200:\n            m = re.search(r'\"answer\":(\\d+),', resp.text)\n            if m:\n                answer = m.group(1)\n            m2 = re.search(r'\"ask_id\":(\\d+),', resp.text)\n            if m2:\n                ask_id = m2.group(1)\n        return ask_id, answer\n\n    def answer_question(self, ask_id, answer):\n        url = f\"https://pan.baidu.com/act/v2/membergrowv2/answerquestion?app_id=250528&web=5&ask_id={ask_id}&answer={answer}\"\n        resp = self.session.get(url, headers=self.headers)\n        answer_score = None\n        answer_msg = \"\"\n        if resp.status_code == 200:\n            m = re.search(r'\"score\":(\\d+)', resp.text)\n            if m:\n                answer_score = m.group(1)\n            m2 = re.search(r'\"show_msg\":\"(.*?)\"', resp.text)\n            if m2:\n                answer_msg = m2.group(1)\n        return answer_score, answer_msg\n\n    def get_userinfo(self):\n        url = \"https://pan.baidu.com/rest/2.0/membership/user?app_id=250528&web=5&method=query\"\n        resp = self.session.get(url, headers=self.headers)\n        current_value = None\n        current_level = None\n        if resp.status_code == 200:\n            m = re.search(r'current_value\":(\\d+),', resp.text)\n            if m:\n                current_value = m.group(1)\n            m2 = re.search(r'current_level\":(\\d+),', resp.text)\n            if m2:\n                current_level = m2.group(1)\n        return current_level, current_value\n\n    def main(self):\n        sign_point, signin_error_msg = self.signin()\n        time.sleep(3)\n        ask_id, answer = self.get_question()\n        answer_score, answer_msg = (None, \"\")\n        if ask_id and answer:\n            answer_score, answer_msg = self.answer_question(ask_id, answer)\n        current_level, current_value = self.get_userinfo()\n        msg = f\"签到获得{sign_point or ''}{signin_error_msg}\\n答题获得{answer_score or ''}{answer_msg}\\n当前会员等级{current_level or ''}，成长值{current_value or ''}\"\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"BAIDUWP\", [])[0]\n    print(BaiduWP(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/bilibili/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/bilibili/main.py",
    "content": "import json\nimport os\nimport time\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass BiliBili(CheckIn):\n    name = \"Bilibili\"\n\n    def __init__(self, check_item: dict):\n        self.check_item = check_item\n\n    @staticmethod\n    def get_nav(session):\n        url = \"https://api.bilibili.com/x/web-interface/nav\"\n        ret = session.get(url=url).json()\n        uname = ret.get(\"data\", {}).get(\"uname\")\n        uid = ret.get(\"data\", {}).get(\"mid\")\n        is_login = ret.get(\"data\", {}).get(\"isLogin\")\n        coin = ret.get(\"data\", {}).get(\"money\")\n        vip_type = ret.get(\"data\", {}).get(\"vipType\")\n        current_exp = ret.get(\"data\", {}).get(\"level_info\", {}).get(\"current_exp\")\n        return uname, uid, is_login, coin, vip_type, current_exp\n\n    @staticmethod\n    def get_today_exp(session: requests.Session) -> list:\n        \"\"\"GET 获取今日经验信息\n        :param requests.Session session:\n        :return list: 今日经验信息列表\n        \"\"\"\n        url = \"https://api.bilibili.com/x/member/web/exp/log?jsonp=jsonp\"\n        today = time.strftime(\"%Y-%m-%d\", time.localtime())\n        return list(\n            filter(\n                lambda x: x[\"time\"].split()[0] == today,\n                session.get(url=url).json().get(\"data\").get(\"list\"),\n            )\n        )\n\n    @staticmethod\n    def vip_privilege_my(session) -> dict:\n        \"\"\"取B站大会员硬币经验信息\"\"\"\n        url = \"https://api.bilibili.com/x/vip/privilege/my\"\n        ret = session.get(url=url).json()\n        return ret\n\n    @staticmethod\n    def reward(session) -> dict:\n        \"\"\"取B站经验信息\"\"\"\n        url = \"https://api.bilibili.com/x/member/web/exp/log?jsonp=jsonp\"\n        today = time.strftime(\"%Y-%m-%d\", time.localtime())\n        return list(\n            filter(\n                lambda x: x[\"time\"].split()[0] == today,\n                session.get(url=url).json().get(\"data\").get(\"list\"),\n            )\n        )\n\n    @staticmethod\n    def live_sign(session) -> dict:\n        \"\"\"B站直播签到\"\"\"\n        try:\n            url = \"https://api.live.bilibili.com/xlive/web-ucenter/v1/sign/DoSign\"\n            ret = session.get(url=url).json()\n            if ret[\"code\"] == 0:\n                msg = f\"签到成功，{ret['data']['text']}，特别信息:{ret['data']['specialText']}，本月已签到{ret['data']['hadSignDays']}天\"\n            elif ret[\"code\"] == 1011040:\n                msg = \"今日已签到过,无法重复签到\"\n            else:\n                msg = f\"签到失败，信息为: {ret['message']}\"\n        except Exception as e:\n            msg = f\"签到异常，原因为{e!s}\"\n            print(msg)\n        return msg\n\n    @staticmethod\n    def manga_sign(session, platform=\"android\") -> dict:\n        \"\"\"\n        模拟B站漫画客户端签到\n        \"\"\"\n        try:\n            url = \"https://manga.bilibili.com/twirp/activity.v1.Activity/ClockIn\"\n            post_data = {\"platform\": platform}\n            ret = session.post(url=url, data=post_data).json()\n            if ret[\"code\"] == 0:\n                msg = \"签到成功\"\n            elif ret[\"msg\"] == \"clockin clockin is duplicate\":\n                msg = \"今天已经签到过了\"\n            else:\n                msg = f\"签到失败，信息为({ret['msg']})\"\n                print(msg)\n        except Exception as e:\n            msg = f\"签到异常,原因为: {e!s}\"\n            print(msg)\n        return msg\n\n    @staticmethod\n    def vip_privilege_receive(session, bili_jct, receive_type: int = 1) -> dict:\n        \"\"\"\n        领取B站大会员权益\n        receive_type int 权益类型 1为B币劵 2为优惠券\n        \"\"\"\n        url = \"https://api.bilibili.com/x/vip/privilege/receive\"\n        post_data = {\"type\": receive_type, \"csrf\": bili_jct}\n        ret = session.post(url=url, data=post_data).json()\n        return ret\n\n    @staticmethod\n    def vip_manga_reward(session) -> dict:\n        \"\"\"获取漫画大会员福利\"\"\"\n        url = \"https://manga.bilibili.com/twirp/user.v1.User/GetVipReward\"\n        ret = session.post(url=url, json={\"reason_id\": 1}).json()\n        return ret\n\n    @staticmethod\n    def report_task(session, bili_jct, aid: int, cid: int, progres: int = 300) -> dict:\n        \"\"\"\n        B站上报视频观看进度\n        aid int 视频av号\n        cid int 视频cid号\n        progres int 观看秒数\n        \"\"\"\n        url = \"http://api.bilibili.com/x/v2/history/report\"\n        post_data = {\"aid\": aid, \"cid\": cid, \"progres\": progres, \"csrf\": bili_jct}\n        ret = session.post(url=url, data=post_data).json()\n        return ret\n\n    @staticmethod\n    def share_task(session, bili_jct, aid) -> dict:\n        \"\"\"\n        分享指定av号视频\n        aid int 视频av号\n        \"\"\"\n        url = \"https://api.bilibili.com/x/web-interface/share/add\"\n        post_data = {\"aid\": aid, \"csrf\": bili_jct}\n        ret = session.post(url=url, data=post_data).json()\n        return ret\n\n    @staticmethod\n    def get_followings(\n        session,\n        uid: int,\n        pn: int = 1,\n        ps: int = 50,\n        order: str = \"desc\",\n        order_type: str = \"attention\",\n    ) -> dict:\n        \"\"\"\n        获取指定用户关注的up主\n        uid int 账户uid 默认为本账户 非登录账户只能获取20个*5页\n        pn int 页码 默认第一页\n        ps int 每页数量 默认50\n        order str 排序方式 默认desc\n        order_type 排序类型 默认attention\n        \"\"\"\n        params = {\n            \"vmid\": uid,\n            \"pn\": pn,\n            \"ps\": ps,\n            \"order\": order,\n            \"order_type\": order_type,\n        }\n        url = \"https://api.bilibili.com/x/relation/followings\"\n        ret = session.get(url=url, params=params).json()\n        return ret\n\n    @staticmethod\n    def space_arc_search(\n        session,\n        uid: int,\n        pn: int = 1,\n        ps: int = 30,\n        tid: int = 0,\n        order: str = \"pubdate\",\n        keyword: str = \"\",\n    ) -> dict:\n        \"\"\"\n        获取指定up主空间视频投稿信息\n        uid int 账户uid 默认为本账户\n        pn int 页码 默认第一页\n        ps int 每页数量 默认50\n        tid int 分区 默认为0(所有分区)\n        order str 排序方式 默认pubdate\n        keyword str 关键字 默认为空\n        \"\"\"\n        params = {\n            \"mid\": uid,\n            \"pn\": pn,\n            \"Ps\": ps,\n            \"tid\": tid,\n            \"order\": order,\n            \"keyword\": keyword,\n        }\n        url = \"https://api.bilibili.com/x/space/arc/search\"\n        ret = session.get(url=url, params=params).json()\n        count = 2\n        data_list = [\n            {\n                \"aid\": one.get(\"aid\"),\n                \"cid\": 0,\n                \"title\": one.get(\"title\"),\n                \"owner\": one.get(\"author\"),\n            }\n            for one in ret.get(\"data\", {}).get(\"list\", {}).get(\"vlist\", [])[:count]\n        ]\n        return data_list, count\n\n    @staticmethod\n    def elec_pay(session, bili_jct, uid: int, num: int = 50) -> dict:\n        \"\"\"\n        用B币给up主充电\n        uid int up主uid\n        num int 充电电池数量\n        \"\"\"\n        url = \"https://api.bilibili.com/x/ugcpay/trade/elec/pay/quick\"\n        post_data = {\n            \"elec_num\": num,\n            \"up_mid\": uid,\n            \"otype\": \"up\",\n            \"oid\": uid,\n            \"csrf\": bili_jct,\n        }\n        ret = session.post(url=url, data=post_data).json()\n        return ret\n\n    @staticmethod\n    def coin_add(session, bili_jct, aid: int, num: int = 1, select_like: int = 1) -> dict:\n        \"\"\"\n        给指定 av 号视频投币\n        aid int 视频av号\n        num int 投币数量\n        select_like int 是否点赞\n        \"\"\"\n        url = \"https://api.bilibili.com/x/web-interface/coin/add\"\n        post_data = {\n            \"aid\": aid,\n            \"multiply\": num,\n            \"select_like\": select_like,\n            \"cross_domain\": \"true\",\n            \"csrf\": bili_jct,\n        }\n        ret = session.post(url=url, data=post_data).json()\n\n        return ret\n\n    @staticmethod\n    def live_status(session) -> dict:\n        \"\"\"B站直播获取金银瓜子状态\"\"\"\n        url = \"https://api.live.bilibili.com/pay/v1/Exchange/getStatus\"\n        ret = session.get(url=url).json()\n        data = ret.get(\"data\")\n        silver = data.get(\"silver\", 0)\n        gold = data.get(\"gold\", 0)\n        coin = data.get(\"coin\", 0)\n        msg = [\n            {\"name\": \"硬币数量\", \"value\": coin},\n            {\"name\": \"金瓜子数\", \"value\": gold},\n            {\"name\": \"银瓜子数\", \"value\": silver},\n        ]\n        return msg\n\n    @staticmethod\n    def get_region(session, rid=1, num=6) -> dict:\n        \"\"\"\n        获取 B站分区视频信息\n        rid int 分区号\n        num int 获取视频数量\n        \"\"\"\n        url = \"https://api.bilibili.com/x/web-interface/dynamic/region?ps=\" + str(num) + \"&rid=\" + str(rid)\n        ret = session.get(url=url).json()\n        data_list = [\n            {\n                \"aid\": one.get(\"aid\"),\n                \"cid\": one.get(\"cid\"),\n                \"title\": one.get(\"title\"),\n                \"owner\": one.get(\"owner\", {}).get(\"name\"),\n            }\n            for one in ret.get(\"data\", {}).get(\"archives\", [])\n        ]\n        return data_list\n\n    @staticmethod\n    def silver2coin(session, bili_jct) -> dict:\n        \"\"\"B站银瓜子换硬币\"\"\"\n        url = \"https://api.live.bilibili.com/xlive/revenue/v1/wallet/silver2coin\"\n        post_data = {\"csrf\": bili_jct}\n        ret = session.post(url=url, data=post_data).json()\n        return ret\n\n    def main(self):\n        bilibili_cookie = {item.split(\"=\")[0]: item.split(\"=\")[1] for item in self.check_item.get(\"cookie\").split(\"; \")}\n        bili_jct = bilibili_cookie.get(\"bili_jct\")\n        coin_num = self.check_item.get(\"coin_num\", 0)\n        coin_type = self.check_item.get(\"coin_type\", 1)\n        silver2coin = self.check_item.get(\"silver2coin\", False)\n        session = requests.session()\n        requests.utils.add_dict_to_cookiejar(session.cookies, bilibili_cookie)\n        session.headers.update(\n            {\n                \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64\",\n                \"Referer\": \"https://www.bilibili.com/\",\n                \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6\",\n                \"Connection\": \"keep-alive\",\n            }\n        )\n        success_count = 0\n        uname, uid, is_login, coin, vip_type, current_exp = self.get_nav(session=session)\n        if is_login:\n            manhua_msg = self.manga_sign(session=session)\n            live_msg = self.live_sign(session=session)\n            aid_list = self.get_region(session=session)\n            vip_privilege_my_ret = self.vip_privilege_my(session=session)\n            welfare_list = vip_privilege_my_ret.get(\"data\", {}).get(\"list\", [])\n            for welfare in welfare_list:\n                if welfare.get(\"state\") == 0 and welfare.get(\"vip_type\") == vip_type:\n                    vip_privilege_receive_ret = self.vip_privilege_receive(\n                        session=session,\n                        bili_jct=bili_jct,\n                        receive_type=welfare.get(\"type\"),\n                    )\n                    print(vip_privilege_receive_ret)\n            coins_av_count = len(\n                list(\n                    filter(\n                        lambda x: x[\"reason\"] == \"视频投币奖励\",\n                        self.get_today_exp(session=session),\n                    )\n                )\n            )\n            coin_num = coin_num - coins_av_count\n            coin_num = coin_num if coin_num < coin else coin\n            if coin_type == 1:\n                following_list = self.get_followings(session=session, uid=uid)\n                count = 0\n                for following in following_list.get(\"data\", {}).get(\"list\"):\n                    mid = following.get(\"mid\")\n                    if mid:\n                        tmplist, tmpcount = self.space_arc_search(session=session, uid=mid)\n                        aid_list += tmplist\n                        count += tmpcount\n                        if count > coin_num:\n                            print(\"已获取足够关注用户的视频\")\n                            break\n                else:\n                    aid_list += self.get_region(session=session)\n                for one in aid_list[::-1]:\n                    print(one)\n            if coin_num > 0:\n                for aid in aid_list[::-1]:\n                    ret = self.coin_add(session=session, aid=aid.get(\"aid\"), bili_jct=bili_jct)\n                    if ret[\"code\"] == 0:\n                        coin_num -= 1\n                        print(f\"成功给{aid.get('title')}投一个币\")\n                        success_count += 1\n                    elif ret[\"code\"] == 34005:\n                        print(f\"投币{aid.get('title')}失败，原因为{ret['message']}\")\n                        continue\n                        # -104 硬币不够了 -111 csrf 失败 34005 投币达到上限\n                    else:\n                        print(f\"投币{aid.get('title')}失败，原因为{ret['message']}，跳过投币\")\n                        break\n                    if coin_num <= 0:\n                        break\n                coin_msg = f\"今日成功投币{success_count + coins_av_count}/{self.check_item.get('coin_num', 5)}个\"\n            else:\n                coin_msg = f\"今日成功投币{coins_av_count}/{self.check_item.get('coin_num', 5)}个\"\n            aid = aid_list[0].get(\"aid\")\n            cid = aid_list[0].get(\"cid\")\n            title = aid_list[0].get(\"title\")\n            report_ret = self.report_task(session=session, bili_jct=bili_jct, aid=aid, cid=cid)\n            if report_ret.get(\"code\") == 0:\n                report_msg = f\"观看《{title}》300秒\"\n            else:\n                report_msg = \"任务失败\"\n            share_ret = self.share_task(session=session, bili_jct=bili_jct, aid=aid)\n            if share_ret.get(\"code\") == 0:\n                share_msg = f\"分享《{title}》成功\"\n            else:\n                share_msg = \"分享失败\"\n                print(share_msg)\n            s2c_msg = \"不兑换硬币\"\n            if silver2coin:\n                silver2coin_ret = self.silver2coin(session=session, bili_jct=bili_jct)\n                s2c_msg = silver2coin_ret[\"message\"]\n                if silver2coin_ret[\"code\"] != 0:\n                    print(s2c_msg)\n                else:\n                    s2c_msg = \"\"\n            live_stats = self.live_status(session=session)\n            uname, uid, is_login, new_coin, vip_type, new_current_exp = self.get_nav(session=session)\n            today_exp = sum(map(lambda x: x[\"delta\"], self.get_today_exp(session=session)))\n            update_data = (28800 - new_current_exp) // (today_exp if today_exp else 1)\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": uname},\n                {\"name\": \"漫画签到\", \"value\": manhua_msg},\n                {\"name\": \"直播签到\", \"value\": live_msg},\n                {\"name\": \"登陆任务\", \"value\": \"今日已登陆\"},\n                {\"name\": \"观看视频\", \"value\": report_msg},\n                {\"name\": \"分享任务\", \"value\": share_msg},\n                {\"name\": \"瓜子兑换\", \"value\": s2c_msg},\n                {\"name\": \"投币任务\", \"value\": coin_msg},\n                {\"name\": \"今日经验\", \"value\": today_exp},\n                {\"name\": \"当前经验\", \"value\": new_current_exp},\n                {\"name\": \"升级还需\", \"value\": f\"{update_data}天\"},\n                *live_stats,\n            ]\n            msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n            return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"BILIBILI\", [])[0]\n    print(BiliBili(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/configs.py",
    "content": "import json\nimport os\n\nfrom dailycheckin import CheckIn\n\n\ndef checkin_map():\n    result = {}\n    for cls in CheckIn.__subclasses__():\n        check_name = cls.__name__.upper()\n        if check_name:\n            result[check_name] = (cls.name, cls)\n    return result\n\n\ncheckin_map = checkin_map()\n\nnotice_map = {\n    \"BARK_URL\": \"\",\n    \"COOLPUSHEMAIL\": \"\",\n    \"COOLPUSHQQ\": \"\",\n    \"COOLPUSHSKEY\": \"\",\n    \"COOLPUSHWX\": \"\",\n    \"DINGTALK_ACCESS_TOKEN\": \"\",\n    \"DINGTALK_SECRET\": \"\",\n    \"FSKEY\": \"\",\n    \"PUSHPLUS_TOKEN\": \"\",\n    \"PUSHPLUS_TOPIC\": \"\",\n    \"QMSG_KEY\": \"\",\n    \"QMSG_TYPE\": \"\",\n    \"QYWX_AGENTID\": \"\",\n    \"QYWX_CORPID\": \"\",\n    \"QYWX_CORPSECRET\": \"\",\n    \"QYWX_KEY\": \"\",\n    \"QYWX_TOUSER\": \"\",\n    \"QYWX_MEDIA_ID\": \"\",\n    \"QYWX_ORIGIN\": \"\",\n    \"SCKEY\": \"\",\n    \"SENDKEY\": \"\",\n    \"TG_API_HOST\": \"\",\n    \"TG_BOT_TOKEN\": \"\",\n    \"TG_PROXY\": \"\",\n    \"TG_USER_ID\": \"\",\n    \"MERGE_PUSH\": \"\",\n    \"GOTIFY_URL\": \"\",\n    \"GOTIFY_TOKEN\": \"\",\n    \"GOTIFY_PRIORITY\": \"\",\n    \"NTFY_URL\": \"\",\n    \"NTFY_TOPIC\": \"\",\n    \"NTFY_PRIORITY\": \"\",\n}\n\n\ndef env2list(key):\n    try:\n        value = json.loads(os.getenv(key, []).strip()) if os.getenv(key) else []\n        if not isinstance(value, list):\n            value = []\n    except Exception as e:\n        print(e)\n        value = []\n    return value\n\n\ndef env2str(key):\n    try:\n        value = os.getenv(key, \"\") if os.getenv(key) else \"\"\n        if isinstance(value, str):\n            value = value.strip()\n        elif isinstance(value, bool):\n            pass\n        else:\n            value = None\n    except Exception as e:\n        print(e)\n        value = None\n    return value\n\n\ndef get_checkin_info(data):\n    result = {}\n    if isinstance(data, dict):\n        for one in checkin_map.keys():\n            result[one.lower()] = data.get(one, [])\n    else:\n        for one in checkin_map.keys():\n            result[one.lower()] = env2list(one)\n    return result\n\n\ndef get_notice_info(data):\n    result = {}\n    if isinstance(data, dict):\n        for one in notice_map.keys():\n            result[one.lower()] = data.get(one, None)\n    else:\n        for one in notice_map.keys():\n            result[one.lower()] = env2str(one)\n    return result\n"
  },
  {
    "path": "dailycheckin/enshan/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/enshan/main.py",
    "content": "import json\nimport os\nimport re\n\nimport requests\nimport urllib3\n\nfrom dailycheckin import CheckIn\n\nurllib3.disable_warnings()\n\n\nclass EnShan(CheckIn):\n    name = \"恩山无线论坛\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n\n    @staticmethod\n    def get_formhash_from_page(session):\n        \"\"\"GET 签到页面并提取 formhash Discuz 常见的 CSRF 字段\"\"\"\n        response = session.get(\"https://www.right.com.cn/forum/forum.php\", timeout=15)\n        response.raise_for_status()\n        html = response.text\n        # 常见两种位置：隐藏 input name=\"formhash\" value=\"...\" 或 js var formhash = '...'\n        m = re.search(r'name=[\"\\']formhash[\"\\']\\s+value=[\"\\']([0-9a-fA-F]+)[\"\\']', html)\n        if not m:\n            m = re.search(r\"formhash\\s*[:=]\\s*['\\\"]([0-9a-fA-F]+)['\\\"]\", html)\n        if not m:\n            # 有时 formhash 包含非十六进制字符，放宽匹配\n            m = re.search(r'name=[\"\\']formhash[\"\\']\\s+value=[\"\\']([^\"\\']+)[\"\\']', html)\n\n        if not m:\n            raise RuntimeError(\"无法在页面中找到 formhash，请检查页面或手动查看 HTML\")\n        return m.group(1)\n\n    @staticmethod\n    def sign(session, form_hash):\n        msg = []\n        payload = {\"formhash\": form_hash}\n        response = session.post(\n            \"https://www.right.com.cn/forum/plugin.php?id=erling_qd:action&action=sign\", data=payload, timeout=15\n        )\n        try:\n            data = response.json()\n            if data.get(\"success\"):\n                continuous_days = data.get(\"continuous_days\")\n                msg = [\n                    {\n                        \"name\": \"签到结果\",\n                        \"value\": data.get(\"message\", \"签到成功\"),\n                    },\n                    {\n                        \"name\": \"连续签到\",\n                        \"value\": f\"已连续签到{continuous_days}天\",\n                    },\n                ]\n            else:\n                msg = [\n                    {\n                        \"name\": \"签到结果\",\n                        \"value\": data.get(\"message\", \"签到失败\"),\n                    },\n                ]\n        except ValueError:\n            msg = [\n                {\n                    \"name\": \"签到结果\",\n                    \"value\": f\"签到异常：{response.status_code}\",\n                }\n            ]\n            # print(f'status_code: {response.status_code}, text: {response.text[:2000]}')\n        return msg\n\n    @staticmethod\n    def get_info(session):\n        msg = []\n        response = session.get(\"https://www.right.com.cn/FORUM/home.php?mod=spacecp&ac=credit&showcredit=1\", timeout=15)\n        response.raise_for_status()\n        html = response.text\n        try:\n            coin = re.findall(\"恩山币: </em>(.*?)&nbsp;\", html)[0]\n            point = re.findall(\"<em>积分: </em>(.*?)<span\", html)[0]\n            msg = [\n                {\n                    \"name\": \"恩山币\",\n                    \"value\": coin,\n                },\n                {\n                    \"name\": \"积分\",\n                    \"value\": point,\n                },\n            ]\n        except Exception as e:\n            msg = [\n                {\n                    \"name\": \"获取代币失败\",\n                    \"value\": str(e),\n                }\n            ]\n        return msg\n\n    def main(self):\n        cookie = self.check_item.get(\"cookie\")\n        session = requests.Session()\n        session.headers.update(\n            {\n                \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36\",\n                \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n                \"Referer\": \"https://www.right.com.cn/forum/\",\n                \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n                \"Cookie\": cookie,\n            }\n        )\n        form_hash = self.get_formhash_from_page(session=session)\n        msg = self.sign(session=session, form_hash=form_hash)\n        msg += self.get_info(session=session)\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"ENSHAN\", [])[0]\n    print(EnShan(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/fnnasclub/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/fnnasclub/main.py",
    "content": "import json\nimport os\nimport re\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass FnNasClub(CheckIn):\n    name = \"飞牛Nas论坛\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n\n    @staticmethod\n    def get_sign_param_from_page(session):\n        \"\"\"GET 签到页面并提取 sign\"\"\"\n        response = session.get(\"https://club.fnnas.com/plugin.php?id=zqlj_sign\", timeout=15)\n        response.raise_for_status()\n        try:\n            html = response.text\n            # 匹配签到按钮，抓取sign参数\n            r_sign_btn = re.compile(r'<a href=\"plugin.php\\?id=zqlj_sign&sign=([0-9a-fA-F]+)\" class=\"btna\">点击打卡</a>')\n            r_signed_btn = re.compile(\n                r'<a href=\"plugin.php\\?id=zqlj_sign&sign=([0-9a-fA-F]+)\" class=\"btna\">今日已打卡</a>'\n            )\n            match = r_sign_btn.search(html)\n            match_signed = r_signed_btn.search(html)\n            sign_param = \"\"\n            if match:\n                # 匹配成功，取出sign参数\n                sign_param = match.group(1)\n            elif match_signed:\n                # 匹配成功，取出sign参数\n                sign_param = match_signed.group(1)\n\n            return sign_param\n        except Exception as e:\n            print(f\"status_code: {response.status_code}, text: {response.text[:2000]}, exception: {e}\")\n        return None\n\n    @staticmethod\n    def sign(session, sign_param):\n        if not sign_param:\n            msg = [\n                {\n                    \"name\": \"签到结果\",\n                    \"value\": \"签到失败，未能成功获取sign参数\",\n                }\n            ]\n            return msg\n        response = session.get(f\"https://club.fnnas.com/plugin.php?id=zqlj_sign&sign={sign_param}\", timeout=15)\n        try:\n            html = response.text\n            # 匹配到 恭喜您，打卡成功！ 证明打卡成功\n            if re.search(r\"恭喜您，打卡成功！\", html):\n                msg = [\n                    {\n                        \"name\": \"签到结果\",\n                        \"value\": \"签到成功\",\n                    }\n                ]\n            elif re.search(r\"您今天已经打过卡了，请勿重复操作！\", html):\n                msg = [\n                    {\n                        \"name\": \"签到结果\",\n                        \"value\": \"您已签到，请勿重复签到\",\n                    }\n                ]\n            else:\n                msg = [\n                    {\n                        \"name\": \"签到结果\",\n                        \"value\": \"未知签到异常\",\n                    }\n                ]\n        except Exception as e:\n            msg = [\n                {\n                    \"name\": \"签到结果\",\n                    \"value\": f\"签到异常，Exception: {e}, Status Code: {response.status_code}\",\n                }\n            ]\n            # print(f'status_code: {response.status_code}, text: {response.text[:2000]}')\n        return msg\n\n    @staticmethod\n    def get_info(session):\n        msg = []\n        response = session.get(\"https://club.fnnas.com/plugin.php?id=zqlj_sign\", timeout=15)\n        response.raise_for_status()\n\n        try:\n            html = response.text\n            # 1. 匹配“我的打卡动态”这一整块 HTML\n            pattern = re.compile(\n                r\"<strong>\\s*我的打卡动态\\s*</strong>\"  # strong 标题\n                r\".*?\"  # 任意内容（非贪婪）\n                r'<div[^>]*class=\"bm_c\"[^>]*>.*?</div>',  # div.bm_c 完整区块\n                re.S,\n            )\n\n            m = pattern.search(html)\n            if not m:\n                raise RuntimeError(\"没匹配到 “我的打卡动态” 这一段 HTML\")\n\n            block_html = m.group(0)\n\n            # 2. 保证每个 <li> 独立一行\n            block_html = re.sub(r\"</li\\s*>\", \"</li>\\n\", block_html)\n\n            # 3. 去掉所有 HTML 标签\n            text = re.sub(r\"<[^>]+>\", \"\", block_html)\n\n            # 4. 这里直接把“我的打卡动态”整个从文本里删除\n            text = text.replace(\"我的打卡动态\", \"\")\n\n            # 5. 按行切分并清理空白\n            lines = [line.strip() for line in text.splitlines() if line.strip()]\n\n            # 6. 分割冒号并生成 msg 列表\n            for line in lines:\n                # 兼容全角“：”和半角“:”\n                if \"：\" in line:\n                    sep = \"：\"\n                elif \":\" in line:\n                    sep = \":\"\n                else:\n                    continue\n\n                name, value = line.split(sep, 1)\n                msg.append(\n                    {\n                        \"name\": name.strip(),\n                        \"value\": value.strip(),\n                    }\n                )\n\n        except Exception as e:\n            msg = [\n                {\n                    \"name\": \"获取打卡动态失败\",\n                    \"value\": str(e),\n                }\n            ]\n        return msg\n\n    def main(self):\n        cookie = self.check_item.get(\"cookie\")\n        session = requests.Session()\n        session.headers.update(\n            {\n                \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\",\n                \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7\",\n                \"Referer\": \"https://club.fnnas.com/portal.php\",\n                \"Content-Type\": \"text/html; charset=utf-8\",\n                \"Cookie\": cookie,\n            }\n        )\n        sign_param = self.get_sign_param_from_page(session=session)\n        msg = self.sign(session=session, sign_param=sign_param)\n        msg += self.get_info(session=session)\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"FNNASCLUB\", [])[0]\n    print(FnNasClub(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/imaotai/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/imaotai/main.py",
    "content": "import base64\nimport datetime\nimport json\nimport math\nimport os\nimport random\nimport time\n\nimport requests\nfrom Crypto.Cipher import AES\n\nfrom dailycheckin import CheckIn\n\n\nclass Encrypt:\n    def __init__(self, key, iv):\n        self.key = key.encode(\"utf-8\")\n        self.iv = iv.encode(\"utf-8\")\n\n    def pkcs7padding(self, text):\n        \"\"\"明文使用PKCS7填充\"\"\"\n        bs = 16\n        length = len(text)\n        bytes_length = len(text.encode(\"utf-8\"))\n        padding_size = length if (bytes_length == length) else bytes_length\n        padding = bs - padding_size % bs\n        padding_text = chr(padding) * padding\n        self.coding = chr(padding)\n        return text + padding_text\n\n    def aes_encrypt(self, content):\n        \"\"\"AES加密\"\"\"\n        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)\n        content_padding = self.pkcs7padding(content)\n        encrypt_bytes = cipher.encrypt(content_padding.encode(\"utf-8\"))\n        result = str(base64.b64encode(encrypt_bytes), encoding=\"utf-8\")\n        return result\n\n    def aes_decrypt(self, content):\n        \"\"\"AES解密\"\"\"\n        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)\n        content = base64.b64decode(content)\n        text = cipher.decrypt(content).decode(\"utf-8\")\n        return text.rstrip(self.coding)\n\n\nclass IMAOTAI(CheckIn):\n    name = \"i茅台\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n        self.RESERVE_RULE = 0\n        self.mt_r = \"clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/\"\n        self.ITEM_MAP = {\n            \"11318\": \"53%vol 500ml贵州茅台酒（乙巳蛇年）\",\n            \"11317\": \"53%vol 500ml贵州茅台酒（笙乐飞天）\",\n            \"11319\": \"53%vol 375mlx2贵州茅台酒（乙巳蛇年）\",\n            \"2478\": \"53%vol 500ml贵州茅台酒（珍品）\",\n            \"11240\": \"53%vol 500ml 茅台1935·中国国家地理文创酒（喜逢大运河）\",\n        }\n        self.ITEM_CODES = [\"11318\", \"11319\"]\n        aes_key = \"qbhajinldepmucsonaaaccgypwuvcjaa\"\n        aes_iv = \"2018534749963515\"\n        self.encrypt = Encrypt(key=aes_key, iv=aes_iv)\n\n        self.mt_version = json.loads(requests.get(\"https://itunes.apple.com/cn/lookup?id=1600482450\").text)[\"results\"][\n            0\n        ][\"version\"]\n        self.headers = {}\n        self.header_context = \"\"\"\nMT-Lat: 28.499562\nMT-K: 1675213490331\nMT-Lng: 102.182324\nHost: app.moutai519.com.cn\nMT-User-Tag: 0\nAccept: */*\nMT-Network-Type: WIFI\nMT-Token: 1\nMT-Info: 028e7f96f6369cafe1d105579c5b9377\nMT-Device-ID: 2F2075D0-B66C-4287-A903-DBFF6358342A\nMT-Bundle-ID: com.moutai.mall\nAccept-Language: en-CN;q=1, zh-Hans-CN;q=0.9\nMT-Request-ID: 167560018873318465\nMT-APP-Version: 1.3.7\nUser-Agent: iOS;16.3;Apple;?unrecognized?\nMT-R: clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/HGhHdw==\nContent-Length: 93\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\nContent-Type: application/json\nuserId: 2\n\"\"\"\n\n    def init_headers(\n        self,\n        user_id: str = \"1\",\n        token: str = \"2\",\n        lat: str = \"29.83826\",\n        lng: str = \"119.74375\",\n    ):\n        for k in self.header_context.strip().split(\"\\n\"):\n            temp_l = k.split(\": \")\n            dict.update(self.headers, {temp_l[0]: temp_l[1]})\n        dict.update(self.headers, {\"userId\": user_id})\n        dict.update(self.headers, {\"MT-Token\": token})\n        dict.update(self.headers, {\"MT-Lat\": lat})\n        dict.update(self.headers, {\"MT-Lng\": lng})\n        dict.update(self.headers, {\"MT-APP-Version\": self.mt_version})\n\n    def get_current_session_id(self):\n        day_time = int(time.mktime(datetime.date.today().timetuple())) * 1000\n        my_url = f\"https://static.moutai519.com.cn/mt-backend/xhr/front/mall/index/session/get/{day_time}\"\n        responses = requests.get(my_url)\n        if responses.status_code != 200:\n            print(\n                f\"get_current_session_id : params : {day_time}, response code : {responses.status_code}, response body : {responses.text}\"\n            )\n        current_session_id = responses.json()[\"data\"][\"sessionId\"]\n        dict.update(self.headers, {\"current_session_id\": str(current_session_id)})\n\n    def get_map(self, lat: str = \"28.499562\", lng: str = \"102.182324\"):\n        p_c_map = {}\n        url = \"https://static.moutai519.com.cn/mt-backend/xhr/front/mall/resource/get\"\n        headers = {\n            \"X-Requested-With\": \"XMLHttpRequest\",\n            \"User-Agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0_1 like Mac OS X)\",\n            \"Referer\": \"https://h5.moutai519.com.cn/gux/game/main?appConfig=2_1_2\",\n            \"Client-User-Agent\": \"iOS;16.0.1;Apple;iPhone 14 ProMax\",\n            \"MT-R\": \"clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/HGhHdw==\",\n            \"Origin\": \"https://h5.moutai519.com.cn\",\n            \"MT-APP-Version\": self.mt_version,\n            \"MT-Request-ID\": f\"{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}\",\n            \"Accept-Language\": \"zh-CN,zh-Hans;q=1\",\n            \"MT-Device-ID\": f\"{int(time.time() * 1000)}{random.randint(1111111, 999999999)}{int(time.time() * 1000)}\",\n            \"Accept\": \"application/json, text/javascript, */*; q=0.01\",\n            \"mt-lng\": f\"{lng}\",\n            \"mt-lat\": f\"{lat}\",\n        }\n        res = requests.get(url, headers=headers)\n        mtshops = res.json().get(\"data\", {}).get(\"mtshops_pc\", {})\n        urls = mtshops.get(\"url\")\n        r = requests.get(urls)\n        for k, v in dict(r.json()).items():\n            province_name = v.get(\"provinceName\")\n            city_name = v.get(\"cityName\")\n            if not p_c_map.get(province_name):\n                p_c_map[province_name] = {}\n            if not p_c_map[province_name].get(city_name, None):\n                p_c_map[province_name][city_name] = [k]\n            else:\n                p_c_map[province_name][city_name].append(k)\n\n        return p_c_map, dict(r.json())\n\n    def max_shop(self, city, item_code, p_c_map, province, shops):\n        max_count = 0\n        max_shop_id = \"0\"\n        shop_ids = p_c_map[province][city]\n        for shop in shops:\n            shop_id = shop[\"shopId\"]\n            items = shop[\"items\"]\n\n            if shop_id not in shop_ids:\n                continue\n            for item in items:\n                if item[\"itemId\"] != str(item_code):\n                    continue\n                if item[\"inventory\"] > max_count:\n                    max_count = item[\"inventory\"]\n                    max_shop_id = shop_id\n        print(f\"item code {item_code}, max shop id : {max_shop_id}, max count : {max_count}\")\n        return max_shop_id\n\n    def distance_shop(\n        self,\n        item_code,\n        shops,\n        source_data,\n        lat: str = \"28.499562\",\n        lng: str = \"102.182324\",\n    ):\n        temp_list = []\n        for shop in shops:\n            shop_id = shop[\"shopId\"]\n            items = shop[\"items\"]\n            item_ids = [i[\"itemId\"] for i in items]\n            if str(item_code) not in item_ids:\n                continue\n            shop_info = source_data.get(shop_id)\n            d = math.sqrt((float(lat) - shop_info[\"lat\"]) ** 2 + (float(lng) - shop_info[\"lng\"]) ** 2)\n            temp_list.append((d, shop_id))\n\n        temp_list = sorted(temp_list, key=lambda x: x[0])\n        if len(temp_list) > 0:\n            return temp_list[0][1]\n        else:\n            return \"0\"\n\n    def get_location_count(\n        self,\n        province: str,\n        city: str,\n        item_code: str,\n        p_c_map: dict,\n        source_data: dict,\n        lat: str = \"29.83826\",\n        lng: str = \"102.182324\",\n        reserve_rule: int = 0,\n    ):\n        day_time = int(time.mktime(datetime.date.today().timetuple())) * 1000\n        session_id = self.headers[\"current_session_id\"]\n        responses = requests.get(\n            f\"https://static.moutai519.com.cn/mt-backend/xhr/front/mall/shop/list/slim/v3/{session_id}/{province}/{item_code}/{day_time}\"\n        )\n        if responses.status_code != 200:\n            print(\n                f\"get_location_count : params : {day_time}, response code : {responses.status_code}, response body : {responses.text}\"\n            )\n        shops = responses.json()[\"data\"][\"shops\"]\n\n        if reserve_rule == 0:\n            return self.distance_shop(item_code, shops, source_data, lat, lng)\n        if reserve_rule == 1:\n            return self.max_shop(city, item_code, p_c_map, province, shops)\n\n    def act_params(self, shop_id: str, item_id: str):\n        session_id = self.headers[\"current_session_id\"]\n        user_id = self.headers[\"userId\"]\n        params = {\n            \"itemInfoList\": [{\"count\": 1, \"itemId\": item_id}],\n            \"sessionId\": int(session_id),\n            \"userId\": user_id,\n            \"shopId\": shop_id,\n        }\n        s = json.dumps(params)\n        act = self.encrypt.aes_encrypt(s)\n        params.update({\"actParam\": act})\n        return params\n\n    def reservation(self, params: dict):\n        params.pop(\"userId\")\n        responses = requests.post(\n            \"https://app.moutai519.com.cn/xhr/front/mall/reservation/add\",\n            json=params,\n            headers=self.headers,\n        ).json()\n        if responses.get(\"code\") == 401:\n            msg = {\n                \"name\": \"申购结果\",\n                \"value\": \"token失效, 请重新抓包获取\",\n            }\n        elif responses.get(\"code\") != 2000:\n            msg = {\n                \"name\": \"申购结果\",\n                \"value\": responses.get(\"message\"),\n            }\n        else:\n            msg = {\n                \"name\": \"申购结果\",\n                \"value\": responses.get(\"data\", {}).get(\"successDesc\"),\n            }\n        return msg\n\n    def getUserEnergyAward(self):\n        \"\"\"\n        耐力值\n        \"\"\"\n        cookies = {\n            \"MT-Device-ID-Wap\": self.headers[\"MT-Device-ID\"],\n            \"MT-Token-Wap\": self.headers[\"MT-Token\"],\n            \"YX_SUPPORT_WEBP\": \"1\",\n        }\n        response = requests.post(\n            url=\"https://h5.moutai519.com.cn/game/isolationPage/getUserEnergyAward\",\n            cookies=cookies,\n            headers=self.headers,\n            json={},\n        ).json()\n        if response.get(\"code\") == 200:\n            msg = {\n                \"name\": \"耐力\",\n                \"value\": \"✅领取耐力成功\",\n            }\n        else:\n            msg = {\n                \"name\": \"耐力\",\n                \"value\": response.get(\"message\"),\n            }\n        return msg\n\n    def main(self):\n        msg = []\n        mobile = self.check_item.get(\"mobile\")\n        province = self.check_item.get(\"province\")\n        city = self.check_item.get(\"city\")\n        token = self.check_item.get(\"token\")\n        user_id = self.check_item.get(\"userid\")\n        lat = self.check_item.get(\"lat\")\n        lng = self.check_item.get(\"lng\")\n        item_codes = self.check_item.get(\"item_codes\", self.ITEM_CODES)\n        reserve_rule = self.check_item.get(\"reserve_rule\", 0)\n        msg = [\n            {\n                \"name\": \"手机号\",\n                \"value\": f\"{mobile}\",\n            },\n            {\n                \"name\": \"省份城市\",\n                \"value\": f\"{province}{city}\",\n            },\n        ]\n        p_c_map, source_data = self.get_map(lat=lat, lng=lng)\n        self.get_current_session_id()\n        self.init_headers(user_id=user_id, token=token, lng=lng, lat=lat)\n        try:\n            for item in item_codes:\n                max_shop_id = self.get_location_count(\n                    province=province,\n                    city=city,\n                    item_code=item,\n                    p_c_map=p_c_map,\n                    source_data=source_data,\n                    lat=lat,\n                    lng=lng,\n                    reserve_rule=reserve_rule,\n                )\n                if max_shop_id == \"0\":\n                    continue\n                reservation_params = self.act_params(max_shop_id, item)\n                reservation_msg = self.reservation(reservation_params)\n                time.sleep(20)\n                award_msg = self.getUserEnergyAward()\n                msg.append(reservation_msg)\n                msg.append(award_msg)\n        except BaseException as e:\n            msg.append(\n                {\n                    \"name\": \"申购结果\",\n                    \"value\": e,\n                }\n            )\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"IMAOTAI\", [])[0]\n    print(IMAOTAI(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/iqiyi/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/iqiyi/main.py",
    "content": "import json\nimport os\nimport re\nimport time\nfrom urllib.parse import unquote\nfrom uuid import uuid4\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass IQIYI(CheckIn):\n    name = \"爱奇艺\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n\n    @staticmethod\n    def parse_cookie(cookie):\n        p00001 = re.findall(r\"P00001=(.*?);\", cookie)[0] if re.findall(r\"P00001=(.*?);\", cookie) else \"\"\n        p00002 = re.findall(r\"P00002=(.*?);\", cookie)[0] if re.findall(r\"P00002=(.*?);\", cookie) else \"\"\n        p00003 = re.findall(r\"P00003=(.*?);\", cookie)[0] if re.findall(r\"P00003=(.*?);\", cookie) else \"\"\n        __dfp = re.findall(r\"__dfp=(.*?);\", cookie)[0] if re.findall(r\"__dfp=(.*?);\", cookie) else \"\"\n        __dfp = __dfp.split(\"@\")[0]\n        qyid = re.findall(r\"QC005=(.*?);\", cookie)[0] if re.findall(r\"QC005=(.*?);\", cookie) else \"\"\n        return p00001, p00002, p00003, __dfp, qyid\n\n    @staticmethod\n    def user_information(p00001):\n        \"\"\"\n        账号信息查询\n        \"\"\"\n        time.sleep(3)\n        url = \"http://serv.vip.iqiyi.com/vipgrowth/query.action\"\n        params = {\"P00001\": p00001}\n        res = requests.get(url=url, params=params).json()\n        if res[\"code\"] == \"A00000\":\n            try:\n                res_data = res.get(\"data\", {})\n                level = res_data.get(\"level\", 0)\n                growthvalue = res_data.get(\"growthvalue\", 0)\n                distance = res_data.get(\"distance\", 0)\n                deadline = res_data.get(\"deadline\", \"非 VIP 用户\")\n                today_growth_value = res_data.get(\"todayGrowthValue\", 0)\n                msg = [\n                    {\"name\": \"VIP 等级\", \"value\": level},\n                    {\"name\": \"当前成长\", \"value\": growthvalue},\n                    {\"name\": \"今日成长\", \"value\": today_growth_value},\n                    {\"name\": \"升级还需\", \"value\": distance},\n                    {\"name\": \"VIP 到期\", \"value\": deadline},\n                ]\n            except Exception as e:\n                msg = [\n                    {\"name\": \"账号信息\", \"value\": str(e)},\n                ]\n        else:\n            msg = [\n                {\"name\": \"账号信息\", \"value\": res.get(\"msg\")},\n            ]\n        return msg\n\n    def lottery(self, p00001, award_list=[]):\n        url = \"https://act.vip.iqiyi.com/shake-api/lottery\"\n        params = {\n            \"P00001\": p00001,\n            \"lotteryType\": \"0\",\n            \"actCode\": \"0k9GkUcjqqj4tne8\",\n        }\n        params = {\n            \"P00001\": p00001,\n            \"deviceID\": str(uuid4()),\n            \"version\": \"15.3.0\",\n            \"platform\": str(uuid4())[:16],\n            \"lotteryType\": \"0\",\n            \"actCode\": \"0k9GkUcjqqj4tne8\",\n            \"extendParams\": json.dumps(\n                {\n                    \"appIds\": \"iqiyi_pt_vip_iphone_video_autorenew_12m_348yuan_v2\",\n                    \"supportSk2Identity\": True,\n                    \"testMode\": \"0\",\n                    \"iosSystemVersion\": \"17.4\",\n                    \"bundleId\": \"com.qiyi.iphone\",\n                }\n            ),\n        }\n        res = requests.get(url, params=params).json()\n        msgs = []\n        if res.get(\"code\") == \"A00000\":\n            award_info = res.get(\"data\", {}).get(\"title\")\n            award_list.append(award_info)\n            time.sleep(3)\n            return self.lottery(p00001=p00001, award_list=award_list)\n        elif res.get(\"msg\") == \"抽奖次数用完\":\n            if award_list:\n                msgs = [{\"name\": \"每天摇一摇\", \"value\": \"、\".join(award_list)}]\n            else:\n                msgs = [{\"name\": \"每天摇一摇\", \"value\": res.get(\"msg\")}]\n        else:\n            msgs = [{\"name\": \"每天摇一摇\", \"value\": res.get(\"msg\")}]\n        return msgs\n\n    @staticmethod\n    def draw(draw_type, p00001, p00003):\n        \"\"\"\n        查询抽奖次数(必),抽奖\n        :param draw_type: 类型 0 查询次数 1 抽奖\n        :param p00001: 关键参数\n        :param p00003: 关键参数\n        :return: {status, msg, chance}\n        \"\"\"\n        url = \"https://iface2.iqiyi.com/aggregate/3.0/lottery_activity\"\n        params = {\n            \"lottery_chance\": 1,\n            \"app_k\": \"b398b8ccbaeacca840073a7ee9b7e7e6\",\n            \"app_v\": \"11.6.5\",\n            \"platform_id\": 10,\n            \"dev_os\": \"8.0.0\",\n            \"dev_ua\": \"FRD-AL10\",\n            \"net_sts\": 1,\n            \"qyid\": \"2655b332a116d2247fac3dd66a5285011102\",\n            \"psp_uid\": p00003,\n            \"psp_cki\": p00001,\n            \"psp_status\": 3,\n            \"secure_v\": 1,\n            \"secure_p\": \"GPhone\",\n            \"req_sn\": round(time.time() * 1000),\n        }\n        if draw_type == 1:\n            del params[\"lottery_chance\"]\n        res = requests.get(url=url, params=params).json()\n        if not res.get(\"code\"):\n            chance = int(res.get(\"daysurpluschance\"))\n            msg = res.get(\"awardName\")\n            return {\"status\": True, \"msg\": msg, \"chance\": chance}\n        else:\n            try:\n                msg = res.get(\"kv\", {}).get(\"msg\")\n            except Exception as e:\n                print(e)\n                msg = res[\"errorReason\"]\n        return {\"status\": False, \"msg\": msg, \"chance\": 0}\n\n    def level_right(self, p00001):\n        data = {\"code\": \"k8sj74234c683f\", \"P00001\": p00001}\n        res = requests.post(url=\"https://act.vip.iqiyi.com/level-right/receive\", data=data).json()\n        msg = res[\"msg\"]\n        return [{\"name\": \"V7 免费升级星钻\", \"value\": msg}]\n\n    def give_times(self, p00001):\n        url = \"https://pcell.iqiyi.com/lotto/giveTimes\"\n        times_code_list = [\"browseWeb\", \"browseWeb\", \"bookingMovie\"]\n        for times_code in times_code_list:\n            params = {\n                \"actCode\": \"bcf9d354bc9f677c\",\n                \"timesCode\": times_code,\n                \"P00001\": p00001,\n            }\n            requests.get(url, params=params)\n\n    def lotto_lottery(self, p00001):\n        self.give_times(p00001=p00001)\n        gift_list = []\n        for _ in range(5):\n            url = \"https://pcell.iqiyi.com/lotto/lottery\"\n            params = {\"actCode\": \"bcf9d354bc9f677c\", \"P00001\": p00001}\n            response = requests.get(url, params=params)\n            gift_name = response.json()[\"data\"][\"giftName\"]\n            if gift_name and \"未中奖\" not in gift_name:\n                gift_list.append(gift_name)\n        if gift_list:\n            return [{\"name\": \"白金抽奖\", \"value\": \"、\".join(gift_list)}]\n        else:\n            return [{\"name\": \"白金抽奖\", \"value\": \"未中奖\"}]\n\n    def main(self):\n        p00001, p00002, p00003, dfp, qyid = self.parse_cookie(self.check_item.get(\"cookie\"))\n        try:\n            user_info = json.loads(unquote(p00002, encoding=\"utf-8\"))\n            user_name = user_info.get(\"user_name\")\n            user_name = user_name.replace(user_name[3:7], \"****\")\n            nickname = user_info.get(\"nickname\")\n        except Exception as e:\n            print(f\"获取账号信息失败，错误信息: {e}\")\n            nickname = \"未获取到，请检查 Cookie 中 P00002 字段\"\n            user_name = \"未获取到，请检查 Cookie 中 P00002 字段\"\n        _user_msg = self.user_information(p00001=p00001)\n        lotto_lottery_msg = self.lotto_lottery(p00001=p00001)\n        if _user_msg[4].get(\"value\") != \"非 VIP 用户\":\n            level_right_msg = self.level_right(p00001=p00001)\n        else:\n            level_right_msg = [\n                {\n                    \"name\": \"V7 免费升级星钻\",\n                    \"value\": \"非 VIP 用户\",\n                }\n            ]\n        chance = self.draw(draw_type=0, p00001=p00001, p00003=p00003)[\"chance\"]\n        lottery_msgs = self.lottery(p00001=p00001, award_list=[])\n        if chance:\n            draw_msg = \"\"\n            for _ in range(chance):\n                ret = self.draw(draw_type=1, p00001=p00001, p00003=p00003)\n                draw_msg += ret[\"msg\"] + \";\" if ret[\"status\"] else \"\"\n        else:\n            draw_msg = \"抽奖机会不足\"\n\n        user_msg = self.user_information(p00001=p00001)\n\n        msg = [\n            {\"name\": \"用户账号\", \"value\": user_name},\n            {\"name\": \"用户昵称\", \"value\": nickname},\n            *user_msg,\n            {\"name\": \"抽奖奖励\", \"value\": draw_msg},\n            *lottery_msgs,\n            *level_right_msg,\n            *lotto_lottery_msg,\n        ]\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"IQIYI\", [])[0]\n    print(IQIYI(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/kgqq/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/kgqq/main.py",
    "content": "import json\nimport os\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass KGQQ(CheckIn):\n    name = \"全民K歌\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n\n    @staticmethod\n    def sign(kgqq_cookie):\n        headers = {\"Cookie\": kgqq_cookie}\n        uid = kgqq_cookie.split(\"; \")\n        t_uuid = \"\"\n        for i in uid:\n            if i.find(\"uid=\") >= 0:\n                t_uuid = i.split(\"=\")[1]\n        proto_profile_url = f\"https://node.kg.qq.com/webapp/proxy?ns=proto_profile&cmd=profile.getProfile&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnByb2ZpbGVfd2ViYXBwSmNlJTIyJTJDJTIyY21kTmFtZSUyMiUzQSUyMlByb2ZpbGVHZXQlMjIlMkMlMjJhcHBpZCUyMiUzQTEwMDA2MjYlMkMlMjJkY2FwaSUyMiUzQSU3QiUyMmludGVyZmFjZUlkJTIyJTNBMjA1MzU5NTk3JTdEJTJDJTIybDVhcGklMjIlM0ElN0IlMjJtb2RpZCUyMiUzQTI5NDAxNyUyQyUyMmNtZCUyMiUzQTI2MjE0NCU3RCUyQyUyMmlwJTIyJTNBJTIyMTAwLjExMy4xNjIuMTc4JTIyJTJDJTIycG9ydCUyMiUzQSUyMjEyNDA2JTIyJTdE&t_uUid={t_uuid}\"\n\n        url_list = (\n            [\n                f\"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.getLottery&ns_inbuf=&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyTG90dGVyeVJlcSUyMiUyQyUyMnduc0NvbmZpZyUyMiUzQSU3QiUyMmFwcGlkJTIyJTNBMTAwMDU1NyU3RCUyQyUyMmw1YXBpJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E1MDM5MzclMkMlMjJjbWQlMjIlM0E1ODk4MjQlN0QlN0Q%3D&t_uid={t_uuid}&t_iShowEntry=1&t_type={one}\"\n                for one in [\"1\", \"2\"]\n            ]\n            + [\n                f\"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.signinGetAward&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyR2V0U2lnbkluQXdhcmRSZXElMjIlMkMlMjJ3bnNDb25maWclMjIlM0ElN0IlMjJhcHBpZCUyMiUzQTEwMDA2MjYlN0QlMkMlMjJsNWFwaSUyMiUzQSU3QiUyMm1vZGlkJTIyJTNBNTAzOTM3JTJDJTIyY21kJTIyJTNBNTg5ODI0JTdEJTdE&t_uid={t_uuid}&t_iShowEntry={one}\"\n                for one in [\"1\", \"2\", \"4\", \"16\", \"128\", \"512\"]\n            ]\n            + [\n                f\"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.getLottery&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyTG90dGVyeVJlcSUyMiUyQyUyMnduc0NvbmZpZyUyMiUzQSU3QiUyMmFwcGlkJTIyJTNBMTAwMDU1NyU3RCUyQyUyMmw1YXBpJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E1MDM5MzclMkMlMjJjbWQlMjIlM0E1ODk4MjQlN0QlN0Q&t_uid={t_uuid}&t_iShowEntry=4&t_type=104\",\n                f\"https://node.kg.qq.com/webapp/proxy?ns=KG_TASK&cmd=task.getLottery&mapExt=JTdCJTIyZmlsZSUyMiUzQSUyMnRhc2tKY2UlMjIlMkMlMjJjbWROYW1lJTIyJTNBJTIyTG90dGVyeVJlcSUyMiUyQyUyMmw1YXBpJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E1MDM5MzclMkMlMjJjbWQlMjIlM0E1ODk4MjQlN0QlMkMlMjJsNWFwaV9leHAxJTIyJTNBJTdCJTIybW9kaWQlMjIlM0E4MTcwODklMkMlMjJjbWQlMjIlM0EzODAxMDg4JTdEJTdE&t_uid={t_uuid}&t_type=103\",\n            ]\n        )\n\n        proto_music_station_url = f\"https://node.kg.qq.com/webapp/proxy?ns=proto_music_station&cmd=message.batch_get_music_cards&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldEJhdGNoTXVzaWNDYXJkc1JlcSUyMiUyQyUyMmZpbGUlMjIlM0ElMjJwcm90b19tdXNpY19zdGF0aW9uSmNlJTIyJTJDJTIyd25zRGlzcGF0Y2hlciUyMiUzQXRydWUlN0Q&t_uUid={t_uuid}&g_tk_openkey=\"\n\n        url_10 = f\"https://node.kg.qq.com/webapp/proxy?t_stReward%3Aobject=%7B%22uInteractiveType%22%3A1%2C%22uRewardType%22%3A0%2C%22uFlowerNum%22%3A15%7D&ns=proto_music_station&cmd=message.get_reward&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldFJld2FyZFJlcSUyMiUyQyUyMmZpbGUlMjIlM0ElMjJwcm90b19tdXNpY19zdGF0aW9uSmNlJTIyJTJDJTIyd25zRGlzcGF0Y2hlciUyMiUzQXRydWUlN0Q&t_uUid={t_uuid}&t_strUgcId=\"\n\n        url_15 = f\"https://node.kg.qq.com/webapp/proxy?t_stReward%3Aobject=%7B%22uInteractiveType%22%3A0%2C%22uRewardType%22%3A0%2C%22uFlowerNum%22%3A10%7D&ns=proto_music_station&cmd=message.get_reward&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldFJld2FyZFJlcSUyMiUyQyUyMmZpbGUlMjIlM0ElMjJwcm90b19tdXNpY19zdGF0aW9uSmNlJTIyJTJDJTIyd25zRGlzcGF0Y2hlciUyMiUzQXRydWUlN0Q&t_uUid={t_uuid}&t_strUgcId=\"\n        try:\n            old_proto_profile_response = requests.get(url=proto_profile_url, headers=headers)\n            old_num = old_proto_profile_response.json()[\"data\"][\"profile.getProfile\"][\"uFlowerNum\"]\n            nickname = old_proto_profile_response.json()[\"data\"][\"profile.getProfile\"][\"stPersonInfo\"][\"sKgNick\"]\n            for url in url_list:\n                try:\n                    requests.get(url=url, headers=headers)\n                except Exception as e:\n                    print(e)\n            for g_tk_openkey in range(16):\n                try:\n                    proto_music_station_resp = requests.get(\n                        url=proto_music_station_url + str(g_tk_openkey), headers=headers\n                    )\n                    if proto_music_station_resp.json().get(\"code\") in [1000]:\n                        return proto_music_station_resp.json().get(\"msg\")\n                    vct_music_cards = proto_music_station_resp.json()[\"data\"][\"message.batch_get_music_cards\"][\n                        \"vctMusicCards\"\n                    ]\n                    vct_music_cards_list = sorted(\n                        vct_music_cards,\n                        key=lambda x: x[\"stReward\"][\"uFlowerNum\"],\n                        reverse=True,\n                    )[0]\n                    str_ugc_id = vct_music_cards_list[\"strUgcId\"]\n                    str_key = vct_music_cards_list[\"strKey\"]\n                    url = str_ugc_id + \"&t_strKey=\" + str_key\n                    u_flower_num = vct_music_cards_list[\"stReward\"][\"uFlowerNum\"]\n                    if u_flower_num > 10:\n                        requests.get(url=url_10 + url, headers=headers)\n                    elif 1 < u_flower_num < 10:\n                        requests.get(url=url_15 + url, headers=headers)\n                except Exception as e:\n                    print(e)\n            # VIP 签到\n            try:\n                getinfourl = (\n                    \"https://node.kg.qq.com/webapp/proxy?ns=proto_vip_webapp&cmd=vip.get_vip_info&t_uUid=\"\n                    + t_uuid\n                    + \"&t_uWebReq=1&t_uGetDataFromC4B=1\"\n                )\n                inforequest = requests.get(url=getinfourl, headers=headers)\n                vip_status = inforequest.json()[\"data\"][\"vip.get_vip_info\"][\"stVipCoreInfo\"][\"uStatus\"]\n                if vip_status == 1:\n                    vipurl = (\n                        \"https://node.kg.qq.com/webapp/proxy?t_uUid=\"\n                        + t_uuid\n                        + \"&ns=proto_vip_webapp&cmd=vip.get_vip_day_reward&ns_inbuf=&nocache=1613719349184&mapExt=JTdCJTIyY21kTmFtZSUyMiUzQSUyMkdldFZpcERheVJld2FyZCUyMiU3RA%3D%3D&g_tk_openkey=642424811\"\n                    )\n                    viprequest = requests.get(url=vipurl, headers=headers)\n                    str_tips = viprequest.json()[\"data\"][\"vip.get_vip_day_reward\"][\"strTips\"]\n                    u_cur_reward_num = viprequest.json()[\"data\"][\"vip.get_vip_day_reward\"][\"uCurRewardNum\"]\n                    vip_message = f\"{str_tips} 获取VIP福利道具：{u_cur_reward_num}个\"\n                else:\n                    vip_message = \"非 VIP 用户\"\n            except Exception as e:\n                print(e)\n                vip_message = \"VIP 签到失败\"\n            new_proto_profile_response = requests.get(url=proto_profile_url, headers=headers)\n            new_num = new_proto_profile_response.json()[\"data\"][\"profile.getProfile\"][\"uFlowerNum\"]\n            get_num = int(new_num) - int(old_num)\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": nickname},\n                {\"name\": \"获取鲜花\", \"value\": get_num},\n                {\"name\": \"当前鲜花\", \"value\": new_num},\n                {\"name\": \"VIP 签到\", \"value\": vip_message},\n            ]\n        except Exception as e:\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": str(e)},\n            ]\n        return msg\n\n    def main(self):\n        kgqq_cookie = self.check_item.get(\"cookie\")\n        msg = self.sign(kgqq_cookie=kgqq_cookie)\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"KGQQ\", [])[0]\n    print(KGQQ(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/main.py",
    "content": "import argparse\nimport json\nimport os\nimport time\nfrom datetime import datetime, timedelta\n\nimport requests\n\nfrom dailycheckin.__version__ import __version__\nfrom dailycheckin.configs import checkin_map, get_checkin_info, get_notice_info\nfrom dailycheckin.utils.message import push_message\n\n\ndef parse_arguments():\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"--include\", nargs=\"+\", help=\"任务执行包含的任务列表\")\n    parser.add_argument(\"--exclude\", nargs=\"+\", help=\"任务执行排除的任务列表\")\n    return parser.parse_args()\n\n\ndef check_config(task_list):\n    config_path = None\n    config_path_list = []\n    for one_path in [\n        \"/ql/scripts/config.json\",\n        \"config.json\",\n        \"../config.json\",\n        \"./config/config.json\",\n        \"../config/config.json\",\n        \"/config.json\",\n    ]:\n        _config_path = os.path.join(os.getcwd(), one_path)\n        if os.path.exists(_config_path):\n            config_path = os.path.normpath(_config_path)\n            break\n        config_path_list.append(os.path.normpath(os.path.dirname(_config_path)))\n    if config_path:\n        print(\"使用配置文件路径:\", config_path)\n        with open(config_path, encoding=\"utf-8\") as f:\n            try:\n                data = json.load(f)\n            except Exception:\n                print(\"Json 格式错误，请检查 config.json 文件格式是否正确！\")\n                return False, False\n        try:\n            notice_info = get_notice_info(data=data)\n            _check_info = get_checkin_info(data=data)\n            check_info = {}\n            for one_check in checkin_map.keys():\n                if one_check in task_list:\n                    if _check_info.get(one_check.lower()):\n                        for _, check_item in enumerate(_check_info.get(one_check.lower(), [])):\n                            if \"xxxxxx\" not in str(check_item) and \"多账号\" not in str(check_item):\n                                if one_check.lower() not in check_info.keys():\n                                    check_info[one_check.lower()] = []\n                                check_info[one_check.lower()].append(check_item)\n            return notice_info, check_info\n        except Exception as e:\n            print(e)\n            return False, False\n    else:\n        print(\"未找到 config.json 配置文件\\n请在下方任意目录中添加「config.json」文件:\\n\" + \"\\n\".join(config_path_list))\n        return False, False\n\n\ndef checkin():\n    start_time = time.time()\n    utc_time = (datetime.utcnow() + timedelta(hours=8)).strftime(\"%Y-%m-%d %H:%M:%S\")\n    print(f\"当前时间: {utc_time}\\n当前版本: {__version__}\")\n    args = parse_arguments()\n    include = args.include\n    exclude = args.exclude\n    if not include:\n        include = list(checkin_map.keys())\n    else:\n        include = [one for one in include if one in checkin_map.keys()]\n    if not exclude:\n        exclude = []\n    else:\n        exclude = [one for one in exclude if one in checkin_map.keys()]\n    task_list = list(set(include) - set(exclude))\n    notice_info, check_info = check_config(task_list)\n    if check_info:\n        task_name_str = \"\\n\".join(\n            [f\"「{checkin_map.get(one.upper())[0]}」账号数 : {len(value)}\" for one, value in check_info.items()]\n        )\n        print(f\"\\n---------- 本次执行签到任务如下 ----------\\n\\n{task_name_str}\\n\\n\")\n        content_list = []\n        for one_check, check_list in check_info.items():\n            check_name, check_func = checkin_map.get(one_check.upper())\n            print(f\"----------开始执行「{check_name}」签到----------\")\n            for index, check_item in enumerate(check_list):\n                try:\n                    msg = check_func(check_item).main()\n                    content_list.append(f\"「{check_name}」\\n{msg}\")\n                    print(f\"第 {index + 1} 个账号: ✅✅✅✅✅\")\n                except Exception as e:\n                    content_list.append(f\"「{check_name}」\\n{e}\")\n                    print(f\"第 {index + 1} 个账号: ❌❌❌❌❌\\n{e}\")\n        print(\"\\n\\n\")\n        try:\n            url = \"https://pypi.org/pypi/dailycheckin/json\"\n            latest_version = requests.get(url=url, timeout=30).json()[\"info\"][\"version\"]\n        except Exception:\n            print(\"获取最新版本失败\")\n            latest_version = \"0.0.0\"\n        content_list.append(\n            f\"开始时间: {utc_time}\\n\"\n            f\"任务用时: {int(time.time() - start_time)} 秒\\n\"\n            f\"当前版本: {__version__}\\n\"\n            f\"最新版本: {latest_version}\\n\"\n            f\"项目地址: https://github.com/Sitoi/dailycheckin\"\n        )\n        push_message(content_list=content_list, notice_info=notice_info)\n        return\n\n\nif __name__ == \"__main__\":\n    checkin()\n"
  },
  {
    "path": "dailycheckin/mimotion/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/mimotion/main.py",
    "content": "import json\nimport os\nimport random\nimport re\nimport time\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass MiMotion(CheckIn):\n    name = \"小米运动\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n        self.headers = {\n            \"Content-Type\": \"application/x-www-form-urlencoded; charset=UTF-8\",\n            \"User-Agent\": \"MiFit/6.12.0 (MCE16; Android 16; Density/1.5)\",\n            \"app_name\": \"com.xiaomi.hm.health\",\n        }\n\n    def get_time(self):\n        try:\n            url = \"https://acs.m.taobao.com/gw/mtop.common.getTimestamp/\"\n            response = requests.get(url, headers=self.headers).json()\n            t = response[\"data\"][\"t\"]\n            return t\n        except Exception as e:\n            print(\"时间戳获取失败，使用本地时间\", e)\n            return str(int(time.time() * 1000))\n\n    def login(self, phone, password):\n        phone_pattern = r\"(^(1)\\d{10}$)\"\n        if re.match(phone_pattern, phone):\n            user = f\"+86{phone}\"\n            third_name = \"huami_phone\"\n        else:\n            user = phone\n            third_name = \"huami\"\n\n        url1 = \"https://api-user.zepp.com/registrations/\" + user + \"/tokens\"\n        data1 = f\"client_id=HuaMi&country_code=CN&json_response=true&name={user}&password={password}&redirect_uri=https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html&state=REDIRECTION&token=access\"\n\n        try:\n            r1 = requests.post(url1, data=data1, headers=self.headers)\n            if r1.status_code == 429:\n                return 0, 0, \"请求过于频繁，请变换IP后再试\"\n\n            r1 = r1.json()\n            code = r1[\"access\"]\n        except Exception as e:\n            print(\"登录失败:\", e)\n            return 0, 0, \"登录失败\"\n\n        url2 = \"https://account.zepp.com/v2/client/login\"\n        data2 = f\"app_name=com.xiaomi.hm.health&country_code=CN&code={code}&device_id=fuck1069-2002-7869-0129-757geoi6sam1&device_model=android_phone&app_version=6.12.0&grant_type=access_token&allow_registration=false&dn=account.zepp.com,api-user.zepp.com,api-mifit.zepp.com,api-watch.zepp.com,app-analytics.zepp.com,api-analytics.huami.com,auth.zepp.com&source=com.xiaomi.hm.health&third_name={third_name}\"\n\n        try:\n            r2 = requests.post(url=url2, data=data2, headers=self.headers).json()\n            login_token = r2[\"token_info\"][\"login_token\"]\n            userid = r2[\"token_info\"][\"user_id\"]\n            app_token = r2[\"token_info\"][\"app_token\"]\n            return login_token, userid, app_token\n        except Exception as e:\n            print(\"获取token失败:\", e)\n            return 0, 0, \"获取token失败\"\n\n    def main(self):\n        phone = str(self.check_item.get(\"phone\"))\n        password = str(self.check_item.get(\"password\"))\n        try:\n            min_step = int(self.check_item.get(\"min_step\", 10000))\n        except Exception as e:\n            print(\"初始化步数失败: 已将最小值设置为 10000\", e)\n            min_step = 10000\n        try:\n            max_step = int(self.check_item.get(\"max_step\", 19999))\n        except Exception as e:\n            print(\"初始化步数失败: 已将最大值设置为 19999\", e)\n            max_step = 19999\n\n        step = str(random.randint(min_step, max_step))\n        login_token, userid, app_token = self.login(phone, password)\n\n        if login_token == 0:\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": f\"{phone[:4]}****{phone[-4:]}\"},\n                {\"name\": \"修改信息\", \"value\": \"登陆失败\"},\n            ]\n        else:\n            t = self.get_time()\n            today = time.strftime(\"%F\")\n            data_json = \"%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%222025-08-17%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%3A1755407692%2C%5C%22ed%5C%22%3A1755407692%2C%5C%22dp%5C%22%3A0%2C%5C%22lt%5C%22%3A0%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%3A0%2C%5C%22lb%5C%22%3A0%2C%5C%22to%5C%22%3A0%2C%5C%22dt%5C%22%3A0%2C%5C%22rhr%5C%22%3A0%2C%5C%22ss%5C%22%3A0%7D%2C%5C%22stp%5C%22%3A%7B%5C%22ttl%5C%22%3A17760%2C%5C%22dis%5C%22%3A10627%2C%5C%22cal%5C%22%3A510%2C%5C%22wk%5C%22%3A41%2C%5C%22rn%5C%22%3A50%2C%5C%22runDist%5C%22%3A7654%2C%5C%22runCal%5C%22%3A397%2C%5C%22stage%5C%22%3A%5B%7B%5C%22start%5C%22%3A327%2C%5C%22stop%5C%22%3A341%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A481%2C%5C%22cal%5C%22%3A13%2C%5C%22step%5C%22%3A680%7D%2C%7B%5C%22start%5C%22%3A342%2C%5C%22stop%5C%22%3A367%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A2295%2C%5C%22cal%5C%22%3A95%2C%5C%22step%5C%22%3A2874%7D%2C%7B%5C%22start%5C%22%3A368%2C%5C%22stop%5C%22%3A377%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1592%2C%5C%22cal%5C%22%3A88%2C%5C%22step%5C%22%3A1664%7D%2C%7B%5C%22start%5C%22%3A378%2C%5C%22stop%5C%22%3A386%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1072%2C%5C%22cal%5C%22%3A51%2C%5C%22step%5C%22%3A1245%7D%2C%7B%5C%22start%5C%22%3A387%2C%5C%22stop%5C%22%3A393%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1036%2C%5C%22cal%5C%22%3A57%2C%5C%22step%5C%22%3A1124%7D%2C%7B%5C%22start%5C%22%3A394%2C%5C%22stop%5C%22%3A398%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A488%2C%5C%22cal%5C%22%3A19%2C%5C%22step%5C%22%3A607%7D%2C%7B%5C%22start%5C%22%3A399%2C%5C%22stop%5C%22%3A414%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A2220%2C%5C%22cal%5C%22%3A120%2C%5C%22step%5C%22%3A2371%7D%2C%7B%5C%22start%5C%22%3A415%2C%5C%22stop%5C%22%3A427%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1268%2C%5C%22cal%5C%22%3A59%2C%5C%22step%5C%22%3A1489%7D%2C%7B%5C%22start%5C%22%3A428%2C%5C%22stop%5C%22%3A433%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A152%2C%5C%22cal%5C%22%3A4%2C%5C%22step%5C%22%3A238%7D%2C%7B%5C%22start%5C%22%3A434%2C%5C%22stop%5C%22%3A444%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A2295%2C%5C%22cal%5C%22%3A95%2C%5C%22step%5C%22%3A2874%7D%2C%7B%5C%22start%5C%22%3A445%2C%5C%22stop%5C%22%3A455%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1592%2C%5C%22cal%5C%22%3A88%2C%5C%22step%5C%22%3A1664%7D%2C%7B%5C%22start%5C%22%3A456%2C%5C%22stop%5C%22%3A466%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1072%2C%5C%22cal%5C%22%3A51%2C%5C%22step%5C%22%3A1245%7D%2C%7B%5C%22start%5C%22%3A467%2C%5C%22stop%5C%22%3A477%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1036%2C%5C%22cal%5C%22%3A57%2C%5C%22step%5C%22%3A1124%7D%2C%7B%5C%22start%5C%22%3A478%2C%5C%22stop%5C%22%3A488%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A488%2C%5C%22cal%5C%22%3A19%2C%5C%22step%5C%22%3A607%7D%2C%7B%5C%22start%5C%22%3A489%2C%5C%22stop%5C%22%3A499%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A2220%2C%5C%22cal%5C%22%3A120%2C%5C%22step%5C%22%3A2371%7D%2C%7B%5C%22start%5C%22%3A500%2C%5C%22stop%5C%22%3A511%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1268%2C%5C%22cal%5C%22%3A59%2C%5C%22step%5C%22%3A1489%7D%2C%7B%5C%22start%5C%22%3A512%2C%5C%22stop%5C%22%3A522%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A152%2C%5C%22cal%5C%22%3A4%2C%5C%22step%5C%22%3A238%7D%5D%7D%2C%5C%22goal%5C%22%3A8000%2C%5C%22tz%5C%22%3A%5C%2228800%5C%22%7D%22%2C%22source%22%3A24%2C%22type%22%3A0%7D%5D\"\n            finddate = re.compile(r\".*?date%22%3A%22(.*?)%22%2C%22data.*?\")\n            findstep = re.compile(r\".*?ttl%5C%22%3A(.*?)%2C%5C%22dis.*?\")\n            data_json = re.sub(finddate.findall(data_json)[0], today, str(data_json))\n            data_json = re.sub(findstep.findall(data_json)[0], step, str(data_json))\n            url = f\"https://api-mifit-cn.huami.com/v1/data/band_data.json?&t={t}\"\n            headers = {\n                \"apptoken\": app_token,\n                \"Content-Type\": \"application/x-www-form-urlencoded\",\n            }\n            data = f\"userid={userid}&last_sync_data_time=1628256960&device_type=0&last_deviceid=C4BDB6FFFE2BCA4C&data_json={data_json}\"\n            response = requests.post(url=url, data=data, headers=headers).json()\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": f\"{phone[:4]}****{phone[-4:]}\"},\n                {\"name\": \"修改信息\", \"value\": f\"{response['message']}\"},\n                {\"name\": \"修改步数\", \"value\": f\"{step}\"},\n            ]\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"MIMOTION\", [])[0]\n    print(MiMotion(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/smzdm/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/smzdm/main.py",
    "content": "import hashlib\nimport json\nimport os\nimport re\nimport time\n\nimport requests\nimport urllib3\n\nfrom dailycheckin import CheckIn\n\nurllib3.disable_warnings()\n\n\nclass SMZDM(CheckIn):\n    name = \"什么值得买\"\n\n    def __init__(self, check_item: dict):\n        self.check_item = check_item\n\n    def robot_token(self, headers):\n        ts = round(time.time() * 1000)\n        url = \"https://user-api.smzdm.com/robot/token\"\n        data = {\n            \"f\": \"android\",\n            \"v\": \"10.4.1\",\n            \"weixin\": 1,\n            \"time\": ts,\n            \"sign\": hashlib.md5(\n                bytes(\n                    f\"f=android&time={ts}&v=10.4.1&weixin=1&key=apr1$AwP!wRRT$gJ/q.X24poeBInlUJC\",\n                    encoding=\"utf-8\",\n                )\n            )\n            .hexdigest()\n            .upper(),\n        }\n        html = requests.post(url=url, headers=headers, data=data)\n        result = html.json()\n        token = result[\"data\"][\"token\"]\n        return token\n\n    def sign(self, headers, token):\n        time_stamp = round(time.time() * 1000)\n        data = {\n            \"f\": \"android\",\n            \"v\": \"10.4.1\",\n            \"sk\": \"ierkM0OZZbsuBKLoAgQ6OJneLMXBQXmzX+LXkNTuKch8Ui2jGlahuFyWIzBiDq/L\",\n            \"weixin\": 1,\n            \"time\": time_stamp,\n            \"token\": token,\n            \"sign\": hashlib.md5(\n                bytes(\n                    f\"f=android&sk=ierkM0OZZbsuBKLoAgQ6OJneLMXBQXmzX+LXkNTuKch8Ui2jGlahuFyWIzBiDq/L&time={time_stamp}&token={token}&v=10.4.1&weixin=1&key=apr1$AwP!wRRT$gJ/q.X24poeBInlUJC\",\n                    encoding=\"utf-8\",\n                )\n            )\n            .hexdigest()\n            .upper(),\n        }\n        url = \"https://user-api.smzdm.com/checkin\"\n        resp = requests.post(url=url, headers=headers, data=data)\n        error_msg = resp.json()[\"error_msg\"]\n        return error_msg, data\n\n    def all_reward(self, headers, data):\n        url2 = \"https://user-api.smzdm.com/checkin/all_reward\"\n        resp = requests.post(url=url2, headers=headers, data=data)\n        result = resp.json()\n        msgs = []\n        if normal_reward := result[\"data\"][\"normal_reward\"]:\n            try:\n                msgs = [\n                    {\n                        \"name\": \"签到奖励\",\n                        \"value\": normal_reward[\"reward_add\"][\"content\"],\n                    },\n                    {\n                        \"name\": \"连续签到\",\n                        \"value\": normal_reward[\"sub_title\"],\n                    },\n                ]\n            except Exception as e:\n                print(e)\n        return msgs\n\n    def active(self, cookie):\n        zdm_active_id = [\"ljX8qVlEA7\"]\n        for active_id in zdm_active_id:\n            url = f\"https://zhiyou.smzdm.com/user/lottery/jsonp_draw?active_id={active_id}\"\n            rewardurl = f\"https://zhiyou.smzdm.com/user/lottery/jsonp_get_active_info?active_id={active_id}\"\n            infourl = \"https://zhiyou.smzdm.com/user/\"\n            headers = {\n                \"Host\": \"zhiyou.smzdm.com\",\n                \"Accept\": \"*/*\",\n                \"Connection\": \"keep-alive\",\n                \"Cookie\": cookie,\n                \"User-Agent\": \"Mozilla/5.0 (iPhone; CPU iPhone OS 15_6 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/smzdm 10.4.6 rv:130.1 (iPhone 13; iOS 15.6; zh_CN)/iphone_smzdmapp/10.4.6/wkwebview/jsbv_1.0.0\",\n                \"Accept-Language\": \"zh-CN,zh-Hans;q=0.9\",\n                \"Referer\": \"https://m.smzdm.com/\",\n                \"Accept-Encoding\": \"gzip, deflate, br\",\n            }\n            response = requests.post(url=url, headers=headers).json()\n            response_info = requests.get(url=infourl, headers=headers).text\n            _ = requests.get(url=rewardurl, headers=headers).json()\n            name = (\n                str(\n                    re.findall(\n                        '<a href=\"https://zhiyou.smzdm.com/user\"> (.*?) </a>',\n                        str(response_info),\n                        re.S,\n                    )\n                )\n                .replace(\"[\", \"\")\n                .replace(\"]\", \"\")\n                .replace(\"'\", \"\")\n            )\n            level = (\n                str(\n                    re.findall(\n                        r'<img src=\"https://res.smzdm.com/h5/h5_user/dist/assets/level/(.*?).png\\?v=1\">',\n                        str(response_info),\n                        re.S,\n                    )\n                )\n                .replace(\"[\", \"\")\n                .replace(\"]\", \"\")\n                .replace(\"'\", \"\")\n            )\n            gold = (\n                str(\n                    re.findall(\n                        '<div class=\"assets-part assets-gold\">\\n                    (.*?)</span>',\n                        str(response_info),\n                        re.S,\n                    )\n                )\n                .replace(\"[\", \"\")\n                .replace(\"]\", \"\")\n                .replace(\"'’\", \"\")\n                .replace('<span class=\"assets-part-element assets-num\">', \"\")\n                .replace(\"'\", \"\")\n            )\n            silver = (\n                str(\n                    re.findall(\n                        '<div class=\"assets-part assets-prestige\">\\n                    (.*?)</span>',\n                        str(response_info),\n                        re.S,\n                    )\n                )\n                .replace(\"[\", \"\")\n                .replace(\"]\", \"\")\n                .replace(\"'’\", \"\")\n                .replace('<span class=\"assets-part-element assets-num\">', \"\")\n                .replace(\"'\", \"\")\n            )\n            msg = [\n                {\n                    \"name\": \"签到结果\",\n                    \"value\": response[\"error_msg\"],\n                },\n                {\"name\": \"等级\", \"value\": level},\n                {\"name\": \"昵称\", \"value\": name},\n                {\"name\": \"金币\", \"value\": gold},\n                {\"name\": \"碎银\", \"value\": silver},\n            ]\n        return msg\n\n    def main(self):\n        cookie = self.check_item.get(\"cookie\")\n        headers = {\n            \"Host\": \"user-api.smzdm.com\",\n            \"Content-Type\": \"application/x-www-form-urlencoded\",\n            \"Cookie\": cookie,\n            \"User-Agent\": \"smzdm_android_V10.4.1 rv:841 (22021211RC;Android12;zh)smzdmapp\",\n        }\n        msg = self.active(cookie)\n        token = self.robot_token(headers)\n        error_msg, data = self.sign(headers, token)\n        msg.append({\"name\": \"签到结果\", \"value\": error_msg})\n        reward_msg = self.all_reward(headers, data)\n        msg += reward_msg\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"SMZDM\", [])[0]\n    print(SMZDM(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/tieba/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/tieba/main.py",
    "content": "import hashlib\nimport json\nimport os\nimport random\nimport time\nfrom typing import Optional\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass Tieba(CheckIn):\n    name = \"百度贴吧\"\n\n    def __init__(self, check_item: dict):\n        self.TBS_URL = \"http://tieba.baidu.com/dc/common/tbs\"\n        self.LIKE_URL = \"http://c.tieba.baidu.com/c/f/forum/like\"\n        self.SIGN_URL = \"http://c.tieba.baidu.com/c/c/forum/sign\"\n        self.LOGIN_INFO_URL = \"https://zhidao.baidu.com/api/loginInfo\"\n        self.SIGN_KEY = \"tiebaclient!!!\"\n\n        self.HEADERS = {\n            \"Host\": \"tieba.baidu.com\",\n            \"User-Agent\": \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36\",\n            \"Connection\": \"keep-alive\",\n            \"Accept-Encoding\": \"gzip, deflate\",\n            \"Cache-Control\": \"no-cache\",\n        }\n\n        self.SIGN_DATA = {\n            \"_client_type\": \"2\",\n            \"_client_version\": \"9.7.8.0\",\n            \"_phone_imei\": \"000000000000000\",\n            \"model\": \"MI+5\",\n            \"net_type\": \"1\",\n        }\n\n        self.session = requests.Session()\n        self.session.headers.update(self.HEADERS)\n\n        cookie = check_item.get(\"cookie\")\n        if not cookie:\n            raise ValueError(\"必须提供 BDUSS 或完整 Cookie\")\n\n        cookie_dict = {item.split(\"=\")[0]: item.split(\"=\")[1] for item in cookie.split(\"; \") if \"=\" in item}\n        requests.utils.add_dict_to_cookiejar(self.session.cookies, cookie_dict)\n        self.bduss = cookie_dict.get(\"BDUSS\", \"\")\n        if not self.bduss:\n            raise ValueError(\"Cookie 中未找到 BDUSS\")\n\n    def request(self, url: str, method: str = \"get\", data: Optional[dict] = None, retry: int = 3) -> dict:\n        for i in range(retry):\n            try:\n                if method.lower() == \"get\":\n                    response = self.session.get(url, timeout=10)\n                else:\n                    response = self.session.post(url, data=data, timeout=10)\n\n                response.raise_for_status()\n                if not response.text.strip():\n                    raise ValueError(\"空响应内容\")\n\n                return response.json()\n\n            except Exception as e:\n                if i == retry - 1:\n                    raise Exception(f\"请求失败: {e!s}\")\n\n                wait_time = 1.5 * (2**i) + random.uniform(0, 1)\n                time.sleep(wait_time)\n\n        raise Exception(f\"请求失败，已达最大重试次数 {retry}\")\n\n    def encode_data(self, data: dict) -> dict:\n        s = \"\"\n        for key in sorted(data.keys()):\n            s += f\"{key}={data[key]}\"\n        sign = hashlib.md5((s + self.SIGN_KEY).encode(\"utf-8\")).hexdigest().upper()\n        data.update({\"sign\": sign})\n        return data\n\n    def get_user_info(self):\n        try:\n            result = self.request(self.TBS_URL)\n            if result.get(\"is_login\", 0) == 0:\n                return False, \"登录失败，Cookie 异常\"\n            tbs = result.get(\"tbs\", \"\")\n            try:\n                user_info = self.request(self.LOGIN_INFO_URL)\n                user_name = user_info.get(\"userName\", \"未知用户\")\n            except Exception:\n                user_name = \"未知用户\"\n            return tbs, user_name\n        except Exception as e:\n            return False, f\"登录验证异常: {e}\"\n\n    def get_favorite(self) -> list[dict]:\n        forums = []\n        page_no = 1\n\n        while True:\n            data = {\n                \"BDUSS\": self.bduss,\n                \"_client_type\": \"2\",\n                \"_client_id\": \"wappc_1534235498291_488\",\n                \"_client_version\": \"9.7.8.0\",\n                \"_phone_imei\": \"000000000000000\",\n                \"from\": \"1008621y\",\n                \"page_no\": str(page_no),\n                \"page_size\": \"200\",\n                \"model\": \"MI+5\",\n                \"net_type\": \"1\",\n                \"timestamp\": str(int(time.time())),\n                \"vcode_tag\": \"11\",\n            }\n            data = self.encode_data(data)\n\n            try:\n                res = self.request(self.LIKE_URL, \"post\", data)\n\n                if \"forum_list\" in res:\n                    for forum_type in [\"non-gconforum\", \"gconforum\"]:\n                        if forum_type in res[\"forum_list\"]:\n                            items = res[\"forum_list\"][forum_type]\n                            if isinstance(items, list):\n                                forums.extend(items)\n                            elif isinstance(items, dict):\n                                forums.append(items)\n\n                if res.get(\"has_more\") != \"1\":\n                    break\n\n                page_no += 1\n                time.sleep(random.uniform(1, 2))\n\n            except Exception as e:\n                print(f\"获取贴吧列表出错: {e}\")\n                break\n\n        print(f\"共获取到 {len(forums)} 个关注的贴吧\")\n        return forums\n\n    def sign_forums(self, forums, tbs: str) -> dict:\n        success_count, error_count, exist_count, shield_count = 0, 0, 0, 0\n        total = len(forums)\n        print(f\"开始签到 {total} 个贴吧\")\n        last_request_time = time.time()\n        for idx, forum in enumerate(forums):\n            elapsed = time.time() - last_request_time\n            delay = max(0, 1.0 + random.uniform(0.5, 1.5) - elapsed)\n            time.sleep(delay)\n            last_request_time = time.time()\n            if (idx + 1) % 10 == 0:\n                extra_delay = random.uniform(5, 10)\n                print(f\"已签到 {idx + 1}/{total} 个贴吧，休息 {extra_delay:.2f} 秒\")\n                time.sleep(extra_delay)\n\n            forum_name = forum.get(\"name\", \"\")\n            forum_id = forum.get(\"id\", \"\")\n            log_prefix = f\"【{forum_name}】吧({idx + 1}/{total})\"\n\n            try:\n                data = self.SIGN_DATA.copy()\n                data.update(\n                    {\n                        \"BDUSS\": self.bduss,\n                        \"fid\": forum_id,\n                        \"kw\": forum_name,\n                        \"tbs\": tbs,\n                        \"timestamp\": str(int(time.time())),\n                    }\n                )\n                data = self.encode_data(data)\n                result = self.request(self.SIGN_URL, \"post\", data)\n                error_code = result.get(\"error_code\", \"\")\n                if error_code == \"0\":\n                    success_count += 1\n                    if \"user_info\" in result:\n                        rank = result[\"user_info\"][\"user_sign_rank\"]\n                        print(f\"{log_prefix} 签到成功，第{rank}个签到\")\n                    else:\n                        print(f\"{log_prefix} 签到成功\")\n                elif error_code == \"160002\":\n                    exist_count += 1\n                    print(f\"{log_prefix} {result.get('error_msg', '今日已签到')}\")\n                elif error_code == \"340006\":\n                    shield_count += 1\n                    print(f\"{log_prefix} 贴吧已被屏蔽\")\n                else:\n                    error_count += 1\n                    print(f\"{log_prefix} 签到失败，错误: {result.get('error_msg', '未知错误')}\")\n\n            except Exception as e:\n                error_count += 1\n                print(f\"{log_prefix} 签到异常: {e!s}\")\n        return {\n            \"total\": total,\n            \"success\": success_count,\n            \"exist\": exist_count,\n            \"shield\": shield_count,\n            \"error\": error_count,\n        }\n\n    def main(self) -> str:\n        try:\n            tbs, user_name = self.get_user_info()\n            if not tbs:\n                return f\"账号: {user_name}\\n登录状态: Cookie可能已过期\"\n            forums = self.get_favorite()\n\n            if forums:\n                stats = self.sign_forums(forums, tbs)\n                msg = [\n                    {\"name\": \"帐号信息\", \"value\": user_name},\n                    {\"name\": \"贴吧总数\", \"value\": stats[\"total\"]},\n                    {\"name\": \"签到成功\", \"value\": stats[\"success\"]},\n                    {\"name\": \"已经签到\", \"value\": stats[\"exist\"]},\n                    {\"name\": \"被屏蔽的\", \"value\": stats[\"shield\"]},\n                    {\"name\": \"签到失败\", \"value\": stats[\"error\"]},\n                ]\n            else:\n                msg = [\n                    {\"name\": \"帐号信息\", \"value\": user_name},\n                    {\"name\": \"获取贴吧列表失败，无法完成签到\", \"value\": \"\"},\n                ]\n        except Exception as e:\n            msg = [\n                {\"name\": \"帐号信息\", \"value\": user_name},\n                {\"name\": \"签到失败\", \"value\": str(e)},\n            ]\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"TIEBA\", [])[0]\n    print(Tieba(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/utils/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/utils/message.py",
    "content": "import base64\nimport hashlib\nimport hmac\nimport json\nimport re\nimport time\nfrom urllib.parse import quote_plus\n\nimport requests\n\n\ndef message2server(sckey, content):\n    print(\"server 酱推送开始\")\n    data = {\"text\": \"每日签到\", \"desp\": content.replace(\"\\n\", \"\\n\\n\")}\n    requests.post(url=f\"https://sc.ftqq.com/{sckey}.send\", data=data)\n\n\ndef message2server_turbo(sendkey, content):\n    data = {\"text\": \"每日签到\", \"desp\": content.replace(\"\\n\", \"\\n\\n\")}\n    if match := re.match(r\"^sctp(\\d+)t\", sendkey):\n        sc3uid = match.group(1)\n        print(\"Server 酱³ 推送开始\")\n        url = f\"https://{sc3uid}.push.ft07.com/send/{sendkey}.send?tags=DailyCheckin\"\n    else:\n        print(\"server 酱 Turbo 推送开始\")\n        url = f\"https://sctapi.ftqq.com/{sendkey}.send\"\n    requests.post(url=url, data=data)\n\n\ndef message2coolpush(\n    coolpushskey,\n    content,\n    coolpushqq: bool = True,\n    coolpushwx: bool = False,\n    coolpushemail: bool = False,\n):\n    print(\"Cool Push 推送开始\")\n    params = {\"c\": content, \"t\": \"每日签到\"}\n    if coolpushqq:\n        requests.post(url=f\"https://push.xuthus.cc/send/{coolpushskey}\", params=params)\n    if coolpushwx:\n        requests.post(url=f\"https://push.xuthus.cc/wx/{coolpushskey}\", params=params)\n    if coolpushemail:\n        requests.post(url=f\"https://push.xuthus.cc/email/{coolpushskey}\", params=params)\n\n\ndef message2qmsg(qmsg_key, qmsg_type, content):\n    print(\"qmsg 酱推送开始\")\n    params = {\"msg\": content}\n    if qmsg_type == \"group\":\n        requests.get(url=f\"https://qmsg.zendee.cn/group/{qmsg_key}\", params=params)\n    else:\n        requests.get(url=f\"https://qmsg.zendee.cn/send/{qmsg_key}\", params=params)\n\n\ndef message2telegram(tg_api_host, tg_proxy, tg_bot_token, tg_user_id, content):\n    print(\"Telegram 推送开始\")\n    send_data = {\n        \"chat_id\": tg_user_id,\n        \"text\": content,\n        \"disable_web_page_preview\": \"true\",\n    }\n    if tg_api_host:\n        url = f\"https://{tg_api_host}/bot{tg_bot_token}/sendMessage\"\n    else:\n        url = f\"https://api.telegram.org/bot{tg_bot_token}/sendMessage\"\n    if tg_proxy:\n        proxies = {\n            \"http\": tg_proxy,\n            \"https\": tg_proxy,\n        }\n    else:\n        proxies = None\n    requests.post(url=url, data=send_data, proxies=proxies)\n\n\ndef message2feishu(fskey, content):\n    print(\"飞书 推送开始\")\n    data = {\"msg_type\": \"text\", \"content\": {\"text\": content}}\n    requests.post(url=f\"https://open.feishu.cn/open-apis/bot/v2/hook/{fskey}\", json=data)\n\n\ndef message2dingtalk(dingtalk_secret, dingtalk_access_token, content):\n    print(\"Dingtalk 推送开始\")\n    timestamp = str(round(time.time() * 1000))\n    secret_enc = dingtalk_secret.encode(\"utf-8\")\n    string_to_sign = f\"{timestamp}\\n{dingtalk_secret}\"\n    string_to_sign_enc = string_to_sign.encode(\"utf-8\")\n    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()\n    sign = quote_plus(base64.b64encode(hmac_code))\n    send_data = {\"msgtype\": \"text\", \"text\": {\"content\": content}}\n    requests.post(\n        url=f\"https://oapi.dingtalk.com/robot/send?access_token={dingtalk_access_token}&timestamp={timestamp}&sign={sign}\",\n        headers={\"Content-Type\": \"application/json\", \"Charset\": \"UTF-8\"},\n        data=json.dumps(send_data),\n    )\n\n\ndef message2bark(bark_url: str, content):\n    print(\"Bark 推送开始\")\n    if not bark_url.endswith(\"/\"):\n        bark_url += \"/\"\n    content = quote_plus(content)\n    url = f\"{bark_url}{content}\"\n    headers = {\"Content-type\": \"application/x-www-form-urlencoded\"}\n    requests.get(url=url, headers=headers)\n\n\ndef message2qywxrobot(qywx_key, content):\n    print(\"企业微信群机器人推送开始\")\n    requests.post(\n        url=f\"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key={qywx_key}\",\n        data=json.dumps({\"msgtype\": \"text\", \"text\": {\"content\": content}}),\n    )\n\n\ndef message2qywxapp(\n    qywx_corpid,\n    qywx_agentid,\n    qywx_corpsecret,\n    qywx_touser,\n    qywx_media_id,\n    qywx_origin,\n    content,\n):\n    print(\"企业微信应用消息推送开始\")\n    base_url = \"https://qyapi.weixin.qq.com\"\n    if qywx_origin:\n        base_url = qywx_origin\n    res = requests.get(f\"{base_url}/cgi-bin/gettoken?corpid={qywx_corpid}&corpsecret={qywx_corpsecret}\")\n    token = res.json().get(\"access_token\", False)\n    if qywx_media_id:\n        data = {\n            \"touser\": qywx_touser,\n            \"msgtype\": \"mpnews\",\n            \"agentid\": int(qywx_agentid),\n            \"mpnews\": {\n                \"articles\": [\n                    {\n                        \"title\": \"Dailycheckin 签到通知\",\n                        \"thumb_media_id\": qywx_media_id,\n                        \"author\": \"Sitoi\",\n                        \"content_source_url\": \"https://github.com/Sitoi/dailycheckin\",\n                        \"content\": content.replace(\"\\n\", \"<br>\"),\n                        \"digest\": content,\n                    }\n                ]\n            },\n        }\n    else:\n        data = {\n            \"touser\": qywx_touser,\n            \"agentid\": int(qywx_agentid),\n            \"msgtype\": \"textcard\",\n            \"textcard\": {\n                \"title\": \"Dailycheckin 签到通知\",\n                \"description\": content,\n                \"url\": \"https://github.com/Sitoi/dailycheckin\",\n                \"btntxt\": \"开源项目\",\n            },\n        }\n    requests.post(\n        url=f\"{base_url}/cgi-bin/message/send?access_token={token}\",\n        data=json.dumps(data),\n    )\n\n\ndef message2pushplus(pushplus_token, content, pushplus_topic=None):\n    print(\"Pushplus 推送开始\")\n    data = {\n        \"token\": pushplus_token,\n        \"title\": \"签到通知\",\n        \"content\": content.replace(\"\\n\", \"<br>\"),\n        \"template\": \"json\",\n    }\n    if pushplus_topic:\n        data[\"topic\"] = pushplus_topic\n    requests.post(url=\"http://www.pushplus.plus/send\", data=json.dumps(data))\n\n\ndef message2gotify(gotify_url: str, gotify_token: str, gotify_priority: str, content: str) -> None:\n    print(\"Gotify 服务启动\")\n    if not gotify_priority:\n        gotify_priority = \"3\"\n    url = f\"{gotify_url}/message?token={gotify_token}\"\n    data = {\n        \"title\": \"Dailycheckin签到通知\",\n        \"message\": content,\n        \"priority\": gotify_priority,\n    }\n    response = requests.post(url, data=data).json()\n\n    if response.get(\"id\"):\n        print(\"Gotify 推送成功！\")\n    else:\n        print(\"Gotify 推送失败！\")\n\n\ndef message2ntfy(ntfy_url: str, ntfy_topic: str, ntfy_priority: str, content: str) -> None:\n    def encode_rfc2047(text: str) -> str:\n        \"\"\"将文本编码为符合 RFC 2047 标准的格式\"\"\"\n        encoded_bytes = base64.b64encode(text.encode(\"utf-8\"))\n        encoded_str = encoded_bytes.decode(\"utf-8\")\n        return f\"=?utf-8?B?{encoded_str}?=\"\n\n    print(\"Ntfy 服务启动\")\n    if not ntfy_url:\n        ntfy_url = \"https://ntfy.sh\"\n    if not ntfy_priority:\n        ntfy_priority = \"3\"\n    # 使用 RFC 2047 编码 title\n    encoded_title = encode_rfc2047(\"Dailycheckin签到通知\")\n\n    data = content.encode(encoding=\"utf-8\")\n    headers = {\"Title\": encoded_title, \"Priority\": ntfy_priority}  # 使用编码后的 title\n    url = f\"{ntfy_url}/{ntfy_topic}\"\n    response = requests.post(url, data=data, headers=headers)\n    if response.status_code == 200:  # 使用 response.status_code 进行检查\n        print(\"Ntfy 推送成功！\")\n    else:\n        print(\"Ntfy 推送失败！错误信息：\", response.text)\n\n\ndef important_notice():\n    datas = requests.get(url=\"https://api.github.com/repos/Sitoi/dailycheckin/issues?state=open&labels=通知\").json()\n    if datas:\n        data = datas[0]\n        title = data.get(\"title\")\n        body = data.get(\"body\")\n        url = data.get(\"html_url\")\n        notice = f\"{title}\\n{body}\\n详细地址: {url}\"\n    else:\n        notice = None\n    return notice\n\n\ndef push_message(content_list: list, notice_info: dict):\n    dingtalk_secret = notice_info.get(\"dingtalk_secret\")\n    dingtalk_access_token = notice_info.get(\"dingtalk_access_token\")\n    fskey = notice_info.get(\"fskey\")\n    bark_url = notice_info.get(\"bark_url\")\n    sckey = notice_info.get(\"sckey\")\n    sendkey = notice_info.get(\"sendkey\")\n    qmsg_key = notice_info.get(\"qmsg_key\")\n    qmsg_type = notice_info.get(\"qmsg_type\")\n    tg_bot_token = notice_info.get(\"tg_bot_token\")\n    tg_user_id = notice_info.get(\"tg_user_id\")\n    tg_api_host = notice_info.get(\"tg_api_host\")\n    tg_proxy = notice_info.get(\"tg_proxy\")\n    coolpushskey = notice_info.get(\"coolpushskey\")\n    coolpushqq = notice_info.get(\"coolpushqq\")\n    coolpushwx = notice_info.get(\"coolpushwx\")\n    coolpushemail = notice_info.get(\"coolpushemail\")\n    qywx_key = notice_info.get(\"qywx_key\")\n    qywx_corpid = notice_info.get(\"qywx_corpid\")\n    qywx_agentid = notice_info.get(\"qywx_agentid\")\n    qywx_corpsecret = notice_info.get(\"qywx_corpsecret\")\n    qywx_touser = notice_info.get(\"qywx_touser\")\n    qywx_media_id = notice_info.get(\"qywx_media_id\")\n    qywx_origin = notice_info.get(\"qywx_origin\")\n    pushplus_token = notice_info.get(\"pushplus_token\")\n    pushplus_topic = notice_info.get(\"pushplus_topic\")\n    gotify_url = notice_info.get(\"gotify_url\")\n    gotify_token = notice_info.get(\"gotify_token\")\n    gotify_priority = notice_info.get(\"gotify_priority\")\n    ntfy_url = notice_info.get(\"ntfy_url\")\n    ntfy_topic = notice_info.get(\"ntfy_topic\")\n    ntfy_priority = notice_info.get(\"ntfy_priority\")\n    content_str = \"\\n————————————\\n\\n\".join(content_list)\n    merge_push = notice_info.get(\"merge_push\")\n    message_list = [content_str]\n    try:\n        notice = important_notice()\n        if notice:\n            message_list.append(notice)\n            content_list.append(notice)\n    except Exception as e:\n        print(\"获取重要通知失败:\", e)\n    if merge_push is None:\n        if (\n            qmsg_key\n            or coolpushskey\n            or qywx_touser\n            or qywx_corpsecret\n            or qywx_agentid\n            or bark_url\n            or pushplus_token\n            or ntfy_topic\n            or (gotify_url and gotify_token)\n        ):\n            merge_push = False\n        else:\n            merge_push = True\n    if not merge_push:\n        message_list = content_list\n    for message in message_list:\n        if qmsg_key:\n            try:\n                message2qmsg(qmsg_key=qmsg_key, qmsg_type=qmsg_type, content=message)\n            except Exception as e:\n                print(\"qmsg 推送失败\", e)\n        if coolpushskey:\n            try:\n                message2coolpush(\n                    coolpushskey=coolpushskey,\n                    coolpushqq=coolpushqq,\n                    coolpushwx=coolpushwx,\n                    coolpushemail=coolpushemail,\n                    content=message,\n                )\n            except Exception as e:\n                print(\"coolpush 推送失败\", e)\n        if qywx_touser and qywx_corpid and qywx_corpsecret and qywx_agentid:\n            try:\n                message2qywxapp(\n                    qywx_corpid=qywx_corpid,\n                    qywx_agentid=qywx_agentid,\n                    qywx_corpsecret=qywx_corpsecret,\n                    qywx_touser=qywx_touser,\n                    qywx_media_id=qywx_media_id,\n                    qywx_origin=qywx_origin,\n                    content=message,\n                )\n            except Exception as e:\n                print(\"企业微信应用消息推送失败\", e)\n        if bark_url:\n            try:\n                message2bark(bark_url=bark_url, content=message)\n            except Exception as e:\n                print(\"Bark 推送失败\", e)\n        if dingtalk_access_token and dingtalk_secret:\n            try:\n                message2dingtalk(\n                    dingtalk_secret=dingtalk_secret,\n                    dingtalk_access_token=dingtalk_access_token,\n                    content=message,\n                )\n            except Exception as e:\n                print(\"钉钉推送失败\", e)\n        if fskey:\n            try:\n                message2feishu(fskey=fskey, content=message)\n            except Exception as e:\n                print(\"飞书推送失败\", e)\n        if sckey:\n            try:\n                message2server(sckey=sckey, content=message)\n            except Exception as e:\n                print(\"Server 推送失败\", e)\n        if sendkey:\n            try:\n                message2server_turbo(sendkey=sendkey, content=message)\n            except Exception as e:\n                print(\"Server Turbo 推送失败\", e)\n        if qywx_key:\n            try:\n                message2qywxrobot(qywx_key=qywx_key, content=message)\n            except Exception as e:\n                print(\"企业微信群机器人推送失败\", e)\n        if pushplus_token:\n            try:\n                message2pushplus(\n                    pushplus_token=pushplus_token,\n                    content=message,\n                    pushplus_topic=pushplus_topic,\n                )\n            except Exception as e:\n                print(\"Pushplus 推送失败\", e)\n        if tg_user_id and tg_bot_token:\n            try:\n                message2telegram(\n                    tg_api_host=tg_api_host,\n                    tg_proxy=tg_proxy,\n                    tg_user_id=tg_user_id,\n                    tg_bot_token=tg_bot_token,\n                    content=message,\n                )\n            except Exception as e:\n                print(\"Telegram 推送失败\", e)\n        if gotify_url and gotify_token:\n            try:\n                message2gotify(\n                    gotify_url=gotify_url,\n                    gotify_token=gotify_token,\n                    gotify_priority=gotify_priority,\n                    content=message,\n                )\n            except Exception as e:\n                print(\"Gotify 推送失败\", e)\n        if ntfy_topic:\n            try:\n                message2ntfy(\n                    ntfy_url=ntfy_url,\n                    ntfy_topic=ntfy_topic,\n                    ntfy_priority=ntfy_priority,\n                    content=message,\n                )\n            except Exception as e:\n                print(\"Ntfy 推送失败\", e)\n\n\nif __name__ == \"__main__\":\n    print(important_notice())\n"
  },
  {
    "path": "dailycheckin/v2ex/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/v2ex/main.py",
    "content": "import json\nimport os\nimport re\n\nimport requests\nimport urllib3\n\nfrom dailycheckin import CheckIn\n\nurllib3.disable_warnings()\n\n\nclass V2ex(CheckIn):\n    name = \"V2EX 论坛\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n\n    @staticmethod\n    def sign(session):\n        msg = []\n        response = session.get(url=\"https://www.v2ex.com/mission/daily\", verify=False)\n        pattern = (\n            r\"<input type=\\\"button\\\" class=\\\"super normal button\\\"\"\n            r\" value=\\\".*?\\\" onclick=\\\"location\\.href = \\'(.*?)\\';\\\" />\"\n        )\n        urls = re.findall(pattern=pattern, string=response.text)\n        url = urls[0] if urls else None\n        if url is None:\n            return [{\"name\": \"签到失败\", \"value\": \"cookie 可能过期\"}]\n        elif url != \"/balance\":\n            headers = {\"Referer\": \"https://www.v2ex.com/mission/daily\"}\n            data = {\"once\": url.split(\"=\")[-1]}\n            _ = session.get(\n                url=\"https://www.v2ex.com\" + url,\n                verify=False,\n                headers=headers,\n                params=data,\n            )\n        response = session.get(url=\"https://www.v2ex.com/balance\", verify=False)\n        total = re.findall(\n            pattern=r\"<td class=\\\"d\\\" style=\\\"text-align: right;\\\">(\\d+\\.\\d+)</td>\",\n            string=response.text,\n        )\n        total = total[0] if total else \"签到失败\"\n        today = re.findall(\n            pattern=r'<td class=\"d\"><span class=\"gray\">(.*?)</span></td>',\n            string=response.text,\n        )\n        today = today[0] if today else \"签到失败\"\n        username = re.findall(\n            pattern=r\"<a href=\\\"/member/.*?\\\" class=\\\"top\\\">(.*?)</a>\",\n            string=response.text,\n        )\n        username = username[0] if username else \"用户名获取失败\"\n        msg += [\n            {\"name\": \"帐号信息\", \"value\": username},\n            {\"name\": \"今日签到\", \"value\": today},\n            {\"name\": \"帐号余额\", \"value\": total},\n        ]\n        response = session.get(url=\"https://www.v2ex.com/mission/daily\", verify=False)\n        data = re.findall(pattern=r\"<div class=\\\"cell\\\">(.*?)天</div>\", string=response.text)\n        data = data[0] + \"天\" if data else \"获取连续签到天数失败\"\n        msg += [\n            {\"name\": \"签到天数\", \"value\": data},\n        ]\n        return msg\n\n    def main(self):\n        cookie = {item.split(\"=\")[0]: item.split(\"=\")[1] for item in self.check_item.get(\"cookie\").split(\"; \")}\n        session = requests.session()\n        if self.check_item.get(\"proxy\", \"\"):\n            proxies = {\n                \"http\": self.check_item.get(\"proxy\", \"\"),\n                \"https\": self.check_item.get(\"proxy\", \"\"),\n            }\n            session.proxies.update(proxies)\n        requests.utils.add_dict_to_cookiejar(session.cookies, cookie)\n        session.headers.update(\n            {\n                \"user-agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66\",\n                \"accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9\",\n                \"accept-language\": \"zh-CN,zh;q=0.9,en;q=0.8\",\n            }\n        )\n        msg = self.sign(session=session)\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"V2EX\", [])[0]\n    print(V2ex(check_item=_check_item).main())\n"
  },
  {
    "path": "dailycheckin/youdao/__init__.py",
    "content": ""
  },
  {
    "path": "dailycheckin/youdao/main.py",
    "content": "import json\nimport os\n\nimport requests\n\nfrom dailycheckin import CheckIn\n\n\nclass YouDao(CheckIn):\n    name = \"有道云笔记\"\n\n    def __init__(self, check_item):\n        self.check_item = check_item\n\n    @staticmethod\n    def sign(cookies):\n        ad_space = 0\n        refresh_cookies_res = requests.get(\"http://note.youdao.com/login/acc/pe/getsess?product=YNOTE\", cookies=cookies)\n        cookies = dict(refresh_cookies_res.cookies)\n        url = \"https://note.youdao.com/yws/api/daupromotion?method=sync\"\n        res = requests.post(url=url, cookies=cookies)\n        if \"error\" not in res.text:\n            checkin_response = requests.post(\n                url=\"https://note.youdao.com/yws/mapi/user?method=checkin\",\n                cookies=cookies,\n            )\n            for i in range(3):\n                ad_response = requests.post(\n                    url=\"https://note.youdao.com/yws/mapi/user?method=adRandomPrompt\",\n                    cookies=cookies,\n                )\n                ad_space += ad_response.json().get(\"space\", 0) // 1048576\n            if \"reward\" in res.text:\n                sync_space = res.json().get(\"rewardSpace\", 0) // 1048576\n                checkin_space = checkin_response.json().get(\"space\", 0) // 1048576\n                space = sync_space + checkin_space + ad_space\n                youdao_message = f\"+{space}M\"\n            else:\n                youdao_message = \"获取失败\"\n        else:\n            youdao_message = \"Cookie 可能过期\"\n        return youdao_message\n\n    def main(self):\n        youdao_cookie = {item.split(\"=\")[0]: item.split(\"=\")[1] for item in self.check_item.get(\"cookie\").split(\"; \")}\n        try:\n            ynote_pers = youdao_cookie.get(\"YNOTE_PERS\", \"\")\n            uid = ynote_pers.split(\"||\")[-2]\n        except Exception as e:\n            print(f\"获取账号信息失败: {e}\")\n            uid = \"未获取到账号信息\"\n        msg = self.sign(cookies=youdao_cookie)\n        msg = [\n            {\"name\": \"帐号信息\", \"value\": uid},\n            {\"name\": \"获取空间\", \"value\": msg},\n        ]\n        msg = \"\\n\".join([f\"{one.get('name')}: {one.get('value')}\" for one in msg])\n        return msg\n\n\nif __name__ == \"__main__\":\n    with open(\n        os.path.join(os.path.dirname(os.path.dirname(__file__)), \"config.json\"),\n        encoding=\"utf-8\",\n    ) as f:\n        datas = json.loads(f.read())\n    _check_item = datas.get(\"YOUDAO\", [])[0]\n    print(YouDao(check_item=_check_item).main())\n"
  },
  {
    "path": "docker/.dockerignore",
    "content": "config.template.json\ncrontab_list.sh\nMakefile\ndocker-compose.yml"
  },
  {
    "path": "docker/Dockerfile",
    "content": "FROM python:3.9-alpine\n\nWORKDIR /dailycheckin\nCOPY ./start.sh /usr/local/bin\n\nRUN set -ex \\\n    && apk update && apk upgrade\\\n    && apk add --no-cache gcc g++ make libffi-dev openssl-dev\\\n    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \\\n    && echo \"Asia/Shanghai\" > /etc/timezone \\\n    && chmod +x /usr/local/bin/start.sh \\\n    && pip install dailycheckin --upgrade \\\n    && ln -s /root/.local/bin/dailycheckin /usr/bin/dailycheckin\n\nADD . /dailycheckin\n\nENTRYPOINT [\"start.sh\"]"
  },
  {
    "path": "docker/Makefile",
    "content": ".PHONY: build up stop pull logs down exec buildx pushx\n\nbuildx:\n\tdocker buildx build --platform=linux/arm/v6,linux/arm/v7,linux/arm64,linux/amd64 -t sitoi/dailycheckin:latest  .\n\npushx:\n\tdocker buildx build --platform=linux/arm/v6,linux/arm/v7,linux/arm64,linux/amd64 -t sitoi/dailycheckin:latest  . --push\n\nbuild:\n\tdocker-compose build --no-cache\nup:\n\tdocker-compose up -d\nstop:\n\tdocker-compose stop\ndown:\n\tdocker-compose down\npull:\n\tdocker-compose pull\nlogs:\n\tdocker-compose logs -f\nexec:\n\tdocker exec -it dailycheckin sh"
  },
  {
    "path": "docker/config.template.json",
    "content": "{\n    \"BARK_URL\": \"\",\n    \"COOLPUSHEMAIL\": true,\n    \"COOLPUSHQQ\": true,\n    \"COOLPUSHSKEY\": \"\",\n    \"COOLPUSHWX\": true,\n    \"DINGTALK_ACCESS_TOKEN\": \"\",\n    \"DINGTALK_SECRET\": \"\",\n    \"FSKEY\": \"\",\n    \"PUSHPLUS_TOKEN\": \"\",\n    \"PUSHPLUS_TOPIC\": \"\",\n    \"QMSG_KEY\": \"\",\n    \"QMSG_TYPE\": \"\",\n    \"QYWX_AGENTID\": \"\",\n    \"QYWX_CORPID\": \"\",\n    \"QYWX_CORPSECRET\": \"\",\n    \"QYWX_KEY\": \"\",\n    \"QYWX_MEDIA_ID\": \"\",\n    \"QYWX_TOUSER\": \"\",\n    \"SCKEY\": \"\",\n    \"SENDKEY\": \"\",\n    \"TG_API_HOST\": \"\",\n    \"TG_BOT_TOKEN\": \"\",\n    \"TG_PROXY\": \"\",\n    \"TG_USER_ID\": \"\",\n    \"MERGE_PUSH\": \"\",\n    \"ACFUN\": [\n        {\n            \"password\": \"Sitoi\",\n            \"phone\": \"18888xxxxxx\"\n        },\n        {\n            \"password\": \"多账号 密码填写，请参考上面\",\n            \"phone\": \"多账号 手机号填写，请参考上面\"\n        }\n    ],\n    \"ALIYUN\": [\n        {\n            \"refresh_token\": \"599dcf65xxxxxx\"\n        },\n        {\n            \"refresh_token\": \"多账号 refresh_token\"\n        }\n    ],\n    \"AOLAXING\": [\n        {\n            \"cookie\": \"BT_AUTO_tt_common=; Hm_lpvt_7fc3681c21a26a2022ae0ca72e2d6fa5=xxxxxx; BT_LOGIN_tt_common=:187xxxxxx; Hm_lvt_7fc3681c21a26a2022ae0ca72e2d6fa5=xxxxxx;\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"BAIDU\": [\n        {\n            \"data_url\": \"https://fastly.jsdelivr.net/gh/Sitoi/Sitoi.github.io/baidu_urls.txt\",\n            \"submit_url\": \"http://data.zz.baidu.com/urls?site=https://sitoi.cn&token=xxxxxx\",\n            \"times\": 10\n        },\n        {\n            \"data_url\": \"多账号 data_url 链接地址，以实际获取为准\",\n            \"submit_url\": \"多账号 submit_url 链接地址，以实际获取为准\",\n            \"times\": 10\n        }\n    ],\n    \"BAIDUWP\": [\n        {\n            \"cookie\": \"BAIDUID=xxx:FG=1; BAIDUID_BFESS=xxx:FG=1; xxx\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"BILIBILI\": [\n        {\n            \"coin_num\": 0,\n            \"coin_type\": 1,\n            \"cookie\": \"_uuid=xxxxxx; rpdid=xxxxxx; LIVE_BUVID=xxxxxx; PVID=xxxxxx; blackside_state=xxxxxx; CURRENT_FNVAL=xxxxxx; buvid3=xxxxxx; fingerprint3=xxxxxx; fingerprint=xxxxxx; buivd_fp=xxxxxx; buvid_fp_plain=xxxxxx; DedeUserID=xxxxxx; DedeUserID__ckMd5=xxxxxx; SESSDATA=xxxxxx; bili_jct=xxxxxx; bsource=xxxxxx; finger=xxxxxx; fingerprint_s=xxxxxx;\",\n            \"silver2coin\": true\n        },\n        {\n            \"coin_num\": 0,\n            \"coin_type\": 1,\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\",\n            \"silver2coin\": true\n        }\n    ],\n    \"ENSHAN\": [\n        {\n            \"cookie\": \"fpv=xxxxxx; yd_captcha_token=xxxxxx; _dx_captcha_cid=xxxxxx; _dx_uzZo5y=xxxxxx; _dx_FMrPY6=xxxxxx; _dx_app_captchadiscuzpluginbydingxiang2017=xxxxxx; TWcq_2132_pc_size_c=0; TWcq_2132_saltkey=xxxxxx; TWcq_2132_lastvisit=xxxxxx; TWcq_2132_sendmail=1; _dx_captcha_vid=xxxxxx; TWcq_2132_sid=Wyv5Ps; TWcq_2132_ulastactivity=xxxxxx; TWcq_2132_auth=xxxxxx; TWcq_2132_lastcheckfeed=xxxxxx; TWcq_2132_lip=xxxxxx; TWcq_2132_connect_is_bind=1; TWcq_2132_nofavfid=1; TWcq_2132_lastact=xxxxxx\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"FNNASCLUB\": [\n        {\n            \"cookie\": \"pvRK_2132_saltkey=xxxx;xxxxxxx\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"IMAOTAI\": [\n        {\n            \"city\": \"上海市\",\n            \"lat\": \"3.025626\",\n            \"lng\": \"3.025626\",\n            \"mobile\": \"18888xxxxxx\",\n            \"province\": \"上海市\",\n            \"token\": \"eyJxxxxxx\",\n            \"userid\": \"1xxxxxx4\"\n        },\n        {\n            \"city\": \"多账号 城市\",\n            \"lat\": \"多账号 纬度\",\n            \"lng\": \"多账号 经度\",\n            \"mobile\": \"多账号 手机号\",\n            \"province\": \"多账号 省份\",\n            \"token\": \"多账号 token\",\n            \"userid\": \"多账号 用户 id\"\n        }\n    ],\n    \"IQIYI\": [\n        {\n            \"cookie\": \"__dfp=xxxxxx; QP0013=xxxxxx; QP0022=xxxxxx; QYABEX=xxxxxx; P00001=xxxxxx; P00002=xxxxxx; P00003=xxxxxx; P00007=xxxxxx; QC163=xxxxxx; QC175=xxxxxx; QC179=xxxxxx; QC170=xxxxxx; P00010=xxxxxx; P00PRU=xxxxxx; P01010=xxxxxx; QC173=xxxxxx; QC180=xxxxxx; P00004=xxxxxx; QP0030=xxxxxx; QC006=xxxxxx; QC007=xxxxxx; QC008=xxxxxx; QC010=xxxxxx; nu=xxxxxx; __uuid=xxxxxx; QC005=xxxxxx;\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"KGQQ\": [\n        {\n            \"cookie\": \"muid=xxxxxx; uid=xxxxxx; userlevel=xxxxxx; openid=xxxxxx; openkey=xxxxxx; opentype=xxxxxx; qrsig=xxxxxx; pgv_pvid=xxxxxx;\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"MIMOTION\": [\n        {\n            \"max_step\": \"20000\",\n            \"min_step\": \"10000\",\n            \"password\": \"Sitoi\",\n            \"phone\": \"18888xxxxxx\"\n        },\n        {\n            \"max_step\": \"多账号 最大步数填写，请参考上面\",\n            \"min_step\": \"多账号 最小步数填写，请参考上面\",\n            \"password\": \"多账号 密码填写，请参考上面\",\n            \"phone\": \"多账号 手机号填写，请参考上面\"\n        }\n    ],\n    \"SMZDM\": [\n        {\n            \"cookie\": \"__ckguid=xxxxxx\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"TIEBA\": [\n        {\n            \"cookie\": \"BIDUPSID=xxxxxx; PSTM=xxxxxx; BAIDUID=xxxxxx; BAIDUID_BFESS=xxxxxx; delPer=xxxxxx; PSINO=xxxxxx; H_PS_PSSID=xxxxxx; BA_HECTOR=xxxxxx; BDORZ=xxxxxx; TIEBA_USERTYPE=xxxxxx; st_key_id=xxxxxx; BDUSS=xxxxxx; BDUSS_BFESS=xxxxxx; STOKEN=xxxxxx; TIEBAUID=xxxxxx; ab_sr=xxxxxx; st_data=xxxxxx; st_sign=xxxxxx;\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ],\n    \"V2EX\": [\n        {\n            \"cookie\": \"_ga=xxxxxx; __cfduid=xxxxxx; PB3_SESSION=xxxxxx; A2=xxxxxx; V2EXSETTINGS=xxxxxx; V2EX_REFERRER=xxxxxx; V2EX_LANG=xxxxxx; _gid=xxxxxx; V2EX_TAB=xxxxxx;\",\n            \"proxy\": \"使用代理的信息，无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\",\n            \"proxy\": \"使用代理的信息，无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080\"\n        }\n    ],\n    \"YOUDAO\": [\n        {\n            \"cookie\": \"JSESSIONID=xxxxxx; __yadk_uid=xxxxxx; OUTFOX_SEARCH_USER_ID_NCOO=xxxxxx; YNOTE_SESS=xxxxxx; YNOTE_PERS=xxxxxx; YNOTE_LOGIN=xxxxxx; YNOTE_CSTK=xxxxxx; _ga=xxxxxx; _gid=xxxxxx; _gat=xxxxxx; PUBLIC_SHARE_18a9dde3de846b6a69e24431764270c4=xxxxxx;\"\n        },\n        {\n            \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n        }\n    ]\n}"
  },
  {
    "path": "docker/crontab_list.sh",
    "content": "##############默认任务##############\n# 每 12 小时更新 Pipy 包，如果不需要更新 pypi 包请注释掉下面这行\n0 */12 * * * echo \"定时任务更新依赖...\" && pip install dailycheckin --upgrade --user >> /dailycheckin/logs/update-pypi.log 2>&1\n# 每天的 23:50 分清理一次日志\n50 23 */2 * * rm -rf /dailycheckin/logs/*.log\n\n##############每日签到一次任务##############\n# 每日签到(9:00 执行全部签到)\n0 9 * * * cd /dailycheckin && dailycheckin >> /dailycheckin/logs/dailycheckin.log 2>&1\n"
  },
  {
    "path": "docker/default_task.sh",
    "content": "#!/bin/sh\nset -e\n\nexport LANG=\"zh_CN.UTF-8\"\n\necho \"定时任务更新依赖...\"\npip install dailycheckin --upgrade --user\n\necho \"Load the latest crontab task file...\"\necho \"加载最新的定时任务文件...\"\ncrontab /dailycheckin/cron/crontab_list.sh\n"
  },
  {
    "path": "docker/docker-compose.yml",
    "content": "version: '3'\nservices:\n  dailycheckin:\n    image: sitoi/dailycheckin:latest\n    container_name: dailycheckin\n    restart: always\n    tty: true\n    volumes:\n      - ./config/:/dailycheckin/config/\n      - ./logs/:/dailycheckin/logs/\n      - ./cron/:/dailycheckin/cron/\n"
  },
  {
    "path": "docker/start.sh",
    "content": "#!/bin/sh\nset -e\n\nexport LANG=\"zh_CN.UTF-8\"\n\nCRONTAB_FILE=\"/dailycheckin/cron/crontab_list.sh\"\n\necho \"安装最新依赖...\"\npip install dailycheckin --upgrade --user\n\necho \"加载最新的定时任务文件...\"\ncrontab $CRONTAB_FILE\n\nif [ $CRONTAB_FILE ]; then\n  chmod -R 777 $CRONTAB_FILE\nfi\n\necho \"启动 crondtab 定时任务主进程...\"\ncrond -f"
  },
  {
    "path": "docker_start.sh",
    "content": "#!/bin/bash\n\necho \"在当前目录下创建 config 和 cron 文件夹\"\nmkdir -p config\nmkdir -p cron\n\nCONFIG_FILE=\"config/config.json\"\nCRONTAB_FILE=\"cron/crontab_list.sh\"\n\nif [ ! -f \"$CONFIG_FILE\" ]; then\n    echo \"config.json 不存在. 开始下载默认文件...\"\n    curl https://fastly.jsdelivr.net/gh/sitoi/dailycheckin@main/docker/config.template.json -o $CONFIG_FILE\nelse\n    echo \"config.json 已存在. 跳过下载。\"\nfi\n\nif [ ! -f \"$CRONTAB_FILE\" ]; then\n    echo \"crontab_list.sh 不存在. 开始下载默认文件...\"\n    curl https://fastly.jsdelivr.net/gh/sitoi/dailycheckin@main/docker/crontab_list.sh -o $CRONTAB_FILE\nelse\n    echo \"crontab_list.sh 已存在. 跳过下载。\"\nfi\n\n\ndocker --version\nif [ $? -ne 0 ];then\n  echo \"未安装 docker ，请先安装 docker 再运行脚本。\"\nelse\n  echo \"docker 环境存在，检测 docker-compose 环境是否安装...\"\n  docker-compose --version || docker compose version && alias docker-compose=\"docker compose\"\n  if [ $? -ne 0 ];then\n    echo \"未安装 docker-compose，将使用 docker 命令启动容器...\"\n    echo \"开始通过 docker 命令创建容器\"\n    docker pull sitoi/dailycheckin:latest\n    docker run -d -v $(pwd)/config:/dailycheckin/config \\\n      -v $(pwd)/logs:/dailycheckin/logs \\\n      -v $(pwd)/cron:/dailycheckin/cron \\\n      --name dailycheckin \\\n      --restart always \\\n      sitoi/dailycheckin:latest\n  else\n    echo \"docker-compose 环境存在，将使用 docker-compose 命令启动容器...\"\n    echo \"下载 docker-compose.yml 文件\"\n    curl -O https://fastly.jsdelivr.net/gh/sitoi/dailycheckin@main/docker/docker-compose.yml\n    echo \"开始通过 docker-compose 命令创建容器\"\n    docker-compose pull\n    docker-compose up -d\n  fi\nfi\n"
  },
  {
    "path": "docs/components/CardList.tsx",
    "content": "import { Card, Cards } from 'nextra/components'\nimport type { ReactNode } from 'react'\n\ninterface CardItem {\n  title: string\n  href: string\n  icon?: ReactNode\n  children?: ReactNode\n}\n\ninterface CardListProps {\n  cards: CardItem[]\n}\n\nconst defaultCards: CardItem[] = [\n  { title: 'AcFun', href: '/settings/acfun' },\n  { title: '奥拉星', href: '/settings/aolaxing' },\n  { title: '阿里云盘', href: '/settings/aliyun' },\n  { title: 'Baidu 站点提交', href: '/settings/baidu' },\n  { title: '百度网盘会员', href: '/settings/baiduwp' },\n  { title: 'Bilibili', href: '/settings/bilibili' },\n  { title: '恩山无线论坛', href: '/settings/enshan' },\n  { title: '飞牛 NAS', href: '/settings/fnnas' },\n  { title: 'i茅台', href: '/settings/imaotai' },\n  { title: '爱奇艺', href: '/settings/iqiyi' },\n  { title: '全民 K 歌', href: '/settings/kgqq' },\n  { title: '小米运动', href: '/settings/mimotion' },\n  { title: '什么值得买', href: '/settings/smzdm' },\n  { title: '百度贴吧', href: '/settings/tieba' },\n  { title: 'V2EX', href: '/settings/v2ex' },\n  { title: '有道云笔记', href: '/settings/youdao' },\n]\n\nexport default function CardList({ cards = defaultCards }: CardListProps) {\n  return (\n    <Cards>\n      {cards.map((item) => (\n        <Card\n          key={item.href}\n          title={item.title}\n          href={item.href}\n          icon={item.icon}\n        >\n          {item.children}\n        </Card>\n      ))}\n    </Cards>\n  )\n}\n"
  },
  {
    "path": "docs/components/counters.module.css",
    "content": ".counter {\n  border: 1px solid #ccc;\n  border-radius: 5px;\n  padding: 2px 6px;\n  margin: 12px 0 0;\n}\n"
  },
  {
    "path": "docs/components/counters.tsx",
    "content": "// Example from https://beta.reactjs.org/learn\n\nimport { useState } from 'react'\nimport styles from './counters.module.css'\n\nfunction MyButton() {\n  const [count, setCount] = useState(0)\n\n  function handleClick() {\n    setCount(count + 1)\n  }\n\n  return (\n    <div>\n      <button\n        onClick={handleClick}\n        className={styles.counter}\n      >\n        Clicked {count} times\n      </button>\n    </div>\n  )\n}\n\nexport default function MyApp() {\n  return <MyButton />\n}\n"
  },
  {
    "path": "docs/next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/basic-features/typescript for more information.\n"
  },
  {
    "path": "docs/next.config.js",
    "content": "/** @type {import('next').NextConfig} */\nconst withNextra = require('nextra')({\n  theme: 'nextra-theme-docs',\n  themeConfig: './theme.config.tsx',\n})\n\nconst isProduction = process.env.NODE_ENV === 'production'\nconst assetPrefix = isProduction ? '/dailycheckin' : ''\n\nconst nextConfig = {\n  images: {\n    unoptimized: true,\n  },\n  reactStrictMode: true,\n  swcMinify: true,\n  trailingSlash: true,\n  assetPrefix,\n  basePath: assetPrefix,\n  output: 'export',\n}\n\nmodule.exports = {\n  ...withNextra(),\n  ...nextConfig,\n}\n"
  },
  {
    "path": "docs/package.json",
    "content": "{\n  \"name\": \"dailycheckin-docs\",\n  \"version\": \"2025-09-28\",\n  \"description\": \"DailyCheckIn docs\",\n  \"scripts\": {\n    \"dev\": \"next dev\",\n    \"build\": \"next build\",\n    \"start\": \"next start\",\n    \"export\": \"next build && touch out/.nojekyll\",\n    \"deploy\": \"gh-pages -d out -t true\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/Sitoi/dailycheckin.git\"\n  },\n  \"author\": \"Sitoi\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/Sitoi/dailycheckin/issues\"\n  },\n  \"homepage\": \"https://github.com/Sitoi/dailycheckin#readme\",\n  \"dependencies\": {\n    \"next\": \"14.1.0\",\n    \"nextra\": \"2.13.3\",\n    \"nextra-theme-docs\": \"2.13.3\",\n    \"react\": \"^18.2.0\",\n    \"react-dom\": \"^18.2.0\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"20.11.19\",\n    \"typescript\": \"^5.3.3\",\n    \"gh-pages\": \"^6.1.1\"\n  }\n}\n"
  },
  {
    "path": "docs/pages/_meta.json",
    "content": "{\n  \"index\": \"项目介绍\",\n  \"install\": \"部署方法\",\n  \"settings\": \"配置说明\",\n  \"history\": \"更新日志\"\n}\n"
  },
  {
    "path": "docs/pages/history.mdx",
    "content": "import { Callout } from 'nextra/components'\n\n## 2025-12-09\n\n![PyPI](https://img.shields.io/badge/Pypi-v25.12.9-brightgreen)\n\n### ✨ 功能\n\n- 新增「飞牛 Nas」签到\n\n### 🐛 修复\n\n- 修复「恩山」接口失效\n- 修复无法检测到「百度网盘」的问题\n\n## 2025-09-28\n\n![PyPI](https://img.shields.io/badge/Pypi-v25.9.28-brightgreen)\n\n### ✨ 功能\n\n- 新增「百度网盘会员签到和答题」签到\n\n### 🐛 修复\n\n- 修复「小米运动」接口失效\n\n## 2025-05-09\n\n![PyPI](https://img.shields.io/badge/Pypi-v25.5.9-brightgreen)\n\n### 🐛 修复\n\n- 修复「什么值得买」签到奖励信息解析错误\n\n- 重构「百度贴吧」签到逻辑提高稳定性，解决卡住的问题\n\n### 🔥 删除\n\n- 移除「爱奇艺」无效签到及任务逻辑\n\n## 2025-01-07\n\n![PyPI](https://img.shields.io/badge/Pypi-v25.1.7-brightgreen)\n\n### ✨ 功能\n\n- 新增「i 茅台」申购蛇茅申购 🐍\n\n  ```json copy\n  {\n    \"11318\": \"53%vol 500ml贵州茅台酒（乙巳蛇年）\",\n    \"11317\": \"53%vol 500ml贵州茅台酒（笙乐飞天）\",\n    \"11319\": \"53%vol 375mlx2贵州茅台酒（乙巳蛇年）\",\n    \"2478\": \"53%vol 500ml贵州茅台酒（珍品）\",\n    \"11240\": \"53%vol 500ml 茅台1935·中国国家地理文创酒（喜逢大运河）\"\n  }\n  ```\n\n  默认配置申购 `[\"11318\", \"11319\"]`\n\n- 新增「ntfy」和「gotify」和「Server 酱 ³」推送方式\n\n### 🐛 修复\n\n- 企业微信反向代理地址参数 QYWX_ORIGIN 无法获取的问题\n\n## 2024-10-08\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.10.8-brightgreen)\n\n### 🐛 修复\n\n- 修复「小米运动」获取时间戳失败的问题\n\n## 2024-05-15\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.5.15-brightgreen)\n\n### 🐛 修复\n\n- 修复「爱奇艺」签到失效的问题\n\n## 2024-03-19\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.3.19-brightgreen)\n\n### 🐛 修复\n\n- 修复「爱奇艺」摇一摇失败的 BUG\n\n## 2024-03-11\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.3.11-brightgreen)\n\n### 🐛 修复\n\n- 兼容 docker compose\n- 修复「企业微信应用消息」 添加反代设置，修复非可信 IP 的问题。\n\nhttps://developer.work.weixin.qq.com/document/path/90664#%E5%8F%AF%E4%BF%A1ip\n\n## 2024-03-07\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.3.7-brightgreen)\n\n### 🐛 修复\n\n- 修复「Bark」消息不通知的 BUG\n\n## 2024-02-27\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.2.27-brightgreen)\n\n### 🐛 修复\n\n- 修复「爱奇艺」非会员用户脚本错误的 BUG\n- 修复「i 茅台」领取耐力值失败的 BUG\n\n## 2024-02-22\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.2.22-brightgreen)\n\n### 🐛 修复\n\n- 修复「V2EX」日志错误的 BUG\n- 修复「阿里云盘」过期提示\n\n### 📃 文档\n\n- 修改获取 cookie 教程\n\n## 2024-02-20\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.2.20-brightgreen)\n\n### ✨ 功能\n\n- 新增「小米运动」支持邮箱登录\n\n- 新增「爱奇艺」抽白金会员活动\n  - 活动链接：https://vip.iqiyi.com/m-design/Else-2312LargeScreenIndependentPage/2312LargeScreenIndependentPage/index.html\n\n## 2024-02-16\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.2.16-brightgreen)\n\n### ✨ 功能\n\n- 新增「i 茅台」支持自定义申购选择\n\n  ```json copy\n  {\n    \"10941\": \"53%vol 500ml贵州茅台酒（甲辰龙年）\",\n    \"10942\": \"53%vol 375ml×2贵州茅台酒（甲辰龙年）\",\n    \"10056\": \"53%vol 500ml茅台1935\",\n    \"2478\": \"53%vol 500ml贵州茅台酒（珍品）\"\n  }\n  ```\n\n  默认配置申购 `[\"10941\", \"10942\"]`\n\n### 🐛 修复\n\n- 修复「爱奇艺」逛会员优选任务\n\n## 2024-02-09\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.2.9-brightgreen)\n\n### ✨ 功能\n\n- 新增「爱奇艺」每日摇一摇功能\n\n### 📃 文档\n\n- 完善「i 茅台」配置获取教程\n- 修复「百度贴吧」 cookie 获取方式\n\n## 2024-02-06\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.2.6-brightgreen)\n\n### ✨ 功能\n\n- 新增「奥拉星」签到\n\n### 💄 优化\n\n- 优化「什么值得买」日志输出\n- 优化「i 茅台」日志输出\n\n### 📃 文档\n\n- 修复多个 cookie 获取方式\n\n## 2024-01-20\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.1.20-brightgreen)\n\n### ✨ 功能\n\n- 新增「恩山无线论坛」签到\n\n## 2024-01-16\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.1.16-brightgreen)\n\n### 🐛 修复\n\n- 修复「爱奇艺」每日签到 BUG\n\n### 📄 文档\n\n- 更新 群晖 部署教程\n\n## 2024-01-14\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.1.14-brightgreen)\n\n### ✨ 功能\n\n- 新增「爱奇艺」刷观看时长、领域 VIP7 升级星钻会员等功能\n\n### 📦 部署\n\n- 更新 Docker 部署\n\n  - 优化自定义定时任务方式（建议优化）\n\n### ⚠️ 建议\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  建议 Docker 用户 和 群晖用户 升级 Docker Image。\n</Callout>\n\n1. 备份 config.json 文件\n2. 更新 image 镜像{' '}\n\n```bash copy\ncurl https://fastly.jsdelivr.net/gh/sitoi/dailycheckin@main/docker_start.sh | bash\n```\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  建议 其他方式部署的用户，更改定时时间到早上 09:00-10:00（茅台申购时间段）。\n</Callout>\n\n1. 修改 crontab 定时配置即可\n\n## 2024-01-13\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.1.13-brightgreen)\n\n### ✨ 功能\n\n- 新增「阿里云盘」签到\n- 新增「i 茅台」申购\n- 新增「什么值得买」签到\n\n### 🐛 修复\n\n- 修复「bilibili」大会员奖励领取\n\n### 🔥 删除\n\n- 删除「Fa 米家」\n\n### 📃 文档\n\n- 详细说明每个签到信息获取方式\n- 删除「腾讯云函数」部署（收费了）\n- 删除「阿里云函数」部署（收费了）\n- 删除「elecV2P」部署\n\n## 2024-01-07\n\n![PyPI](https://img.shields.io/badge/Pypi-v24.1.7-brightgreen)\n\n### 🐛 修复\n\n- 修复 Bilibili 兑换银瓜子 BUG\n\n## 2023-10-18\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v23.10.18-brightgreen)\n\n### 🔥 删除\n\n- 删除失效脚本\n\n## 2023-02-21\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.4.0-brightgreen)\n\n### 🐛 修复\n\n- 修复&删除失效脚本\n\n## 2022-04-26\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.3.8-brightgreen)\n\n### 🐛 修复\n\n- 修复【百度贴吧】签到功能\n\n### 🔥 删除\n\n- 删除【吾爱破解】&【网易云音乐】\n\n## 2022-03-17\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.3.7-brightgreen)\n\n### ✨ 功能\n\n- 新增【多看阅读】延期功能\n- 新增【Bilibili】银瓜子兑换功能\n- 新增【爱奇艺】WEB 签到功能\n\n### 🐛 修复\n\n- 修复【爱奇艺】签到功能\n\n## 2021-11-04\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.3.4-brightgreen)\n\n### ✨ 功能\n\n- 新增【联通沃邮箱】网页端和客户端任务\n- 新增【联通沃邮箱】是否 21 天断签配置\n\n### 🐛 修复\n\n- 修复【联通沃邮箱】俱乐部签到\n\n### 🔥 删除\n\n- 移除【联通沃邮箱】拼图活动\n\n## 2021-10-13\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.3.1-brightgreen)\n\n- 修复【联通沃邮箱】脚本\n- 完善【欢太商城】脚本\n- 修复【pushplus 推送】限制，改为分开推送\n- 添加最新版本内容推送\n\n## 2021-10-11\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.2.6-brightgreen)\n\n### 🐛 修复\n\n- 修复【联通沃邮箱】脚本\n\n## 2021-10-09\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.2.5-brightgreen)\n\n### ✨ 功能\n\n- 添加推送合并或拆分功能\n\n### 💄 优化\n\n- 优化企业微信推送\n\n## 2021-09-22\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.2.2-brightgreen)\n\n### ✨ 功能\n\n- 添加【时光相册】签到脚本\n\n### 💄 优化\n\n- 优化日志输出\n- Bark 通知改为分批发送\n\n### 🐛 修复\n\n- 修复【联通营业厅】日志错误\n\n## 2021-09-20\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.2.1-brightgreen)\n\n### ✨ 功能\n\n- 添加【联通营业厅】脚本\n- 更新【联通沃邮箱】每日签到脚本(21 天自动断签)\n\n### 💄 优化\n\n- 优化配置文件\n\n### 🔥 删除\n\n- 移除【每日天气】\n\n## 2021-09-20\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.9-brightgreen)\n\n### ✨ 功能\n\n- 添加【欢太商城】脚本\n\n### 💄 优化\n\n- 优化项目结构\n\n## 2021-09-19\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.8-brightgreen)\n\n### 💄 优化\n\n- 优化日志输出\n\n### 🔥 删除\n\n- 移除每日一句脚本\n\n## 2021-09-03\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.7-brightgreen)\n\n### ✨ 功能\n\n- 适配青龙\n- 支持指定运行某个脚本\n\n### 🐛 修复\n\n- 修复【小米运动】签到脚本\n- 修复【爱奇艺】签到脚本\n\n## 2021-08-18\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.4-brightgreen)\n\n### 🐛 修复\n\n- 修复【小米运动】签到脚本\n\n## 2021-07-29\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.3-brightgreen)\n\n### ✨ 功能\n\n- 添加【飞书】推送功能\n\n### 🐛 修复\n\n- 修复【天翼云】签到脚本\n- 修复【AcFun】签到脚本\n\n## 2021-07-05\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.1-brightgreen)\n\n### 🐛 修复\n\n- 修复【Bilibili】签到脚本\n\n## 2021-06-01\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.1.0-brightgreen)\n\n### 🔥 删除\n\n- 删除【联通】&【WPS】签到脚本\n\n## 2021-05-30\n\n- ![PyPI](https://img.shields.io/badge/Pypi-v0.0.8-brightgreen)\n\n### 🐛 修复\n\n- 更新【联通沃邮箱】每日签到脚本\n\n## 2021-04-28\n\n### ✨ 功能\n\n- 添加【联通沃邮箱】每日签到脚本 感谢水友`@什么大风大浪都见过` 提供脚本\n\n## 2021-04-07\n\n### ✨ 功能\n\n- 添加【王者营地】每日签到脚本\n- 添加【CSDN】每日签到脚本\n- 添加【AcFun】每日分享任务功能\n\n## 2021-03-30\n\n### ✨ 功能\n\n- 添加【微博】每日签到脚本\n- 添加【多看阅读】每日签到脚本\n\n## 2021-03-16\n\n### ✨ 功能\n\n- 添加【智友邦】每日签到脚本\n\n## 2021-03-10\n\n### ✨ 功能\n\n- 添加【爱奇艺】10s 任务\n\n## 2021-03-09\n\n### ✨ 功能\n\n- 添加【pushplus】推送功能\n- 添加【配置文件】GitHub Actions 使用整个 config.json 配置文件\n\n## 2021-03-06\n\n### ✨ 功能\n\n- 添加【和彩云】签到和抽奖功能\n\n## 2021-03-03\n\n### ✨ 功能\n\n- 添加【MEIZU 社区】签到和抽奖功能\n\n## 2021-03-02\n\n### ✨ 功能\n\n- 添加【企业微信群机器人】推送功能\n- 添加【企业微信应用消息】推送功能\n\n## 2021-03-01\n\n### ✨ 功能\n\n- 添加【哔咔漫画】每日签到脚本\n- 添加【芒果 TV】每日签到脚本\n\n## 2021-02-23\n\n### ✨ 功能\n\n- 添加【WPS】每日签到脚本\n- 添加【吾爱破解】每日签到脚本\n\n## 2021-02-21\n\n### ✨ 功能\n\n- 添加【全民 K 歌】VIP 每日签到脚本\n\n## 2021-02-20\n\n### ✨ 功能\n\n- 添加【server 酱 turbo 版】推送功能\n\n## 2021-01-27\n\n### ✨ 功能\n\n- 添加【天翼云盘】每日签到脚本\n\n## 2021-01-22\n\n### ✨ 功能\n\n- 添加【AcFun】每日签到脚本\n\n## 2021-01-19\n\n### ✨ 功能\n\n- 添加【Bark】推送功能\n\n## 2021-01-16\n\n### ✨ 功能\n\n- 添加【小米运动】刷步数功能\n\n## 2021-01-07\n\n### ✨ 功能\n\n- 添加【什么值得买】每日签到脚本\n- 添加【咔叽网单】每日签到脚本\n- 添加【V2EX】每日签到脚本\n\n## 2021-01-03\n\n### ✨ 功能\n\n- 添加【联通】每日签到脚本\n\n## 2020-12-22\n\n### ✨ 功能\n\n- 添加【Cool Push】推送功能\n\n## 2020-12-21\n\n### ✨ 功能\n\n- 添加【bilibili】每日签到脚本\n- 添加【百度贴吧】每日签到脚本\n\n## 2020-12-19\n\n### ✨ 功能\n\n- 添加【Fa 米家 App】每日签到脚本\n\n## 2020-12-10\n\n### ✨ 功能\n\n- 添加【一加手机社区官方论坛】每日签到脚本\n\n## 2020-12-07\n\n### ✨ 功能\n\n- 添加【每日天气】预报\n- 添加【每日一句】获取\n\n## 2020-12-06\n\n### ✨ 功能\n\n- 添加【网易云音乐】每日签到脚本\n- 添加【腾讯视频】每日签到脚本\n- 添加【吾爱破解】每日签到脚本\n- 添加【有道云笔记】每日签到脚本\n- 添加【爱奇艺】每日签到脚本\n- 添加【百度站点】每日提交脚本\n"
  },
  {
    "path": "docs/pages/index.md",
    "content": "<div align=\"center\">\n\n<img src=\"https://socialify.git.ci/Sitoi/dailycheckin/image?font=Rokkitt&forks=1&issues=1&language=1&name=1&owner=1&pattern=Circuit%20Board&pulls=1&stargazers=1&theme=Dark\">\n\n<h1>DailyCheckIn</h1>\n\n基于「Docker」/「青龙面板」/「群晖」/「本地」的每日签到脚本\n\n<!-- SHIELD GROUP -->\n<div id=\"shield\">\n\n<style>\n#shield img {\n    display: inline-block;\n}\n</style>\n\n[![][github-releases-shield]][github-releases-link]\n[![][pypi-version-shield]][pypi-version-link]\n[![][github-release-date-shield]][github-release-date-link]\n[![][github-stars-shield]][github-stars-link]\n[![][github-forks-shield]][github-forks-link]\n[![][github-issues-shield]][github-issues-link]\n[![][github-contributors-shield]][github-contributors-link]\n\n[![][python-version-shield]][python-version-link]\n[![][pypi-dm-shield]][pypi-dm-link]\n[![][docker-pull-shield]][docker-pull-link]\n[![][docker-size-shield]][docker-size-link]\n[![][docker-stars-shield]][docker-stars-link]\n[![][github-license-shield]][github-license-link]\n\n<!-- SHIELD GROUP -->\n</div>\n</div>\n\n## ✨ 特性\n\n- 📦 支持 Pypi 包安装\n- 💻 支持多个平台部署\n- ⚙️ 支持多个平台签到\n- 📢 支持多个平台通知\n- ♾️ 支持多个账号签到\n- 🕙 支持定时任务设置\n- 🆙 支持项目自动更新\n\n## 🦄 教程\n\n[https://sitoi.github.io/dailycheckin/](https://sitoi.github.io/dailycheckin/)\n\n## 🧾 列表\n\n🟢: 正常运行 🔴: 脚本暂不可用 🔵: 可以执行(需更新) 🟡: 待测试 🟤: 看脸\n\n| 状态 | 任务名称  | 名称网站                                                   | 检查日期 | 备注                                                                         |\n| ---- | --------- | ---------------------------------------------------------- | -------- | ---------------------------------------------------------------------------- |\n| 🟢️  | KGQQ      | [全民 K 歌](https://kg.qq.com/index-pc.html)               | 25.09.28 | 每日签到获取鲜花 每日大约 120 鲜花左右                                       |\n| 🟢️  | YOUDAO    | [有道云笔记](https://note.youdao.com/web/)                 | 25.09.28 | 每日签到获取存储空间                                                         |\n| 🟢️  | TIEBA     | [百度贴吧](https://tieba.baidu.com/index.html)             | 25.09.28 | 贴吧每日签到                                                                 |\n| 🟢️  | BAIDUWP   | [百度网盘](https://pan.baidu.com/wap/svip/growth/task)     | 25.09.28 | 百度网盘会员签到和答题功能                                                   |\n| 🟢️  | BILIBILI  | [BiliBili](https://www.bilibili.com/)                      | 25.09.28 | 漫画签到，每日经验任务，自动投币，银瓜子换硬币等功能                         |\n| 🟢️  | V2EX      | [V2EX](https://www.v2ex.com/)                              | 25.09.28 | 铜币奖励                                                                     |\n| 🟢️  | ACFUN     | [AcFun](https://www.acfun.cn/)                             | 25.09.28 | 每日签到香蕉                                                                 |\n| 🟢️  | IQIYI     | [爱奇艺](https://www.iqiyi.com/)                           | 25.09.28 | ① VIP7 每月免费领白金会员；② 抽白金会员 5 次；③ 摇一摇抽奖 3 次；④ 抽奖 3 次 |\n| 🟢️  | SMZDM     | [什么值得买](https://www.smzdm.com/)                       | 24.02.20 | 签到和抽奖                                                                   |\n| 🟢️  | ALIYUN    | [阿里云盘](https://www.aliyundrive.com/drive/)             | 24.02.20 | 签到获取免费会员和空间                                                       |\n| 🟢️  | ENSHAN    | [恩山无线论坛](https://www.right.com.cn/forum/)            | 24.02.20 | 签到获取硬币和积分                                                           |\n| 🟢️  | FNNASCLUB | [飞牛 Nas](https://club.fnnas.com/)                        | 25.12.09 | 签到奖励                                                                     |\n| 🟢️  | AOLAXING  | [奥拉星](http://www.100bt.com/m/creditMall/?gameId=2#task) | 24.02.20 | 签到获取积分                                                                 |\n| 🟢️  | IMAOTAI   | i 茅台                                                     | 25.09.28 | 申购生肖茅台                                                                 |\n| 🟤   | MIMOTION  | 小米运动                                                   | 25.09.28 | 每日小米运动刷步数                                                           |\n| 🟢️  | BAIDU     | [百度站点](https://ziyuan.baidu.com/site/index#/)          | 25.09.28 | 提交网站页面供百度收录                                                       |\n\n## 💬 通知列表\n\n- dingtalk（钉钉）\n- 企业微信群机器人（企业微信）\n- 企业微信应用消息（企业微信）\n- telegram（TG）\n- Bark（iOS）\n- server 酱（微信）\n- server 酱 TURBO（微信）\n- pushplus（微信）\n- Cool Push（QQ,微信,邮箱）\n- qmsg 酱（QQ）\n- 飞书（飞书）\n- ntfy（安卓）\n- gotify（安卓）\n\n## 🤝 参与贡献\n\n我们非常欢迎各种形式的贡献。如果你对贡献代码感兴趣，可以查看我们的 GitHub [Issues][github-issues-link]，大展身手，向我们展示你的奇思妙想。\n\n[![][pr-welcome-shield]][pr-welcome-link]\n\n### 💗 感谢我们的贡献者\n\n[![][github-contrib-shield]][github-contrib-link]\n\n## ✨ Star 数\n\n[![][starchart-shield]][starchart-link]\n\n---\n\n## 📝 License\n\nCopyright © 2021 [Sitoi][profile-link]. <br />\nThis project is [MIT](https://github.com/Sitoi/dailycheckin/blob/main/LICENSE) licensed.\n\n<!-- LINK GROUP -->\n\n[profile-link]: https://github.com/sitoi\n[github-codespace-link]: https://codespaces.new/sitoi/dailycheckin\n[github-codespace-shield]: https://github.com/sitoi/dailycheckin/blob/main/images/codespaces.png?raw=true\n[github-contributors-link]: https://github.com/sitoi/dailycheckin/graphs/contributors\n[github-contributors-shield]: https://img.shields.io/github/contributors/sitoi/dailycheckin?color=c4f042&labelColor=black&style=flat-square\n[github-forks-link]: https://github.com/sitoi/dailycheckin/network/members\n[github-forks-shield]: https://img.shields.io/github/forks/sitoi/dailycheckin?color=8ae8ff&labelColor=black&style=flat-square\n[github-issues-link]: https://github.com/sitoi/dailycheckin/issues\n[github-issues-shield]: https://img.shields.io/github/issues/sitoi/dailycheckin?color=ff80eb&labelColor=black&style=flat-square\n[github-license-link]: https://github.com/sitoi/dailycheckin/blob/main/LICENSE\n[github-license-shield]: https://img.shields.io/github/license/sitoi/dailycheckin?labelColor=black&style=flat-square\n[github-stars-link]: https://github.com/sitoi/dailycheckin/stargazers\n[github-stars-shield]: https://img.shields.io/github/stars/sitoi/dailycheckin?color=ffcb47&labelColor=black&style=flat-square\n[github-releases-link]: https://github.com/sitoi/dailycheckin/releases\n[github-releases-shield]: https://img.shields.io/github/v/release/sitoi/dailycheckin?labelColor=black&style=flat-square\n[github-release-date-link]: https://github.com/sitoi/dailycheckin/releases\n[github-release-date-shield]: https://img.shields.io/github/release-date/sitoi/dailycheckin?labelColor=black&style=flat-square\n[pr-welcome-link]: https://github.com/sitoi/dailycheckin/pulls\n[pr-welcome-shield]: https://img.shields.io/badge/🤯_pr_welcome-%E2%86%92-ffcb47?labelColor=black&style=for-the-badge\n[github-contrib-link]: https://github.com/sitoi/dailycheckin/graphs/contributors\n[github-contrib-shield]: https://contrib.rocks/image?repo=sitoi%2Fdailycheckin\n[docker-pull-shield]: https://img.shields.io/docker/pulls/sitoi/dailycheckin?labelColor=black&style=flat-square\n[docker-pull-link]: https://hub.docker.com/repository/docker/sitoi/dailycheckin\n[docker-size-shield]: https://img.shields.io/docker/image-size/sitoi/dailycheckin?labelColor=black&style=flat-square\n[docker-size-link]: https://hub.docker.com/repository/docker/sitoi/dailycheckin\n[docker-stars-shield]: https://img.shields.io/docker/stars/sitoi/dailycheckin?labelColor=black&style=flat-square\n[docker-stars-link]: https://hub.docker.com/repository/docker/sitoi/dailycheckin\n[pypi-dm-shield]: https://img.shields.io/pypi/dm/dailycheckin?label=pypi&labelColor=black&style=flat-square\n[pypi-dm-link]: https://pypi.org/project/dailycheckin/\n[python-version-link]: https://pypi.org/project/dailycheckin/\n[python-version-shield]: https://img.shields.io/pypi/pyversions/dailycheckin?labelColor=black&style=flat-square\n[pypi-version-shield]: https://img.shields.io/pypi/v/dailycheckin?labelColor=black&style=flat-square\n[pypi-version-link]: https://pypi.org/project/dailycheckin/\n[starchart-shield]: https://api.star-history.com/svg?repos=sitoi/dailycheckin&type=Date\n[starchart-link]: https://star-history.com/#sitoi/dailycheckin&Date\n"
  },
  {
    "path": "docs/pages/install/_meta.json",
    "content": "{\n  \"docker\": \"Docker 部署\",\n  \"qinglong\": \"青龙部署\",\n  \"synology\": \"群辉部署\",\n  \"local\": \"手动部署\"\n}\n"
  },
  {
    "path": "docs/pages/install/docker.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport { FileTree } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"手动部署\"\n    href=\"/install/local\"\n  />\n  <Card\n    title=\"青龙部署\"\n    href=\"/install/qinglong\"\n  />\n  <Card\n    title=\"群晖部署\"\n    href=\"/install/synology\"\n  />\n</Cards>\n# Docker 使用教程\n\n## 一、安装\n\n运行如下命令一键启动并创建服务\n\n```bash copy\ncurl https://fastly.jsdelivr.net/gh/sitoi/dailycheckin@main/docker_start.sh | bash\n```\n\n> 运行成功会自动创建如下目录结构, 并成功启动 docker 服务。\n\n<FileTree>\n  <FileTree.Folder\n    name=\".\"\n    defaultOpen\n  >\n    <FileTree.Folder\n      name=\"config\"\n      defaultOpen\n    >\n      <FileTree.File name=\"config.json\" />\n    </FileTree.Folder>\n    <FileTree.Folder\n      name=\"cron\"\n      defaultOpen\n    >\n      <FileTree.File name=\"crontab_list.sh\" />\n    </FileTree.Folder>\n    <FileTree.Folder\n      name=\"logs\"\n      defaultOpen\n    >\n      <FileTree.File name=\"default_task.log\" />\n    </FileTree.Folder>\n    <FileTree.File name=\"docker-compose.yml\" />\n\n  </FileTree.Folder>\n</FileTree>\n\n- `./config/config.json`: 配置文件\n- `./cron/crontab_list.sh`: 配置定时任务的文件\n- `./logs`: 日志文件\n- `./docker-compose.yml`: docker 启动文件（只在有 docker-compose 的情况下创建）\n\n## 二、配置\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n文件路径: `./config/config.json`\n\n参考[配置说明文档](/settings/config) ，并修改 `config.json`\n\n## 三、定时\n\n修改 `./cron/crontab_list.sh` 文件, 根据实际情况修改下面的默认文件。\n\n```bash filename=\"crontab_list.sh\" copy\n##############默认任务##############\n# 每 12 小时更新 Pipy 包，如果不需要更新 pypi 包请注释掉下面这行\n0 */12 * * * echo \"定时任务更新依赖...\" && pip install dailycheckin --upgrade --user >> /dailycheckin/logs/update-pypi.log 2>&1\n# 每天的 23:50 分清理一次日志\n50 23 */2 * * rm -rf /dailycheckin/logs/*.log\n\n##############每日签到一次任务##############\n# 每日签到(9:00 执行全部签到)\n0 9 * * * cd /dailycheckin && dailycheckin >> /dailycheckin/logs/dailycheckin.log 2>&1\n```\n\n## 四、运行\n\n#### 运行全部脚本\n\n```bash copy\ndocker exec -it dailycheckin dailycheckin\n```\n\n#### 运行指定脚本（包含），可以同时选择多个，用「空格」分开\n\n```bash copy\ndocker exec -it dailycheckin dailycheckin --include MUSIC163 BAIDU\n```\n\n#### 运行指定脚本（排除），可以同时选择多个，用「空格」分开\n\n```bash copy\ndocker exec -it dailycheckin dailycheckin --exclude MUSIC163 BAIDU\n```\n\n## 更新 Pypi\n\n```bash copy\ndocker exec dailycheckin sh /dailycheckin/default_task.sh\n```\n\n## 升级 Docker Image\n\n```bash copy\ncurl https://fastly.jsdelivr.net/gh/sitoi/dailycheckin@main/docker_start.sh | bash\n```\n\n## 附录\n\n### docker-compose 安装\n\n##### 方式一（Python 环境）\n\n```bash copy\npip3 install docker-compose\n```\n\n##### 方式二\n\n```bash copy\nsudo curl -L \"https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\" -o /usr/local/bin/docker-compose\nsudo chmod +x /usr/local/bin/docker-compose\n```\n\n通过 `docker-compose version` 查看 `docker-compose` 版本，确认是否安装成功。\n\n### docker-compose 常用命令\n\n- `docker-compose logs` 打印日志\n- `docker-compose pull` 更新镜像\n- `docker-compose stop` 停止容器\n- `docker-compose restart` 重启容器\n- `docker-compose down` 停止并删除容器\n- `docker exec -it dailycheckin sh` 进入 docker\n"
  },
  {
    "path": "docs/pages/install/local.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"Docker 部署\"\n    href=\"/install/docker\"\n  />\n  <Card\n    title=\"青龙部署\"\n    href=\"/install/qinglong\"\n  />\n  <Card\n    title=\"群晖部署\"\n    href=\"/install/synology\"\n  />\n</Cards>\n\n# 手动部署\n\n## 一、安装\n\n```bash copy\npip install dailycheckin --user\n```\n\n## 二、配置\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n在项目目录下新建并编写 `config.json` 配置文件，参考[配置说明文档](/settings/config) ，并修改 `config.json`\n\n## 三、运行\n\n1. 运行全部脚本\n\n   ```bash copy\n   dailycheckin\n   ```\n\n2. 运行指定脚本（包含），可以同时选择多个，用「空格」分开\n\n   ```bash copy\n   dailycheckin --include MUSIC163 BAIDU\n   ```\n\n3. 运行指定脚本（排除），可以同时选择多个，用「空格」分开\n\n   ```bash copy\n   dailycheckin --exclude MUSIC163 BAIDU\n   ```\n\n## 四、更新\n\n```bash copy\npip install dailycheckin --user --upgrade\n```\n"
  },
  {
    "path": "docs/pages/install/qinglong.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"手动部署\"\n    href=\"/install/local\"\n  />\n  <Card\n    title=\"Docker 部署\"\n    href=\"/install/docker\"\n  />\n  <Card\n    title=\"群晖部署\"\n    href=\"/install/synology\"\n  />\n</Cards>\n# 青龙使用教程\n\n## 一、安装\n\n<Steps>\n### 选择「依赖管理」\n\n![点击依赖管理](../img/qinglong/1.png)\n\n### 新建 Linux 依赖\n\n#### 1. 点击 Linux\n\n![点击 Linux](../img/qinglong/2.png)\n\n#### 2. 点击新建依赖\n\n![点击新建依赖](../img/qinglong/3.png)\n\n#### 3. 输入依赖\n\n```text copy\ngcc g++ make libffi-dev openssl-dev\n```\n\n![输入依赖](../img/qinglong/4.png)\n\n#### 4. 点击确认，等待安装完成\n\n![点击确认](../img/qinglong/5.png)\n\n### 新建 Python 依赖\n\n#### 1. 点击 Python\n\n![点击 Linux](../img/qinglong/6.png)\n\n#### 2. 点击新建依赖\n\n![点击新建依赖](../img/qinglong/7.png)\n\n#### 3. 输入 dailycheckin\n\n![输入 dailycheckin](../img/qinglong/8.png)\n\n#### 4. 点击确认，等待安装完成\n\n![点击确认](../img/qinglong/9.png)\n\n</Steps>\n\n## 二、配置\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n<Steps>\n### 选择「脚本管理」\n\n![点击选择「脚本管理」](../img/qinglong/10.png)\n\n### 点击 ➕ 添加\n\n![点击 ➕ 添加](../img/qinglong/11.png)\n\n### 输入文件名 config.json 后确定\n\n![输入文件名](../img/qinglong/12.png)\n\n### 配置 config.json 文件\n\n参考[配置说明文档](/settings/config) ，并修改 `config.json`\n\n![编辑配置](../img/qinglong/13.png)\n![配置示例](../img/qinglong/14.png)\n\n</Steps>\n\n## 三、运行\n\n1. 运行全部脚本\n   ![定时任务](../img/qinglong/15.png)\n2. 运行指定脚本（包含），可以同时选择多个，用「空格」分开\n   ![定时任务](../img/qinglong/16.png)\n3. 运行指定脚本（排除），可以同时选择多个，用「空格」分开\n   ![定时任务](../img/qinglong/17.png)\n\n## 四、更新\n\n添加一个定时任务，名称为 更新Dailycheckin（可自定义），命令为 `task pip3 install dailycheckin --upgrade`，定时规则为 0 0 * * *。\n\n国内机器如无法完成更新，可为命令设置镜像，将命令改为 `task pip3 install dailycheckin --upgrade -i https://pypi.mirrors.ustc.edu.cn/simple/` 后再更新。\n\n![定时更新](../img/qinglong/18.png)\n"
  },
  {
    "path": "docs/pages/install/synology.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport { FileTree } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"手动部署\"\n    href=\"/install/local\"\n  />\n  <Card\n    title=\"Docker 部署\"\n    href=\"/install/docker\"\n  />\n  <Card\n    title=\"青龙部署\"\n    href=\"/install/qinglong\"\n  />\n</Cards>\n# 群晖 Docker 使用教程\n\n## 一、安装\n\n<Steps>\n\n### 新建项目目录\n\n<FileTree>\n  <FileTree.Folder\n    name=\"dailycheckin\"\n    defaultOpen\n  >\n    <FileTree.Folder\n      name=\"config\"\n      defaultOpen\n    >\n      <FileTree.File name=\"config.json\" />\n    </FileTree.Folder>\n    <FileTree.Folder\n      name=\"cron\"\n      defaultOpen\n    >\n      <FileTree.File name=\"crontab_list.sh\" />\n    </FileTree.Folder>\n    <FileTree.Folder\n      name=\"logs\"\n      defaultOpen\n    ></FileTree.Folder>\n  </FileTree.Folder>\n</FileTree>\n\n- `./config/config.json`: 配置文件\n- `./cron/crontab_list.sh`: 配置定时任务的文件\n- `./logs`: 日志文件\n\n#### Config 目录\n\n![config 目录](../img/synology/01.png)\n\n参考[配置说明文档](/settings/config) ，并修改 `config.json`\n\n#### Cron 目录\n\n![cron 目录](../img/synology/01.png)\n\n修改 `./cron/crontab_list.sh` 文件, 根据实际情况修改下面的默认文件。\n\n```bash filename=\"crontab_list.sh\" copy\n##############默认任务##############\n# 每 12 小时更新 Pipy 包，如果不需要更新 pypi 包请注释掉下面这行\n0 */12 * * * echo \"定时任务更新依赖...\" && pip install dailycheckin --upgrade --user >> /dailycheckin/logs/update-pypi.log 2>&1\n# 每天的 23:50 分清理一次日志\n50 23 */2 * * rm -rf /dailycheckin/logs/*.log\n\n##############每日签到一次任务##############\n# 每日签到(9:00 执行全部签到)\n0 9 * * * cd /dailycheckin && dailycheckin >> /dailycheckin/logs/dailycheckin.log 2>&1\n```\n\n### 注册表搜索「dailycheckin」，双击下载\n\n![下载](../img/synology/03.png)\n\n### 下载完成后，点击映像，选中「dailycheckin」，点击「启动」\n\n![启动](../img/synology/04.png)\n\n### 配置网络\n\n跳过，点击下一步\n\n![配置网络](../img/synology/05.png)\n\n### 常规设置\n\n☑️ 启动自动重新启动\n\n![常规设置](../img/synology/06.png)\n\n### 端口设置\n\n跳过，点击下一步\n\n![端口设置](../img/synology/07.png)\n\n### 存储空间设置\n\n![添加文件夹](../img/synology/08.png)\n\n##### 按照图中的文件夹添加一致的目录结构\n\n![下一步](../img/synology/09.png)\n\n![启动成功](../img/synology/10.png)\n\n### 容器启动成功\n\n![启动成功](../img/synology/11.png)\n\n![容器日志](../img/synology/12.png)\n\n</Steps>\n\n## 二、配置\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n上传配置文件「config.json」到 「dailycheckin/config」目录下，参考[配置说明文档](/settings/config) ，并修改 `config.json`\n\n![配置并上传配置文件](../img/synology/01.png)\n\n## 三、运行\n\n<Steps>\n\n### 点击「详情」，「终端机」，点击「新增」右侧「下拉按钮」，输入「dailycheckin」命令\n\n![添加命令](../img/synology/13.png)\n\n### 点击命令，输出如下内容，表示配置成功\n\n![运行命令](../img/synology/14.png)\n\n</Steps>\n\n## 更新\n\n自动更新\n"
  },
  {
    "path": "docs/pages/settings/_meta.json",
    "content": "{\n  \"config\": \"config.json 配置\",\n  \"notify\": \"通知配置\",\n  \"acfun\":\"AcFun\",\n  \"aolaxing\":\"奥拉星\",\n  \"aliyun\":\"阿里云盘\",\n  \"baidu\":\"百度站点提交\",\n  \"baiduwp\": \"百度网盘会员\",\n  \"bilibili\":\"BiliBili\",\n  \"enshan\":\"恩山无线论坛\",\n  \"fnnas\":\"飞牛 Nas\",\n  \"imaotai\":\"i茅台\",\n  \"iqiyi\":\"爱奇艺\",\n  \"kgqq\":\"全民K歌\",\n  \"mimotion\":\"小米运动\",\n  \"smzdm\":\"什么值得买\",\n  \"tieba\":\"百度贴吧\",\n  \"v2ex\":\"V2EX\",\n  \"youdao\":\"有道云笔记\"\n}\n"
  },
  {
    "path": "docs/pages/settings/acfun.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# AcFun\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"ACFUN\": [\n    {\n      \"password\": \"Sitoi\",\n      \"phone\": \"18888xxxxxx\"\n    },\n    {\n      \"password\": \"多账号 密码填写，请参考上面\",\n      \"phone\": \"多账号 手机号填写，请参考上面\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|         参数         |      说明      |\n| :------------------: | :------------: |\n|  _**ACFUN**_.phone   | AcFun 手机账号 |\n| _**ACFUN**_.password | AcFun 账号密码 |\n"
  },
  {
    "path": "docs/pages/settings/aliyun.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 阿里云盘\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"ALIYUN\": [\n    {\n      \"refresh_token\": \"599dcf65xxxxxx\"\n    },\n    {\n      \"refresh_token\": \"多账号 refresh_token\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|            参数            |          说明          |\n| :------------------------: | :--------------------: |\n| _**ALIYUN**_.refresh_token | 阿里云盘 refresh_token |\n\n## 获取方式\n\n<Steps>\n\n### 打开官网\n\n进入[阿里云盘](https://www.aliyundrive.com/drive/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 使用下面的 JavaScript 代码复制所有 cookie\n\n```js copy\ncopy(JSON.parse(localStorage.token).refresh_token)\n```\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/aolaxing.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 奥拉星\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"AOLAXING\": [\n    {\n      \"cookie\": \"BT_AUTO_tt_common=; Hm_lpvt_7fc3681c21a26a2022ae0ca72e2d6fa5=xxxxxx; BT_LOGIN_tt_common=:187xxxxxx; Hm_lvt_7fc3681c21a26a2022ae0ca72e2d6fa5=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|         参数          |     说明      |\n| :-------------------: | :-----------: |\n| _**AOLAXING**_.cookie | 奥拉星 cookie |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[奥拉星](http://www.100bt.com/m/creditMall/?gameId=2#task)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 http://www.100bt.com/m/creditMall/?gameId=2\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/baidu.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# Baidu 站点提交\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"BAIDU\": [\n    {\n      \"data_url\": \"https://fastly.jsdelivr.net/gh/Sitoi/Sitoi.github.io/baidu_urls.txt\",\n      \"submit_url\": \"http://data.zz.baidu.com/urls?site=https://sitoi.cn&token=xxxxxx\",\n      \"times\": 10\n    },\n    {\n      \"data_url\": \"多账号 data_url 链接地址，以实际获取为准\",\n      \"submit_url\": \"多账号 submit_url 链接地址，以实际获取为准\",\n      \"times\": 10\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|          参数           |                  说明                   |\n| :---------------------: | :-------------------------------------: |\n|  _**BAIDUT**_.data_url  |           提交网站的 URL 链接           |\n| _**BAIDUT**_.submit_url | 百度搜索资源平台 提交百度网站的目标 URL |\n|   _**BAIDUT**_.times    |        每日对同一个网站提交次数         |\n\n## 获取方式\n\n[百度搜索资源平台](https://ziyuan.baidu.com/site/index#/)\n\n![获取百度云提交链接教程](../img/submit_url.png)\n\n- _**BAIDUT**_.data_url: 提交网站的 URL 链接，参考链接：[https://sitoi.cn/baidu_urls.txt](https://sitoi.cn/baidu_urls.txt)\n- _**BAIDUT**_.submit_url: 提交百度网站的目标 URL，参考格式：`http://data.zz.baidu.com/urls?site=https://sitoi.cn&token=xxxxx`\n- _**BAIDUT**_.times: 单次任务执行对同一个网站提交次数\n"
  },
  {
    "path": "docs/pages/settings/baiduwp.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 百度网盘会员\n\n## 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"BAIDUWP\": [\n    {\n      \"cookie\": \"BDUSS=xxxxxx; STOKEN=xxxxxx; ...\"\n    }\n  ]\n}\n```\n\n## 配置说明\n\n|  参数  |            说明            |\n| :----: | :------------------------: |\n| cookie | 百度网盘账号的 cookie 信息 |\n\n- cookie 获取后请完整粘贴。\n\n## cookie 获取方式\n\n<Steps>\n\n### 1. 访问 [成长值任务页面](https://pan.baidu.com/wap/svip/growth/task)\n\n### 2. 复制完整的 Cookie 内容，粘贴到 config.json 的对应位置\n\n</Steps>\n\n> 建议使用 PC 浏览器操作，获取 cookie 时请确保账号已登录。\n"
  },
  {
    "path": "docs/pages/settings/bilibili.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# BiliBili\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"BILIBILI\": [\n    {\n      \"cookie\": \"_uuid=xxxxxx; rpdid=xxxxxx; LIVE_BUVID=xxxxxx; PVID=xxxxxx; blackside_state=xxxxxx; CURRENT_FNVAL=xxxxxx; buvid3=xxxxxx; fingerprint3=xxxxxx; fingerprint=xxxxxx; buivd_fp=xxxxxx; buvid_fp_plain=xxxxxx; DedeUserID=xxxxxx; DedeUserID__ckMd5=xxxxxx; SESSDATA=xxxxxx; bili_jct=xxxxxx; bsource=xxxxxx; finger=xxxxxx; fingerprint_s=xxxxxx;\",\n      \"coin_num\": 0,\n      \"coin_type\": 1,\n      \"silver2coin\": true\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\",\n      \"coin_num\": 0,\n      \"coin_type\": 1,\n      \"silver2coin\": true\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|            参数            |                                                                 说明                                                                 |\n| :------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: |\n|   _**BILIBILI**_.cookie    |                                                           Bilibili cookie                                                            |\n|  _**BILIBILI**_.coin_num   |                                                        Bilibili 每日投币数量                                                         |\n|  _**BILIBILI**_.coin_type  | Bilibili 投币方式 默认为 0 ；1: 为关注用户列表视频投币 0: 为随机投币。如果关注用户发布的视频不足配置的投币数，则剩余部分使用随机投币 |\n| _**BILIBILI**_.silver2coin |                                           Bilibili 是否开启银瓜子换硬币，默认为 True 开启                                            |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[Bilibili](https://www.bilibili.com)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Fetch/XHR 标签\n\n### 选中 https://api.bilibili.com/x/space/user/setting/list\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/config.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Cards, Card } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n# config.json 配置\n\n## 示例文件\n\n以下是一份默认的 `config.json` 配置文件，你可以直接复制到你的 `config.json` 文件中，然后修改其中的参数。\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n```json filename=\"config.json\" copy\n{\n  \"BARK_URL\": \"\",\n  \"COOLPUSHEMAIL\": true,\n  \"COOLPUSHQQ\": true,\n  \"COOLPUSHSKEY\": \"\",\n  \"COOLPUSHWX\": true,\n  \"DINGTALK_ACCESS_TOKEN\": \"\",\n  \"DINGTALK_SECRET\": \"\",\n  \"FSKEY\": \"\",\n  \"PUSHPLUS_TOKEN\": \"\",\n  \"PUSHPLUS_TOPIC\": \"\",\n  \"QMSG_KEY\": \"\",\n  \"QMSG_TYPE\": \"\",\n  \"QYWX_AGENTID\": \"\",\n  \"QYWX_CORPID\": \"\",\n  \"QYWX_CORPSECRET\": \"\",\n  \"QYWX_KEY\": \"\",\n  \"QYWX_MEDIA_ID\": \"\",\n  \"QYWX_TOUSER\": \"\",\n  \"SCKEY\": \"\",\n  \"SENDKEY\": \"\",\n  \"TG_API_HOST\": \"\",\n  \"TG_BOT_TOKEN\": \"\",\n  \"TG_PROXY\": \"\",\n  \"TG_USER_ID\": \"\",\n  \"MERGE_PUSH\": \"\",\n  \"ACFUN\": [\n    {\n      \"password\": \"Sitoi\",\n      \"phone\": \"18888xxxxxx\"\n    },\n    {\n      \"password\": \"多账号 密码填写，请参考上面\",\n      \"phone\": \"多账号 手机号填写，请参考上面\"\n    }\n  ],\n  \"ALIYUN\": [\n    {\n      \"refresh_token\": \"599dcf65xxxxxx\"\n    },\n    {\n      \"refresh_token\": \"多账号 refresh_token\"\n    }\n  ],\n  \"AOLAXING\": [\n    {\n      \"cookie\": \"BT_AUTO_tt_common=; Hm_lpvt_7fc3681c21a26a2022ae0ca72e2d6fa5=xxxxxx; BT_LOGIN_tt_common=:187xxxxxx; Hm_lvt_7fc3681c21a26a2022ae0ca72e2d6fa5=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"BAIDU\": [\n    {\n      \"data_url\": \"https://fastly.jsdelivr.net/gh/Sitoi/Sitoi.github.io/baidu_urls.txt\",\n      \"submit_url\": \"http://data.zz.baidu.com/urls?site=https://sitoi.cn&token=xxxxxx\",\n      \"times\": 10\n    },\n    {\n      \"data_url\": \"多账号 data_url 链接地址，以实际获取为准\",\n      \"submit_url\": \"多账号 submit_url 链接地址，以实际获取为准\",\n      \"times\": 10\n    }\n  ],\n  \"BAIDUWP\": [\n    {\n      \"cookie\": \"BAIDUID=xxx:FG=1; BAIDUID_BFESS=xxx:FG=1; xxx\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"BILIBILI\": [\n    {\n      \"coin_num\": 0,\n      \"coin_type\": 1,\n      \"cookie\": \"_uuid=xxxxxx; rpdid=xxxxxx; LIVE_BUVID=xxxxxx; PVID=xxxxxx; blackside_state=xxxxxx; CURRENT_FNVAL=xxxxxx; buvid3=xxxxxx; fingerprint3=xxxxxx; fingerprint=xxxxxx; buivd_fp=xxxxxx; buvid_fp_plain=xxxxxx; DedeUserID=xxxxxx; DedeUserID__ckMd5=xxxxxx; SESSDATA=xxxxxx; bili_jct=xxxxxx; bsource=xxxxxx; finger=xxxxxx; fingerprint_s=xxxxxx;\",\n      \"silver2coin\": true\n    },\n    {\n      \"coin_num\": 0,\n      \"coin_type\": 1,\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\",\n      \"silver2coin\": true\n    }\n  ],\n  \"ENSHAN\": [\n    {\n      \"cookie\": \"fpv=xxxxxx; yd_captcha_token=xxxxxx; _dx_captcha_cid=xxxxxx; _dx_uzZo5y=xxxxxx; _dx_FMrPY6=xxxxxx; _dx_app_captchadiscuzpluginbydingxiang2017=xxxxxx; TWcq_2132_pc_size_c=0; TWcq_2132_saltkey=xxxxxx; TWcq_2132_lastvisit=xxxxxx; TWcq_2132_sendmail=1; _dx_captcha_vid=xxxxxx; TWcq_2132_sid=Wyv5Ps; TWcq_2132_ulastactivity=xxxxxx; TWcq_2132_auth=xxxxxx; TWcq_2132_lastcheckfeed=xxxxxx; TWcq_2132_lip=xxxxxx; TWcq_2132_connect_is_bind=1; TWcq_2132_nofavfid=1; TWcq_2132_lastact=xxxxxx\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"FNNASCLUB\": [\n    {\n      \"cookie\": \"pvRK_2132_saltkey=xxxx;xxxxxxx\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"IMAOTAI\": [\n    {\n      \"city\": \"上海市\",\n      \"lat\": \"3.025626\",\n      \"lng\": \"3.025626\",\n      \"mobile\": \"18888xxxxxx\",\n      \"province\": \"上海市\",\n      \"token\": \"eyJxxxxxx\",\n      \"userid\": \"1xxxxxx4\"\n    },\n    {\n      \"city\": \"多账号 城市\",\n      \"lat\": \"多账号 纬度\",\n      \"lng\": \"多账号 经度\",\n      \"mobile\": \"多账号 手机号\",\n      \"province\": \"多账号 省份\",\n      \"token\": \"多账号 token\",\n      \"userid\": \"多账号 用户 id\"\n    }\n  ],\n  \"IQIYI\": [\n    {\n      \"cookie\": \"__dfp=xxxxxx; QP0013=xxxxxx; QP0022=xxxxxx; QYABEX=xxxxxx; P00001=xxxxxx; P00002=xxxxxx; P00003=xxxxxx; P00007=xxxxxx; QC163=xxxxxx; QC175=xxxxxx; QC179=xxxxxx; QC170=xxxxxx; P00010=xxxxxx; P00PRU=xxxxxx; P01010=xxxxxx; QC173=xxxxxx; QC180=xxxxxx; P00004=xxxxxx; QP0030=xxxxxx; QC006=xxxxxx; QC007=xxxxxx; QC008=xxxxxx; QC010=xxxxxx; nu=xxxxxx; __uuid=xxxxxx; QC005=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"KGQQ\": [\n    {\n      \"cookie\": \"muid=xxxxxx; uid=xxxxxx; userlevel=xxxxxx; openid=xxxxxx; openkey=xxxxxx; opentype=xxxxxx; qrsig=xxxxxx; pgv_pvid=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"MIMOTION\": [\n    {\n      \"max_step\": \"20000\",\n      \"min_step\": \"10000\",\n      \"password\": \"Sitoi\",\n      \"phone\": \"18888xxxxxx\"\n    },\n    {\n      \"max_step\": \"多账号 最大步数填写，请参考上面\",\n      \"min_step\": \"多账号 最小步数填写，请参考上面\",\n      \"password\": \"多账号 密码填写，请参考上面\",\n      \"phone\": \"多账号 手机号填写，请参考上面\"\n    }\n  ],\n  \"SMZDM\": [\n    {\n      \"cookie\": \"__ckguid=xxxxxx\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"TIEBA\": [\n    {\n      \"cookie\": \"BIDUPSID=xxxxxx; PSTM=xxxxxx; BAIDUID=xxxxxx; BAIDUID_BFESS=xxxxxx; delPer=xxxxxx; PSINO=xxxxxx; H_PS_PSSID=xxxxxx; BA_HECTOR=xxxxxx; BDORZ=xxxxxx; TIEBA_USERTYPE=xxxxxx; st_key_id=xxxxxx; BDUSS=xxxxxx; BDUSS_BFESS=xxxxxx; STOKEN=xxxxxx; TIEBAUID=xxxxxx; ab_sr=xxxxxx; st_data=xxxxxx; st_sign=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ],\n  \"V2EX\": [\n    {\n      \"cookie\": \"_ga=xxxxxx; __cfduid=xxxxxx; PB3_SESSION=xxxxxx; A2=xxxxxx; V2EXSETTINGS=xxxxxx; V2EX_REFERRER=xxxxxx; V2EX_LANG=xxxxxx; _gid=xxxxxx; V2EX_TAB=xxxxxx;\",\n      \"proxy\": \"使用代理的信息，无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\",\n      \"proxy\": \"使用代理的信息，无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080\"\n    }\n  ],\n  \"YOUDAO\": [\n    {\n      \"cookie\": \"JSESSIONID=xxxxxx; __yadk_uid=xxxxxx; OUTFOX_SEARCH_USER_ID_NCOO=xxxxxx; YNOTE_SESS=xxxxxx; YNOTE_PERS=xxxxxx; YNOTE_LOGIN=xxxxxx; YNOTE_CSTK=xxxxxx; _ga=xxxxxx; _gid=xxxxxx; _gat=xxxxxx; PUBLIC_SHARE_18a9dde3de846b6a69e24431764270c4=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n## 通知平台配置\n\n<Callout type=\"info\">\n  第一步：选择适合自己的通知平台，点进对应的通知平台，配置相关的参数，填入\n  `config.json` 文件中。\n</Callout>\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n## 签到平台配置\n\n<Callout type=\"info\">\n  第二步：配置需要签到的平台，点进对应的签到平台，配置相关的参数，填入\n  `config.json` 文件中。\n</Callout>\n\n<Callout\n  type=\"warning\"\n  emoji=\"⚠️\"\n>\n  请务必到 [https://www.json.cn/](https://www.json.cn/) 网站检查 `config.json`\n  文件格式是否正确！\n</Callout>\n\n<CardList />\n\n---\n\n<Callout type=\"info\">\n  配置完成后，根据部署方法中的「运行」教程执行程序，进行签到\n</Callout>\n"
  },
  {
    "path": "docs/pages/settings/enshan.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 恩山无线论坛\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"ENSHAN\": [\n    {\n      \"cookie\": \"fpv=xxxxxx; yd_captcha_token=xxxxxx; _dx_captcha_cid=xxxxxx; _dx_uzZo5y=xxxxxx; _dx_FMrPY6=xxxxxx; _dx_app_captchadiscuzpluginbydingxiang2017=xxxxxx; TWcq_2132_pc_size_c=0; TWcq_2132_saltkey=xxxxxx; TWcq_2132_lastvisit=xxxxxx; TWcq_2132_sendmail=1; _dx_captcha_vid=xxxxxx; TWcq_2132_sid=Wyv5Ps; TWcq_2132_ulastactivity=xxxxxx; TWcq_2132_auth=xxxxxx; TWcq_2132_lastcheckfeed=xxxxxx; TWcq_2132_lip=xxxxxx; TWcq_2132_connect_is_bind=1; TWcq_2132_nofavfid=1; TWcq_2132_lastact=xxxxxx\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|        参数         |              说明               |\n| :-----------------: | :-----------------------------: |\n| _**ENSHAN**_.cookie | 恩山无线论坛 帐号的 cookie 信息 |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[恩山无线论坛](https://www.right.com.cn/forum/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 www.right.com.cn\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/fnnas.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 飞牛 NAS\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"FNNASCLUB\": [\n    {\n      \"cookie\": \"xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|          参数          |      说明       |\n| :--------------------: | :-------------: |\n| _**FNNASCLUB**_.cookie | 飞牛 NAS cookie |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[飞牛 NAS](https://club.fnnas.com/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 https://club.fnnas.com/\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/imaotai.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# i 茅台\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"IMAOTAI\": [\n    {\n      \"city\": \"上海市\",\n      \"lat\": \"3.025626\",\n      \"lng\": \"3.025626\",\n      \"mobile\": \"18888xxxxxx\",\n      \"province\": \"上海市\",\n      \"token\": \"eyJxxxxxx\",\n      \"userid\": \"1xxxxxx4\",\n      \"reserve_rule\": 0,\n      \"item_codes\": [\"11318\", \"11319\"]\n    },\n    {\n      \"city\": \"多账号 城市\",\n      \"lat\": \"多账号 纬度\",\n      \"lng\": \"多账号 经度\",\n      \"mobile\": \"多账号 手机号\",\n      \"province\": \"多账号 省份\",\n      \"token\": \"多账号 token\",\n      \"userid\": \"多账号 用户 id\",\n      \"reserve_rule\": 0,\n      \"item_codes\": [\"11318\", \"11319\"]\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|            参数            |                              说明                               |\n| :------------------------: | :-------------------------------------------------------------: |\n|    _**IMAOTAI**_.mobile    |                         i 茅台 手机账号                         |\n|    _**IMAOTAI**_.userid    |                      i 茅台 登录的用户 ID                       |\n|    _**IMAOTAI**_.token     |                     i 茅台 登录的用户 token                     |\n|   _**IMAOTAI**_.province   |                         i 茅台 申领省份                         |\n|     _**IMAOTAI**_.city     |                         i 茅台 申领城市                         |\n|     _**IMAOTAI**_.lat      |          i 茅台 申领纬度（用于选择离你最近的茅台地点）          |\n|     _**IMAOTAI**_.lng      |          i 茅台 申领经度（用于选择离你最近的茅台地点）          |\n| _**IMAOTAI**_.reserve_rule | i 茅台 申领方式 默认：0 距离最近的店铺，1: 当前城市出货量最多的 |\n|  _**IMAOTAI**_.item_codes  |       i 茅台 申领商品 Code 默认不填为 [\"10941\", \"10942\"]        |\n\n> item_codes 支持以下几种选择\n\n```json copy\n{\n  \"11318\": \"53%vol 500ml贵州茅台酒（乙巳蛇年）\",\n  \"11317\": \"53%vol 500ml贵州茅台酒（笙乐飞天）\",\n  \"11319\": \"53%vol 375mlx2贵州茅台酒（乙巳蛇年）\",\n  \"2478\": \"53%vol 500ml贵州茅台酒（珍品）\",\n  \"11240\": \"53%vol 500ml 茅台1935·中国国家地理文创酒（喜逢大运河）\"\n}\n```\n\n默认配置申购 `[\"11318\", \"11319\"]`\n\n## 获取方式\n\n<Steps>\n\n## 获取高德地图 APP Key\n\n打开高德开放平台 [https://console.amap.com/dev/key/app](https://console.amap.com/dev/key/app)\n\n### 点击「我的应用」\n\n![](../img/imaotai/gd-1.png)\n\n### 点击「创建新应用」\n\n![](../img/imaotai/gd-2.png)\n\n### 新建应用\n\n![](../img/imaotai/gd-3.png)\n\n### 点击「添加 Key」\n\n![](../img/imaotai/gd-4.png)\n\n### 创建 Key\n\n输入 「Key 名称」 -> 选择 「Web 服务」\n\n![](../img/imaotai/gd-5.png)\n\n### 复制 key\n\n![](../img/imaotai/gd-6.png)\n\n## 获取「i 茅台」账号配置信息\n\n网页在线平台 [https://lightly.teamcode.com/dashboard](https://lightly.teamcode.com/dashboard)\n\n### 新建 Python 项目\n\n新建一个 Python 项目 将以下内容复制到 main.py，复制完后将刚刚申请的 KEY 填写进去保存\n\n![](../img/imaotai/code-1.png)\n\n### 编辑 main.py 文件\n\n将以下内容复制到 `main.py`，复制完后将刚刚申请的 KEY 填写到 AMAP_KEY 中并保存。\n\n![](../img/imaotai/code-2.png)\n\n```python filename=\"main.py\" copy\nimport hashlib\nimport json\nimport time\n\nimport requests\n\n\"\"\"\n获取地点信息,这里用的高德 api,需要自己去高德开发者平台申请自己的 key\n\"\"\"\nAMAP_KEY = \"\"\n\n\nSALT = \"2af72f100c356273d46284f6fd1dfc08\"\n\nCURRENT_TIME = str(int(time.time() * 1000))\nheaders = {}\n\n\nmt_version = json.loads(\n    requests.get(\"https://itunes.apple.com/cn/lookup?id=1600482450\").text\n)[\"results\"][0][\"version\"]\n\n\nheader_context = \"\"\"\nMT-Lat: 28.499562\nMT-K: 1675213490331\nMT-Lng: 102.182324\nHost: app.moutai519.com.cn\nMT-User-Tag: 0\nAccept: */*\nMT-Network-Type: WIFI\nMT-Token: 1\nMT-Team-ID: 1\nMT-Info: 028e7f96f6369cafe1d105579c5b9377\nMT-Device-ID: 2F2075D0-B66C-4287-A903-DBFF6358342A\nMT-Bundle-ID: com.moutai.mall\nAccept-Language: en-CN;q=1, zh-Hans-CN;q=0.9\nMT-Request-ID: 167560018873318465\nMT-APP-Version: 1.3.7\nUser-Agent: iOS;16.3;Apple;?unrecognized?\nMT-R: clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/HGhHdw==\nContent-Length: 93\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\nContent-Type: application/json\nuserId: 2\n\"\"\"\n\n\n# 初始化请求头\ndef init_headers(\n    user_id: str = \"1\", token: str = \"2\", lat: str = \"29.83826\", lng: str = \"119.74375\"\n):\n    for k in header_context.strip().split(\"\\n\"):\n        temp_l = k.split(\": \")\n        dict.update(headers, {temp_l[0]: temp_l[1]})\n    dict.update(headers, {\"userId\": user_id})\n    dict.update(headers, {\"MT-Token\": token})\n    dict.update(headers, {\"MT-Lat\": lat})\n    dict.update(headers, {\"MT-Lng\": lng})\n    dict.update(headers, {\"MT-APP-Version\": mt_version})\n\n\n# 用高德api获取地图信息\ndef select_geo(i: str):\n    # 校验高德api是否配置\n    if AMAP_KEY is None:\n        print(\"!!!!请配置 AMAP_KEY (高德地图的MapKey)\")\n        raise ValueError\n    resp = requests.get(\n        f\"https://restapi.amap.com/v3/geocode/geo?key={AMAP_KEY}&output=json&address={i}\"\n    )\n    geocodes: list = resp.json()[\"geocodes\"]\n    return geocodes\n\n\ndef signature(data: dict):\n    keys = sorted(data.keys())\n    temp_v = \"\"\n    for item in keys:\n        temp_v += data[item]\n    text = SALT + temp_v + CURRENT_TIME\n    hl = hashlib.md5()\n    hl.update(text.encode(encoding=\"utf8\"))\n    md5 = hl.hexdigest()\n    return md5\n\n\n# 获取登录手机验证码\ndef get_vcode(mobile: str):\n    params = {\"mobile\": mobile}\n    md5 = signature(params)\n    dict.update(\n        params, {\"md5\": md5, \"timestamp\": CURRENT_TIME, \"MT-APP-Version\": mt_version}\n    )\n    responses = requests.post(\n        \"https://app.moutai519.com.cn/xhr/front/user/register/vcode\",\n        json=params,\n        headers=headers,\n    )\n    if responses.status_code != 200:\n        print(\n            f\"get v_code : params : {params}, response code : {responses.status_code}, response body : {responses.text}\"\n        )\n\n\n# 执行登录操作\ndef login(mobile: str, v_code: str):\n    params = {\"mobile\": mobile, \"vCode\": v_code, \"ydToken\": \"\", \"ydLogId\": \"\"}\n    md5 = signature(params)\n    dict.update(\n        params, {\"md5\": md5, \"timestamp\": CURRENT_TIME, \"MT-APP-Version\": mt_version}\n    )\n    responses = requests.post(\n        \"https://app.moutai519.com.cn/xhr/front/user/register/login\",\n        json=params,\n        headers=headers,\n    )\n    if responses.status_code != 200:\n        print(\n            f\"login : params : {params}, response code : {responses.status_code}, response body : {responses.text}\"\n        )\n    dict.update(headers, {\"MT-Token\": responses.json()[\"data\"][\"token\"]})\n    dict.update(headers, {\"userId\": responses.json()[\"data\"][\"userId\"]})\n    return responses.json()[\"data\"][\"token\"], responses.json()[\"data\"][\"userId\"]\n\n\ndef get_location():\n    while 1:\n        location = input(\n            \"请输入精确小区位置，例如[小区名称]，为你自动预约附近的门店:\"\n        ).strip()\n        selects = select_geo(location)\n\n        a = 0\n        for item in selects:\n            formatted_address = item[\"formatted_address\"]\n            province = item[\"province\"]\n            print(f\"{a} : [地区:{province},位置:{formatted_address}]\")\n            a += 1\n        user_select = input(\"请选择位置序号,重新输入请输入[-]:\").strip()\n        if user_select == \"-\":\n            continue\n        select = selects[int(user_select)]\n        formatted_address = select[\"formatted_address\"]\n        province = select[\"province\"]\n        print(f\"已选择 地区:{province},[{formatted_address}]附近的门店\")\n        return select\n\n\nif __name__ == \"__main__\":\n    items = []\n    while 1:\n        init_headers()\n        location_select: dict = get_location()\n        province = location_select[\"province\"]\n        city = location_select[\"city\"]\n        location: str = location_select[\"location\"]\n\n        mobile = input(\"输入手机号[18888888888]:\").strip()\n        get_vcode(mobile)\n        code = input(f\"输入 [{mobile}] 验证码[8888]:\").strip()\n        token, userId = login(mobile, code)\n        item = {\n            \"city\": str(city),\n            \"lat\": location.split(\",\")[1],\n            \"lng\": location.split(\",\")[0],\n            \"mobile\": str(mobile),\n            \"province\": province,\n            \"token\": str(token),\n            \"userid\": str(userId),\n            \"reserve_rule\": 0,\n            \"item_codes\": [\"11318\", \"11319\"],\n        }\n        items.append(item)\n        condition = input(\"是否继续添加账号[y/n]:\").strip()\n        with open(\"account.json\", \"w\") as f:\n            f.write(json.dumps(items, ensure_ascii=False, indent=4))\n        if condition.lower() == \"n\":\n            break\n```\n\n### 点击「终端」安装依赖项\n\n![](../img/imaotai/code-3.png)\n\n```bash copy\npip install requests~=2.31.0 pycryptodome==3.17\n```\n\n![](../img/imaotai/code-4.png)\n\n### 运行 python 代码获取配置\n\n![](../img/imaotai/code-5.png)\n\n### 根据终端的提示输出\n\n![](../img/imaotai/code-6.png)\n\n### 最后输出一个 account.json 文件\n\n![](../img/imaotai/code-7.png)\n\n### 复制数据后填入到 `config.json` 中\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/iqiyi.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 爱奇艺\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"IQIYI\": [\n    {\n      \"cookie\": \"__dfp=xxxxxx; QP0013=xxxxxx; QP0022=xxxxxx; QYABEX=xxxxxx; P00001=xxxxxx; P00002=xxxxxx; P00003=xxxxxx; P00007=xxxxxx; QC163=xxxxxx; QC175=xxxxxx; QC179=xxxxxx; QC170=xxxxxx; P00010=xxxxxx; P00PRU=xxxxxx; P01010=xxxxxx; QC173=xxxxxx; QC180=xxxxxx; P00004=xxxxxx; QP0030=xxxxxx; QC006=xxxxxx; QC007=xxxxxx; QC008=xxxxxx; QC010=xxxxxx; nu=xxxxxx; __uuid=xxxxxx; QC005=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|        参数        |             说明              |\n| :----------------: | :---------------------------: |\n| _**IQIYI**_.cookie | 爱奇艺 APP headers 中的 token |\n\n## 获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[爱奇艺官网](https://www.iqiyi.com/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 www.iqiyi.com\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/kgqq.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 全民 K 歌\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"KGQQ\": [\n    {\n      \"cookie\": \"muid=xxxxxx; uid=xxxxxx; userlevel=xxxxxx; openid=xxxxxx; openkey=xxxxxx; opentype=xxxxxx; qrsig=xxxxxx; pgv_pvid=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|       参数        |             说明             |\n| :---------------: | :--------------------------: |\n| _**KGQQ**_.cookie | 全民 K 歌 帐号的 cookie 信息 |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n### 打开官网\n\n进入[全民 K 歌](https://kg.qq.com/index-pc.html)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 https://kg.qq.com\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/mimotion.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 小米运动\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"MIMOTION\": [\n    {\n      \"max_step\": \"20000\",\n      \"min_step\": \"10000\",\n      \"password\": \"Sitoi\",\n      \"phone\": \"18888xxxxxx\"\n    },\n    {\n      \"max_step\": \"多账号 最大步数填写，请参考上面\",\n      \"min_step\": \"多账号 最小步数填写，请参考上面\",\n      \"password\": \"多账号 密码填写，请参考上面\",\n      \"phone\": \"多账号 手机号填写，请参考上面\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|          参数           |                说明                |\n| :---------------------: | :--------------------------------: |\n|  _**MIMOTION**_.phone   | 小米运动刷步数的「手机」或「邮箱」 |\n| _**MIMOTION**_.password |      小米运动刷步数的账号密码      |\n| _**MIMOTION**_.min_step |      小米运动刷步数的最小步数      |\n| _**MIMOTION**_.max_step |      小米运动刷步数的最大步数      |\n"
  },
  {
    "path": "docs/pages/settings/notify/_meta.json",
    "content": "{\n  \"bark\": \"Bark\",\n  \"coolpush\": \"CoolPush\",\n  \"dingtalk\": \"钉钉\",\n  \"feishu\": \"飞书\",\n  \"pushplus\": \"PushPlus\",\n  \"qmsg\": \"QMSG\",\n  \"qywx\": \"企业微信应用消息\",\n  \"qywxrobot\": \"企业微信群机器人\",\n  \"telegram\": \"Telegram\",\n  \"server\": \"Server 酱\",\n  \"turbo\": \"Server 酱 Turbo\",\n  \"ntfy\": \"Ntfy\",\n  \"gotify\": \"Gotify\"\n}\n"
  },
  {
    "path": "docs/pages/settings/notify/bark.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# BARK\n\n<Callout type=\"warning\">\n  通知消息在 Bark 有长度限制，如果没收到推送，请将 MERGE_PUSH 改为 false\n</Callout>\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"BARK_URL\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|       参数       |                                              说明                                              |\n| :--------------: | :--------------------------------------------------------------------------------------------: |\n|  _**BARK_URL**_  | [BARK](https://bark.day.app/#/) ,填写 `BARK_URL` 例: `https://api.day.app/DxHcxxxxxRxxxxxxcm/` |\n| _**MERGE_PUSH**_ |                         **true**: 将推送消息合并；**false**: 分开推送                          |\n"
  },
  {
    "path": "docs/pages/settings/notify/coolpush.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# CoolPush\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"COOLPUSHEMAIL\": true,\n  \"COOLPUSHQQ\": true,\n  \"COOLPUSHSKEY\": \"\",\n  \"COOLPUSHWX\": true,\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|        参数         |                              说明                               |\n| :-----------------: | :-------------------------------------------------------------: |\n| _**COOLPUSHSKEY**_  |        [Cool Push](https://cp.xuthus.cc/) 推送的 `SKEY`         |\n|  _**COOLPUSHQQ**_   |  [Cool Push](https://cp.xuthus.cc/) 是否开启 QQ 推送，默认开启  |\n|  _**COOLPUSHWX**_   | [Cool Push](https://cp.xuthus.cc/) 是否开启 微信 推送，默认关闭 |\n| _**COOLPUSHEMAIL**_ | [Cool Push](https://cp.xuthus.cc/) 是否开启 邮件 推送，默认关闭 |\n|  _**MERGE_PUSH**_   |          **true**: 将推送消息合并；**false**: 分开推送          |\n"
  },
  {
    "path": "docs/pages/settings/notify/dingtalk.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# 钉钉\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"DINGTALK_ACCESS_TOKEN\": \"\",\n  \"DINGTALK_SECRET\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|            参数             |                                                                                                                     说明                                                                                                                      |\n| :-------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |\n|    _**DINGTALK_SECRET**_    | 钉钉推送[官方文档](https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq) 密钥，机器人安全设置页面，加签一栏下面显示的 `SEC` 开头的字符串, 注:填写了 `DD_BOT_TOKEN` 和 `DD_BOT_SECRET`，钉钉机器人安全设置只需勾选`加签`即可，其他选项不要勾选 |\n| _**DINGTALK_ACCESS_TOKEN**_ |                                          钉钉推送[官方文档](https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq) ,只需 `https://oapi.dingtalk.com/robot/send?access_token=XXX` 等于符号后面的 `XXX`                                          |\n|      _**MERGE_PUSH**_       |                                                                                                 **true**: 将推送消息合并；**false**: 分开推送                                                                                                 |\n"
  },
  {
    "path": "docs/pages/settings/notify/feishu.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n# 飞书\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"FSKEY\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|       参数       |                                           说明                                            |\n| :--------------: | :---------------------------------------------------------------------------------------: |\n|   _**FSKEY**_    | `https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx` **xxxxxx** 部分就是需要填写的 FSKEY |\n| _**MERGE_PUSH**_ |                       **true**: 将推送消息合并；**false**: 分开推送                       |\n"
  },
  {
    "path": "docs/pages/settings/notify/gotify.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# GOTIFY\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"GOTIFY_URL\": \"\",\n  \"GOTIFY_TOKEN\": \"\",\n  \"GOTIFY_PRIORITY\": \"\"\n}\n```\n\n|         参数          |                     说明                      |\n| :-------------------: | :-------------------------------------------: |\n|   _**GOTIFY_URL**_    |          [GOTIFY] ,填写 `GOTIFY_URL`          |\n|  _**GOTIFY_TOKEN**_   |              填写 `GOTIFY_TOKEN`              |\n| _**GOTIFY_PRIORITY**_ |            填写 `GOTIFY_PRIORITY`             |\n|   _**MERGE_PUSH**_    | **true**: 将推送消息合并；**false**: 分开推送 |\n"
  },
  {
    "path": "docs/pages/settings/notify/ntfy.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# NTFY\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"NTFY_URL\": \"\",\n  \"NTFY_TOPIC\": \"\",\n  \"NTFY_PRIORITY\": \"\"\n}\n```\n\n|        参数         |                                      说明                                       |\n| :-----------------: | :-----------------------------------------------------------------------------: |\n|   _**NTFY_URL**_    | [NTFY](https://ntfy.sh) ,填写 `NTFY_URL` 例: `https://ntfy.sh` 也可以自建服务端 |\n|  _**NTFY_TOPIC**_   |                      填写 `NTFY_TOPIC` 例: `dailycheckin`                       |\n| _**NTFY_PRIORITY**_ |                     填写 `NTFY_PRIORITY` 例: `3`, 默认为 3                      |\n|  _**MERGE_PUSH**_   |                  **true**: 将推送消息合并；**false**: 分开推送                  |\n"
  },
  {
    "path": "docs/pages/settings/notify/pushplus.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# PushPlus\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"PUSHPLUS_TOKEN\": \"\",\n  \"PUSHPLUS_TOPIC\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|         参数         |                                                         说明                                                         |\n| :------------------: | :------------------------------------------------------------------------------------------------------------------: |\n| _**PUSHPLUS_TOKEN**_ | 用户令牌，可直接加到请求地址后，如：http://www.pushplus.plus/send/{token} [官方文档](https://www.pushplus.plus/doc/) |\n| _**PUSHPLUS_TOPIC**_ |                        群组编码，不填仅发送给自己 [官方文档](https://www.pushplus.plus/doc/)                         |\n|   _**MERGE_PUSH**_   |                                    **true**: 将推送消息合并；**false**: 分开推送                                     |\n"
  },
  {
    "path": "docs/pages/settings/notify/qmsg.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\nimport { Callout } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# Qmsg 酱\n\n<Callout type=\"warning\">\n  通知消息在 Qmsg 中被视为违规。 ![qmsg-error](../../img/qmsg-error.png)\n</Callout>\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"QMSG_KEY\": \"\",\n  \"QMSG_TYPE\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|       参数       |                                              说明                                              |\n| :--------------: | :--------------------------------------------------------------------------------------------: |\n|  _**QMSG_KEY**_  |              Qmsg 酱推送[官方文档](https://qmsg.zendee.cn/) ,填写 `KEY` 代码即可               |\n| _**QMSG_TYPE**_  | Qmsg 酱推送[官方文档](https://qmsg.zendee.cn/) ,如果需要推送到群填写 `group`,其他的都推送到 QQ |\n| _**MERGE_PUSH**_ |                         **true**: 将推送消息合并；**false**: 分开推送                          |\n"
  },
  {
    "path": "docs/pages/settings/notify/qywx.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# 企业微信应用消息\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"QYWX_AGENTID\": \"\",\n  \"QYWX_CORPID\": \"\",\n  \"QYWX_CORPSECRET\": \"\",\n  \"QYWX_KEY\": \"\",\n  \"QYWX_MEDIA_ID\": \"\",\n  \"QYWX_TOUSER\": \"\",\n  \"QYWX_ORIGIN\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|         参数          |                                   说明                                    |\n| :-------------------: | :-----------------------------------------------------------------------: |\n|   _**QYWX_CORPID**_   |                                  corpid                                   |\n|  _**QYWX_AGENTID**_   |                                  agentid                                  |\n| _**QYWX_CORPSECRET**_ |                                corpsecret                                 |\n|   _**QYWX_TOUSER**_   |                                  touser                                   |\n|  _**QYWX_MEDIA_ID**_  |                                 media_id                                  |\n|   _**QYWX_ORIGIN**_   | 企业微信反向代理地址将 https://qyapi.weixin.qq.com 替换为 **QYWX_ORIGIN** |\n|   _**MERGE_PUSH**_    |               **true**: 将推送消息合并；**false**: 分开推送               |\n"
  },
  {
    "path": "docs/pages/settings/notify/qywxrobot.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# 企业微信群机器人\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"QYWX_AGENTID\": \"\",\n  \"QYWX_CORPID\": \"\",\n  \"QYWX_CORPSECRET\": \"\",\n  \"QYWX_KEY\": \"\",\n  \"QYWX_MEDIA_ID\": \"\",\n  \"QYWX_TOUSER\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|       参数       |                                                        说明                                                        |\n| :--------------: | :----------------------------------------------------------------------------------------------------------------: |\n|  _**QYWX_KEY**_  | 密钥，企业微信推送 `webhook` 后面的 `key` 详见[官方说明文档](https://work.weixin.qq.com/api/doc/90000/90136/91770) |\n| _**MERGE_PUSH**_ |                                   **true**: 将推送消息合并；**false**: 分开推送                                    |\n"
  },
  {
    "path": "docs/pages/settings/notify/server.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# Server 酱\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"SCKEY\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|       参数       |                                说明                                 |\n| :--------------: | :-----------------------------------------------------------------: |\n|   _**SCKEY**_    | server 酱推送[官方文档](https://sc.ftqq.com) ,填写 `SCKEY` 代码即可 |\n| _**MERGE_PUSH**_ |            **true**: 将推送消息合并；**false**: 分开推送            |\n"
  },
  {
    "path": "docs/pages/settings/notify/telegram.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# Telegram\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"TG_API_HOST\": \"\",\n  \"TG_BOT_TOKEN\": \"\",\n  \"TG_PROXY\": \"\",\n  \"TG_USER_ID\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|        Name        |                                                                         说明                                                                         |\n| :----------------: | :--------------------------------------------------------------------------------------------------------------------------------------------------: |\n| _**TG_BOT_TOKEN**_ |                                                             telegram 推送 `TG_BOT_TOKEN`                                                             |\n|  _**TG_USER_ID**_  |                                                              telegram 推送 `TG_USER_ID`                                                              |\n| _**TG_API_HOST**_  | Telegram api 自建的反向代理地址 例子：反向代理地址 http://aaa.bbb.ccc 则填写 aaa.bbb.ccc [简略搭建教程](https://shimo.im/docs/JD38CJDQtYy3yTd8/read) |\n|   _**TG_PROXY**_   |                                                   Telegram 代理的信息，例子: http://127.0.0.1:1080                                                   |\n|  _**MERGE_PUSH**_  |                                                    **true**: 将推送消息合并；**false**: 分开推送                                                     |\n"
  },
  {
    "path": "docs/pages/settings/notify/turbo.mdx",
    "content": "import { Cards, Card } from 'nextra/components'\n\n<Cards>\n  <Card\n    title=\"BARK\"\n    href=\"/settings/notify/bark\"\n  />\n  <Card\n    title=\"CoolPush\"\n    href=\"/settings/notify/coolpush\"\n  />\n  <Card\n    title=\"钉钉\"\n    href=\"/settings/notify/dingtalk\"\n  />\n  <Card\n    title=\"飞书\"\n    href=\"/settings/notify/feishu\"\n  />\n  <Card\n    title=\"PushPlus\"\n    href=\"/settings/notify/pushplus\"\n  />\n  <Card\n    title=\"Qmsg 酱\"\n    href=\"/settings/notify/qmsg\"\n  />\n  <Card\n    title=\"企业微信应用消息\"\n    href=\"/settings/notify/qywx\"\n  />\n  <Card\n    title=\"企业微信群机器人\"\n    href=\"/settings/notify/qywxrobot\"\n  />\n  <Card\n    title=\"Server 酱\"\n    href=\"/settings/notify/server\"\n  />\n  <Card\n    title=\"Telegram\"\n    href=\"/settings/notify/telegram\"\n  />\n  <Card\n    title=\"Server 酱 TURBO\"\n    href=\"/settings/notify/turbo\"\n  />\n  <Card\n    title=\"Ntfy\"\n    href=\"/settings/notify/ntfy\"\n  />\n  <Card\n    title=\"Gotify\"\n    href=\"/settings/notify/gotify\"\n  />\n</Cards>\n\n# Server 酱 TURBO\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"SENDKEY\": \"\",\n  \"MERGE_PUSH\": \"\"\n}\n```\n\n|       参数       |                                         说明                                          |\n| :--------------: | :-----------------------------------------------------------------------------------: |\n|  _**SENDKEY**_   | server 酱 TURBO 推送[官方文档](https://sct.ftqq.com/sendkey) ,填写 `SENDKEY` 代码即可 |\n| _**MERGE_PUSH**_ |                     **true**: 将推送消息合并；**false**: 分开推送                     |\n"
  },
  {
    "path": "docs/pages/settings/smzdm.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 什么值得买\n\n### 配置示例\n\n```json filename=\"config.json\" copy filename=\"config.json\"\n{\n  \"SMZDM\": [\n    {\n      \"cookie\": \"__ckguid=xxxxxx\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|        参数        |          说明          |\n| :----------------: | :--------------------: |\n| _**SMZDM**_.cookie | 什么值得买 cookie 信息 |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[什么值得买](https://www.smzdm.com/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 www.smzdm.com\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/tieba.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 百度贴吧\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"TIEBA\": [\n    {\n      \"cookie\": \"BIDUPSID=xxxxxx; PSTM=xxxxxx; BAIDUID=xxxxxx; BAIDUID_BFESS=xxxxxx; delPer=xxxxxx; PSINO=xxxxxx; H_PS_PSSID=xxxxxx; BA_HECTOR=xxxxxx; BDORZ=xxxxxx; TIEBA_USERTYPE=xxxxxx; st_key_id=xxxxxx; BDUSS=xxxxxx; BDUSS_BFESS=xxxxxx; STOKEN=xxxxxx; TIEBAUID=xxxxxx; ab_sr=xxxxxx; st_data=xxxxxx; st_sign=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|        参数        |      说明       |\n| :----------------: | :-------------: |\n| _**TIEBA**_.cookie | 百度贴吧 cookie |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[百度贴吧](https://tieba.baidu.com/index.html)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 tieba.baidu.com/index.html\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/v2ex.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# V2EX\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"V2EX\": [\n    {\n      \"cookie\": \"_ga=xxxxxx; __cfduid=xxxxxx; PB3_SESSION=xxxxxx; A2=xxxxxx; V2EXSETTINGS=xxxxxx; V2EX_REFERRER=xxxxxx; V2EX_LANG=xxxxxx; _gid=xxxxxx; V2EX_TAB=xxxxxx;\",\n      \"proxy\": \"使用代理的信息，无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\",\n      \"proxy\": \"使用代理的信息，无密码例子: http://127.0.0.1:1080 有密码例子: http://username:password@127.0.0.1:1080\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|       参数        |                     说明                     |\n| :---------------: | :------------------------------------------: |\n| _**V2EX**_.cookie |                V2EX 每日签到                 |\n| _**V2EX**_.proxy  | V2EX 代理的信息，例子: http://127.0.0.1:1080 |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[V2EX](https://www.v2ex.com/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 www.v2ex.com\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/pages/settings/youdao.mdx",
    "content": "import { Callout } from 'nextra/components'\nimport { Steps } from 'nextra/components'\nimport CardList from '../../components/CardList'\n\n<CardList />\n\n# 有道云笔记\n\n### 配置示例\n\n```json filename=\"config.json\" copy\n{\n  \"YOUDAO\": [\n    {\n      \"cookie\": \"JSESSIONID=xxxxxx; __yadk_uid=xxxxxx; OUTFOX_SEARCH_USER_ID_NCOO=xxxxxx; YNOTE_SESS=xxxxxx; YNOTE_PERS=xxxxxx; YNOTE_LOGIN=xxxxxx; YNOTE_CSTK=xxxxxx; _ga=xxxxxx; _gid=xxxxxx; _gat=xxxxxx; PUBLIC_SHARE_18a9dde3de846b6a69e24431764270c4=xxxxxx;\"\n    },\n    {\n      \"cookie\": \"多账号 cookie 填写，请参考上面，cookie 以实际获取为准（遇到特殊字符如双引号\\\" 请加反斜杠转义）\"\n    }\n  ]\n}\n```\n\n### 配置说明\n\n|        参数         |             说明              |\n| :-----------------: | :---------------------------: |\n| _**YOUDAO**_.cookie | 有道云笔记 帐号的 cookie 信息 |\n\n## 获取方式\n\n> 参考「爱奇艺」获取方式\n\n![获取 cookie 教程](../img/iqiyi_cookie.png)\n\n<Steps>\n\n### 打开官网\n\n进入[有道云笔记](https://note.youdao.com/web/)\n\n### 打开开发者工具\n\n按 `F12` 打开开发者工具，刷新页面\n\n### 点击 Network 标签\n\n### 选择 Doc 标签\n\n### 选中 note.youdao.com/web/\n\n### 下滑找到 cookie 全选复制即可\n\n</Steps>\n"
  },
  {
    "path": "docs/theme.config.tsx",
    "content": "import { useRouter } from 'next/router'\nimport { DocsThemeConfig } from 'nextra-theme-docs'\n\nconst config: DocsThemeConfig = {\n  logo: <span className=\"nx-text-3xl nx-font-bold\">DailyCheckin</span>,\n  project: {\n    link: 'https://github.com/Sitoi/dailycheckin',\n  },\n  chat: {\n    link: 'https://t.me/dailycheckin',\n    icon: (\n      <svg\n        xmlns=\"http://www.w3.org/2000/svg\"\n        width=\"24\"\n        height=\"24\"\n        viewBox=\"0 0 256 256\"\n      >\n        <defs>\n          <linearGradient\n            id=\"IconifyId18cfc9cea1e90987a0\"\n            x1=\"50%\"\n            x2=\"50%\"\n            y1=\"0%\"\n            y2=\"100%\"\n          >\n            <stop\n              offset=\"0%\"\n              stopColor=\"#2AABEE\"\n            />\n            <stop\n              offset=\"100%\"\n              stopColor=\"#229ED9\"\n            />\n          </linearGradient>\n        </defs>\n        <path\n          fill=\"url(#IconifyId18cfc9cea1e90987a0)\"\n          d=\"M128 0C94.06 0 61.48 13.494 37.5 37.49A128.038 128.038 0 0 0 0 128c0 33.934 13.5 66.514 37.5 90.51C61.48 242.506 94.06 256 128 256s66.52-13.494 90.5-37.49c24-23.996 37.5-56.576 37.5-90.51c0-33.934-13.5-66.514-37.5-90.51C194.52 13.494 161.94 0 128 0\"\n        />\n        <path\n          fill=\"#FFF\"\n          d=\"M57.94 126.648c37.32-16.256 62.2-26.974 74.64-32.152c35.56-14.786 42.94-17.354 47.76-17.441c1.06-.017 3.42.245 4.96 1.49c1.28 1.05 1.64 2.47 1.82 3.467c.16.996.38 3.266.2 5.038c-1.92 20.24-10.26 69.356-14.5 92.026c-1.78 9.592-5.32 12.808-8.74 13.122c-7.44.684-13.08-4.912-20.28-9.63c-11.26-7.386-17.62-11.982-28.56-19.188c-12.64-8.328-4.44-12.906 2.76-20.386c1.88-1.958 34.64-31.748 35.26-34.45c.08-.338.16-1.598-.6-2.262c-.74-.666-1.84-.438-2.64-.258c-1.14.256-19.12 12.152-54 35.686c-5.1 3.508-9.72 5.218-13.88 5.128c-4.56-.098-13.36-2.584-19.9-4.708c-8-2.606-14.38-3.984-13.82-8.41c.28-2.304 3.46-4.662 9.52-7.072\"\n        />\n      </svg>\n    ),\n  },\n  head: (\n    <>\n      <script\n        async\n        src=\"https://umami.sitoi.cn/script.js\"\n        data-website-id=\"93cd32e8-03fb-4896-9420-6d9bff2d2359\"\n      ></script>\n    </>\n  ),\n  footer: {\n    text: 'DailyCheckin Docs © 2024',\n  },\n  docsRepositoryBase: 'https://github.com/Sitoi/dailycheckin',\n  feedback: {\n    content: '',\n  },\n  editLink: {\n    text: '',\n  },\n  useNextSeoProps() {\n    const { asPath } = useRouter()\n    if (asPath !== '/') {\n      return {\n        titleTemplate: '%s – DailyCheckIn',\n      }\n    }\n  },\n  banner: {\n    key: '2025.12.9-release',\n    text: (\n      <a\n        href=\"/dailycheckin/history/#2025-12-09\"\n        target=\"_blank\"\n      >\n        🎉 DailyCheckIn 2025.12.9 is released. Read more →\n      </a>\n    ),\n  },\n}\n\nexport default config\n"
  },
  {
    "path": "docs/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"es5\",\n    \"lib\": [\"dom\", \"dom.iterable\", \"esnext\"],\n    \"allowJs\": true,\n    \"skipLibCheck\": true,\n    \"strict\": false,\n    \"forceConsistentCasingInFileNames\": true,\n    \"noEmit\": true,\n    \"incremental\": true,\n    \"esModuleInterop\": true,\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"resolveJsonModule\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\"\n  },\n  \"include\": [\"next-env.d.ts\", \"**/*.ts\", \"**/*.tsx\"],\n  \"exclude\": [\"node_modules\"]\n}\n"
  },
  {
    "path": "imaotai_login.py",
    "content": "import hashlib\nimport json\nimport time\n\nimport requests\n\n\"\"\"\n获取地点信息,这里用的高德 api,需要自己去高德开发者平台申请自己的 key\n\"\"\"\nAMAP_KEY = \"\"\n\n\nSALT = \"2af72f100c356273d46284f6fd1dfc08\"\n\nCURRENT_TIME = str(int(time.time() * 1000))\nheaders = {}\n\n\nmt_version = json.loads(requests.get(\"https://itunes.apple.com/cn/lookup?id=1600482450\").text)[\"results\"][0][\"version\"]\n\n\nheader_context = \"\"\"\nMT-Lat: 28.499562\nMT-K: 1675213490331\nMT-Lng: 102.182324\nHost: app.moutai519.com.cn\nMT-User-Tag: 0\nAccept: */*\nMT-Network-Type: WIFI\nMT-Token: 1\nMT-Team-ID: 1\nMT-Info: 028e7f96f6369cafe1d105579c5b9377\nMT-Device-ID: 2F2075D0-B66C-4287-A903-DBFF6358342A\nMT-Bundle-ID: com.moutai.mall\nAccept-Language: en-CN;q=1, zh-Hans-CN;q=0.9\nMT-Request-ID: 167560018873318465\nMT-APP-Version: 1.3.7\nUser-Agent: iOS;16.3;Apple;?unrecognized?\nMT-R: clips_OlU6TmFRag5rCXwbNAQ/Tz1SKlN8THcecBp/HGhHdw==\nContent-Length: 93\nAccept-Encoding: gzip, deflate, br\nConnection: keep-alive\nContent-Type: application/json\nuserId: 2\n\"\"\"\n\n\n# 初始化请求头\ndef init_headers(user_id: str = \"1\", token: str = \"2\", lat: str = \"29.83826\", lng: str = \"119.74375\"):\n    for k in header_context.strip().split(\"\\n\"):\n        temp_l = k.split(\": \")\n        dict.update(headers, {temp_l[0]: temp_l[1]})\n    dict.update(headers, {\"userId\": user_id})\n    dict.update(headers, {\"MT-Token\": token})\n    dict.update(headers, {\"MT-Lat\": lat})\n    dict.update(headers, {\"MT-Lng\": lng})\n    dict.update(headers, {\"MT-APP-Version\": mt_version})\n\n\n# 用高德api获取地图信息\ndef select_geo(i: str):\n    # 校验高德api是否配置\n    if AMAP_KEY is None:\n        print(\"!!!!请配置 AMAP_KEY (高德地图的MapKey)\")\n        raise ValueError\n    resp = requests.get(f\"https://restapi.amap.com/v3/geocode/geo?key={AMAP_KEY}&output=json&address={i}\")\n    geocodes: list = resp.json()[\"geocodes\"]\n    return geocodes\n\n\ndef signature(data: dict):\n    keys = sorted(data.keys())\n    temp_v = \"\"\n    for item in keys:\n        temp_v += data[item]\n    text = SALT + temp_v + CURRENT_TIME\n    hl = hashlib.md5()\n    hl.update(text.encode(encoding=\"utf8\"))\n    md5 = hl.hexdigest()\n    return md5\n\n\n# 获取登录手机验证码\ndef get_vcode(mobile: str):\n    params = {\"mobile\": mobile}\n    md5 = signature(params)\n    dict.update(params, {\"md5\": md5, \"timestamp\": CURRENT_TIME, \"MT-APP-Version\": mt_version})\n    responses = requests.post(\n        \"https://app.moutai519.com.cn/xhr/front/user/register/vcode\",\n        json=params,\n        headers=headers,\n    )\n    if responses.status_code != 200:\n        print(\n            f\"get v_code : params : {params}, response code : {responses.status_code}, response body : {responses.text}\"\n        )\n\n\n# 执行登录操作\ndef login(mobile: str, v_code: str):\n    params = {\"mobile\": mobile, \"vCode\": v_code, \"ydToken\": \"\", \"ydLogId\": \"\"}\n    md5 = signature(params)\n    dict.update(params, {\"md5\": md5, \"timestamp\": CURRENT_TIME, \"MT-APP-Version\": mt_version})\n    responses = requests.post(\n        \"https://app.moutai519.com.cn/xhr/front/user/register/login\",\n        json=params,\n        headers=headers,\n    )\n    if responses.status_code != 200:\n        print(f\"login : params : {params}, response code : {responses.status_code}, response body : {responses.text}\")\n    dict.update(headers, {\"MT-Token\": responses.json()[\"data\"][\"token\"]})\n    dict.update(headers, {\"userId\": responses.json()[\"data\"][\"userId\"]})\n    return responses.json()[\"data\"][\"token\"], responses.json()[\"data\"][\"userId\"]\n\n\ndef get_location():\n    while 1:\n        location = input(\"请输入精确小区位置，例如[小区名称]，为你自动预约附近的门店:\").strip()\n        selects = select_geo(location)\n\n        a = 0\n        for item in selects:\n            formatted_address = item[\"formatted_address\"]\n            province = item[\"province\"]\n            print(f\"{a} : [地区:{province},位置:{formatted_address}]\")\n            a += 1\n        user_select = input(\"请选择位置序号,重新输入请输入[-]:\").strip()\n        if user_select == \"-\":\n            continue\n        select = selects[int(user_select)]\n        formatted_address = select[\"formatted_address\"]\n        province = select[\"province\"]\n        print(f\"已选择 地区:{province},[{formatted_address}]附近的门店\")\n        return select\n\n\nif __name__ == \"__main__\":\n    items = []\n    while 1:\n        init_headers()\n        location_select: dict = get_location()\n        province = location_select[\"province\"]\n        city = location_select[\"city\"]\n        location: str = location_select[\"location\"]\n\n        mobile = input(\"输入手机号[18888888888]:\").strip()\n        get_vcode(mobile)\n        code = input(f\"输入 [{mobile}] 验证码[8888]:\").strip()\n        token, user_id = login(mobile, code)\n        item = {\n            \"province\": province,\n            \"city\": str(city),\n            \"lat\": location.split(\",\")[1],\n            \"lng\": location.split(\",\")[0],\n            \"mobile\": str(mobile),\n            \"token\": str(token),\n            \"userid\": str(user_id),\n            \"reserve_rule\": 0,\n            \"item_codes\": [\"11318\", \"11319\"],\n        }\n        items.append(item)\n        condition = input(\"是否继续添加账号[y/n]:\").strip()\n        with open(\"account.json\", \"w\") as f:\n            f.write(json.dumps(items, ensure_ascii=False, indent=4))\n        if condition.lower() == \"n\":\n            break\n"
  },
  {
    "path": "pyproject.toml",
    "content": "[project]\nname = \"dailycheckin\"\nversion = \"25.12.9\"\ndependencies = [\n    \"pycryptodome==3.17\",\n    \"requests~=2.25.1\",\n    \"rsa~=4.0\",\n    \"urllib3~=1.26.2\",\n]\ndynamic = [\"readme\",\"requires-python\",\"license\",\"authors\",\"classifiers\",\"urls\",\"scripts\"]\n\n\n[tool.ruff]\nline-length = 120\nindent-width = 4\ntarget-version = \"py39\"\n\n[tool.ruff.lint]\nignore-init-module-imports = false\nselect = [\n    \"F\",\n    \"E\",\n    \"W\",\n    \"UP\",\n    \"N\",\n    \"PL\",\n    \"PERF\",\n    \"RUF\",\n]\nignore = [\n    \"F401\",\n    \"PLR0913\",\n    \"N802\",\n    \"N805\",\n    \"PLR2004\",\n    \"RUF001\",\n    \"PLW1508\",\n    \"PERF401\",\n    \"RUF003\",\n    \"PLR0912\",\n    \"E501\",\n    \"PLR0915\",\n    \"PERF203\"\n]\n"
  },
  {
    "path": "requirements.txt",
    "content": "pycryptodome==3.17\nrequests~=2.25.1\nrsa~=4.0\nurllib3~=1.26.2\n"
  },
  {
    "path": "setup.py",
    "content": "import os\n\nfrom setuptools import find_packages, setup\n\nNAME = \"dailycheckin\"\nFOLDER = \"dailycheckin\"\nDESCRIPTION = \"dailycheckin\"\nEMAIL = \"133397418@qq.com\"\nAUTHOR = \"Sitoi\"\nREQUIRES_PYTHON = \">=3.9.0\"\nVERSION = None\n\n\ndef read_file(filename):\n    with open(filename) as fp:\n        return fp.read().strip()\n\n\ndef read_requirements(filename):\n    return [line.strip() for line in read_file(filename).splitlines() if not line.startswith(\"#\")]\n\n\nREQUIRED = read_requirements(\"requirements.txt\")\n\nhere = os.path.abspath(os.path.dirname(__file__))\n\ntry:\n    with open(os.path.join(here, \"README.md\"), encoding=\"utf-8\") as f:\n        long_description = \"\\n\" + f.read()\nexcept FileNotFoundError:\n    long_description = DESCRIPTION\n\nabout = {}\nif not VERSION:\n    with open(os.path.join(here, FOLDER, \"__version__.py\")) as f:\n        exec(f.read(), about)\nelse:\n    about[\"__version__\"] = VERSION\n\n\ndef package_files(directories):\n    paths = []\n    for item in directories:\n        if os.path.isfile(item):\n            paths.append(os.path.join(\"..\", item))\n            continue\n        for path, _, filenames in os.walk(item):\n            for filename in filenames:\n                paths.append(os.path.join(\"..\", path, filename))\n    return paths\n\n\nsetup(\n    name=NAME,\n    version=about[\"__version__\"],\n    description=DESCRIPTION,\n    long_description=long_description,\n    long_description_content_type=\"text/markdown\",\n    author=AUTHOR,\n    author_email=EMAIL,\n    python_requires=REQUIRES_PYTHON,\n    url=\"https://sitoi.cn\",\n    project_urls={\"Documentation\": \"https://sitoi.github.io/dailycheckin/\"},\n    packages=find_packages(exclude=(\"config\",)),\n    install_requires=REQUIRED,\n    include_package_data=True,\n    license=\"MIT\",\n    zip_safe=False,\n    entry_points={\"console_scripts\": [\"dailycheckin = dailycheckin.main:checkin\"]},\n    classifiers=[\n        \"License :: OSI Approved :: MIT License\",\n        \"Programming Language :: Python :: 3.9\",\n        \"Programming Language :: Python :: 3.10\",\n        \"Programming Language :: Python :: Implementation :: CPython\",\n        \"Programming Language :: Python :: Implementation :: PyPy\",\n    ],\n)\n"
  }
]