Mailchimp v3.0 API,使用 Perl Curl

Posted

技术标签:

【中文标题】Mailchimp v3.0 API,使用 Perl Curl【英文标题】:Mailchimp v3.0 API, using Perl Curl 【发布时间】:2016-01-11 02:47:01 【问题描述】:

我正在尝试找到一种方法来向 MailChimps 新的 API v3.0 发出 Curl 请求,这将使用户订阅给定列表。到目前为止,这是我所拥有的:

use warnings;
use WWW::Curl::Easy;
use JSON;

my $apikey = 'xxxx';
my $listid = 'xxxx';
my $email = 'andy@test.co.uk';
my $endpoint = "https://us6.api.mailchimp.com/3.0/lists";

my $json = JSON::encode_json([
    'email_address' => $email,
    'status'        => 'pending',
    'merge_fields'  => [
        'FNAME'     => "andy",
        'LNAME'     => "newby"
    ]
]);

my $curl = WWW::Curl::Easy->new;

my $url = "$endpoint/$listid/members/" . Digest::MD5::md5(lc($email));

$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, $endpoint);

$curl->setopt(CURLOPT_USERPWD, 'user:' . $apikey);
$curl->setopt(CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
$curl->setopt(CURLOPT_TIMEOUT, 10);
$curl->setopt(CURLOPT_CUSTOMREQUEST, 'PUT');
$curl->setopt(CURLOPT_SSL_VERIFYPEER, 0);
$curl->setopt(CURLOPT_POSTFIELDS, $json);

my $response_body;
$curl->setopt(CURLOPT_WRITEDATA,\$response_body);

# Starts the actual request
my $retcode = $curl->perform;

# Looking at the results...
if ($retcode == 0) 
        print("Transfer went ok\n");
        my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
        print "Received response: $response_body\n";
 else 
        # Error code, type of error, error message
        print "An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n";

文档非常稀缺,因为它是一个新的 API。有没有人使用 MailChimp v3 API 成功订阅 Perl 中的某个人? (我也对命令行curl 请求的建议持开放态度......但我对此所做的一切尝试都失败了,MailChimp 返回了“内部服务器错误”,这不是很有帮助)

更新:如下所示,我启用了verbose,它现在吐出:

在 DNS 缓存中找不到主机名 正在尝试 184.86.100.251... 连接到 us6.api.mailchimp.com (184.86.100.251) 端口 443 (#0) 成功设置证书验证位置: CAfile:无 CApath:/etc/ssl/certs 使用 TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256 的 SSL 连接 服务器证书: 主题:C=US; ST=GA; L=亚特兰大; O=火箭科学集团; OU=火箭科学集团; CN=*.api.mailchimp.com 开始日期:2015-09-22 14:39:14 GMT 有效期:2016-09-22 14:39:13 GMT subjectAltName: us6.api.mailchimp.com 匹配 发行人:C=NL; L=阿姆斯特丹; O=Verizon 企业解决方案; OU=网络信任; CN=Verizon Akamai SureServer CA G14-SHA2 SSL 证书验证正常。

使用 Basic 和用户“用户”的服务器身份验证

PUT /3.0/lists HTTP/1.1 授权:基本 xxxx 主机:us6.api.mailchimp.com 接受:/ 内容类型:application/json 内容长度:108

上传完全发送:108 个字节中的 108 个

服务器nginx未列入黑名单https://us6.api.mailchimp.com/schema/3.0/ProblemDetailDocument.json; rel=" describeBy" 关闭连接 0 传输正常收到响应:HTTP/1.1 405 Method Not Allowed 服务器:nginx 内容类型: 应用程序/问题+json; charset=utf-8 内容长度:253 X 请求 ID:5f6ab08f-69e7-4c9b-b22a-91714331d5b7 链接: https://us6.api.mailchimp.com/schema/3.0/ProblemDetailDocument.json; rel=" describeBy" 允许:GET,POST 日期:星期二,2015 年 10 月 13 日 11:24:32 GMT 连接:关闭 Set-Cookie:_AVESTA_ENVIRONMENT=prod;路径=/

"type":"http://kb.mailchimp.com/api/error-docs/405-method-not-allowed","title":"方法 Not Allowed","status":405,"detail":"请求的方法和资源 不兼容。请参阅允许标头了解此资源的可用情况 方法。","instance":""

虽然我不确定该怎么做:/

工作代码:多亏了 TooMuchPete,我才得以成功。对于在 Perl 中尝试使用 MailChimp API (3.0) 时可能遇到此问题的任何人,下面是一个工作示例(您只需替换电子邮件、名称、api 键和列表 ID 的值);

    use WWW::Curl::Easy;
    use JSON;
    use Digest::MD5;

    my $apikey = 'xxxx-us6';
    my $listid = 'xxxx';
    my $email = 'andy@testr.co.uk';
    my $endpoint = "https://us6.api.mailchimp.com/3.0/lists";

    my $json = JSON::encode_json(
        'email_address' => $email,
        'status'        => 'pending',
        'merge_fields'  => 
            'FNAME'     => "andy",
            'LNAME'     => "newby"
        
    );

    my $curl = WWW::Curl::Easy->new;

    my $url = "$endpoint/$listid/members/" . Digest::MD5::md5(lc($email));

    $curl->setopt(CURLOPT_HEADER,1);
    $curl->setopt(CURLOPT_URL, $url);

    $curl->setopt(CURLOPT_VERBOSE, 1);
    $curl->setopt(CURLOPT_USERPWD, 'user:' . $apikey);
    $curl->setopt(CURLOPT_HTTPHEADER, ['Content-Type: application/json']);
    $curl->setopt(CURLOPT_TIMEOUT, 10);
    $curl->setopt(CURLOPT_CUSTOMREQUEST, 'PUT');
    $curl->setopt(CURLOPT_SSL_VERIFYPEER, 0);
    $curl->setopt(CURLOPT_POSTFIELDS, $json);

    # A filehandle, reference to a scalar or reference to a typeglob can be used here.
    my $response_body;
    $curl->setopt(CURLOPT_WRITEDATA,\$response_body);

    # Starts the actual request
    my $retcode = $curl->perform;

    # Looking at the results...
    if ($retcode == 0) 
            print("Transfer went ok\n");
            my $response_code = $curl->getinfo(CURLINFO_HTTP_CODE);
            # judge result and next action based on $response_code
            print "Received response: $response_body\n";
     else 
            # Error code, type of error, error message
            print "An error happened: $retcode ".$curl->strerror($retcode)." ".$curl->errbuf."\n";
    

我希望这可以减轻我的悲伤:)

【问题讨论】:

尝试运行$curl->setopt(CURLOPT_VERBOSE, 1); 以获取详细输出。它可以帮助您进一步调试。 @SabujHassan - 谢谢,我已经更新了上面的问题,包括调试(已取出身份验证密钥) @AndrewNewby 我只是过来说声谢谢,我爱你。这为我节省了几天手动创建解决方案的工作量。 @ljamison 不用担心 - 我很高兴我的痛苦救了别人一些 =) 呵呵 【参考方案1】:

