Библиотеки Perl Amazon SNS (Simple Notification Service) - PullRequest
5 голосов
/ 05 ноября 2011

Я хотел начать использовать Amazon Simple Notification Service , но я не нашел никаких библиотек Perl, которые я мог бы использовать для доступа к службе. Я бы предпочел не создавать свою собственную библиотеку, я хотел бы узнать, использовал ли кто-нибудь какие-либо библиотеки Perl для службы SNS, и если бы они рекомендовали какие-либо.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Amazon :: SNS существует. Документы довольно скудные, но, похоже, они справляются с основами, а качество кода мне подходит.

1 голос
/ 05 ноября 2011

Я использовал Net :: Amazon :: 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 :: Simple и передал результат из Curl в XMLIn, чтобы проанализировать XML, который возвращает Amazon. Делай что хочешь ...

0 голосов
/ 01 сентября 2015

Я использовал Брэда в качестве отправной точки, спасибо Брэду! У меня было изменение местного времени на gmtime. Я также использовал не темы, а целевые ARN и аутентификацию на основе ролей. Я должен был передать SecurityToken, чтобы заставить его работать, и Сообщение работало только для android push, когда я помещал его в оболочку json GCM. В коде я использую имя своего приложения в TargetARN, чтобы определить платформу и соответствующим образом настроить полезную нагрузку. Примечание. Код Windows не проверен.

Последнее замечание - это сумасшедшая вложенная кодировка json, которая, по-видимому, требуется для SNS.

    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;
        }
}
...