如何通过 api 向 mailchimp 订阅者添加“标签”

Posted

技术标签:

【中文标题】如何通过 api 向 mailchimp 订阅者添加“标签”【英文标题】:How to add "Tags" to mailchimp subscriber via the api 【发布时间】:2019-02-17 06:36:00 【问题描述】:

希望通过 api 将tags 添加到我的邮件列表成员中。但我看不到在documentation 中传递标签的位置。有人可以举个例子说明如何通过api更新与成员关联的标签吗?

【问题讨论】:

【参考方案1】:

标签取代了静态片段。因此,用于创建标签以及从成员中添加和删除标签的端点与以前用于管理段的端点相同。以下是用于通过 API 管理标签的端点文档,其中包括请求和响应正文参数以及示例请求和响应:

http://developer.mailchimp.com/documentation/mailchimp/reference/lists/segments/

为了给您的成员添加标签,您需要在“static_segment”数组参数中包含他们的电子邮件地址。

希望对你有帮助。

【讨论】:

【参考方案2】:

如果你想创建一个成员并添加一个标签,你可以通过以下方式指定标签属性:

$data = array(
              'apikey'        => $api_key,
              'email_address' => $email,
              'status'     => $status,
              'tags'  => array('your-tag-name'),
              'merge_fields'  => array(
                    'FNAME' => $fname,
                    'LNAME' => $lname
                  )
            );

尽管 MC API 有些地方会告诉你填写名称和状态,但它帮助我将标签定义为数组,但只能粘贴标签的名称。

Seefan 在这个帖子中的回答帮助了我,我想我想帮助一个花了几天时间(比如我)弄清楚“标签”是如何指定的人:add tags to mailchimp subscriber created via api php

【讨论】:

在混乱的 MailChimp 文档 (mailchimp.com/developer/reference/lists/list-members) 中也发现了这一点,但不确定如何定义数组(仅字符串名称,简单但未指定)。这个解决方案对我来说效果很好,因为我已经定义了父参数数组。谢谢! 这对我有用!文档说在导致错误的原因时还要添加状态标签,这太疯狂了【参考方案3】:

这是官方添加标签的方式: https://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/tags/ 它可以工作,只是在我的测试中,响应消息是空的,即使添加了标签。

以下是 Google Apps 脚本中的示例代码:

payload = '\
  "tags": [\
    \
     "name":"' + tagName + '",\
     "status":"' + tagStatus + '"\
    \
   ]\
'
;

params = 
  "method": "POST",
  "headers":MC_headers,
  "payload": payload,
  "muteHttpExceptions": true
;
url = MC_url + 'lists/' + MC_IDs.listId + '/members/' + sub_hash + '/tags';
response = UrlFetchApp.fetch(url, params);

【讨论】:

这也是我最终得到的结果,因为它似乎比为给定成员要修改的每个标签发送请求更简单。仅供参考,http 响应代码是“204 No Content - 服务器成功处理了请求并且没有返回任何内容”。所以是的,没有收到回复是正常的。有些事情告诉我,他们将在未来的版本中弃用或增强此方法,这似乎是半生不熟。 @billynoah 是否可以仅通过 1 个请求添加多个标签?还是我必须多次请求才能将多个标签添加到列表成员? 对我来说,响应代码也是“204 No Content”,但没有添加标签。 根据我的经验,这种方法只有在添加新成员时有效,如果要为现有成员添加标签,则无效。 @DecimalTurn 我也使用相同的方法将标签添加到现有成员。【参考方案4】:

显然 Mailchimp 的“标签”是“段”。

我编写了几个函数,允许我通过电子邮件地址按名称(而不是按 ID)向成员(即订阅者)添加标签。

/**
 * 
 * @param string $emailAddress
 * @param array $tags
 * @return void
 */
public function addTagsToContact($emailAddress, $tags) 
    $list_id = $this->getDefaultListId();
    foreach ($tags as $tag) 
        $this->addMemberToSegment($emailAddress, $list_id, $tag);
    


