Javascript + MailChimp API 订阅

Posted

技术标签:

【中文标题】Javascript + MailChimp API 订阅【英文标题】:Javascript + MailChimp API subscribe 【发布时间】:2013-11-09 09:39:15 【问题描述】:

发出此请求时:

// Subscribe a new account holder to a MailChimp list
function subscribeSomeoneToMailChimpList()

  var options =
  
    "apikey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "id": "xxxxxx",
    "email":
    
      "email": "me@example.com"
    ,
    "send_welcome": false
  ;
  var mcSubscribeRequest = UrlFetchApp.fetch("https://us4.api.mailchimp.com/2.0/lists/subscribe.json", options);
  var mcListObject = Utilities.jsonParse(mcSubscribeRequest.getContentText());

返回此响应:

对https://us4.api.mailchimp.com/2.0/lists/subscribe.json 的请求失败,返回代码 500。截断的服务器响应:"status":"error","code":-100,"name":"ValidationError","error":"您必须指定一个apikey value"(使用 muteHttpExceptions 选项检查完整响应)(第 120 行,文件“v2”)

第 120 行是调用 UrlFetchApp.fetch 的行。

API 密钥是有效的(我已经使用不包含关联数组的更简单的 API 调用进行了测试)。当我将 API 密钥直接附加到基本 URL 并将其从 options 中删除时,我收到一条错误消息,指出列表 ID 无效。然后,当我将列表 ID 直接附加到基本 URL 并将其从 options 中删除时,我收到一条错误消息,指出电子邮件地址必须采用关联数组形式。

我的问题是:使用上述格式,如何发送包含关联数组的请求?

相关API文档可以在here找到。

【问题讨论】:

在客户端代码中公开 API 密钥的坏主意:( @Maxim,此代码用于私有 Google 脚本。那还有风险吗? 我不确定 Google 如何保护它,但我来宾它已经足够好了。这完全取决于您需要多少安全性。在某些情况下,我什至会在我的服务器端代码中加密密码。 这道题的题目更准确的说是Google App Script + MailChimp API。否则,javascript 新手可能最终会在客户端代码中使用答案,从而暴露他们的 MailChimp API。 【参考方案1】:

经过进一步研究和修补,我能够解决这个问题:

https://<dc>.api.mailchimp.com/2.0/lists/subscribe.json?apikey=<my_api_key>&id=<my_list_id>&email[email]=test@test.com&merge_vars[FNAME]=John&merge_vars[LNAME]=Doe&double_optin=false&send_welcome=false

&lt;dc&gt; 应替换为 API 密钥中破折号后的部分。例如“us1”、“us2”、“uk1”等

【讨论】:

正是我想要的。谢谢你。不知道为什么这不在 Mailchimp 文档中。 根据api docs,url 应该是https://&lt;dc&gt;.api.mailchimp.com/2.0/,其中&lt;dc&gt; 应该替换为 API 密钥中破折号后面的部分。例如“us1”、“us2”、“uk1”等。如果您不更改 url,它会报告错误的 API 密钥。 我收到 ""error":"必须提供 TEXTAREAY - 请输入一个值"" @benmcdonald,也许可以发布您的请求。 在 Javscript 上使用 API 密钥公开此 URL 是否安全?我不太确定。【参考方案2】:

在 javascript 中执行此操作会将您的 API 密钥公开。如果有人拥有您的密钥,他/她可以更改或访问您的帐户。

【讨论】:

此代码包含在私有 Google 脚本中。 什么是 Google 脚本? 这不是答案,应该是评论。【参考方案3】:

阅读 UrlFetchApp.fetch 文档后,我想我知道发生了什么。 https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?csw=1#fetch(String)

看起来您应该使用一些额外的参数来执行请求,例如有效负载和方法。您的 options 变量应如下所示。

  var payload =   
    "apikey": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "id": "xxxxxx",
    "email": 
      "email": "me@example.com"
    ,
    "send_welcome": false
  ;
  payload = Utilities.jsonStringify(payload); // the payload needs to be sent as a string, so we need this
  var options = 
     method: "post",
     contentType: "application/json", // contentType property was mistyped as ContentType - case matters
     payload: payload
  ; 
  var result = UrlFetchApp.fetch("https://<dc>.api.mailchimp.com/2.0/lists/subscribe.json", options);

&lt;dc&gt; 应替换为 API 密钥中破折号后的部分。例如“us1”、“us2”、“uk1”等

问题是您的选项变量应该用作 JSON 而不是 GET url 参数。 mailchimp 还指定最好使用 POST 而不是 GET。因此,总的来说,您应该确保将您的方法设置为“发布”并确保您的有效负载是有效的 JSON。

【讨论】:

以上是关于Javascript + MailChimp API 订阅的主要内容,如果未能解决你的问题,请参考以下文章

Mailchimp 错误:错误请求 - 您的广告系列尚未准备好发送

MailChimp 发送邮件 v3.0

MailChimp:为啥带有 javascript 的 PUT 方法返回“使用 PUT 插入或更新列表成员”

Javascript + MailChimp API 订阅

javascript mailchimp-popup.js

javascript mailchimp-popup.js