Amazon SNS(简单通知服务)Perl库
问题描述:
我想开始使用Amazon Simple Notification Service,但我还没有找到任何可用于访问该服务的Perl库。我宁愿不创建我自己的库,我想看看是否有人使用任何Perl库作为SNS服务,并且他们是否会推荐任何。Amazon SNS(简单通知服务)Perl库
答
我用网::亚马逊:: AWSSign连同一个小脚本:
#!/usr/bin/perl
use Net::Amazon::AWSSign;
$ACCESS_KEY_ID="<my key id>";
$SECRET_KEY="<my secret key>";
$TOPIC_ARN='<my topic arn>';
$TOPIC_ARN =~ s/:/%3A/g;
$MESSAGE="This is a test";
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$mon+=1;
$timestamp = sprintf("%4.4d-%2.2d-%2.2dT%2.2d:%2.2d:%2.2d.000Z",
$year,$mon,$mday,$hour,$min,$sec);
$timestamp =~ s/:/%3A/g;
$REQUEST="http://sns.us-east-1.amazonaws.com/".
"?TopicArn=$TOPIC_ARN".
"&Message=$MESSAGE".
"&Action=Publish".
"&SignatureVersion=2".
"&SignatureMethod=HmacSHA256".
"&Timestamp=$timestamp".
"&AWSAccessKeyId=$ACCESS_KEY_ID";
my $awsSign=new Net::Amazon::AWSSign("$ACCESS_KEY_ID", "$SECRET_KEY");
$signed = $awsSign->addRESTSecret($REQUEST);
$res = `curl -s -o- '$signed'`;
if ($res =~ /<error>/) {
print "ERROR!\n";
return 1;
}
0;
我实际使用XML ::简单到底,并通过了结果从卷曲到XMLIn,解析亚马逊返回的XML。做你会......
答
我用布拉德的出发点,谢谢布拉德! 我改变了本地时间到gmtime。 我也没有使用主题,但使用了Target ARN并使用基于角色的身份验证。 我必须通过SecurityToken才能使其工作,并且只有当我将它放入GCM json包装器时,该消息才能用于android push。 在代码中,我使用TargetARN中的应用程序名称来检测平台并相应地调整有效载荷。 注意:Windows代码未经测试。
需要注意的最后一项是似乎是SNS所需的疯狂嵌套json编码。
sub send_sns
{
# required arguments: endpoint (AWS SNS endpoint), message
my $args = shift;
my $TargetArn=encode_url($args->{endpoint});
my $message=$args->{message};
my $data = {};
my $json = JSON->new->utf8->allow_nonref;
if ($args->{endpoint} =~ /GCM\/[a-z]+_android\//) {
# Android
$data->{data}{message}=$args->{message};
my $dataString = $json->encode($data);
$message = '{"GCM": '.$json->encode($dataString).'}';
} elsif ($args->{endpoint} =~ /APNS\/[a-z]+_apple_ios\//) {
# iOS
$data->{aps}{alert}=$args->{message};
my $dataString = $json->encode($data);
$message = '{"APNS": '.$json->encode($dataString).'}';
} elsif ($args->{endpoint} =~ /ADM\/[a-z]+_windows\//) {
# windows (incomplete)
$data->{data}{message}=$args->{message};
my $dataString = $json->encode($data);
$message = '{"ADM": '.$json->encode($dataString).'}';
}
use Net::Amazon::AWSSign;
my $credentials = qx[ curl -s --fail http://169.254.169.254/latest/meta-data/iam/security-credentials/myrole ];
my $credObj = decode_json($credentials);
my $ACCESS_KEY_ID=$credObj->{AccessKeyId};
my $SECRET_KEY=$credObj->{SecretAccessKey};
my $token=$credObj->{Token};
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
$year += 1900;
$mon+=1;
my $timestamp = sprintf("%4.4d-%2.2d-%2.2dT%2.2d:%2.2d:%2.2d.000Z",
$year,$mon,$mday,$hour,$min,$sec);
$timestamp =~ s/:/%3A/g;
my $REQUEST="http://sns.us-east-1.amazonaws.com/".
"?TargetArn=$TargetArn".
"&Message=$message".
"&Action=Publish".
"&SignatureVersion=2".
"&SignatureMethod=HmacSHA256".
"&Timestamp=$timestamp".
"&SecurityToken=$token".
"&MessageStructure=json".
"&AWSAccessKeyId=$ACCESS_KEY_ID";
my $awsSign=new Net::Amazon::AWSSign("$ACCESS_KEY_ID", "$SECRET_KEY");
my $signed = $awsSign->addRESTSecret($REQUEST);
$res = `curl -s -o- '$signed'`;
print "returns: $res\n" if -t;
if ($res =~ /<error>/) {
print "ERROR!\n";
return 1;
} else {
return 0;
}
}
是的。我试过了。无数的问题。 – Brad
@Brad请让我知道你遇到的问题。最新版本可在https://github.com/dwery/amazon-sns – dwery