/**
 * Add a tag to a subscriber (tags replaced segments https://***.com/a/52315577/470749)
 * 
 * @param string $emailAddress
 * @param string $list_id
 * @param string $segment_name
 * @return array
 */
public function addMemberToSegment($emailAddress, $list_id, $segment_name) 
    $api = Newsletter::getApi();
    $segmentsByName = $this->getSegments($list_id);
    $segment_id = $segmentsByName[$segment_name]['id'];
    $response = $api->post("lists/$list_id/segments/$segment_id", [
        'members_to_add' => [$emailAddress]
    ]); //https://developer.mailchimp.com/documentation/mailchimp/reference/lists/segments/#create-post_lists_list_id_segments_segment_id
    return $response;


/**
 * 
 * @param string $list_id
 * @return array
 */
public function getSegments($list_id) //https://developer.mailchimp.com/documentation/mailchimp/reference/lists/segments/#%20
    $segmentsByName = [];
    $api = Newsletter::getApi();
    $count = 50; //default is 10
    $offset = 0;
    do 
        $url = "lists/$list_id/segments/?" . http_build_query(['count' => $count, 'offset' => $offset]);
        Log::debug($url);
        $response = $api->get($url);
        $total_items = $response['total_items'];
        foreach ($response['segments'] as $segment) 
            $segmentsByName[$segment['name']] = $segment;
        
        $offset += $count;
     while (count($segmentsByName) < $total_items);
    //Log::debug(json_encode($segmentsByName));
    return $segmentsByName;


/**
 * 
 * @return string
 */
public function getDefaultListId() 
    return config('newsletter.lists.subscribers.id');

这依赖于https://github.com/spatie/laravel-newsletter 库。

附:非常感谢@Jelan,他的回答让我走上了正轨!

【讨论】:

不客气。我很高兴它有帮助。我向 MailChimp 提供了反馈,以使文档更清晰,因为“标签”并不明显是“段”。【参考方案5】:

这是 WordPress 的代码,但应该会有所帮助。我确实从另一个答案中得到了大部分内容,但在其他任何地方都找不到它。 请注意,这仅在订阅者已存在于列表中时才有效,然后您可以标记或取消标记它们。

    $api_key = XXXXXXXXXXXXXXXXXXX-us20';
    $email = 'tom@gmail.com';
    $list_id = 'XXXXXXXX'; //This is the list /Audience id
    $tag_name_text = 'XXXXX'; //This can be whatever you want it to be. Mail chimp will add it to the tags if not already on the system

    //TAGS
    $args = array(
      'method' => 'POST',
        'headers' => array(
            'Authorization' => 'Basic ' . base64_encode( 'user:'. $api_key )
    ),
    'body' => json_encode(array(

            'tags' => array(
                    ['name' => $tag_name_text,
                    'status' => 'active']
            )




    ))
);
$response = wp_remote_post( 'https://' . substr($api_key,strpos($api_key,'-')+1) . '.api.mailchimp.com/3.0/lists/' . $list_id . '/members/'.md5(strtolower($email)).'/tags', $args );
if ($response['response']['code'] == 200 && $body->status == $status || $response['resp`enter code here`onse']['code'] == 204) 
    //echo 'The you have been successfully ' . $status . '. Please check your emails';

 else 
    echo '<b>' . $response['response']['code'] . $body->title . ':</b> ' . $body->detail;

【讨论】:

【参考方案6】:

我也花了一段时间才弄清楚这一点。他们的文档不清楚,似乎有两种添加标签的方法,要么通过标签端点使用 POST,要么通过更新用户通过补丁。下面是 PHP 中的 POST 示例:

function tagUser($email)
global $api_key;
global $listId;
$hashedEmail = md5(strtolower($email));
$args = array(
    'method' => 'POST',
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode( 'user:'. $api_key )
    ),
    'body' => json_encode(array(
        'tags' => array(['name'=>'healthy','status'=>'active'])
    ))
);
$response = wp_remote_post( 'https://usxx.api.mailchimp.com/3.0/lists/'.$listId.'/members/'.$hashedEmail.'/tags', $args );

$body = json_decode( $response['body'] );


