tags:

views:

297

answers:

1

So I have been using an open source twitter php class I got a few months back, and all of a sudden, it started to throw me errors last night. You can see what is happening here:

www.campusmediawatch.org

It says it requires authentication but I do authenticate and it has been working for months since last night. Any ideas? Here are the functions:

public function getFriends($id = null, $page = null)
{
 // build parameters
 $aParameters = array();
 if($page !== null) $aParameters['page'] = (int) $page;

 // build url
 $url = 'statuses/friends.xml';
 if($id !== null) $url = 'statuses/friends/'. urlencode($id) .'.xml';

 // do the call
 $response = $this->doCall($url, $aParameters, true, false);

 // convert into xml-object
 $xml = @simplexml_load_string($response);

 // validate
 if($xml == false) throw new TwitterException('invalid body');

 // init var
 $aUsers = array();

 // loop statuses
 foreach ($xml->user as $user) $aUsers[] = $this->userXMLToArray($user);

 // return
 return (array) $aUsers;
}

And here is the code that makes the curl call:

private function doCall($url, $aParameters = array(), $authenticate = false, $usePost = true)
{
 // redefine
 $url = (string) $url;
 $aParameters = (array) $aParameters;
 $authenticate = (bool) $authenticate;
 $usePost = (bool) $usePost;

 // build url
 $url = self::TWITTER_API_URL .'/'. $url;

 // validate needed authentication
 if($authenticate && ($this->getUsername() == '' || $this->getPassword() == '')) throw new TwitterException('No username or password was set.');

 // rebuild url if we don't use post
 if(!empty($aParameters) && !$usePost)
 {
  // init var
  $queryString = '';

  // loop parameters and add them to the queryString
  foreach($aParameters as $key => $value) $queryString .= '&'. $key .'='. urlencode(utf8_encode($value));

  // cleanup querystring
  $queryString = trim($queryString, '&');

  // append to url
  $url .= '?'. $queryString;
 }

 // set options
 $options[CURLOPT_URL] = $url;
 $options[CURLOPT_PORT] = self::TWITTER_API_PORT;
 $options[CURLOPT_USERAGENT] = $this->getUserAgent();
 $options[CURLOPT_FOLLOWLOCATION] = true;
 $options[CURLOPT_RETURNTRANSFER] = true;
 $options[CURLOPT_TIMEOUT] = (int) $this->getTimeOut();

 // should we authenticate?
 if($authenticate)
 {
  $options[CURLOPT_HTTPAUTH] = CURLAUTH_BASIC;
  $options[CURLOPT_USERPWD] = $this->getUsername() .':'. $this->getPassword();
 }

 // are there any parameters?
 if(!empty($aParameters) && $usePost)
 {
  $var = '';

  // rebuild parameters
  foreach($aParameters as $key => $value) $var .= '&'. $key .'='. urlencode($value);

  // set extra options
  $options[CURLOPT_POST] = true;
  $options[CURLOPT_POSTFIELDS] = trim($var, '&');

  // Probaly Twitter's webserver doesn't support the Expect: 100-continue header. So we reset it.
  $options[CURLOPT_HTTPHEADER] = array('Expect:');
 }

 // init
 $curl = curl_init();

 // set options
 curl_setopt_array($curl, $options);

 // execute
 $response = curl_exec($curl);
 $headers = curl_getinfo($curl);

 // fetch errors
 $errorNumber = curl_errno($curl);
 $errorMessage = curl_error($curl);

 // close
 curl_close($curl);

 // validate body
 $xml = @simplexml_load_string($response);
 if($xml !== false && isset($xml->error)) throw new TwitterException((string) $xml->error);

 // invalid headers
 if(!in_array($headers['http_code'], array(0, 200)))
 {
  // should we provide debug information
  if(self::DEBUG)
  {
   // make it output proper
   echo '<pre>';

   // dump the header-information
   var_dump($headers);

   // dump the raw response
   var_dump($response);

   // end proper format
   echo '</pre>';

   // stop the script
   exit;
  }

  // throw error
  throw new TwitterException(null, (int) $headers['http_code']);
 }

 // error?
 if($errorNumber != '') throw new TwitterException($errorMessage, $errorNumber);

 // return
 return $response;
}
A: 

I managed to find the twitter library you are using in a wordpress plugins repository. I hope it is the same one.

I played around with my account using it and I managed to get it working alright. I think you might have to try and log into your twitter account because that error only seems to occur when your account username and password are invalid (thus failed to authenticate on twitter)

So try and log in to your account and make sure your username and password are the same as what you using to initialize the twitter class.

e.g.

$twitter_api = new Twitter(<username>, <password>);
houmam