<div>
<img alt="Mys_Goods_Tool 预览" src="https://user-images.githubusercontent.com/63289359/235797444-21a86294-609e-4c7a-9d7d-5d3683fe6ab2.png" width="45%" />
<img alt="Mys_Goods_Tool 预览2" src="https://user-images.githubusercontent.com/63289359/235799237-3039c3e0-8fdb-4c12-957b-afb50f34625c.png" width="45%" />
</div>
# 米游社商品兑换工具
<div>
<img alt="CodeFactor" src="https://www.codefactor.io/repository/github/ljzd-pro/mys_goods_tool/badge?style=for-the-badge">
<img alt="最新发行版" src="https://img.shields.io/github/v/release/Ljzd-PRO/Mys_Goods_Tool?logo=python&style=for-the-badge">
<img alt="最后提交" src="https://img.shields.io/github/last-commit/Ljzd-PRO/Mys_Goods_Tool?style=for-the-badge">
<img alt="代码行数" src="https://img.shields.io/tokei/lines/github/Ljzd-PRO/Mys_Goods_Tool?style=for-the-badge">
<img alt="构建结果" src="https://img.shields.io/github/actions/workflow/status/Ljzd-PRO/Mys_Goods_Tool/build-v2.yml?event=pull_request&style=for-the-badge">
<img alt="Python版本兼容性测试" src="https://img.shields.io/github/actions/workflow/status/Ljzd-PRO/Mys_Goods_Tool/python-package.yml?event=pull_request&label=Versions%20Test&style=for-the-badge">
</div>
### 更新说明
v2.1.0
- 在兑换开始后的一段时间内不断尝试兑换,直到成功
> 完整流程:兑换开始后,数个线程同时进行,每个线程在一段时间内重复发送兑换请求
>
原因:[太早兑换可能被认定不在兑换时间](https://github.com/Ljzd-PRO/Mys_Goods_Tool/discussions/135#discussioncomment-6487717)
- 兑换开始后将不会延迟兑换,用户数据文件中 `preference.exchange_latency` 将作为同一线程下每个兑换请求之间的时间间隔
> `preference.exchange_latency` 为列表类型,包含两个浮点数,分别为最小延迟和最大延迟,单位为秒,可参考默认值
- 兑换请求日志内容增加了发送请求时的时间戳
v2.1.0-beta.1
- 兑换请求Headers增加与修改了 `Referer`, `x-rpc-device_fp`, `x-rpc-verify_key`, `Origin` 等字段,可能修复兑换失败的问题
- 修复登陆时因为连接断开(client has been closed)而导致登陆失败的问题
- 防止因配置文件中默认存在 `device_config`, `salt_config` 而导致更新后默认配置被原配置覆盖的问题
- 若需要修改 `device_config` 配置,修改后还设置用户数据文件中 `preference.override_device_and_salt` 为 `true` 以覆盖默认值
- 修复Unix下即使安装了 uvloop 也找不到,无法应用的问题
## 功能和特性
- [x] 使用 [Textual](https://github.com/Textualize/textual) 终端图形界面库,支持 Windows / Linux / macOS 甚至可能是移动端SSH客户端
- [x] 短信验证码登录(只需接收一次验证码)
- [x] 内置人机验证页面,无需前往官网验证
- [x] 多账号支持
- [x] 支持米游社所有分区的商品兑换
### 预览图
<details>
<summary>短信验证登录</summary>
<img src="https://user-images.githubusercontent.com/63289359/235790425-7c502a69-baac-4ced-ba07-d068a88a7ae9.png" alt="短信验证登录页面" />
<img src="https://user-images.githubusercontent.com/63289359/235790979-85954be8-023f-47e0-bb69-bb16385905d4.png" alt="人机验证页面" />
</details>
<details>
<summary>管理兑换计划</summary>
<img src="https://user-images.githubusercontent.com/63289359/235791200-d1a7c8f0-9a9a-4fcc-91bf-69fe397e6420.png" alt="选择目标商品页面" />
<img src="https://user-images.githubusercontent.com/63289359/235791332-3d8ea836-7d0b-4dbf-b643-81c65eaa5082.png" alt="确认添加计划页面" />
<img src="https://user-images.githubusercontent.com/63289359/235791435-69edf6f7-9abf-4c81-8da4-44a486c6d362.png" alt="管理计划页面" />
</details>
<details>
<summary>进入兑换模式</summary>
<img src="https://user-images.githubusercontent.com/63289359/235791620-bf32692d-a521-49b3-bf2a-23d7012b6fff.png" alt="兑换模式页面" />
</details>
## 使用说明
参考 [🛠️ 下载安装](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki/Installation)
## 常见问题
参考 [❓ 常见问题](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki/Troubleshooting)
## 代码结构
参考 [📃 代码结构](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki/Source-Structure)
## 其他
- [**🔗完整说明文档**](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki)
- 仅供学习时参考
- 相似项目推荐: \
**mysTool - 米游社辅助工具插件** \
简介:NoneBot2 插件 | 米游社工具-每日米游币任务、游戏签到、商品兑换、免抓包登录、原神树脂提醒 \
🔗 https://github.com/Ljzd-PRO/nonebot-plugin-mystool
- [🔗Bug 反馈](https://github.com/Ljzd-PRO/Mys_Goods_Tool/issues)
- 如果你知道如何修复一些Bug和新增功能,也欢迎提交你的修订代码 [🔗Pull requests](https://github.com/Ljzd-PRO/Mys_Goods_Tool/pulls)
Raw data
{
"_id": null,
"home_page": "https://github.com/Ljzd-PRO/Mys_Goods_Tool",
"name": "mys-goods-tool",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9,<3.12",
"maintainer_email": "",
"keywords": "mihoyo,mihoyobbs,genshin impact,textual,tui",
"author": "Ljzd-PRO",
"author_email": "ljzd@office.ljzd-pro.ml",
"download_url": "https://files.pythonhosted.org/packages/ee/3b/4ea51d1dddee0ab8cd13113036c1546925b69ac2221fa6c8b92fe2947ee5/mys_goods_tool-2.1.0.tar.gz",
"platform": null,
"description": "<div>\n <img alt=\"Mys_Goods_Tool \u9884\u89c8\" src=\"https://user-images.githubusercontent.com/63289359/235797444-21a86294-609e-4c7a-9d7d-5d3683fe6ab2.png\" width=\"45%\" />\n <img alt=\"Mys_Goods_Tool \u9884\u89c82\" src=\"https://user-images.githubusercontent.com/63289359/235799237-3039c3e0-8fdb-4c12-957b-afb50f34625c.png\" width=\"45%\" />\n</div>\n\n# \u7c73\u6e38\u793e\u5546\u54c1\u5151\u6362\u5de5\u5177\n\n<div>\n <img alt=\"CodeFactor\" src=\"https://www.codefactor.io/repository/github/ljzd-pro/mys_goods_tool/badge?style=for-the-badge\">\n <img alt=\"\u6700\u65b0\u53d1\u884c\u7248\" src=\"https://img.shields.io/github/v/release/Ljzd-PRO/Mys_Goods_Tool?logo=python&style=for-the-badge\">\n <img alt=\"\u6700\u540e\u63d0\u4ea4\" src=\"https://img.shields.io/github/last-commit/Ljzd-PRO/Mys_Goods_Tool?style=for-the-badge\">\n <img alt=\"\u4ee3\u7801\u884c\u6570\" src=\"https://img.shields.io/tokei/lines/github/Ljzd-PRO/Mys_Goods_Tool?style=for-the-badge\">\n <img alt=\"\u6784\u5efa\u7ed3\u679c\" src=\"https://img.shields.io/github/actions/workflow/status/Ljzd-PRO/Mys_Goods_Tool/build-v2.yml?event=pull_request&style=for-the-badge\">\n <img alt=\"Python\u7248\u672c\u517c\u5bb9\u6027\u6d4b\u8bd5\" src=\"https://img.shields.io/github/actions/workflow/status/Ljzd-PRO/Mys_Goods_Tool/python-package.yml?event=pull_request&label=Versions%20Test&style=for-the-badge\">\n</div>\n\n### \u66f4\u65b0\u8bf4\u660e\n\nv2.1.0\n\n- \u5728\u5151\u6362\u5f00\u59cb\u540e\u7684\u4e00\u6bb5\u65f6\u95f4\u5185\u4e0d\u65ad\u5c1d\u8bd5\u5151\u6362\uff0c\u76f4\u5230\u6210\u529f\n > \u5b8c\u6574\u6d41\u7a0b\uff1a\u5151\u6362\u5f00\u59cb\u540e\uff0c\u6570\u4e2a\u7ebf\u7a0b\u540c\u65f6\u8fdb\u884c\uff0c\u6bcf\u4e2a\u7ebf\u7a0b\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u91cd\u590d\u53d1\u9001\u5151\u6362\u8bf7\u6c42 \n >\n \u539f\u56e0\uff1a[\u592a\u65e9\u5151\u6362\u53ef\u80fd\u88ab\u8ba4\u5b9a\u4e0d\u5728\u5151\u6362\u65f6\u95f4](https://github.com/Ljzd-PRO/Mys_Goods_Tool/discussions/135#discussioncomment-6487717)\n- \u5151\u6362\u5f00\u59cb\u540e\u5c06\u4e0d\u4f1a\u5ef6\u8fdf\u5151\u6362\uff0c\u7528\u6237\u6570\u636e\u6587\u4ef6\u4e2d `preference.exchange_latency` \u5c06\u4f5c\u4e3a\u540c\u4e00\u7ebf\u7a0b\u4e0b\u6bcf\u4e2a\u5151\u6362\u8bf7\u6c42\u4e4b\u95f4\u7684\u65f6\u95f4\u95f4\u9694\n > `preference.exchange_latency` \u4e3a\u5217\u8868\u7c7b\u578b\uff0c\u5305\u542b\u4e24\u4e2a\u6d6e\u70b9\u6570\uff0c\u5206\u522b\u4e3a\u6700\u5c0f\u5ef6\u8fdf\u548c\u6700\u5927\u5ef6\u8fdf\uff0c\u5355\u4f4d\u4e3a\u79d2\uff0c\u53ef\u53c2\u8003\u9ed8\u8ba4\u503c\n- \u5151\u6362\u8bf7\u6c42\u65e5\u5fd7\u5185\u5bb9\u589e\u52a0\u4e86\u53d1\u9001\u8bf7\u6c42\u65f6\u7684\u65f6\u95f4\u6233\n\nv2.1.0-beta.1\n\n- \u5151\u6362\u8bf7\u6c42Headers\u589e\u52a0\u4e0e\u4fee\u6539\u4e86 `Referer`, `x-rpc-device_fp`, `x-rpc-verify_key`, `Origin` \u7b49\u5b57\u6bb5\uff0c\u53ef\u80fd\u4fee\u590d\u5151\u6362\u5931\u8d25\u7684\u95ee\u9898\n- \u4fee\u590d\u767b\u9646\u65f6\u56e0\u4e3a\u8fde\u63a5\u65ad\u5f00\uff08client has been closed\uff09\u800c\u5bfc\u81f4\u767b\u9646\u5931\u8d25\u7684\u95ee\u9898\n- \u9632\u6b62\u56e0\u914d\u7f6e\u6587\u4ef6\u4e2d\u9ed8\u8ba4\u5b58\u5728 `device_config`, `salt_config` \u800c\u5bfc\u81f4\u66f4\u65b0\u540e\u9ed8\u8ba4\u914d\u7f6e\u88ab\u539f\u914d\u7f6e\u8986\u76d6\u7684\u95ee\u9898\n- \u82e5\u9700\u8981\u4fee\u6539 `device_config` \u914d\u7f6e\uff0c\u4fee\u6539\u540e\u8fd8\u8bbe\u7f6e\u7528\u6237\u6570\u636e\u6587\u4ef6\u4e2d `preference.override_device_and_salt` \u4e3a `true` \u4ee5\u8986\u76d6\u9ed8\u8ba4\u503c\n- \u4fee\u590dUnix\u4e0b\u5373\u4f7f\u5b89\u88c5\u4e86 uvloop \u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5e94\u7528\u7684\u95ee\u9898\n\n## \u529f\u80fd\u548c\u7279\u6027\n\n- [x] \u4f7f\u7528 [Textual](https://github.com/Textualize/textual) \u7ec8\u7aef\u56fe\u5f62\u754c\u9762\u5e93\uff0c\u652f\u6301 Windows / Linux / macOS \u751a\u81f3\u53ef\u80fd\u662f\u79fb\u52a8\u7aefSSH\u5ba2\u6237\u7aef\n- [x] \u77ed\u4fe1\u9a8c\u8bc1\u7801\u767b\u5f55\uff08\u53ea\u9700\u63a5\u6536\u4e00\u6b21\u9a8c\u8bc1\u7801\uff09\n- [x] \u5185\u7f6e\u4eba\u673a\u9a8c\u8bc1\u9875\u9762\uff0c\u65e0\u9700\u524d\u5f80\u5b98\u7f51\u9a8c\u8bc1\n- [x] \u591a\u8d26\u53f7\u652f\u6301\n- [x] \u652f\u6301\u7c73\u6e38\u793e\u6240\u6709\u5206\u533a\u7684\u5546\u54c1\u5151\u6362\n\n### \u9884\u89c8\u56fe\n\n<details>\n <summary>\u77ed\u4fe1\u9a8c\u8bc1\u767b\u5f55</summary>\n <img src=\"https://user-images.githubusercontent.com/63289359/235790425-7c502a69-baac-4ced-ba07-d068a88a7ae9.png\" alt=\"\u77ed\u4fe1\u9a8c\u8bc1\u767b\u5f55\u9875\u9762\" />\n <img src=\"https://user-images.githubusercontent.com/63289359/235790979-85954be8-023f-47e0-bb69-bb16385905d4.png\" alt=\"\u4eba\u673a\u9a8c\u8bc1\u9875\u9762\" />\n</details>\n\n<details>\n <summary>\u7ba1\u7406\u5151\u6362\u8ba1\u5212</summary>\n <img src=\"https://user-images.githubusercontent.com/63289359/235791200-d1a7c8f0-9a9a-4fcc-91bf-69fe397e6420.png\" alt=\"\u9009\u62e9\u76ee\u6807\u5546\u54c1\u9875\u9762\" />\n <img src=\"https://user-images.githubusercontent.com/63289359/235791332-3d8ea836-7d0b-4dbf-b643-81c65eaa5082.png\" alt=\"\u786e\u8ba4\u6dfb\u52a0\u8ba1\u5212\u9875\u9762\" />\n <img src=\"https://user-images.githubusercontent.com/63289359/235791435-69edf6f7-9abf-4c81-8da4-44a486c6d362.png\" alt=\"\u7ba1\u7406\u8ba1\u5212\u9875\u9762\" />\n</details>\n\n<details>\n <summary>\u8fdb\u5165\u5151\u6362\u6a21\u5f0f</summary>\n <img src=\"https://user-images.githubusercontent.com/63289359/235791620-bf32692d-a521-49b3-bf2a-23d7012b6fff.png\" alt=\"\u5151\u6362\u6a21\u5f0f\u9875\u9762\" />\n</details>\n\n## \u4f7f\u7528\u8bf4\u660e\n\n\u53c2\u8003 [\ud83d\udee0\ufe0f \u4e0b\u8f7d\u5b89\u88c5](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki/Installation)\n\n## \u5e38\u89c1\u95ee\u9898\n\n\u53c2\u8003 [\u2753 \u5e38\u89c1\u95ee\u9898](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki/Troubleshooting)\n\n## \u4ee3\u7801\u7ed3\u6784\n\n\u53c2\u8003 [\ud83d\udcc3 \u4ee3\u7801\u7ed3\u6784](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki/Source-Structure)\n\n## \u5176\u4ed6\n\n- [**\ud83d\udd17\u5b8c\u6574\u8bf4\u660e\u6587\u6863**](https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki)\n\n- \u4ec5\u4f9b\u5b66\u4e60\u65f6\u53c2\u8003\n\n- \u76f8\u4f3c\u9879\u76ee\u63a8\u8350: \\\n **mysTool - \u7c73\u6e38\u793e\u8f85\u52a9\u5de5\u5177\u63d2\u4ef6** \\\n \u7b80\u4ecb\uff1aNoneBot2 \u63d2\u4ef6 | \u7c73\u6e38\u793e\u5de5\u5177-\u6bcf\u65e5\u7c73\u6e38\u5e01\u4efb\u52a1\u3001\u6e38\u620f\u7b7e\u5230\u3001\u5546\u54c1\u5151\u6362\u3001\u514d\u6293\u5305\u767b\u5f55\u3001\u539f\u795e\u6811\u8102\u63d0\u9192 \\\n \ud83d\udd17 https://github.com/Ljzd-PRO/nonebot-plugin-mystool\n\n- [\ud83d\udd17Bug \u53cd\u9988](https://github.com/Ljzd-PRO/Mys_Goods_Tool/issues) \n- \u5982\u679c\u4f60\u77e5\u9053\u5982\u4f55\u4fee\u590d\u4e00\u4e9bBug\u548c\u65b0\u589e\u529f\u80fd\uff0c\u4e5f\u6b22\u8fce\u63d0\u4ea4\u4f60\u7684\u4fee\u8ba2\u4ee3\u7801 [\ud83d\udd17Pull requests](https://github.com/Ljzd-PRO/Mys_Goods_Tool/pulls)\n",
"bugtrack_url": null,
"license": "",
"summary": "\u7c73\u6e38\u793e\u5546\u54c1\u5151\u6362\u5de5\u5177|\u77ed\u4fe1\u9a8c\u8bc1\u767b\u5f55|\u7ec8\u7aefTUI\u754c\u9762",
"version": "2.1.0",
"project_urls": {
"Bug Tracker": "https://github.com/Ljzd-PRO/Mys_Goods_Tool/issues",
"Documentation": "https://github.com/Ljzd-PRO/Mys_Goods_Tool/wiki",
"Homepage": "https://github.com/Ljzd-PRO/Mys_Goods_Tool",
"Repository": "https://github.com/Ljzd-PRO/Mys_Goods_Tool"
},
"split_keywords": [
"mihoyo",
"mihoyobbs",
"genshin impact",
"textual",
"tui"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "3ca360e57c50d75a098cf2e9be27a68c1f6111887d564bcf26f2dc822ccb5bb2",
"md5": "c3f9f0fc06fbf31456a4f78f27f819e0",
"sha256": "f5ef23e4d515a866fb86ec97f231d878c05a94d377e8bb74f192375d66dcacd7"
},
"downloads": -1,
"filename": "mys_goods_tool-2.1.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "c3f9f0fc06fbf31456a4f78f27f819e0",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9,<3.12",
"size": 162684,
"upload_time": "2023-07-20T21:00:11",
"upload_time_iso_8601": "2023-07-20T21:00:11.031153Z",
"url": "https://files.pythonhosted.org/packages/3c/a3/60e57c50d75a098cf2e9be27a68c1f6111887d564bcf26f2dc822ccb5bb2/mys_goods_tool-2.1.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "ee3b4ea51d1dddee0ab8cd13113036c1546925b69ac2221fa6c8b92fe2947ee5",
"md5": "0647090e6daacd6c973495a84b17bd1f",
"sha256": "52a8e3a11dd7ed6e73ccf937265cbd8e8483b376edce2eda6d20ad0eba462898"
},
"downloads": -1,
"filename": "mys_goods_tool-2.1.0.tar.gz",
"has_sig": false,
"md5_digest": "0647090e6daacd6c973495a84b17bd1f",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9,<3.12",
"size": 149209,
"upload_time": "2023-07-20T21:00:12",
"upload_time_iso_8601": "2023-07-20T21:00:12.512831Z",
"url": "https://files.pythonhosted.org/packages/ee/3b/4ea51d1dddee0ab8cd13113036c1546925b69ac2221fa6c8b92fe2947ee5/mys_goods_tool-2.1.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-07-20 21:00:12",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Ljzd-PRO",
"github_project": "Mys_Goods_Tool",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "tenacity",
"specs": [
[
"~=",
"8.2.2"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.31.0"
]
]
},
{
"name": "ping3",
"specs": [
[
"~=",
"4.0.4"
]
]
},
{
"name": "ntplib",
"specs": [
[
"~=",
"0.4.0"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"1.10.9"
]
]
},
{
"name": "loguru",
"specs": [
[
"~=",
"0.7.0"
]
]
},
{
"name": "httpx",
"specs": [
[
"==",
"0.24.1"
]
]
},
{
"name": "rich",
"specs": [
[
"==",
"13.4.2"
]
]
},
{
"name": "textual",
"specs": [
[
"<=",
"0.27.0"
]
]
},
{
"name": "socksio",
"specs": [
[
"~=",
"1.0.0"
]
]
},
{
"name": "apscheduler",
"specs": [
[
"~=",
"3.10.1"
]
]
},
{
"name": "uvloop",
"specs": [
[
"~=",
"0.17.0"
]
]
},
{
"name": "pyinstaller",
"specs": [
[
"==",
"5.12.0"
]
]
},
{
"name": "pytest",
"specs": [
[
"~=",
"7.3.1"
]
]
},
{
"name": "pytest-html",
"specs": [
[
"~=",
"3.2.0"
]
]
},
{
"name": "pytest-asyncio",
"specs": [
[
"~=",
"0.21.0"
]
]
},
{
"name": "flake8",
"specs": [
[
"~=",
"6.0.0"
]
]
},
{
"name": "pydevd-pycharm",
"specs": [
[
"~=",
"231.8109.197"
]
]
}
],
"lcname": "mys-goods-tool"
}