views:

100

answers:

2

I'm trying to update my status through the Twitter API and OAuth.

I get stuck on the last step, the status update. Here's my code.

The header:

$ua->default_header('Content-Type' => "application/x-www-form-urlencoded");
$ua->default_header('oauth_signature' => "$signature");
$ua->default_header('Authorization' => '"OAuth realm="Twitter API"');
$ua->default_header('oauth_consumer_key' => "blablabla");
$ua->default_header('oauth_nonce' => "$nonce");
$ua->default_header('oauth_signature_method' => "HMAC-SHA1");
$ua->default_header('oauth_timestamp' => "$epoch");
$ua->default_header('oauth_token' => "$token_final");
$ua->default_header('oauth_version' => "1.0");

The post to http://api.twitter.com/1/statuses/update.json made with lwp useragent:

'oauth_signature'=>"$signature",
'status'=>'Bientot',
'oauth_consumer_key'=>'blabla',
'oauth_signature_method'=>'HMAC-SHA1',
'oauth_nonce'=>"$nonce",
'oauth_timestamp'=>"$epoch",
'oauth_token'=>"$token_final",
'oauth_version'=>"1.0", 

and what i get:

HTTP/1.1 401 Unauthorized
Cache-Control: no-cache, max-age=300
Connection: close
Date: Wed, 29 Sep 2010 14:36:48 GMT
Server: hi
Vary: Accept-Encoding
WWW-Authenticate: Basic realm="Twitter API"
Content-Length: 75
Content-Type: application/json; charset=utf-8
Expires: Wed, 29 Sep 2010 14:41:48 GMT
Client-Date: Wed, 29 Sep 2010 14:36:49 GMT
Client-Peer: 128.242.240.29:80
Client-Response-Num: 1
Set-Cookie: _twitter_sess=BAh7DjoTc2hvd19oZWxwX2xpbmswOg5yZXR1cm5fdG8iYWh0dHA6Ly9hcGku%250AdHdpdHRlci5jb20vb2F1dGgvYXV0aG9yaXplP29hdXRoX3Rva2VuPXpMc2d2%250AV2U5aHBvSWNOSW5rOFFkYUNrN1NQSlozZW1VcUNpckNxWkZvOhVpbl9uZXdf%250AdXNlcl9mbG93MDoTcGFzc3dvcmRfdG9rZW4iLWZiNzEyNTAzMGNiYTk1NTU1%250ANDE0OGExM2UxN2U2Yzc1ZmY2YjUzMDE6CXVzZXJpBLWRPgYiCmZsYXNoSUM6%250AJ0FjdGlvbkNvbnRyb2xsZXI6OkZsYXNoOjpGbGFzaEhhc2h7AAY6CkB1c2Vk%250AewA6B2lkIiU0MGUyNmQzNjRmYmI4YThlODgwN2MwZWYzYzNlOGJiYjoMY3Ny%250AZl9pZCIlZTUzZjY0OGIxMWZiOTA0OWQzM2FlOGI4NjYzZDA5NTI6D2NyZWF0%250AZWRfYXRsKwhe%252FkpTKwE%253D--3b624de9adb8de40ff8a3f0a5780f2b18b6abd44; domain=.twitter.com; path=/
Status: 401 Unauthorized
X-Runtime: 0.00264

{"request":"/1/statuses/update.json","error":"Could not authenticate you."}

Does anyone has an idea? i'm stuck there, and it's really frustrating.

+9  A: 

Well, if you don't want to use Net::Twitter or Net::Twitter::Lite, you should probably at least have a look at the code and see what they are doing.

Based on the error you're getting, it looks like you aren't doing the OAuth handshake properly. Maybe it's as simple as a missing field, but I suspect there is something more missing from your simple approach (I don't know anything about OAuth specifics - sorry). You could also go directly to the OAuth module that Twitter::Lite is using Net::OAuth::Simple to see how they handle it.

Mike Ellery
Thanks, that's what I've done to now, but I'm stuck there... i'm going to give another look, you should be right.
A: 

Don't use OAuth, simply do it the old way and tag ?source=twitterandroid onto the end, like so:

http://api.twitter.com/1/account/rate_limit_status.json?source=twitterandroid

I tested that a couple of weeks ago and confirmed the method still works. Please don't consider this a workaround, it is simply legacy functionality that will quickly disappear but might enable you to do something for now.

TehGringe
Ok, thank you! In fact, I just found how to do it, I'm still having problem if the status has a ' in it, but otherwise everythings posts well.