baseUrlFull = $this->baseUrl; if (null !== $user) { // user is defined, so use it in the URL $this->user = $user; $this->pass = $pass; $parsed = parse_url($this->baseUrl); $this->baseUrlFull = $parsed['scheme'] . '://' . $this->user . ':' . $this->pass . '@' . $parsed['host']; // port (optional) if (isset($parsed['port']) && is_numeric($parsed['port'])) { $this->baseUrlFull .= ':' . $parsed['port']; } // append path (default: /) if (isset($parsed['path'])) { $this->baseUrlFull .= $parsed['path']; } else { $this->baseUrlFull .= '/'; } } } /** * Fetches a tweet by its number/id * * @param int $num the tweet id/number * @return string (null on failure) */ public function getTweetByNum($num) { if (!is_numeric($num)) { return; } $tweet = json_decode(file_get_contents($this->getUrlStatus($num))); return $tweet; } /** * Reads [last] tweet from user * * @param string $tweeter the tweeter username * @param int $num this many tweets ago (1 = current tweet) * @return string (false on failure) */ public function getLastTweet($tweeter, $num = 1) { $source = json_decode(file_get_contents($this->getUrlUserTimeline($tweeter))); if ($num > count($source)) { return false; } $tweet = $source[$num - 1]; if (!isset($tweet->user->screen_name) || !$tweet->user->screen_name) { return false; } return $tweet; } /** * fetches mentions for a user */ public function getMentions($sinceId=null, $count=20) { return json_decode(file_get_contents($this->getUrlMentions($sinceId, $count))); } /** * Fetches followers for a user */ public function getFollowers($cursor=-1) { return json_decode(file_get_contents($this->getUrlFollowers($cursor))); } /** * Follow a userid */ public function follow($userId) { $params = array( 'http' => array( 'method' => 'POST', 'content' => array(), 'header' => 'Content-type: application/x-www-form-urlencoded', ) ); $ctx = stream_context_create($params); $fp = fopen($this->getUrlFollow($userId), 'rb', false, $ctx); if (!$fp) { return false; } $response = stream_get_contents($fp); if ($response === false) { return false; } $response = json_decode($response); return $response; } /** * fetches DMs for a user */ public function getDMs($sinceId=null, $count=20, $page=1) { return json_decode(file_get_contents($this->getUrlDMs($sinceId, $count, $page))); } /** * Send DM */ public function sendDM($screenName, $text) { $data = http_build_query(array('screen_name'=>$screenName, 'text'=>$text)); $params = array( 'http' => array( 'method' => 'POST', 'content' => $data, 'header' => 'Content-type: application/x-www-form-urlencoded', ) ); $ctx = stream_context_create($params); $fp = fopen($this->getUrlSendDM(), 'rb', false, $ctx); if (!$fp) { return false; } $response = stream_get_contents($fp); if ($response === false) { return false; } $response = json_decode($response); return $response; } /** * Sends a tweet * * @param string $txt the tweet text to send * @return string URL of tweet (or false on failure) */ public function sendTweet($txt, $limit=true) { if ($limit) { $txt = substr($txt, 0, 140); // twitter message size limit } $data = 'status=' . urlencode($txt); $params = array( 'http' => array( 'method' => 'POST', 'content' => $data, 'header' => 'Content-type: application/x-www-form-urlencoded', ) ); $ctx = stream_context_create($params); $fp = fopen($this->getUrlTweetPost(), 'rb', false, $ctx); if (!$fp) { return false; } $response = stream_get_contents($fp); if ($response === false) { return false; } $response = json_decode($response); return $response; } /** * Returns the base API URL */ protected function getUrlApi() { return $this->baseUrlFull; } /** * Returns the status URL * * @param int $num the tweet number */ protected function getUrlStatus($num) { return $this->getUrlApi() . 'statuses/show/'. urlencode($num) .'.json'; } /** * Returns the user timeline URL */ protected function getUrlUserTimeline($user) { return $this->getUrlApi() . 'statuses/user_timeline/'. urlencode($user) .'.json'; } /** * Returns the tweet posting URL */ protected function getUrlTweetPost() { return $this->getUrlApi() . 'statuses/update.json'; } /** * Output URL: status */ public function getUrlOutputStatus(StdClass $tweet) { return $this->baseUrl . urlencode($tweet->user->screen_name) . '/statuses/' . urlencode($tweet->id); } /** * Return mentions URL */ public function getUrlMentions($sinceId=null, $count=20) { $url = $this->baseUrlFull . 'statuses/mentions.json?count=' . urlencode($count); if ($sinceId !== null) { $url .= '&since_id=' . urlencode($sinceId); } return $url; } /** * Returns the followers URL */ public function getUrlFollowers($cursor=-1) { return $this->baseUrlFull . 'statuses/followers.json?cursor=' . ((int)$cursor); } /** * Returns the follow-user URL */ public function getUrlFollow($userid) { return $this->baseUrlFull . 'friendships/create/' . ((int) $userid) . '.json'; } /** * Returns the get DMs URL */ public function getUrlDMs($sinceId=null, $count=20, $page=1) { $url = $this->baseUrlFull . 'direct_messages.json?'; if ($sinceId !== null) { $url .= 'since_id=' . urlencode($sinceId); } $url .= "&page={$page}"; $url .= "&count={$count}"; return $url; } /** * Returns the send DM URL */ public function getURLSendDM() { return $this->baseUrlFull . 'direct_messages/new.json'; } }