This code wraps the user endpoint and media endpoint of Instagram API. Any best practices/ styles or glaring bugs you can see? I wrote some unit tests for each class but did not include for readability
Base class:
import unirest
from oauth2 import OAuth2API
class Client(OAuth2API):
host = "http://api.instagram.com"
base_path = "/v1"
header_default = {"Accept": "application/json"}
ACCESS_TOKEN_ONLY = ["access_token"]
def __init__(self, **kwargs):
super(Client, self).__init__(**kwargs)
def build_path(self, endpoint):
return self.host + self.base_path + endpoint
def build_params(self, params):
return params
def build_oauth_params(self, params):
if params == self.ACCESS_TOKEN_ONLY:
return {"access_token": self.access_token}
else:
raise NotImplementedError("ouath params {} not implemented".format(params))
def parse_request(self, endpoint, accepted_oauth_params, accepted_params):
path = self.build_path(endpoint)
params = self.build_params(accepted_params)
params.update(self.build_oauth_params(accepted_oauth_params))
return path, params
def get_request(self, endpoint, accepted_oauth_params, accepted_params):
path, params = self.parse_request(endpoint, accepted_oauth_params, accepted_params)
return unirest.get(path, headers=self.header_default, params=params)
User endpoint class:
from client import Client
class User(Client):
endpoint_base = "/users"
def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
def self(self):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
endpoint = self.endpoint_base + "/self"
response = self.get_request(endpoint, oauth_params, params)
return response
def self_recent_media(self, count=None, min_id=None, max_id=None):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
if count:
params.update({"count": count})
if min_id:
params.update({"mind_id": min_id})
if max_id:
params.update({"max_id": max_id})
endpoint = self.endpoint_base + "/self/media/recent"
response = self.get_request(endpoint, oauth_params, params)
return response
def user_id(self, user_id):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
endpoint = self.endpoint_base + "/" + str(user_id)
response = self.get_request(endpoint, oauth_params, params)
return response
def user_recent_media(self, user_id, count=None, min_id=None, max_id=None):
pass
def self_liked(self, count=None, max_like_id=None):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
if count:
params.update({"count": count})
if max_like_id:
params.update({"max_like_id": max_like_id})
endpoint = self.endpoint_base + "/self/media/liked"
response = self.get_request(endpoint, oauth_params, params)
return response
def search(self, query, count=None):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {"q": query}
if count:
params.update({"count": count})
endpoint = self.endpoint_base + "/search"
response = self.get_request(endpoint, oauth_params, params)
return response
Media endpoint class
from client import Client
class Media(Client):
endpoint_base = "/media"
def __init__(self, **kwargs):
super(Media, self).__init__(**kwargs)
def media_id(self, media_id):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
endpoint = self.endpoint_base + "/" + str(media_id)
response = self.get_request(endpoint, oauth_params, params)
return response
def media_shortcode(self, shortcode):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
endpoint = self.endpoint_base + "/shortcode/" + str(shortcode)
response = self.get_request(endpoint, oauth_params, params)
return response
def media_search(self, latitude=None, longitude=None, distance=1000):
oauth_params = self.ACCESS_TOKEN_ONLY
params = {}
if latitude and longitude:
params.update({"lat": latitude, "lng": longitude})
if distance != 1000:
params.update({"distance": distance})
endpoint = self.endpoint_base + "/search"
response = self.get_request(endpoint, oauth_params, params)
return response