feat: add email verification skill with recentWithinMinutes parameter
这个提交包含在:
509
email-verification/SKILL.md
普通文件
509
email-verification/SKILL.md
普通文件
@@ -0,0 +1,509 @@
|
||||
---
|
||||
name: email-verification
|
||||
description: 邮箱验证码获取服务 - 支持临时邮箱API获取验证码、验证链接和完整邮件内容
|
||||
domain: utilities
|
||||
version: 1.0.0
|
||||
tags: [email, verification, code, outlook, temp-mail, api]
|
||||
triggers:
|
||||
keywords:
|
||||
primary: [邮箱验证码, 验证码获取, email code, verification code, 邮件验证]
|
||||
secondary: [临时邮箱, temp mail, outlook验证码, email verification, 获取验证码]
|
||||
context_boost: [注册, register, 验证, verify, 邮箱, email]
|
||||
priority: high
|
||||
---
|
||||
|
||||
# Email Verification Service
|
||||
|
||||
临时邮箱验证码获取服务,用于自动化注册流程中获取邮箱验证码。
|
||||
|
||||
## API 配置
|
||||
|
||||
```
|
||||
Base URL: https://one.hao.work/api/mail
|
||||
API Key: 2b358a68a8de4403b29949bf7b3a46f0
|
||||
```
|
||||
|
||||
## 认证方式
|
||||
|
||||
所有请求需要在 Header 中添加:
|
||||
|
||||
```bash
|
||||
-H "Authorization: Bearer 2b358a68a8de4403b29949bf7b3a46f0"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API 端点
|
||||
|
||||
### 1. 获取可用邮箱账户列表
|
||||
|
||||
```bash
|
||||
curl -X GET \
|
||||
'https://one.hao.work/api/mail/accounts' \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Authorization: Bearer 2b358a68a8de4403b29949bf7b3a46f0'
|
||||
```
|
||||
|
||||
**响应示例:**
|
||||
|
||||
```json
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"id": 465,
|
||||
"email": "tertia1948tasha315ne@outlook.com",
|
||||
"password": "Kyle4714",
|
||||
"status": 1,
|
||||
"statusText": "登录成功(IMAP)",
|
||||
"lastCheck": "2026-03-02T07:39:14Z",
|
||||
"lastFrom": "Binance <do_not_reply@mgdirectmail.binance.com>",
|
||||
"loginOk": true
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
**字段说明:**
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| id | integer | 账户ID |
|
||||
| email | string | 邮箱地址 |
|
||||
| password | string | 邮箱密码 |
|
||||
| status | integer | 状态码 (1=正常) |
|
||||
| statusText | string | 状态描述 |
|
||||
| lastCheck | string | 最后检查时间 |
|
||||
| lastFrom | string | 最后收到邮件的发件人 |
|
||||
| loginOk | boolean | 登录是否成功 |
|
||||
|
||||
---
|
||||
|
||||
### 2. 获取最新邮件(推荐)
|
||||
|
||||
一站式获取最新邮件,包含验证码、链接和完整内容。
|
||||
|
||||
```bash
|
||||
curl -X POST \
|
||||
'https://one.hao.work/api/mail/all-in-one' \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H 'Authorization: Bearer 2b358a68a8de4403b29949bf7b3a46f0' \
|
||||
-d '{
|
||||
"email": "faye1989arlene1029@outlook.com",
|
||||
"useApiOnly": true,
|
||||
"timeoutSeconds": 180,
|
||||
"recentWithinMinutes": 10
|
||||
}'
|
||||
```
|
||||
|
||||
**参数说明:**
|
||||
|
||||
| 参数 | 类型 | 必填 | 说明 |
|
||||
|------|------|------|------|
|
||||
| email | string | 是 | 邮箱地址 |
|
||||
| useApiOnly | boolean | 否 | 是否仅使用API获取,默认 true |
|
||||
| timeoutSeconds | integer | 否 | 超时时间(秒),默认 180 |
|
||||
| recentWithinMinutes | integer | 否 | 只获取最近 N 分钟内的邮件,避免误判旧邮件 |
|
||||
|
||||
**响应示例:**
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"email": "faye1989arlene1029@outlook.com",
|
||||
"message": {
|
||||
"from": "noreply@binance.com",
|
||||
"to": "faye1989arlene1029@outlook.com",
|
||||
"subject": "Binance 验证码",
|
||||
"date": "2026-03-02T01:30:00Z",
|
||||
"text": "您的验证码是:123456。有效期10分钟。",
|
||||
"html": "<html><body>您的验证码是:<b>123456</b>。有效期10分钟。</body></html>",
|
||||
"verification": {
|
||||
"code": "123456",
|
||||
"link": "https://www.binance.com/verify?token=abc123xyz",
|
||||
"type": "registration"
|
||||
}
|
||||
},
|
||||
"timestamp": 1772441437665
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 使用流程
|
||||
|
||||
### 标准流程
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────────┐
|
||||
│ 邮箱验证码获取流程 │
|
||||
│ │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ 准备邮箱地址 │ │
|
||||
│ └──────┬──────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ 发送验证请求 │ POST /api/mail/all-in-one │
|
||||
│ │ (注册/登录) │ │
|
||||
│ └──────┬──────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ 等待邮件到达 │ timeoutSeconds: 180 │
|
||||
│ │ (最长3分钟) │ │
|
||||
│ └──────┬──────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ 获取邮件内容 │ text + html + 验证码 + 链接 │
|
||||
│ └──────┬──────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ 提取验证码 │ 自动识别 4-8 位数字验证码 │
|
||||
│ └──────┬──────┘ │
|
||||
│ │ │
|
||||
│ ▼ │
|
||||
│ ┌─────────────┐ │
|
||||
│ │ 完成验证 │ 填入验证码或点击链接 │
|
||||
│ └─────────────┘ │
|
||||
└─────────────────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 自动化脚本示例
|
||||
|
||||
### Python 示例
|
||||
|
||||
```python
|
||||
import requests
|
||||
import time
|
||||
import re
|
||||
|
||||
class EmailVerificationService:
|
||||
def __init__(self, api_key="2b358a68a8de4403b29949bf7b3a46f0"):
|
||||
self.base_url = "https://one.hao.work/api/mail"
|
||||
self.headers = {
|
||||
"accept": "application/json",
|
||||
"Content-Type": "application/json",
|
||||
"Authorization": f"Bearer {api_key}"
|
||||
}
|
||||
|
||||
def get_accounts(self):
|
||||
"""获取可用邮箱账户列表"""
|
||||
response = requests.get(
|
||||
f"{self.base_url}/accounts",
|
||||
headers=self.headers
|
||||
)
|
||||
return response.json()
|
||||
|
||||
def get_latest_email(self, email, timeout=180, recent_minutes=None):
|
||||
"""获取最新邮件"""
|
||||
payload = {
|
||||
"email": email,
|
||||
"useApiOnly": True,
|
||||
"timeoutSeconds": timeout
|
||||
}
|
||||
if recent_minutes:
|
||||
payload["recentWithinMinutes"] = recent_minutes
|
||||
response = requests.post(
|
||||
f"{self.base_url}/all-in-one",
|
||||
headers=self.headers,
|
||||
json=payload
|
||||
)
|
||||
return response.json()
|
||||
|
||||
def extract_verification_code(self, email_content):
|
||||
"""从邮件内容中提取验证码"""
|
||||
# 常见验证码模式
|
||||
patterns = [
|
||||
r'验证码[是为::\s]*(\d{4,8})',
|
||||
r'verification code[是为::\s]*(\d{4,8})',
|
||||
r'code[是为::\s]*(\d{4,8})',
|
||||
r'\b(\d{6})\b', # 6位数字
|
||||
r'\b(\d{4})\b', # 4位数字
|
||||
]
|
||||
|
||||
text = email_content.get('text', '') or email_content.get('html', '')
|
||||
|
||||
for pattern in patterns:
|
||||
match = re.search(pattern, text, re.IGNORECASE)
|
||||
if match:
|
||||
return match.group(1)
|
||||
|
||||
return None
|
||||
|
||||
def wait_for_verification_code(self, email, timeout=180, interval=5, recent_minutes=10):
|
||||
"""等待并获取验证码"""
|
||||
start_time = time.time()
|
||||
|
||||
while time.time() - start_time < timeout:
|
||||
result = self.get_latest_email(email, timeout=interval, recent_minutes=recent_minutes)
|
||||
|
||||
if result.get('success') and result.get('message'):
|
||||
message = result['message']
|
||||
|
||||
# 优先使用自动识别的验证码
|
||||
if message.get('verification', {}).get('code'):
|
||||
return {
|
||||
'code': message['verification']['code'],
|
||||
'link': message['verification'].get('link'),
|
||||
'full_message': message
|
||||
}
|
||||
|
||||
# 手动提取验证码
|
||||
code = self.extract_verification_code(message)
|
||||
if code:
|
||||
return {
|
||||
'code': code,
|
||||
'link': message.get('verification', {}).get('link'),
|
||||
'full_message': message
|
||||
}
|
||||
|
||||
time.sleep(interval)
|
||||
|
||||
return None
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == "__main__":
|
||||
service = EmailVerificationService()
|
||||
|
||||
# 获取验证码
|
||||
result = service.wait_for_verification_code(
|
||||
"faye1989arlene1029@outlook.com",
|
||||
timeout=180
|
||||
)
|
||||
|
||||
if result:
|
||||
print(f"验证码: {result['code']}")
|
||||
print(f"验证链接: {result['link']}")
|
||||
print(f"完整邮件: {result['full_message']}")
|
||||
```
|
||||
|
||||
### Bash/cURL 示例
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
|
||||
API_KEY="2b358a68a8de4403b29949bf7b3a46f0"
|
||||
BASE_URL="https://one.hao.work/api/mail"
|
||||
|
||||
# 获取验证码
|
||||
get_verification_code() {
|
||||
local email=$1
|
||||
local timeout=${2:-180}
|
||||
|
||||
curl -X POST \
|
||||
"${BASE_URL}/all-in-one" \
|
||||
-H 'accept: application/json' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-H "X-API-Key: ${API_KEY}" \
|
||||
-d "{
|
||||
\"email\": \"${email}\",
|
||||
\"useApiOnly\": true,
|
||||
\"timeoutSeconds\": ${timeout}
|
||||
}"
|
||||
}
|
||||
|
||||
# 使用示例
|
||||
get_verification_code "faye1989arlene1029@outlook.com" 180
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 验证码提取规则
|
||||
|
||||
### 常见验证码格式
|
||||
|
||||
| 格式 | 示例 | 正则表达式 |
|
||||
|------|------|-----------|
|
||||
| 4位数字 | 1234 | `\b(\d{4})\b` |
|
||||
| 6位数字 | 123456 | `\b(\d{6})\b` |
|
||||
| 带前缀 | 验证码:123456 | `验证码[是为::\s]*(\d{4,8})` |
|
||||
| 英文前缀 | Code: 123456 | `code[是为::\s]*(\d{4,8})` |
|
||||
|
||||
### 支持的邮件类型
|
||||
|
||||
- Outlook.com
|
||||
- Hotmail.com
|
||||
- Gmail (需要配置)
|
||||
- 自定义域名邮箱
|
||||
|
||||
---
|
||||
|
||||
## 应用场景
|
||||
|
||||
### 1. 自动化注册流程
|
||||
|
||||
```python
|
||||
# 1. 填写注册表单
|
||||
fill_registration_form(email, password)
|
||||
|
||||
# 2. 提交注册
|
||||
submit_registration()
|
||||
|
||||
# 3. 等待并获取验证码
|
||||
service = EmailVerificationService()
|
||||
result = service.wait_for_verification_code(email)
|
||||
|
||||
# 4. 填入验证码
|
||||
fill_verification_code(result['code'])
|
||||
|
||||
# 5. 完成注册
|
||||
complete_registration()
|
||||
```
|
||||
|
||||
### 2. 批量账号注册
|
||||
|
||||
```python
|
||||
accounts = [
|
||||
"user1@outlook.com",
|
||||
"user2@outlook.com",
|
||||
"user3@outlook.com"
|
||||
]
|
||||
|
||||
service = EmailVerificationService()
|
||||
|
||||
for email in accounts:
|
||||
# 注册账号
|
||||
register_account(email)
|
||||
|
||||
# 获取验证码
|
||||
result = service.wait_for_verification_code(email)
|
||||
|
||||
if result:
|
||||
verify_account(email, result['code'])
|
||||
print(f"✓ {email} 注册成功")
|
||||
else:
|
||||
print(f"✗ {email} 获取验证码失败")
|
||||
```
|
||||
|
||||
### 3. 验证链接提取
|
||||
|
||||
```python
|
||||
result = service.wait_for_verification_code(email)
|
||||
|
||||
if result and result.get('link'):
|
||||
# 方式1: 直接访问链接
|
||||
requests.get(result['link'])
|
||||
|
||||
# 方式2: 提取链接中的token
|
||||
import urllib.parse
|
||||
parsed = urllib.parse.urlparse(result['link'])
|
||||
token = urllib.parse.parse_qs(parsed.query).get('token', [None])[0]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 错误处理
|
||||
|
||||
### 常见错误码
|
||||
|
||||
| 状态码 | 说明 | 解决方案 |
|
||||
|--------|------|---------|
|
||||
| 401 | API Key 无效 | 检查 X-API-Key header |
|
||||
| 404 | 邮箱不存在 | 确认邮箱地址正确 |
|
||||
| 408 | 获取超时 | 增加 timeoutSeconds |
|
||||
| 429 | 请求过于频繁 | 降低请求频率 |
|
||||
| 500 | 服务器错误 | 稍后重试 |
|
||||
|
||||
### 重试机制
|
||||
|
||||
```python
|
||||
def get_code_with_retry(email, max_retries=3):
|
||||
service = EmailVerificationService()
|
||||
|
||||
for attempt in range(max_retries):
|
||||
try:
|
||||
result = service.wait_for_verification_code(email)
|
||||
if result:
|
||||
return result
|
||||
except Exception as e:
|
||||
print(f"尝试 {attempt + 1} 失败: {e}")
|
||||
time.sleep(5)
|
||||
|
||||
return None
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **超时设置** - 默认 180 秒,根据邮件到达时间调整
|
||||
2. **请求频率** - 避免过于频繁的请求,建议间隔 5 秒以上
|
||||
3. **验证码有效期** - 通常 10-15 分钟,尽快使用
|
||||
4. **邮件延迟** - 某些服务邮件可能有延迟,适当增加超时
|
||||
5. **并发限制** - 同一邮箱同时只能有一个等待请求
|
||||
|
||||
---
|
||||
|
||||
## 与其他 Skill 集成
|
||||
|
||||
### 配合 Binance 注册
|
||||
|
||||
```python
|
||||
# 在 Binance 注册流程中使用
|
||||
from binance_registration import BinanceRegistration
|
||||
from email_verification import EmailVerificationService
|
||||
|
||||
binance = BinanceRegistration()
|
||||
email_service = EmailVerificationService()
|
||||
|
||||
# 1. 发送注册请求
|
||||
email = "user@outlook.com"
|
||||
binance.request_verification_code(email)
|
||||
|
||||
# 2. 获取验证码
|
||||
result = email_service.wait_for_verification_code(email)
|
||||
code = result['code']
|
||||
|
||||
# 3. 完成注册
|
||||
binance.complete_registration(email, password, code)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API 响应字段说明
|
||||
|
||||
### 完整响应结构
|
||||
|
||||
```json
|
||||
{
|
||||
"success": true,
|
||||
"email": "user@outlook.com",
|
||||
"message": {
|
||||
"from": "sender@example.com",
|
||||
"to": "user@outlook.com",
|
||||
"subject": "邮件主题",
|
||||
"date": "2026-03-02T01:30:00Z",
|
||||
"text": "纯文本内容",
|
||||
"html": "HTML内容",
|
||||
"verification": {
|
||||
"code": "123456",
|
||||
"link": "https://example.com/verify?token=xxx",
|
||||
"type": "registration|login|reset_password"
|
||||
}
|
||||
},
|
||||
"timestamp": 1772441437665
|
||||
}
|
||||
```
|
||||
|
||||
### 字段说明
|
||||
|
||||
| 字段 | 类型 | 说明 |
|
||||
|------|------|------|
|
||||
| success | boolean | 请求是否成功 |
|
||||
| email | string | 邮箱地址 |
|
||||
| message.from | string | 发件人地址 |
|
||||
| message.to | string | 收件人地址 |
|
||||
| message.subject | string | 邮件主题 |
|
||||
| message.date | string | 邮件日期时间 (ISO 8601) |
|
||||
| message.text | string | 纯文本内容 |
|
||||
| message.html | string | HTML 内容 |
|
||||
| message.verification.code | string | 自动识别的验证码 |
|
||||
| message.verification.link | string | 验证链接 |
|
||||
| message.verification.type | string | 验证类型 |
|
||||
| timestamp | integer | 响应时间戳 (毫秒) |
|
||||
在新工单中引用
屏蔽一个用户