您正在尝试连接到 $endpoint 而不是 $url

my $url = "$endpoint/$listid/members/" . Digest::MD5::md5(lc($email));

$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, $endpoint);

应该是:

my $url = "$endpoint/$listid/members/" . Digest::MD5::md5(lc($email));

$curl->setopt(CURLOPT_HEADER,1);
$curl->setopt(CURLOPT_URL, $url);

【讨论】:

谢谢!就是这样。我现在遇到了另一个错误,但会深入研究:,"errors":["field":"","message":"Schema describes object, array found instead"] 啊...明白了....在 JSON 变量中使用 [] 而不是 ...现在看起来不错(获取有关用户存在的错误,这很好,因为确实) 这很奇怪——PUT 不应该为现有用户返回错误,这就是它的全部意义所在,它允许添加或更新功能。您可能需要咨询他们的 API 支持团队。 是的,错误是我使用 [ ] 而不是 hashref: ... 所以它没有得到预期的 JSON 输出(因为它的编码方式不同)跨度> 【参考方案2】:

在我切换到 md5_base64() 调用之前,我使用上面的代码收到了来自 MailChimp 的非法字符响应。

【讨论】:

以上是关于Mailchimp v3.0 API,使用 Perl Curl的主要内容,如果未能解决你的问题,请参考以下文章

使用 .Net 调用 MailChimp API v3.0

使用maleorang v3.0 java api发送mailchimp活动

使用 MailChimp API v3.0 创建新的订阅者验证错误

Mailchimp v3.0 API,使用 Perl Curl

使用 MailChimp API v3.0 获取特定成员列表

使用 Api v3.0 和 jQuery Ajax 方法的 Mailchimp 连接错误 (401)