JavaScript + MailChimp API 订阅

11

当进行此请求时:

// 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":"You must specify a apikey value"}(使用muteHttpExceptions选项查看完整响应)(第120行,文件“v2”)

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

API密钥是有效的(我已经用不包含关联数组的简单API调用进行了测试)。当我直接将API密钥附加到基本URL并从options中删除它时,会出现错误,说明列表ID无效。然后,当我直接将列表ID附加到基本URL并将其从options中删除时,会出现错误,说明电子邮件地址必须以关联数组形式提供。

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

相关API文档可以在此处找到。


5
在客户端代码中暴露API密钥是一个糟糕的想法 :( - Maxim
@Maxim,这段代码用于私人Google脚本中。这仍然存在风险吗? - barryedmund
我不确定谷歌是如何保护它的,但我猜测这已经足够好了。这完全取决于你需要多少安全性。在某些情况下,我甚至会在我的服务器端代码中加密密码。 - Maxim
3
这个问题的标题更准确地说是“Google App Script + MailChimp API”。否则,对 JavaScript 不太熟悉的人可能会在客户端代码中使用答案,从而暴露他们的 MailChimp API。 - makstaks
3个回答

21

经过进一步的研究和调试,我成功解决了这个问题:

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

将API密钥中破折号后面的部分替换为<dc>。例如"us1"、"us2"、"uk1"等。


正是我所需要的。谢谢你。不知道为什么这不在Mailchimp文档中。 - Carlos Daniel Gadea Omelchenko
1
根据API文档,URL应该是https://<dc>.api.mailchimp.com/2.0/,其中<dc>应该替换为您的API密钥中破折号后面的部分。例如:"us1","us2","uk1"等。如果您不更改URL,则会报告错误的API密钥。 - maresmar
我收到了“错误”:“必须提供TEXTAREAY-请输入一个值”。 - Fuji
@benmcdonald,也许你可以发出你的请求。 - barryedmund
在JavaScript中公开带API密钥的URL是否安全?我不是很确定。 - Jomar Sevillejo

8

在JavaScript中这样做会暴露你的API密钥给全世界。如果有人拥有你的密钥,他/她可以更改或访问你的帐户。


1
此代码包含在私有的Google脚本中。 - barryedmund
7
什么是 Google Script?Google Script 是一种基于 JavaScript 语言的编程语言,可用于创建和修改 Google 应用程序(如文档、表格等)的自定义脚本。通过使用 Google Script,用户可以自动化重复性任务、增强应用程序功能并与其他 Google 应用程序集成。 - zeckdude
1
这不是一个答案,应该是一条评论。 - jfunk

0

我认为在阅读了UrlFetchApp.fetch文档后,我已经弄清楚了发生了什么。 https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app?csw=1#fetch(String)

看起来你应该使用一些额外的参数来进行请求,例如payload和method。你的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);

在您的API密钥中,<dc>应替换为破折号后面的部分。例如"us1"、"us2"、"uk1"等。

问题在于您的选项变量应该用作JSON而不是GET URL参数。此外,Mailchimp指定最好使用POST而不是GET。因此,总体而言,您应确保将方法设置为“post”,并确保您的有效负载是有效的JSON。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接