class provider(basicProvider): ''' This class is used to: 1. Make the connection to the Foursquare API 2. Get user's Photos 3. Get OPENi album Photos 4. Post Photos to OPENi album ''' def __init__(self, access_token): ''' Initiate the connector ''' self.connector = Foursquare(access_token=access_token, version='20140116') # region Media API # As described here: http://redmine.openi-ict.eu/projects/openi/wiki/Media_API # region Photo Object # As described here: http://redmine.openi-ict.eu/projects/openi/wiki/Photo_Mapping def get_user(self, data): return self.connector.users() def get_a_photo(self, data): ''' GET API_PATH/[PHOTO_ID] ''' # /media/media-id (ie media/628147512937366504_917877895) raw_data = self.connector.media(data['media_id']) response = { 'meta': { 'total_count': 1, 'next': None }, 'data': [self.format_photo_response( raw_data.id, self.check_if_exists(raw_data, 'type', 'image'), 'openi', raw_data.link, raw_data.user.id, raw_data.user.username, raw_data.user.website, raw_data.caption.text, raw_data.link, self.defJsonRes, self.check_if_exists(raw_data, 'location'), raw_data.created_time, self.defJsonRes, self.check_if_exists(raw_data, 'tags'), self.defJsonRes, self.defJsonRes )] } return response def get_all_photos_for_account(self, data): ''' GET API_PATH/[ACCOUNT_ID]/photos ''' # /users/user-id (ie users/917877895) raw_datas, next = self.connector.user_recent_media(data['account_id']) response = { 'meta': { 'total_count': len(raw_datas), 'next': next }, 'data' : [] } for raw_data in raw_datas: response['data'].append(self.format_photo_response( raw_data.id, self.check_if_exists(raw_data, 'type', 'image'), 'openi', raw_data.link, raw_data.user.id, raw_data.user.username, raw_data.user.website, raw_data.caption.text, raw_data.link, self.defJsonRes, self.check_if_exists(raw_data, 'location'), raw_data.created_time, self.defJsonRes, self.check_if_exists(raw_data, 'tags'), self.defJsonRes, self.defJsonRes )) return response # region Connections def get_photo_comments(self, data): ''' GET API_PATH/[PHOTO_ID]/comments ''' # /media/media-id/comments (ie media/628147512937366504_917877895/comments) raw_datas = self.connector.media_comments(data['media_id']) response = { 'meta': { 'total_count': len(raw_datas['data']) }, 'data' : [] } for raw_data in raw_datas['data']: response['data'].append(self.format_comment_response( raw_data['id'], 'Photo Comment', 'openi', defJsonRes, raw_data['from']['id'], raw_data['from']['username'], defJsonRes, raw_data['created_time'], defJsonRes, defJsonRes, raw_data['text'], defJsonRes )) return response def post_comment(self, data): ''' POST API_PATH/[PHOTO_ID]/comments ''' # /media/media-id/comments (ie media/628147512937366504_917877895/comments) # 'error_message': 'Please visit http://bit.ly/instacomments for commenting access' Please email apidevelopers[at]instagram.com for access. return defaultMethodResponse def delete_comment(self, data): ''' DELETE API_PATH/[COMMENT_ID] ''' # /media/media-id/comments/comment-id (ie media/628147512937366504_917877895/comments/628902539272471262) response = self.connector.delete_comment(data['media_id'], data['comment_id']) return response def like_a_photo(self, data): ''' POST API_PATH/[PHOTO_ID]/likes ''' # /media/media-id/likes (ie media/628147512937366504_917877895/likes) response = self.connector.like_media(data['media_id']) return response def get_photo_likes(self, data): ''' GET API_PATH/[PHOTO_ID]/likes ''' # /media/media-id/likes (ie media/628147512937366504_917877895/likes) raw_datas = self.connector.media_likes(data['media_id']) response = { 'meta': { 'total_count': len(raw_datas['data']) }, 'data' : [] } for raw_data in raw_datas['data']: response['data'].append(self.format_comment_response( defJsonRes,#id 'Photo Like',#obj_type 'openi',#service defJsonRes,#url raw_data['id'],#from:id raw_data['username'],#from:username defJsonRes,#from:url defJsonRes,#time:created_time defJsonRes,#time:edited_time defJsonRes#target_id )) return 'Not supported by this service' def unlike_photo(self, data): ''' DELETE API_PATH/[PHOTO_ID]/likes ''' # /media/media-id/likes (ie media/628147512937366504_917877895/likes) response = self.connector.unlike_media(data['media_id']) return response # endregion Connections # endregion Photo Object # endregion Media API # region Location API # As described here: http://redmine.openi-ict.eu/projects/openi/wiki/Location_API # region Event Object # As described here: http://redmine.openi-ict.eu/projects/openi/wiki/Event_Mapping def get_an_event(self, data): """ GET API_PATH/[EVENT_ID] """ response = self.connector.Events(data['event_id']) return defaultMethodResponse def get_all_events_for_account(self, data): """ GET API_PATH/[VENUE_ID]/events """ response = self.connector.venues.events(data['venue_id']) return defaultMethodResponse def post_event_to_account(self, data): """ POST API_PATH/[ACCOUNT_ID]/events """ return defaultMethodResponse def post_event_to_aggregation(self, data): """ POST API_PATH/[AGGREGATION_ID]/events """ return defaultMethodResponse def edit_an_event(self, data): """ PUT API_PATH/[EVENT_ID] """ return defaultMethodResponse def delete_an_event(self, data): """ DELETE API_PATH/[EVENT_ID] """ return defaultMethodResponse # region Connections def get_event_comments(self, data): """ GET API_PATH/[EVENT_ID]/comments """ return defaultMethodResponse def post_event_comment(self, data): """ POST API_PATH/[EVENT_ID]/comments """ return defaultMethodResponse def delete_event_comment(self, data): """ DELETE API_PATH/[COMMENT_ID] """ return defaultMethodResponse def edit_event_comment(self, data): """ PUT API_PATH/[COMMENT_ID] """ return defaultMethodResponse def like_an_event(self, data): """ POST API_PATH/[EVENT_ID]/likes """ return defaultMethodResponse def get_event_likes(self, data): """ GET API_PATH/[EVENT_ID]/likes """ return defaultMethodResponse def unlike_event(self, data): """ DELETE API_PATH/[EVENT_ID]/likes """ return defaultMethodResponse def dislike_event(self, data): """ POST API_PATH/[EVENT_ID]/dislikes """ return defaultMethodResponse def get_event_dislikes(self, data): """ GET API_PATH/[EVENT_ID]/dislikes """ return defaultMethodResponse def delete_event_dislikes(self, data): """ DELETE API_PATH/[EVENT_ID]/dislikes """ return defaultMethodResponse # endregion Connections # endregion Event Object # endregion Location API
from foursquare import Foursquare client = Foursquare(client_id='KEE332SEACBCB00LBQ5QBS5OQYPHYBGBO2LEK14RFUJOGHS0', client_secret='SJ4L5E5RDMHSPA0EZNH0RS5QTEK0DMDGV5XI2TGCCASBMTBO') # Build the authorization url for your app auth_uri = client.oauth.auth_url() rooftops = client.users()
class FoursquareAPI(object): def __init__(self, access_token=None): self.logger = get_logger(__name__) self.fsq = Foursquare( client_id=FOURSQUARE_CLIENT_ID, client_secret=FOURSQUARE_CLIENT_SECRET, redirect_uri=LOGIN_REDIRECT_URI ) if access_token is not None: self.set_token(access_token) self.cache = Cache() # TODO: разобраться, в чем дело # def auth(self, access_code): # access_token = self.fsq.oauth.get_token(access_code) # self.fsq.set_access_token(access_token) def auth(self, access_code): resp = requests.get( 'https://foursquare.com/oauth2/access_token', params={ 'client_id': FOURSQUARE_CLIENT_ID, 'client_secret': FOURSQUARE_CLIENT_SECRET, 'grant_type': 'authorization_code', 'redirect_uri': LOGIN_REDIRECT_URI, 'code': access_code, } ).json() self.logger.debug(resp) access_token = resp['access_token'] self.set_token(access_token) return access_token def set_token(self, access_token): self.fsq.set_access_token(access_token) return self @property def auth_url(self): return self.fsq.oauth.auth_url() def get_current_user(self): json_response = self.fsq.users() return User(json_user=json_response['user']) def search(self, search_term, categories, per_category_limit): bounds = Rect.rect_with_center_and_halfsize( MOSCOW_CENTER, MOSCOW_RADIUS ) self.logger.debug(u'API::search \'{}\' with bounds {}'.format( search_term, bounds )) return self.fsq.venues.search(params={ 'intent': SEARCH_INTENT, 'sw': bounds.sw, 'ne': bounds.ne, 'query': search_term.encode('UTF-8'), 'limit': per_category_limit, 'categoryId': categories, }) def get_categories_filter(self): KEY = '.'.join((__name__, self.__class__.__name__, 'categories_filter')) if self.cache.exists(KEY): return self.cache.get(KEY) self.logger.debug('API::Categories') categories = Category.list_from_json(self.fsq.venues.categories()) result = ','.join((x['id'] for x in categories)) self.cache.put(KEY, result, CATEGORIES_LIST_CACHE_TIMEOUT) return result