Loading...
Loading...
Compare original and translation side by side
1. 尝试密码登录
├─ 成功 → 保存session,完成
└─ 失败 (code: 1101) → 需要验证码登录
2. 获取图形验证码
└─ 展示图片给用户,等待人工识别
3. 发送短信验证码
└─ 使用图形验证码答案调用发送API
4. 短信验证码登录
└─ 用户提供短信验证码,完成登录
5. 保存Session
└─ Session保存在 /tmp/linkfox_wmtwin_sessions/{phone}.json1. 尝试密码登录
├─ 成功 → 保存session,完成
└─ 失败 (code: 1101) → 需要验证码登录
2. 获取图形验证码
└─ 展示图片给用户,等待人工识别
3. 发送短信验证码
└─ 使用图形验证码答案调用发送API
4. 短信验证码登录
└─ 用户提供短信验证码,完成登录
5. 保存Session
└─ Session保存在 /tmp/linkfox_wmtwin_sessions/{phone}.json{
"code": 1, // 注意:1表示成功,不是0!
"msg": "成功",
"data": {...}
}{
"code": 1101, // 其他code表示失败
"msg": "错误信息",
"data": null
}def is_success(result):
return result.get('code') in [0, 1] and result.get('msg') in ['成功', '操作成功']{
"code": 1, // 注意:1表示成功,不是0!
"msg": "成功",
"data": {...}
}{
"code": 1101, // 其他code表示失败
"msg": "错误信息",
"data": null
}def is_success(result):
return result.get('code') in [0, 1] and result.get('msg') in ['成功', '操作成功']| Code | 含义 | 处理方式 |
|---|---|---|
| 1 | 成功 | 正常处理 |
| 1101 | 环境异常,需要验证码登录 | 执行短信登录流程 |
| 1008 | 验证码错误 | 重新获取验证码 |
| 1020 | 短信验证码错误 | 检查验证码或重新发送 |
| 错误码 | 含义 | 处理方式 |
|---|---|---|
| 1 | 成功 | 正常处理 |
| 1101 | 环境异常,需要验证码登录 | 执行短信登录流程 |
| 1008 | 验证码错误 | 重新获取验证码 |
| 1020 | 短信验证码错误 | 检查验证码或重新发送 |
| Endpoint | Method | Description |
|---|---|---|
| POST | 密码登录 |
| GET | 获取图形验证码 |
| POST | 发送短信验证码 |
| POST | 短信验证码登录 |
references/api.md| 端点 | 请求方法 | 描述 |
|---|---|---|
| POST | 密码登录 |
| GET | 获取图形验证码 |
| POST | 发送短信验证码 |
| POST | 短信验证码登录 |
references/api.mdundefinedundefinedundefinedundefinedpython3 scripts/wmtwin_login.py check 13699998888python3 scripts/wmtwin_login.py check 13699998888undefinedundefinedundefinedundefined/tmp/linkfox_wmtwin_sessions/{phone}.json/tmp/linkfox_wmtwin_sessions/{phone}.json{
"cookies": {
"wal": "encoded_session_token"
},
"headers": {
"User-Agent": "...",
"Content-Type": "application/json"
},
"saved_at": "2024-04-28T16:28:08.987745"
}{
"cookies": {
"wal": "encoded_session_token"
},
"headers": {
"User-Agent": "...",
"Content-Type": "application/json"
},
"saved_at": "2024-04-28T16:28:08.987745"
}undefinedundefinedundefinedundefinedfrom Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEICVdtxqOCBwHN9a/+YxeXz/B
ZGfduADPfV9dUTW+hGVpIcXU6kBkUdlhVPPdO6n7irK7dxD56m1xG1EmV2RICsvy
W2Y7JVyRRVhun92urbw7TtBcMCCB5SzLI+x1LBUr98SMkMNRQxcnYPkrPj0qGI4v
MC52dJ7z3n6aMf3XoQIDAQAB
-----END PUBLIC KEY-----"""
def encrypt_password(password):
public_key = RSA.import_key(PUBLIC_KEY)
cipher = PKCS1_v1_5.new(public_key)
encrypted_bytes = cipher.encrypt(password.encode('utf-8'))
return base64.b64encode(encrypted_bytes).decode('utf-8')from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
import base64
PUBLIC_KEY = """-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEICVdtxqOCBwHN9a/+YxeXz/B
ZGfduADPfV9dUTW+hGVpIcXU6kBkUdlhVPPdO6n7irK7dxD56m1xG1EmV2RICsvy
W2Y7JVyRRVhun92urbw7TtBcMCCB5SzLI+x1LBUr98SMkMNRQxcnYPkrPj0qGI4v
MC52dJ7z3n6aMf3XoQIDAQAB
-----END PUBLIC KEY-----"""
def encrypt_password(password):
public_key = RSA.import_key(PUBLIC_KEY)
cipher = PKCS1_v1_5.new(public_key)
encrypted_bytes = cipher.encrypt(password.encode('utf-8'))
return base64.b64encode(encrypted_bytes).decode('utf-8')| 编码范围 | Unicode | 映射 | 用途 | 方案 |
|---|---|---|---|---|
| 323 | 单字符 | 小数点 | 价格小数点 | 通用 |
| 324-333 | 10字符 | 数字 0-9 | 简单数字(评论数等) | API方案 |
| 334-385 | 52字符 | A-Z, a-z | 卖家名称、公司名 | API方案 |
| 528 | 单字符 | 小数点 | 价格小数点 | 文档方案 |
| 529-538 | 10字符 | 数字 0-9 | 数字 | 文档方案 |
| 539-564 | 26字符 | 大写 A-Z | 大写字母 | 文档方案 |
| 565-590 | 26字符 | 小写 a-z | 小写字母 | 文档方案 |
| 编码范围 | Unicode | 映射 | 用途 | 方案 |
|---|---|---|---|---|
| 323 | 单字符 | 小数点 | 价格小数点 | 通用 |
| 324-333 | 10字符 | 数字 0-9 | 简单数字(评论数等) | API方案 |
| 334-385 | 52字符 | A-Z, a-z | 卖家名称、公司名 | API方案 |
| 528 | 单字符 | 小数点 | 价格小数点 | 文档方案 |
| 529-538 | 10字符 | 数字 0-9 | 数字 | 文档方案 |
| 539-564 | 26字符 | 大写 A-Z | 大写字母 | 文档方案 |
| 565-590 | 26字符 | 小写 a-z | 小写字母 | 文档方案 |
undefinedundefinedundefinedundefinedscripts/wmtwin_complete_decoder.pyundefinedscripts/wmtwin_complete_decoder.pyundefined
**在代码中使用**:
```python
from scripts.wmtwin_complete_decoder import decode_json, decode_json_file
**在代码中使用**:
```python
from scripts.wmtwin_complete_decoder import decode_json, decode_json_fileundefinedundefinednumber_of_reviewsadditional_offer_countsales_volumesales_amountsellersdisplay_namenameseller_reviewsseller_ratingsales_trendssales_amount.label$2110.4k+sales_volume.label197.0k+month_sales_growthgross_profitgross_profit_marginnumber_of_reviewsadditional_offer_countsales_volumesales_amountsellersdisplay_namenameseller_reviewsseller_ratingsales_trendssales_amount.label$2110.4k+sales_volume.label197.0k+month_sales_growthgross_profitgross_profit_marginundefinedundefinedundefinedundefinedfrom scripts.wmtwin_login import load_session
session = load_session(phone)from scripts.wmtwin_login import call_api
result = call_api(phone, endpoint, method, data)from scripts.wmtwin_login import load_session
session = load_session(phone)from scripts.wmtwin_login import call_api
result = call_api(phone, endpoint, method, data)undefinedundefinedundefinedundefinedcat /tmp/linkfox_wmtwin_sessions/13699998888.json | python3 -m json.toolcat /tmp/linkfox_wmtwin_sessions/13699998888.json | python3 -m json.toolrm /tmp/linkfox_wmtwin_sessions/13699998888.jsonrm /tmp/linkfox_wmtwin_sessions/13699998888.json| Operation | Time |
|---|---|
| Password login attempt | < 2s |
| Get CAPTCHA | < 1s |
| Send SMS code | < 2s |
| SMS login | < 2s |
| API call (logged in) | < 2s |
| 操作 | 耗时 |
|---|---|
| 密码登录尝试 | < 2秒 |
| 获取验证码 | < 1秒 |
| 发送短信验证码 | < 2秒 |
| 短信登录 | < 2秒 |
| API调用(已登录) | < 2秒 |
undefinedundefined
**特性:**
- ✅ 自动检测请求数量是否超过单页限制(50条)
- ✅ 自动查询多页直到达到目标数量
- ✅ 自动合并多页结果为单个JSON文件
- ✅ 显示实时查询进度(已获取/目标总数)
- ✅ 支持所有筛选条件
**特性:**
- ✅ 自动检测请求数量是否超过单页限制(50条)
- ✅ 自动查询多页直到达到目标数量
- ✅ 自动合并多页结果为单个JSON文件
- ✅ 显示实时查询进度(已获取/目标总数)
- ✅ 支持所有筛选条件from scripts.wmtwin_search_competitors import WMTwinCompetitorSearchfrom scripts.wmtwin_search_competitors import WMTwinCompetitorSearchundefinedundefinedundefinedundefined
**重要说明**:
- 当使用 `-o` 参数保存文件时,会自动保存两个文件:
- `<filename>_raw.json` - 原始编码数据(API直接返回的数据)
- `<filename>.json` - 解码后的数据(所有字符已解码)
- 后续操作始终使用解码后的文件
- 解码过程自动进行,无需手动操作
**重要说明**:
- 当使用 `-o` 参数保存文件时,会自动保存两个文件:
- `<filename>_raw.json` - 原始编码数据(API直接返回的数据)
- `<filename>.json` - 解码后的数据(所有字符已解码)
- 后续操作始终使用解码后的文件
- 解码过程自动进行,无需手动操作| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| keyword | string | 是 | 搜索关键词 | "iphone" |
| is_wfs | boolean | 否 | 只搜索 WFS 商品 | true |
| min_sales_volume | integer | 否 | 最小销量 | 4000 |
| max_sales_volume | integer | 否 | 最大销量 | 90000 |
| min_sales_amount | integer | 否 | 最小销售额 | 200 |
| max_sales_amount | integer | 否 | 最大销售额 | 800 |
| min_number_of_reviews | integer | 否 | 最小评论数 | 50 |
| max_number_of_reviews | integer | 否 | 最大评论数 | 100 |
| min_average_rating | float | 否 | 最低评分(1-5) | 1.0 |
| max_average_rating | float | 否 | 最高评分(1-5) | 5.0 |
| min_price | float | 否 | 最低价格 | 1.0 |
| max_price | float | 否 | 最高价格 | 10.0 |
| seller_name | string | 否 | 卖家名称 | "ERIC-EXPRESS" |
| brand | string | 否 | 品牌 | "Simyoung" |
| page | integer | 否 | 页码(从1开始) | 1 |
| pageSize | integer | 否 | 每页数量 | 10 |
| 参数名 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| keyword | string | 是 | 搜索关键词 | "iphone" |
| is_wfs | boolean | 否 | 只搜索 WFS 商品 | true |
| min_sales_volume | integer | 否 | 最小销量 | 4000 |
| max_sales_volume | integer | 否 | 最大销量 | 90000 |
| min_sales_amount | integer | 否 | 最小销售额 | 200 |
| max_sales_amount | integer | 否 | 最大销售额 | 800 |
| min_number_of_reviews | integer | 否 | 最小评论数 | 50 |
| max_number_of_reviews | integer | 否 | 最大评论数 | 100 |
| min_average_rating | float | 否 | 最低评分(1-5) | 1.0 |
| max_average_rating | float | 否 | 最高评分(1-5) | 5.0 |
| min_price | float | 否 | 最低价格 | 1.0 |
| max_price | float | 否 | 最高价格 | 10.0 |
| seller_name | string | 否 | 卖家名称 | "ERIC-EXPRESS" |
| brand | string | 否 | 品牌 | "Simyoung" |
| page | integer | 否 | 页码(从1开始) | 1 |
| pageSize | integer | 否 | 每页数量 | 10 |
references/competitor_search.mdreferences/competitor_search.md| 编码示例 | 解码结果 | 类型 |
|---|---|---|
| ȟȬȣȝ-ȟȲȪȬȟȭȭ | ERIC-EXPRESS | 卖家名称 |
| $ȒȓȐȔȘ | $12.37 | 价格 |
| ȓȑȑ+ | 200+ | 数量 |
| $ȓȒȒȑȐȕȿ+ | $2110.4k+ | 销售额 |
| 编码示例 | 解码结果 | 类型 |
|---|---|---|
| ȟȬȣȝ-ȟȲȪȬȟȭȭ | ERIC-EXPRESS | 卖家名称 |
| $ȒȓȐȔȘ | $12.37 | 价格 |
| ȓȑȑ+ | 200+ | 数量 |
| $ȓȒȒȑȐȕȿ+ | $2110.4k+ | 销售额 |
undefinedundefinedundefinedundefinedundefinedundefinedundefinedundefinedreferences/api.mdreferences/competitor_search.mdAUTO_LOGIN.mdCOMPETITOR_SEARCH.mdscripts/wmtwin_login.pyscripts/wmtwin_search_competitors.pyscripts/decode_api_json.pyQUICKSTART.mdREADME.mdreferences/api.mdreferences/competitor_search.mdAUTO_LOGIN.mdCOMPETITOR_SEARCH.mdscripts/wmtwin_login.pyscripts/wmtwin_search_competitors.pyscripts/decode_api_json.pyQUICKSTART.mdREADME.md