如何在Python中使用Mailchimp3取消订阅/删除列表成员?

时间:2017-02-11 11:54:19

标签: python mailchimp-api-v3.0

我在Python中使用mailchimp3。我设法使用此功能批量插入用户:

client = MailChimp(USERNAME, APIKEY)
def fill_list(list_id, subscribers_data):
    data = {'operations': create_subscriptions_data(list_id, subscribers_data)}
    client.batches.create(data)

def create_subscriptions_data(list_id, users_data):
    return [{'method': 'PUT',
             'path': 'lists/{}/members/{}'.format(list_id, str(md5(user['email_address'].encode('utf-8')))),
             'body': json.dumps(user)} for user in users_data]

以下是一个用户dict的样子:

{"email_address": "user@somemail.com", "status": "subscribed"}

然后我想用类似的方法来取消订阅用户列表。为了实现这一点,我尝试使用相同的逻辑,只是为了更改用户对象。现在,我使用了这种用户格式:

{"email_address": "user@somemail.com", "status": "unsubscribed"}

它不会更新订阅状态。当我手动删除所有用户(使用Web界面)并尝试相同的命令时,我成功创建了具有" status":" unsubscribed"的用户。我想知道为什么这种方法不能改变状态?我也试过使用POST而不是PUT,但它没有用。知道可能是什么问题吗?

我使用了这个引用https://devs.mailchimp.com/blog/batch-operations-and-put-in-api-v3-0/,它提到这种方法也适用于更新。

提前谢谢!

2 个答案:

答案 0 :(得分:1)

取消订阅已订阅用户的唯一方法是使用列表ID和列表成员电子邮件地址的小写版本的MD5哈希进行更新。

  

client.lists.members.update(' LIST_ID',' MD5 HASH',{" status":   "取消订阅"})

答案 1 :(得分:0)

实际上,我使用的是一些错误的函数,所以这里是固定代码。我也遇到了批量大小的问题。最大批量大小为500,因此我在几个批次中对数据进行了一些拆分。 这是一个简单的代码,应该如何完成插入:

client = MailChimp(USERNAME, APIKEY)

def _update_list(list_id: str, members_data: list):
    client.lists.update_members(list_id, {'members': members_data, 'update_existing': True})

members_data中的每个成员都有如下数据:

mailchimp_user = {
        'email_address': user.email,
        'status': user.subscription_status,
        'merge_fields': {
            'FNAME': user.first_name,
            'LNAME': user.last_name
        },
        'interests': {}
    }

这是最重要的功能:

def fill_in_multiple_batches(list_id, mailchimp_members):
    step_size = 400

    for i in range(0, len(mailchimp_members), step_size):
        batch_start_idx = i
        batch_end_idx = min(i + step_size, len(mailchimp_members))
        this_batch_of_members = mailchimp_members[batch_start_idx:batch_end_idx]

        client.lists.update_members(list_id, {'members': members_data, 'update_existing': True})

之后,在脚本的主要部分:

if __name__ == '__main__':
    fill_in_multiple_batches('your_list_id', your_data_list)