使用 MailChimp API 3.0 从邮件列表中获取所有成员

Get all members from the mailing list using MailChimp API 3.0

http://kb.mailchimp.com/api/resources/lists/members/lists-members-collection

使用此资源我们只能获得前 10 个成员。如何全部获得?

答案很简单——在URL查询中使用offsetcount参数:

https://us10.api.mailchimp.com/3.0/lists/b5b5fdc2fa/members?offset=150&count=10

我终于找到了 MailChimp API v3 的 PHP API 客户端: https://github.com/pacely/mailchimp-api-v3

还有关于分页的官方文档..我之前错过了:( http://kb.mailchimp.com/api/article/api-3-overview

偏移量和计数是文档中的官方方式,但问题是线性减速。它似乎是一个 n^2 解决方案,所以如果你有 20,000 个项目,你就有麻烦了。他们的文档 http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#read-get_lists_list_id_members 警告您不要使用偏移量。

如果您的场景允许您使用其他过滤器(如 since_last_changed),那么您可以快速完成。有关日期时间的格式,请参阅

你可以只用计数来做到这一点,对 list root 进行 API 调用,所以在下一个 API 调用中你包含计数参数并且你拥有所有列表成员.

我 运行 遇到了这个问题,因为我有一个包含 2600 名成员的中等列表,而 MailChimp 抛出了一个错误,但它适用于 1500 人。

因此,对于超过 1500 名成员的列表,我使用 MailChimp export API 请记住,这将停止,但我找不到任何其他可接受的解决方案。

或者,对于更大的列表 (>1500),您可以获取成员总数,然后对 Member endpoint 进行多次 api 调用,但我真的不喜欢这样 :(

如果有人有更好的选择,我会很高兴听到。

使用 offsetcount 参数是正确的,如其他一些答案中所述,但对于大型列表来说变得乏味。

一种更有效的方法是使用 MailChimp API 的客户端。我用了mailchimp3 for python。使用它,很容易让所有成员都出现在您的列表中,因为它处理分页。以下是您的操作方法。

from mailchimp3 import MailChimp

client = MailChimp('YOUR_USERNAME', 'YOUR_SECRET_KEY')
client.lists.members.all('YOUR_LIST_ID', get_all=True, fields="members.email_address")

我在研究一种在 MC API 3.0 中获取所有列表成员的方法时偶然发现了这个。我注意到有一些关于 API 尝试将所有列表成员显示在一页上时超时的评论。我一开始也遇到过这个问题,但通过使用 'fields' 参数限制结果中的字段能够克服它。我的代码用于批量删除器,所以我真正需要的只是每个成员的 ID 来组合批量删除请求。这是我的获取请求的样子(伪代码):

$total_members = $result['total_items'];//get number of members in list via previous request
https://usXX.api.mailchimp.com/3.0/lists/foobarx/members?fields=members.id&count=total_members

通过这种方式,我可以在一个页面上准确无误地获取 15,000 多个订阅者。

和MailChimp.Net。
使用偏移值。

List<Member> listMembers = new List<Member>();
IMailChimpManager manager = new MailChimpManager(MailChimpApiKey);
bool moreAvailable = true;
int offset = 0;
while (moreAvailable)
{
    var listMembers = manager.Members.GetAllAsync(yourListId, new MemberRequest
    {
        Status = Status.Subscribed,
        Limit = 250,
        Offset = offset
    }).ConfigureAwait(false);

    var Allmembers = listMembers.GetAwaiter().GetResult();
    foreach(Member member in Allmembers)
    {
        listMembers.Add(member);
    }
    if (Allmembers.Count() == 250)
        //if the count is < of 250 then it means that there aren't more results
        offset += 250;
    else
        moreAvailable = false;
}