【问题标题】:Get all contacts from sendgrid via api通过 api 从 sendgrid 获取所有联系人
【发布时间】:2020-12-15 18:45:07
【问题描述】:

我正在开发一个应用程序,我在使用 api 注册期间将用户添加到 sendgrid:

PUT /marketing/contacts

我还根据用户在注册期间的状态(数据库数据)将用户添加到特定列表中。

假设我在 sendgrid 列表 A、列表 B、列表 C 中有 3 个列表

现在我每小时运行一次 cron 并检查用户的状态,并根据我想将用户从列表 A 移动到列表 B 的条件

正如我检查的那样,我可以使用相同的 api 将用户添加到新列表中:

PUT /marketing/contacts

我可以从上一个列表中删除用户我可以使用 api:

DELETE /marketing/lists/{id}/contacts

但是用户之前被添加到哪个列表中并从 sendgrid 获取联系人 ID,我需要从 sendgrid 获取联系人,我正在使用 api:

GET /marketing/contacts

但是这个 api 只返回最后 50 条数据并且分页选项也不存在。

我也试过api:

GET https://api.sendgrid.com/v3/contactdb/recipients?page_size=100&page=1

但是这个 api 也返回错误

error:
{
  "errors": [
     {
       "field": null,
       "message": "access forbidden"
     }
  ]
}

但是 api 密钥很好,因为营销 api 使用相同的 api 密钥,并且 api 密钥是在完全访问权限下生成的。

https://sendgrid.com/docs/API_Reference/api_v3.html https://sendgrid.com/docs/API_Reference/Web_API_v3/Marketing_Campaigns/contactdb.html

有人可以帮助我通过任何其他 api 从 sendgrid 获取所有联系人,或者如果我在上述 api 中缺少任何参数。

【问题讨论】:

  • 我也遇到了同样的问题,你有没有发现怎么解决的?
  • 我也有同样的问题,真的很令人沮丧。我什至运行了 Arjun 工具来查找特定 URL 上的参数,但它没有找到单个参数,我开始相信真的没有办法分页。

标签: sendgrid sendgrid-api-v3


【解决方案1】:

联系支持后,我得到了以下信息:

为了获取所有现有联系人,您可以使用此端点:https://api.sendgrid.com/v3/marketing/contacts/exports
发布/营销/联系人/出口

这将返回id,您使用该GET /v3/marketing/contacts/exports/<id>,接收一个文件。所以下载它,打开并阅读 csv。不完全是我想要的,但它可能对其他人有用。

关于这个 endoint 的文档here

【讨论】:

  • 如果这是唯一的解决方案,那就太令人沮丧了。努力寻找任何方式向所有收件人发送一封电子邮件
【解决方案2】:

我最近经历了同样的事情,所以想补充一下我所做的事情,希望这对遇到同样问题的人有所帮助。

这是我用来测试如何获取整个联系人列表而不需要在脚本之外打开文件的快速而肮脏的代码。

request = { 
    "list_ids": [list_id]
}
response = sg.client.marketing.contacts.exports.post(
    request_body=request
)

export_json = response.body.decode('utf8').replace("'", '"')
export_data = json.loads(export_json)

export_id = export_data['id']

urls = []
while True:
    response = sg.client.marketing.contacts.exports._(export_id).get()
    export_status_json = response.body.decode('utf8').replace("'", '"')
    export_status_data = json.loads(export_status_json)
    urls = export_status_data['urls']
    
    if len(urls) == 0:
        time.sleep(10)
    else:
        break

for url in urls:
    response = requests.get(url)
    out_file = gzip.decompress(response.content).decode('utf8'))
    pd = pandas.read_csv(io.StringIO(out_file), dtype=str)

如果需要 json,请将其添加到请求正文中并将其读取为

for url in urls:
    response = requests.get(url)
    out_file = gzip.decompress(response.content).decode('utf8').replace("'", '"')


    print(out_file)

【讨论】:

    【解决方案3】:

    对我来说,我们公司正在使用传统营销,所以我必须使用另一个端点 POST v3/contactdb/recipient

    【讨论】:

    • 他们希望“获取”所有联系人,而不是创建一个
    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多