Re: [twitter-dev] Single Token: Using oauth with Perl: 401 Unauthorized

2010-09-02 Thread Marc Mims
* Lars  [100902 14:38]:
> I am not a Perl expert but I have developed a small web page with Perl
> which is somewhat popular in Germany (according to Alexa trafic rank <
> 1000). And this web site is tweeting important events using its own
> twitter account.
> 
> I tried for days but I am not able to get it working (tweeting) again.
> 
> I registered my web page/application and want to use my access tokens
> "oauth_token" and "oauth_token_secret" which I find under my
> application settings because I am using only this twitter account to
> tweet (see http://dev.twitter.com/pages/oauth_single_token)
> 
> But the response is always "401 Unauthorized"!
> 
> Any ideas?
> 
> My Perl program looks like this (my provider does not offer the module
> NET::Twitter)

If you have shell access, you can probably install local::lib using the
bootstrap method, then install Net::Twitter or Net::Twitter::Lite in
your own directory.

-Marc

-- 
Twitter developer documentation and resources: http://dev.twitter.com/doc
API updates via Twitter: http://twitter.com/twitterapi
Issues/Enhancements Tracker: http://code.google.com/p/twitter-api/issues/list
Change your membership to this group: 
http://groups.google.com/group/twitter-development-talk?hl=en


Re: [twitter-dev] Single Token: Using oauth with Perl: 401 Unauthorized

2010-09-02 Thread Tom van der Woerdt
There's only one thing I notice and that is that you seem to be adding a
"=" to your signature. Why?

I also noticed that you don't URL encode the values in $content. If I
recall correctly, you have to URL encode those as well.

If that was not the issue, then please show your Base String and the
HTTP request.

Tom



On 9/2/10 11:33 PM, Lars wrote:
> Hi,
> 
> I am not a Perl expert but I have developed a small web page with Perl
> which is somewhat popular in Germany (according to Alexa trafic rank <
> 1000). And this web site is tweeting important events using its own
> twitter account.
> 
> I tried for days but I am not able to get it working (tweeting) again.
> 
> I registered my web page/application and want to use my access tokens
> "oauth_token" and "oauth_token_secret" which I find under my
> application settings because I am using only this twitter account to
> tweet (see http://dev.twitter.com/pages/oauth_single_token)
> 
> But the response is always "401 Unauthorized"!
> 
> Any ideas?
> 
> My Perl program looks like this (my provider does not offer the module
> NET::Twitter)
> 
> #!/usr/bin/perl
> 
> use CGI::Carp qw(fatalsToBrowser);
> use strict;
> use Digest::HMAC_SHA1;
> use Encode qw(encode);
> use URI::Escape;
> use LWP::UserAgent;
> use HTTP::Request::Common ('POST');
> 
> my $api_url = "http://api.twitter.com/1/statuses/update.json";;
> my $status = "Hello world";
> my $oauth_consumer_key = "XYZ";
> my $oauth_consumer_secret = "XYZ";
> my $oauth_nonce = "101";
> my $oauth_signature_method = "HMAC-SHA1";
> my $oauth_token = "XYZ"; # from my application under my access token
> my $oauth_token_secret = "XYZ"; # from my application under my access
> token
> my $oauth_timestamp = "1272325550";
> my $oauth_version = "1.0";
> my $content = "oauth_consumer_key=$oauth_consumer_key&oauth_nonce=
> $oauth_nonce&oauth_signature_method=
> $oauth_signature_method&oauth_timestamp=$oauth_timestamp&oauth_token=
> $oauth_token&oauth_version=$oauth_version&status=$status";
> 
> my $signature_base_str = "POST&" . uri_escape_RFC3986($api_url) .
> "&" . uri_escape_RFC3986($content);
> 
> my $HMAC_SHA1_key = uri_escape_RFC3986(Encode::encode("UTF-8",
> $oauth_consumer_secret));
>$HMAC_SHA1_key .= "&";
>$HMAC_SHA1_key .= uri_escape_RFC3986(Encode::encode("UTF-8",
> $oauth_token_secret));
> 
> my $hmac = Digest::HMAC_SHA1->new($HMAC_SHA1_key);
>$hmac->add($signature_base_str);
> my $signature = $hmac->b64digest;
> $signature .= "=";
> 
> my $ua = LWP::UserAgent->new;
> my $req = POST($api_url => [
>oauth_nonce => $oauth_nonce,
>oauth_signature_method => $oauth_signature_method,
>oauth_timestamp => $oauth_timestamp,
>oauth_consumer_key => $oauth_consumer_key,
>oauth_token => $oauth_token,
>oauth_signature => $signature,
>oauth_version => $oauth_version,
>status => $status
>]);
> 
> my $res = $ua->request($req);
> 
> print "Content-type: text\/html\n\n";
> 
> if ($res->is_success) {
>  print "success: $res->decoded_content";
>  }
>  else {
>  print "error:", $res->status_line;
>  }
> 
> #
> 
> sub uri_escape_RFC3986 {
> my($str) = @_;
> 
> return uri_escape($str,"^A-Za-z0-9\-_.~");
> }
> 

-- 
Twitter developer documentation and resources: http://dev.twitter.com/doc
API updates via Twitter: http://twitter.com/twitterapi
Issues/Enhancements Tracker: http://code.google.com/p/twitter-api/issues/list
Change your membership to this group: 
http://groups.google.com/group/twitter-development-talk?hl=en


Re: [twitter-dev] Single Token: Using oauth with Perl: 401 Unauthorized

2010-09-02 Thread Taylor Singletary
Hi Lars,

First thing I spotted here was that your timestamp doesn't appear to be
correct.

In fact, it's a timestamp for "Mon Apr 26 16:45:50 -0700 2010" -- you'll
need to make sure that your timestamp is in epoch GMT time in seconds.

On a quick glance, the code looks pretty good for this limited use case,
though I didn't go too deeply into it. I would probably also go the extra
mile and make sure your space characters in a POST body value are always
encoded as %20. "+" will work but is more prone to encoding errors.

Taylor

On Thu, Sep 2, 2010 at 2:33 PM, Lars  wrote:

> Hi,
>
> I am not a Perl expert but I have developed a small web page with Perl
> which is somewhat popular in Germany (according to Alexa trafic rank <
> 1000). And this web site is tweeting important events using its own
> twitter account.
>
> I tried for days but I am not able to get it working (tweeting) again.
>
> I registered my web page/application and want to use my access tokens
> "oauth_token" and "oauth_token_secret" which I find under my
> application settings because I am using only this twitter account to
> tweet (see http://dev.twitter.com/pages/oauth_single_token)
>
> But the response is always "401 Unauthorized"!
>
> Any ideas?
>
> My Perl program looks like this (my provider does not offer the module
> NET::Twitter)
>
> #!/usr/bin/perl
>
> use CGI::Carp qw(fatalsToBrowser);
> use strict;
> use Digest::HMAC_SHA1;
> use Encode qw(encode);
> use URI::Escape;
> use LWP::UserAgent;
> use HTTP::Request::Common ('POST');
>
> my $api_url = "http://api.twitter.com/1/statuses/update.json";;
> my $status = "Hello world";
> my $oauth_consumer_key = "XYZ";
> my $oauth_consumer_secret = "XYZ";
> my $oauth_nonce = "101";
> my $oauth_signature_method = "HMAC-SHA1";
> my $oauth_token = "XYZ"; # from my application under my access token
> my $oauth_token_secret = "XYZ"; # from my application under my access
> token
> my $oauth_timestamp = "1272325550";
> my $oauth_version = "1.0";
> my $content = "oauth_consumer_key=$oauth_consumer_key&oauth_nonce=
> $oauth_nonce&oauth_signature_method=
> $oauth_signature_method&oauth_timestamp=$oauth_timestamp&oauth_token=
> $oauth_token&oauth_version=$oauth_version&status=$status";
>
> my $signature_base_str = "POST&" . uri_escape_RFC3986($api_url) .
> "&" . uri_escape_RFC3986($content);
>
> my $HMAC_SHA1_key = uri_escape_RFC3986(Encode::encode("UTF-8",
> $oauth_consumer_secret));
>   $HMAC_SHA1_key .= "&";
>   $HMAC_SHA1_key .= uri_escape_RFC3986(Encode::encode("UTF-8",
> $oauth_token_secret));
>
> my $hmac = Digest::HMAC_SHA1->new($HMAC_SHA1_key);
>   $hmac->add($signature_base_str);
> my $signature = $hmac->b64digest;
> $signature .= "=";
>
> my $ua = LWP::UserAgent->new;
> my $req = POST($api_url => [
>   oauth_nonce => $oauth_nonce,
>   oauth_signature_method => $oauth_signature_method,
>   oauth_timestamp => $oauth_timestamp,
>   oauth_consumer_key => $oauth_consumer_key,
>   oauth_token => $oauth_token,
>   oauth_signature => $signature,
>   oauth_version => $oauth_version,
>   status => $status
>   ]);
>
> my $res = $ua->request($req);
>
> print "Content-type: text\/html\n\n";
>
> if ($res->is_success) {
>  print "success: $res->decoded_content";
>  }
>  else {
>  print "error:", $res->status_line;
>  }
>
> #
>
> sub uri_escape_RFC3986 {
>my($str) = @_;
>
>return uri_escape($str,"^A-Za-z0-9\-_.~");
> }
>
> --
> Twitter developer documentation and resources: http://dev.twitter.com/doc
> API updates via Twitter: http://twitter.com/twitterapi
> Issues/Enhancements Tracker:
> http://code.google.com/p/twitter-api/issues/list
> Change your membership to this group:
> http://groups.google.com/group/twitter-development-talk?hl=en
>

-- 
Twitter developer documentation and resources: http://dev.twitter.com/doc
API updates via Twitter: http://twitter.com/twitterapi
Issues/Enhancements Tracker: http://code.google.com/p/twitter-api/issues/list
Change your membership to this group: 
http://groups.google.com/group/twitter-development-talk?hl=en