2011-11-04 33 views
5

Tôi muốn bắt đầu sử dụng Amazon Simple Notification Service, nhưng tôi chưa tìm thấy bất kỳ thư viện Perl nào mà tôi có thể sử dụng để truy cập dịch vụ. Tôi không muốn tạo thư viện của riêng mình, tôi muốn xem liệu có ai đã sử dụng bất kỳ thư viện Perl nào cho dịch vụ SNS hay không và liệu họ có muốn giới thiệu bất kỳ thư viện nào không.Amazon SNS (Dịch vụ thông báo đơn giản) Thư viện Perl

Trả lời

1

tôi đã sử dụng Net :: Amazon :: AWSSign kết hợp với một kịch bản nhỏ:

#!/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; 

Tôi thực sự sử dụng XML :: Simple cuối cùng, và thông qua kết quả từ Curl để XMLIn, để phân tích XML mà Amazon trả về. Hãy làm những gì bạn sẽ ...

2

Amazon::SNS tồn tại. Các tài liệu khá thưa thớt nhưng có vẻ như nó cơ bản, và chất lượng mã có vẻ ổn với tôi.

+0

Có. Tôi đã thử điều đó. Nhiều vấn đề. – Brad

+0

@Brad hãy cho tôi biết các sự cố bạn đã gặp phải.Phiên bản mới nhất có sẵn tại https://github.com/dwery/amazon-sns – dwery

0

Tôi đã sử dụng Brad làm điểm xuất phát, cảm ơn Brad! Tôi đã thay đổi giờ địa phương thành gmtime. Tôi cũng không sử dụng các chủ đề nhưng ARN mục tiêu và sử dụng xác thực dựa trên vai trò. Tôi đã phải vượt qua các SecurityToken để làm cho nó hoạt động và tin nhắn chỉ làm việc cho android đẩy khi tôi đặt nó trong một wrapper json GCM. Trong mã tôi sử dụng tên ứng dụng của tôi trong TargetARN để phát hiện nền tảng và điều chỉnh tải trọng tương ứng. Lưu ý: Mã Windows chưa được kiểm tra.

Một mục cuối cùng của ghi chú là mã hóa json lồng nhau điên mà dường như được yêu cầu của 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; 
     } 
} 
Các vấn đề liên quan