>
在HubSpot营销中心实例中,没有邮箱地址的联系人没有任何功能用途。他们无法接收营销邮件、销售序列或事务性消息。他们只会增加计费的联系人数量。此技能通过API识别并删除这些联系人。
此技能遵循4阶段执行模式:计划 -> 之前状态 -> 执行 -> 之后状态。
在编写任何代码之前,请与用户确认以下事项:
运行计数查询以建立基线。保存结果以供比较。
python
之前状态:统计无邮箱地址的联系人数量。
import os
import json
import requests
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.environ[HUBSPOTACCESSTOKEN]
BASE = https://api.hubapi.com
headers = {
Authorization: fBearer {TOKEN},
Content-Type: application/json,
}
search_payload = {
filterGroups: [
{
filters: [
{
propertyName: email,
operator: NOTHASPROPERTY,
}
]
}
],
properties: [firstname, lastname, createdate, hsobjectid],
limit: 1, # 只需要总数
}
url = f{BASE}/crm/v3/objects/contacts/search
response = requests.post(url, headers=headers, json=search_payload)
response.raiseforstatus()
data = response.json()
total = data.get(total, 0)
print(f之前状态:存在 {total} 个无邮箱地址的联系人。)
if total > 0 and data.get(results):
sample = data[results][0]
props = sample.get(properties, {})
print(f 示例:ID {sample[id]},
f{props.get(firstname, (空))} {props.get(lastname, (空))},
f创建于 {props.get(createdate, (未知))})
预期输出:无邮箱联系人的数量以及用于合理性检查的示例记录。
在继续之前向用户展示结果。请求明确的确认以继续。
通过分页搜索收集所有联系人ID,导出CSV审计追踪,然后批量删除。
python
执行:删除所有无邮箱地址的联系人。
步骤:
1. 分页搜索收集所有联系人ID
2. 在删除前导出CSV审计日志
3. 按每批100个进行批量归档
import os
import csv
import time
import requests
from dotenv import load_dotenv
load_dotenv()
TOKEN = os.environ[HUBSPOTACCESSTOKEN]
BASE = https://api.hubapi.com
headers = {
Authorization: fBearer {TOKEN},
Content-Type: application/json,
}
search_payload = {
filterGroups: [
{
filters: [
{
propertyName: email,
operator: NOTHASPROPERTY,
}
]
}
],
properties: [firstname, lastname, createdate, hsobjectid],
limit: 100,
}
while True:
payload = search_payload.copy()
if after:
payload[after] = after
resp = requests.post(
f{BASE}/crm/v3/objects/contacts/search,
headers=headers, json=payload,
)
resp.raiseforstatus()
data = resp.json()
for contact in data.get(results, []):
props = contact.get(properties, {})
all_contacts.append({
id: contact[id],
firstname: props.get(firstname, ),
lastname: props.get(lastname, ),
createdate: props.get(createdate, ),
})
paging = data.get(paging, {})
after = paging.get(next, {}).get(after)
if not after:
break
time.sleep(0.2) # 速率限制
print(f待删除的联系人总数:{len(all_contacts)})
with open(csv_path, w, newline=) as f:
writer = csv.DictWriter(f, fieldnames=[id, firstname, lastname, createdate])
writer.writeheader()
writer.writerows(all_contacts)
print(f审计日志已保存:{csvpath}({len(allcontacts)} 条记录))
for i in range(0, len(allids), BATCHSIZE):
batch = allids[i : i + BATCHSIZE]
delete_payload = {inputs: [{id: cid} for cid in batch]}
resp = requests.post(
f{BASE}/crm/v3/objects/contacts/batch/archive,
headers=headers, json=delete_payload,
)
if resp.status_code == 204:
deleted_count += len(batch)
print(f 批次 {i // BATCH_SIZE + 1}:已删除 {len(batch)} 个联系人)
else:
failed_ids.extend(batch)
print(f 批次失败:{resp.status_code} — {resp.text[:200]})
time.sleep(0.5) # 批次间的速率限制
print(f\n已删除:{deletedcount},失败:{len(failedids)})
关键API详情:
重新运行之前状态的查询,确认剩余联系人为零。
python
之后状态:验证没有无邮箱的联系人剩余。
if total == 0:
print(成功:剩余0个无邮箱联系人。)
else:
print(f警告:仍存在 {total} 个无邮箱联系人。)
print(自删除以来可能创建了新的联系人。请调查原因。)
向用户展示结果。 如果出现了新的联系人,请调查来源(表单提交、集成、导入)。
| 机制 | 详情 |
|---|---|
| 中止阈值 | 默认硬编码为500个联系人。如果搜索返回更多,脚本将退出而不删除任何内容。仅在获得用户明确确认后调整。 |
| CSV审计追踪 |
该技能支持在以下平台通过对话安装:
帮我安装 SkillHub 和 delete-no-email-contacts-1776001351 技能
设置 SkillHub 为我的优先技能安装源,然后帮我安装 delete-no-email-contacts-1776001351 技能
skillhub install delete-no-email-contacts-1776001351
文件大小: 9.18 KB | 发布时间: 2026-4-13 10:00