2011-11-04 29 views
5

मैं Amazon Simple Notification Service का उपयोग शुरू करना चाहता था, लेकिन मुझे कोई भी पर्ल लाइब्रेरी नहीं मिली है जिसका उपयोग मैं सेवा तक पहुंचने के लिए कर सकता हूं। मैं अपनी खुद की लाइब्रेरी नहीं बनाऊंगा, मैं देखना चाहता था कि किसी ने एसएनएस सेवा के लिए किसी भी पर्ल पुस्तकालयों का उपयोग किया है, और यदि वे किसी की भी सिफारिश करेंगे।अमेज़ॅन एसएनएस (सरल अधिसूचना सेवा) पर्ल पुस्तकालय

उत्तर

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; 

मैं वास्तव में एक्सएमएल :: अंत में सरल थे, और XMLIn को कर्ल से परिणाम पारित कर दिया, पार्स करने के लिए एक्सएमएल अमेज़ॅन लौटता है। जो भी आप करेंगे ...

2

Amazon::SNS मौजूद है। दस्तावेज़ बहुत अस्पष्ट हैं लेकिन ऐसा लगता है कि यह मूल बातें करता है, और कोड की गुणवत्ता मेरे लिए ठीक लगती है।

+0

हां। मैंने कोशिश की। कई असंख्य समस्याएं – Brad

+0

@ ब्रैड कृपया मुझे जिन समस्याओं का सामना करना पड़ा है, उन्हें बताएं। नवीनतम संस्करण https://github.com/dwery/amazon-sns पर उपलब्ध है – dwery

0

मैंने ब्रैड को शुरुआती बिंदु के रूप में इस्तेमाल किया, धन्यवाद ब्रैड! मैंने जीएमटाइम के लिए लोकलटाइम बदल दिया था। मैं विषयों का उपयोग नहीं कर रहा था लेकिन लक्षित एआरएन और भूमिका आधारित प्रमाणीकरण का उपयोग कर रहा था। मुझे इसे काम करने के लिए सुरक्षा टोकन पास करना पड़ा और जब मैंने इसे जीसीएम जेसन रैपर में रखा तो संदेश केवल एंड्रॉइड पुश के लिए काम करता था। कोड में मैं प्लेटफ़ॉर्म का पता लगाने और तदनुसार पेलोड समायोजित करने के लिए TargetARN में अपना एप्लिकेशन नाम उपयोग करता हूं। नोट: विंडोज कोड यह अनचाहे है।

नोट की एक आखिरी वस्तु पागल नेस्टेड जेसन एन्कोडिंग है जो एसएनएस की आवश्यकता होती है।

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; 
     } 
} 
संबंधित मुद्दे