【讨论】:

【参考方案7】:

使用 GRAIL 将标签列表按名称添加到电子邮件用户列表的完整示例

请注意,您可能需要设置一些错误检查以查看 MailChimp 受众成员是否存在。

BusinessLogicController.groovy

/* 
 * Add list of tags by name to list of members
 */
def addTagsByNameToUser()
    List<string> tagNamesToAdd = ['foo', 'bar']
    def addResult = mailChimpService.addTagsToContactsByName(["foo@example.com", "bar@example.com"], tagNamesToAdd)
 

MailChimpService.groovy

import grails.util.Holders
import groovyx.net.http.Method

class MailChimpService 

   def grailsApplication
   ApiConsumerService apiConsumerService

   final String AUTH = Holders.config.grails.mailChimp.auth
   final String BASEURL = "https://us19.api.mailchimp.com/3.0/"
   final String LISTID = "abc123"

   //Add list of tags by name to list of subscribers by email
   def addTagsToContactsByName(List emailAddresses, List tags = []) 
      tags.each  tagName ->
         addMembersToSegment(emailAddresses, tagName);
      
   

   //Add a tag to a subscriber by name
   def addMembersToSegment(List emailAddresses, String segmentName) 
      def segmentsByName = getAllSegmentsInList()

      String segmentId = segmentsByName["$segmentName"] as String

      return addMailChimpTagToUsers(emailAddresses, segmentId)
   

   //Get information about all available segments for a specific list.
   def getAllSegmentsInList(Map query = [:]) 
      String path = "lists/"+LISTID+"/segments/"
      Map segments = [:]
      def segmentResults = apiConsumerService.getRequest(BASEURL, path, AUTH, query, Method.GET)
      segmentResults.segments.each  segment ->
         segments.put(segment.name, segment.id)
      

      return segments
   

   //Add list of tags to a list members. 
   def addMailChimpTagToUsers(List emailAddresses = [], String segmentId) 
      String path = "lists/LISTID/segments/" + segmentId

      apiConsumerService.postRequest(BASEURL, path, AUTH, ['members_to_add': emailAddresses], Method.POST)
        

ApiConsumerService.groovy

import grails.transaction.Transactional
import groovyx.net.http.ContentType
import groovyx.net.http.HTTPBuilder
import groovyx.net.http.Method

@Transactional
class ApiConsumerService 

   //POST REQUEST
   def postRequest(String baseUrl, String path, String auth, Map query = [:], Method method = Method.POST) 
      try 
         HTTPBuilder http = new HTTPBuilder(baseUrl)
         http.headers['Authorization'] = 'Basic ' + "$auth".getBytes('iso-8859-1').encodeBase64()

         http.request(method, ContentType.JSON)  req ->
            uri.path = path
            if (method == Method.POST) 
                body = query
             else 
                uri.query = query
            

            headers.'Accept' = 'application/json'
            headers.'User-Agent' = "MyPetCerts/US19"
            response.success =  resp, json ->
                return json
            

            response.failure =  resp, json ->
                println "POST response status: $resp.statusLine"
            
         
       catch (groovyx.net.http.HttpResponseException ex) 
           ex.printStackTrace()
           return null
       catch (java.net.ConnectException ex) 
           ex.printStackTrace()
           return null
      
   

   //GET Request
   def getRequest(String baseUrl, String path, String auth, Map query = [:], Method method = Method.GET) 
      return postRequest(baseUrl, path, auth, query, method)
   

【讨论】:

以上是关于如何通过 api 向 mailchimp 订阅者添加“标签”的主要内容,如果未能解决你的问题,请参考以下文章

通过 HTML 表单 + JavaScript 向 MailChimp API 提交 JSON 结构

使用带有 AJAX 的 API 向 Mailchimp 发送/包含“名称”字段

向 MailChimp 添加新订阅者返回错误请求

如何通过 Gibbon Export API 调用为 Mailchimp 传递过滤器

如何从 Mailchimp 列表 ID API 获取取消订阅 URL

使用 Java 和 Jersey 客户端向 Mailchimp 受众添加新订阅者