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

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

【问题讨论】:

    标签: mailchimp mailchimp-api-v3.0


    【解决方案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://stackoverflow.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)
             }
          }
          

          【讨论】:

            猜你喜欢
            • 2019-02-28
            • 2016-06-12
            • 2013-10-28
            • 2019-02-10
            • 1970-01-01
            • 2018-05-31
            • 1970-01-01
            • 2018-05-15
            • 2019-06-11
            相关资源
            最近更新 更多