一键上传并创建任务(整合接口)
POST /api/openapi/uploadAndCreateTask
功能说明
- 将「上传文件」和「创建任务」两步合并为一步
- 简化调用流程,减少网络请求次数
- 适合需要快速创建任务的场景
请求参数
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| file | form-data | File | 是 | 仅 .txt,≤ 1 GB,≤ 100 万行 |
| taskType | form-data | String | 是 | 业务类型,见任务类型列表 |
| description | form-data | String | 是 | 任务描述(通常为原始文件名) |
| countryCode | form-data | String | 是 | 国家代码(如:US) |
| countryAreaCode | form-data | String | 手机号类必填 | 区域代码(如:1)。邮箱/用户名类任务可不传;skipCountryFilter=true 时可不传 |
| skipDedup | form-data | Boolean | 否 | 是否跳过去重,默认 false。仅白名单任务类型支持,见下方说明 |
| skipCountryFilter | form-data | Boolean | 否 | 是否跳过国家/区号 过滤,默认 false。仅白名单任务类型支持,见下方说明 |
countryAreaCode 说明
手机号类任务必须传入 countryAreaCode,缺失将直接返回错误「手机号类任务必须传入countryAreaCode(国家区号)」,不会创建任务。
邮箱类任务(email 及所有以 Email 结尾的类型)和 TG 用户名筛活跃(usernameActive)无需传入该参数。传了 skipCountryFilter=true 的请求也无需传入该参数。
跳过去重 / 跳过国家过滤(skipDedup / skipCountryFilter)
默认情况下,系统会对上传文件做两件事:去重(相同号码只保留一条)和国家过滤(只保留以 countryCode 对应区号开头的号码;US / CA / DO 还会按各自的三位区号白名单再过滤一次,例如选 US 时 +1 开头但属于加拿大、波多黎各等地区的号码会被丢 弃)。
如果你的业务需要原样提交文件内容,可以通过以下两个可选参数关闭对应处理:
| 参数 | 取值 | 效果 |
|---|---|---|
| skipDedup | true/false | true 时不去重,文件中的重复号码全部保留,重复项同样计费 |
| skipCountryFilter | true/false | true 时不按国家区号过滤,也不做 US/CA/DO 区号白名单校验;countryAreaCode 可不传 |
两个参数相互独立,可以只传其中一个。不传或传 false 时行为与以前完全一致。
使用限制
- 只有白名单内的任务类型才允许传这两个参数,当前白名单为
tgAdvanced。其它任务类型携带skipDedup=true或skipCountryFilter=true会直接返回错误「任务类型 xxx 不支持 skipDedup/skipCountryFilter 参数」,不会创建任务。白名单由平台配置,如需为其它任务类型开通请联系客服。 countryCode仍然必传。即使跳过了国家过滤,任务结果仍按countryCode归档存储。skipDedup=true时计费条数为文件中的全部有效行数(含重复),请先确认文件内容再提交。- 基础清洗不受影响:空行、首尾空白、号码中的
+和空格始终会被去掉。 - 这两个参数只在本接口和批量接口生效,分步接口(上传 + 创建任务)不支持。
错误返回示例:
{
"code": 500,
"msg": "任务类型 wsExist 不支持 skipDedup/skipCountryFilter 参数"
}
返回示例
{
"code": 200,
"msg": "文件上传并创建任务成功",
"data": "TASK-20250120110901-1001"
}
返回说明:
data字段直接返回任务 ID (字符串格式)- 可以立即使用返回的 taskId 查询任务状态
优势
- ✅ 一次请求完成两步操作
- ✅ 减少网络延迟和请求次数
- ✅ 简化代码逻辑
- ✅ 自动处理文件上传和任务创建的关联
错误返回示例
{
"code": 500,
"msg": "文件上传失败 :文件解析失败或文件内容为空"
}
使用建议
调用示例(Java)
// 1. 生成签名
String timestamp = String.valueOf(System.currentTimeMillis());
String data = account + ":" + timestamp;
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(apiKey.getBytes(), "HmacSHA256"));
String signature = Base64.getEncoder().encodeToString(mac.doFinal(data.getBytes()));
String headerKey = timestamp + "." + signature;
// 2. 构建请求
HttpClient client = HttpClient.newHttpClient();
MultipartBodyPublisher publisher = new MultipartBodyPublisher()
.addPart("file", Paths.get("data.txt"))
.addPart("taskType", "wsExist")
.addPart("description", "data.txt")
.addPart("countryCode", "US")
.addPart("countryAreaCode", "1");
// 白名单任务类型(如 tgAdvanced)可按需追加:
// .addPart("skipDedup", "true")
// .addPart("skipCountryFilter", "true")
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.ts-filter.com/api/openapi/uploadAndCreateTask"))
.header("X-Api-Account", account)
.header("X-Api-Key", headerKey)
.POST(publisher.build())
.build();
// 3. 发送请求并获取任务ID
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
JSONObject json = new JSONObject(response.body());
String taskId = json.getString("data");
System.out.println("任务创建成功,任务ID: " + taskId);
调用示例(Python)
import requests
import hmac
import hashlib
import base64
import time
# 1. 生成签名
timestamp = str(int(time.time() * 1000))
data = f"{account}:{timestamp}"
signature = base64.b64encode(
hmac.new(api_key.encode(), data.encode(), hashlib.sha256).digest()
).decode()
header_key = f"{timestamp}.{signature}"
# 2. 发送请求
files = {'file': open('data.txt', 'rb')}
data = {
'taskType': 'wsExist',
'description': 'data.txt',
'countryCode': 'US',
'countryAreaCode': '1'
# 白名单任务类型(如 tgAdvanced)可按需追加:
# 'skipDedup': 'true',
# 'skipCountryFilter': 'true',
}
headers = {
'X-Api-Account': account,
'X-Api-Key': header_key
}
response = requests.post(
'https://api.ts-filter.com/api/openapi/uploadAndCreateTask',
files=files,
data=data,
headers=headers
)
# 3. 获取任务ID
result = response.json()
task_id = result['data']
print(f"任务创建成功,任务ID: {task_id}")