I'm pretty sure that the request is being made authenticated. Reasons for thinking so include:
1. I'm passing the correct authentication credentials to the Net::Twitter object. 2. Dumping the data structure corresponding to the Perl libwww user agent shows an 'authentication' structure containing those credentials; this should mean that those are the credentials that libwww will send to Twitter. 3. While the 'user_timeline' method returns 404 whatever I send it, if I switch to using the 'friends_timeline' method, I will get either a '200' or a '401' response, depending on whether I pass in a correct username/password combination or not. The 'following_timeline' method (which wraps a call to '/statuses/ friends_timeline' in the Twitter API) and the 'user_timeline' method (which wraps a call to '/statuses/user_timeline') are line-by-line identical except for the URL, so I'd expect them to behave the same way in the case of an authentication failure. Are there any headers or arguments that are mandatory for 'user_timeline' that are not required for other, similar API functions? Thanks, Angus On Oct 20, 9:10 pm, "Alex Payne" <[EMAIL PROTECTED]> wrote: > Are you quite sure that you're making the request authenticated? It > will return a 404 if it can't authenticate you, because that URL > doesn't specify a user ID to retrieve a timeline for and thus assumes > that you want the timeline for the requesting user. > > > > On Mon, Oct 20, 2008 at 11:48 AM, angusmci <[EMAIL PROTECTED]> wrote: > > > I don't have a way currently to monitor what's actually going out over > > the wire, but I've scattered Data::Dumper calls through the > > Net::Twitter code to inspect the data structures used by the libwww > > user agent. According to that, Net::Twitter is requesting: > > > http://twitter.com/statuses/user_timeline.json?count=1& > > > and it's sending the headers: > > > 'user-agent' => 'Net::Twitter/1.17 (PERL)', > > 'x-twitter-client-version:' => '1.17', > > 'x-twitter-client:' => 'Perl Net::Twitter', > > 'x-twitter-client-url:' => 'http://x4.net/twitter/meta.xml' > > > The authentication information that it should be sending corresponds > > to a valid Twitter account. It's supposedly using > > 'basic_authentication' against 'twitter.com:80', with realm set to > > 'Twitter API'. > > > The response headers sent back by Twitter are: > > > 'connection' => 'close', > > 'client-response-num' => 1, > > 'set-cookie' => '_twitter_sess=...; domain=.twitter.com; path=/', > > 'cache-control' => 'no-cache, no-store, must-revalidate, pre-check=0, > > post-check=0', > > 'last-modified' => 'Mon, 20 Oct 2008 18:17:52 GMT', > > 'status' => '404 Not Found', > > 'date' => 'Mon, 20 Oct 2008 18:17:52 GMT', > > 'client-peer' => '128.121.146.100:80', > > 'content-length' => '73', > > 'client-date' => 'Mon, 20 Oct 2008 18:17:49 GMT', > > 'pragma' => 'no-cache', > > 'content-type' => 'application/json; charset=utf-8', > > 'server' => 'hi', > > 'expires' => 'Tue, 31 Mar 1981 05:00:00 GMT' > > > (I've elided the Twitter session cookie just in case it contains > > anything sensitive). > > > Some more data points: > > > - the same request submitted to the corresponding API endpoint on > > identi.ca works correctly. > > - if I add an id parameter to my call to Net::Twitter's > > user_timeline() method, Twitter returns a valid result. > > - if I substitute 'friends' for 'user_timeline', I get the same > > behavior: 404 with no 'id' parameter, 200 if I supply an 'id' > > parameter. > > - if I substitute 'friends_timeline' for 'user_timeline', it works > > without problems: I get a 200 response, and appropriate JSON data > > - the code implementing 'friends_timeline' and 'user_timeline' in > > Net::Twitter seems to be effectively identical. > > - if I send friends_timeline the wrong password, it replies '401 Not > > authorized'. > > - if I send user_timeline the wrong password, it replies '404 Not > > Found'. > > - testing from a different host/network produces the same results > > - requesting 'http://twitter.com/statuses/user_timeline.json?count=1&' > > using curl and the proper authentication credentials works > > - this worked successfully at least as recently as September 22nd > > > The fact that sending an 'id' parameter (which asks Twitter to return > > information for the user identified by 'id', and which may not depend > > on authentication) made me think that it was an authentication issue > > and that Net::Twitter was somehow fumbling authentication (although > > since Net::Twitter is using Perl LWP, I don't know how that could > > happen). However, 'friends_timeline' works as expected. > > > Thanks again for your help, > > > Angus > > > On Oct 20, 1:51 pm, "Alex Payne" <[EMAIL PROTECTED]> wrote: > >> Certain headers like If-Modified-Since will effect the responses we > >> return. Can you please provide full header output? > > >> On Sat, Oct 18, 2008 at 11:44 AM, angusmci <[EMAIL PROTECTED]> wrote: > > >> > The problem was reported by one of our users, but when I tested our > >> > software with my own Twitter account - which is alive and in good > >> > standing - I got the same 404 message. > > >> > If I use 'curl', i.e. > > >> > curl -u user:passhttp://twitter.com/statuses/user_timeline.json > > >> > It works fine. However, if I use the Perl Net::Twitter equivalent, > >> > i.e. > > >> > use Net::Twitter; > >> > my $twitter = Net::Twitter->new(username => "user", password => > >> > "pass"); > >> > my $timeline = $twitter->user_timeline({ count => 1 }); > >> > print $twitter->http_code, " ", $twitter->http_message(); > > >> > I get the 404 Not Found error. > > >> > Both my simple Net::Twitter test case and our actual application have > >> > worked well in the past, and our Net::Twitter module is up-to-date. > > >> > Is it possible that Twitter's behavior depends in some way on other > >> > headers sent by the client? > > >> > Thanks for your help, > > >> > Angus > > >> > On Oct 17, 9:44 pm, "Alex Payne" <[EMAIL PROTECTED]> wrote: > >> >> Nope, hasn't changed. Is it possible that the user you're requesting > >> >> was deleted or marked as a spammer? > > >> >> On Fri, Oct 17, 2008 at 3:48 PM, angusmci <[EMAIL PROTECTED]> wrote: > > >> >> > A part of our app that made use of the '/statuses/ > >> >> > user_timeline.format' endpoint has broken, and tests show that we're > >> >> > now getting a 404 result from that (using 'curl', or the Perl > >> >> > Net::Twitter module). > > >> >> > Has the API changed recently? > > >> >> > Angus > > >> >> -- > >> >> Alex Payne - API Lead, Twitter, Inc.http://twitter.com/al3x > > >> -- > >> Alex Payne - API Lead, Twitter, Inc.http://twitter.com/al3x > > -- > Alex Payne - API Lead, Twitter, Inc.http://twitter.com/al3x