From 76ed132162b31b887101ad3d381c6efe355bb4d8 Mon Sep 17 00:00:00 2001 From: rohitkhatri Date: Sun, 17 Feb 2019 11:56:35 +0530 Subject: [PATCH] Initial commit version 1.0.0 --- .gitignore | 6 ++ MANIFEST.in | 1 + PKG-INFO | 48 ++++++++++++++++ README.md | 31 +++++++++- google/__init__.py | 7 +++ google/api.py | 132 +++++++++++++++++++++++++++++++++++++++++++ google/exceptions.py | 13 +++++ requirements.txt | 1 + setup.cfg | 7 +++ setup.py | 31 ++++++++++ 10 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 MANIFEST.in create mode 100644 PKG-INFO create mode 100644 google/__init__.py create mode 100644 google/api.py create mode 100644 google/exceptions.py create mode 100644 requirements.txt create mode 100644 setup.cfg create mode 100644 setup.py diff --git a/.gitignore b/.gitignore index 510c73d..76982bd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ +.idea +.vscode +.DS_Store + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] @@ -112,3 +116,5 @@ dmypy.json # Pyre type checker .pyre/ + +/test.py \ No newline at end of file diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..540b720 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1 @@ +include requirements.txt \ No newline at end of file diff --git a/PKG-INFO b/PKG-INFO new file mode 100644 index 0000000..e2ece72 --- /dev/null +++ b/PKG-INFO @@ -0,0 +1,48 @@ +Metadata-Version: 1.1 +Name: google-python-sdk +Version: 1.0.0 +Summary: Python Google API +Home-page: https://github.com/rohitkhatri/google-python-sdk +Author: Rohit Khatri +Author-email: developer.rohitkhatri@gmail.com +License: GPL +Description: # google-python-sdk + =================== + #### Python - Google API + + **google-python-sdk** is a simple client for google api. + + ## Installation + ``` + sudo pip install google-python-sdk + ``` + + ## Using + ```python + from google import API + api = API('CLIENT_ID', 'CLIENT_SECRET', 'API_KEY', 'ACCESS_TOKEN') + ``` + + ## References https://www.googleapis.com/oauth2/v3/userinfo + ```python + profile = api.get_profile() + ``` + + ## References https://oauth2.googleapis.com/tokeninfo + ```python + tokeninfo = api.get_token_info() + ``` + + + ## Contributing + [https://github.com/rohitkhatri/google-python-sdk](https://github.com/rohitkhatri/google-python-sdk) + + +Keywords: google data api python +Platform: UNKNOWN +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3.5 +Classifier: Operating System :: OS Independent +Classifier: Topic :: Software Development :: Libraries :: Python Modules diff --git a/README.md b/README.md index d9e211f..9d4fe68 100644 --- a/README.md +++ b/README.md @@ -1 +1,30 @@ -# google-python-sdk +google-python-sdk +=================== +#### Python - Google API + +**google-python-sdk** is a simple client for google api. + +## Installation +``` +sudo pip install google-python-sdk +``` + +## Using +```python +from google import API +api = API('CLIENT_ID', 'CLIENT_SECRET', 'API_KEY', 'ACCESS_TOKEN') +``` + +## References https://www.googleapis.com/oauth2/v3/userinfo +```python +profile = api.get_profile() +``` + +## References https://oauth2.googleapis.com/tokeninfo +```python +tokeninfo = api.get_token_info() +``` + + +## Contributing +[https://github.com/rohitkhatri/google-python-sdk](https://github.com/rohitkhatri/google-python-sdk) \ No newline at end of file diff --git a/google/__init__.py b/google/__init__.py new file mode 100644 index 0000000..3ceb9cd --- /dev/null +++ b/google/__init__.py @@ -0,0 +1,7 @@ +__version__ = '1.0.0' +__author__ = 'Rohit Khatri' +__license__ = 'MIT' + + +from google.exceptions import * +from google.api import API diff --git a/google/api.py b/google/api.py new file mode 100644 index 0000000..59fb570 --- /dev/null +++ b/google/api.py @@ -0,0 +1,132 @@ +import requests +from urllib.parse import urlencode +from google.exceptions import GoogleException + + +class API: + _client_id = None + _client_secret = None + _api_key = None + _access_token = None + _api_base_url = 'https://www.googleapis.com/google/v3' + _auth_url = 'https://accounts.google.com/o/oauth2/auth' + _profile_url = 'https://www.googleapis.com/oauth2/v3/userinfo' + _exchange_code_url = 'https://accounts.google.com/o/oauth2/token' + _scope = [ + 'https://www.googleapis.com/auth/userinfo.profile', + 'https://www.googleapis.com/auth/userinfo.email' + ] + _part = 'id,snippet' + + def __init__(self, client_id, client_secret, api_key, access_token=None, api_url=None): + self._client_id = client_id + self._client_secret = client_secret + self._api_key = api_key + self._access_token = access_token + + if api_url: + self.api_url = api_url + + def get(self, endpoint, **kwargs): + if self._access_token: + kwargs['access_token'] = self._access_token + else: + kwargs['api_key'] = self._api_key + + if 'part' not in kwargs: + kwargs['part'] = self._part + + return self.response(self._get('{}{}'.format(self._api_base_url, endpoint), params=kwargs)) + + def post(self, endpoint, **kwargs): + if self._access_token: + kwargs['access_token'] = self._access_token + else: + kwargs['api_key'] = self._api_key + + return self.response(self._post('{}{}'.format(self._api_base_url, endpoint), params=kwargs)) + + def get_auth_url(self, redirect_uri, **kwargs): + kwargs = {**{ + 'response_type': 'code', + 'redirect_uri': redirect_uri, + 'client_id': self._client_id, + 'access_type': 'offline', + 'approval_prompt': 'force' + }, **kwargs} + + if 'scope' not in kwargs: + kwargs['scope'] = self._scope + + kwargs['scope'] = ' '.join(kwargs['scope']) + + return '{}?{}'.format(self._auth_url, urlencode(kwargs)) + + def exchange_code(self, code, redirect_uri): + params = { + 'code': code, 'client_id': self._client_id, 'client_secret': self._client_secret, + 'redirect_uri': redirect_uri, 'grant_type': 'authorization_code' + } + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + response = self.response(self._post(self._exchange_code_url, params=params, headers=headers)) + + if response and 'access_token' in response: + self._access_token = response['access_token'] + + return response + + def refresh_token(self, refresh_token): + params = { + 'client_id': self._client_id, 'client_secret': self._client_secret, 'refresh_token': refresh_token, + 'grant_type': 'refresh_token' + } + headers = {'Content-Type': 'application/x-www-form-urlencoded'} + response = self.response(self._post(self._exchange_code_url, params=params, headers=headers)) + + if response and 'access_token' in response: + self._access_token = response['access_token'] + + return response + + def get_token_info(self): + return self.response(self._get('https://oauth2.googleapis.com/tokeninfo', { + 'access_token': self._access_token + })) + + def get_profile(self): + return self.response(self._get(self._profile_url, { + 'access_token': self._access_token + })) + + @staticmethod + def _get(url, params=None, **kwargs): + result = requests.get(url, params=params, **kwargs) + _response = result.json() + + if _response and 'error' in _response: + raise GoogleException(_response['error']['code'], _response['error']['message'], result) + + if result.status_code != 200: + raise GoogleException(result.status_code, result.reason, result) + + return result + + @staticmethod + def _post(url, params=None, **kwargs): + result = requests.post(url, data=params, **kwargs) + _response = result.json() + + if _response and 'error' in _response: + if isinstance(_response['error'], str): + raise GoogleException(result.status_code, _response['error'], result) + else: + raise GoogleException(_response['error']['code'], _response['error']['message'], result) + + if result.status_code != 200: + raise GoogleException(result.status_code, result.reason, result) + + return result + + @staticmethod + def response(response): + return response.json() diff --git a/google/exceptions.py b/google/exceptions.py new file mode 100644 index 0000000..fe7cadf --- /dev/null +++ b/google/exceptions.py @@ -0,0 +1,13 @@ +class GoogleException(Exception): + def __init__(self, code, message, response): + self.status_code = code + self.error_type = message + self.message = message + self.response = response + self.get_error_type() + + def get_error_type(self): + json_response = self.response.json() + + if 'error' in json_response and 'errors' in json_response['error']: + self.error_type = json_response['error']['errors'][0]['reason'] diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..c73d178 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +requests==2.12.1 \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..adf5ed7 --- /dev/null +++ b/setup.cfg @@ -0,0 +1,7 @@ +[bdist_wheel] +universal = 1 + +[egg_info] +tag_build = +tag_date = 0 + diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..dd815c6 --- /dev/null +++ b/setup.py @@ -0,0 +1,31 @@ +try: + from setuptools import setup +except ImportError: + from distutils.core import setup + +try: + long_description = open('README.md').read() +except IOError: + long_description = "" + +setup( + name='google-python-sdk', + version='1.0.0', + description='Python Google API', + long_description=long_description, + url='https://github.com/rohitkhatri/google-python-sdk', + author='Rohit Khatri', + author_email='developer.rohitkhatri@gmail.com', + license='GPL', + classifiers=[ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Operating System :: OS Independent", + 'Programming Language :: Python :: 3.5', + "Operating System :: OS Independent", + 'Topic :: Software Development :: Libraries :: Python Modules' + ], + keywords="google data api python", + packages=['google'], + install_requires=['requests'] +)