* @license http://opensource.org/licenses/mit-license.php The MIT License */ namespace Instagram\Core; /** * Proxy * * This class performs all the API calls * * It uses the supplied HTTP client as a default (cURL) * */ class Proxy { /** * HTTP Client * * @var \Instagram\Net\ClientInterface * @access protected */ protected $client; /** * Instagram access token * * @var string * @access protected */ protected $access_token = null; /** * Client ID * * @var string * @access protected */ protected $client_id = null; /** * API URL * * @var string * @access protected */ protected $api_url = 'https://api.instagram.com/v1'; /** * Constructor * * @param \Instagram\Net\ClientInterface $client HTTP Client * @param string $access_token The access token from authentication * @access public */ public function __construct( \Instagram\Net\ClientInterface $client, $access_token = null ) { $this->client = $client; $this->access_token = $access_token; } /** * Get the access token * * @param array $data Auth data * @return string Returns the access token */ public function getAccessToken( array $data ) { $response = $this->apiCall( 'post', 'https://api.instagram.com/oauth/access_token', $data ); return $response; } /** * Set the access token * * @param string $access_token The access token * @access public */ public function setAccessToken( $access_token ) { $this->access_token = $access_token; } /** * Set the client ID * * @param string $client_id the client ID * @access public */ public function setClientID( $client_id ) { $this->client_id = $client_id; } /** * Logout of instagram * * This hasn't been implemented by instagram yet * * @access public */ public function logout() { $this->client->get( 'https://instagram.com/accounts/logout/', array() ); } /** * Get the media associated with an object * * This function is used by the individual object functions * getLocationMedia, getTagMedia, atc... * * @param string $api_endpoint API endpoint for the object type * @param string $id Id of the object to get the media for * @param array $params Extra parameters for the API call * @return StdClass Returns the raw response * @access protected */ protected function getObjectMedia( $api_endpoint, $id, array $params = null ) { $response = $this->apiCall( 'get', sprintf( '%s/%s/%s/media/recent', $this->api_url, strtolower( $api_endpoint ), $id ), $params ); return $response->getRawData(); } /** * Get location media * * @param string $id Location ID * @param array $params Extra params to pass to the API * @return StdClass Returns the location media * @access public */ public function getLocationMedia( $id, array $params = null ) { return $this->getObjectMedia( 'Locations', $id, $params ); } /** * Get tag media * * @param string $id Location ID * @param array $params Extra params to pass to the API * @return StdClass Returns the location media * @access public */ public function getTagMedia( $id, array $params = null ) { return $this->getObjectMedia( 'Tags', $id, $params ); } /** * Get user media * * @param string $id Location ID * @param array $params Extra params to pass to the API * @return StdClass Returns the location media * @access public */ public function getUserMedia( $id, array $params = null ) { return $this->getObjectMedia( 'Users', $id, $params ); } /** * Get user * * @param string $id User ID * @return StdClass Returns the user data * @access public */ public function getUser( $id ) { $response = $this->apiCall( 'get', sprintf( '%s/users/%s', $this->api_url, $id ) ); return $response->getData(); } /** * Get a user's follows * * @param string $id User's ID * @param array $params Extra params to pass to the API * @return StdClass Returns the user's followers * @access public */ public function getUserFollows( $id, array $params = null ) { $response = $this->apiCall( 'get', sprintf( '%s/users/%s/follows', $this->api_url, $id ), $params ); return $response->getRawData(); } /** * Get a user's followers * * @param string $id User's ID * @param array $params Extra params to pass to the API * @return StdClass Returns the user's followers * @access public */ public function getUserFollowers( $id, array $params = null ) { $response = $this->apiCall( 'get', sprintf( '%s/users/%s/followed-by', $this->api_url, $id ), $params ); return $response->getRawData(); } /** * Get media comments * * @param string $id Media ID * @return StdClass Returns the media data * @access public */ public function getMediaComments( $id ) { $response = $this->apiCall( 'get', sprintf( '%s/media/%s/comments', $this->api_url, $id ) ); return $response->getRawData(); } /** * Get media likes * * @param string $id Media ID * @return StdClass Returns the media likes * @access public */ public function getMediaLikes( $id ) { $response = $this->apiCall( 'get', sprintf( '%s/media/%s/likes', $this->api_url, $id ) ); return $response->getRawData(); } /** * Get media comments * * @return StdClass Returns the current user data * @access public */ public function getCurrentUser() { $response = $this->apiCall( 'get', sprintf( '%s/users/self', $this->api_url ) ); return $response->getData(); } /** * Get media * * @param string $id Media ID * @return StdClass Returns the media data * @access public */ public function getMedia( $id ) { $response = $this->apiCall( 'get', sprintf( '%s/media/%s', $this->api_url, $id ) ); return $response->getData(); } /** * Get tag * * @param string $id Tag ID * @return StdClass Returns the tag data * @access public */ public function getTag( $tag ) { $response = $this->apiCall( 'get', sprintf( '%s/tags/%s', $this->api_url, $tag ) ); return $response->getData(); } /** * Get location * * @param string $id Location ID * @return StdClass Returns the location data * @access public */ public function getLocation( $id ) { $response = $this->apiCall( 'get', sprintf( '%s/locations/%s', $this->api_url, $id ) ); return $response->getData(); } /** * Search users * * @param array $params Search params * @return array Returns an array of user data * @access public */ public function searchUsers( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/users/search', $params ); return $response->getRawData(); } /** * Search tags * * @param array $params Search params * @return array Returns an array of tag data * @access public */ public function searchTags( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/tags/search', $params ); return $response->getRawData(); } /** * Search media * * @param array $params Search params * @return array Returns an array of media data * @access public */ public function searchMedia( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/media/search', $params ); return $response->getRawData(); } /** * Search locations * * @param array $params Search params * @return array Returns an array of location data * @access public */ public function searchLocations( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/locations/search', $params ); return $response->getRawData(); } /** * Get popular media * * @param array $params Extra params * @return array Returns an array of popular media data * @access public */ public function getPopularMedia( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/media/popular', $params ); return $response->getRawData(); } /** * Get the current user's feed * * @param array $params Extra params * @return array Returns an array of media data * @access public */ public function getFeed( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/users/self/feed', $params ); return $response->getRawData(); } /** * Get the current users follow requests * * @param $params Extra params (not used in API, here in case it's added) * @return array Returns an array of user data * @access public */ public function getFollowRequests( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/users/self/requested-by', $params ); return $response->getRawData(); } /** * Get the current user's liked media * * @param array $params Extra params * @return array Returns an array of media data * @access public */ public function getLikedMedia( array $params = null ) { $response = $this->apiCall( 'get', $this->api_url . '/users/self/media/liked', $params ); return $response->getRawData(); } /** * Get a user's relationship to the current user * * @param string $user_id User to check relationship for * @return StdClass Returns the relationship * @access public */ public function getRelationshipToCurrentUser( $user_id ) { $response = $this->apiCall( 'get', $this->api_url . sprintf( '/users/%s/relationship', $user_id ) ); return $response->getData(); } /** * Modify a relationship with the current user * @param string $user_id User ID of the user to change the relationship for * @param string $relationship New relationship {@link http://instagram.com/developer/endpoints/relationships/#post_relationship} * @return StdClass Returns the status * @access public */ public function modifyRelationship( $user_id, $relationship ) { $response = $this->apiCall( 'post', $this->api_url . sprintf( '/users/%s/relationship', $user_id ), array( 'action' => $relationship ) ); return $response->getData(); } /** * Add a like form the current user on a media * * @param string $media_id Media ID to like * @return StdClass Returns the status * @access public */ public function like( $media_id ) { $this->apiCall( 'post', $this->api_url . sprintf( '/media/%s/likes', $media_id ) ); } /** * Delete a like form the current user on a media * * @param string $media_id Media ID to unlike * @return StdClass Returns the status * @access public */ public function unLike( $media_id ) { $this->apiCall( 'delete', $this->api_url . sprintf( '/media/%s/likes', $media_id ) ); } /** * Add a comment to a media * * @param string $media_id Media ID * @param string $text Comment text * @return StdClass Returns the status * @access public */ public function addMediaComment( $media_id, $text ) { $this->apiCall( 'post', $this->api_url . sprintf( '/media/%s/comments', $media_id ), array( 'text' => $text ) ); } /** * Delete a comment from a media * * @param string $media_id Media ID * @param string $comment_id Comment ID to delete * @return StdClass * @access public */ public function deleteMediaComment( $media_id, $comment_id ) { $this->apiCall( 'delete', $this->api_url . sprintf( '/media/%s/comments/%s', $media_id, $comment_id ) ); } /** * Make a call to the API * * @param string $method HTTP method to use * @param string $url URL * @param array $params API parameters * @param boolean $throw_exception True to throw exceptoins * @throws APIException, APIAuthException * @return \Instagram\Net\ApiResponse Returns teh API response * @access private */ private function apiCall( $method, $url, array $params = null, $throw_exception = true ){ $raw_response = $this->client->$method( $url, array( 'access_token' => $this->access_token, 'client_id' => isset( $params['client_id'] ) ? $params['client_id'] : $this->client_id ) + (array) $params ); $response = new \Instagram\Net\ApiResponse( $raw_response ); if ( !$response->isValid() ) { if ( $throw_exception ) { if ( $response->getErrorType() == 'OAuthAccessTokenException' ) { throw new \Instagram\Core\ApiAuthException( $response->getErrorMessage(), $response->getErrorCode(), $response->getErrorType() ); } else { throw new \Instagram\Core\ApiException( $response->getErrorMessage(), $response->getErrorCode(), $response->getErrorType() ); } } else { return false; } } return $response; } }