2011-11-04 14 views
5

Amazon Simple Notification Serviceを使い始めましたが、サービスにアクセスするために使用できるPerlライブラリが見つかりませんでした。自分のライブラリを作成するのではなく、SNSサービスのためにPerlライブラリを使用している人がいるかどうか、誰かがSNSサービスを推奨しているかどうかを見たいと思っていました。Amazon SNS(Simple Notification Service)Perlライブラリ

答えて

1

私はネット使用::アマゾン:: 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はを使用し、解析するために、カールからXMLInに結果を渡しますAmazonが返すXML。あなたは何をしますか...

2

Amazon::SNSが存在します。ドキュメントは非常にまばらですが、基本的なように見え、コードの品質は私にとってはうまく見えます。

+0

はい。私はそれを試みた。数多くの問題。 – Brad

+0

@ブラッドあなたが直面している問題を教えてください。最新バージョンはhttps://github.com/dwery/amazon-snsで入手できます。 – dwery

0

私はBrad'sを出発点として使用しました。Bradに感謝します! ローカルタイムをgmtimeに変更しました。 トピックARNと役割ベース認証を使用していました。 GCT jsonラッパーに入れたときに、SecurityTokenを渡してMessageを動作させる必要がありました。 コードでは、プラットフォームを検出し、それに応じてペイロードを調整するために、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; 
     } 
} 
関連する問題