Interact with the Patreon API via OAuth.
Get the egg from PyPI, typically via pip
:
pip install patreon
or
echo "patreon" >> requirements.txt
pip install -r requirements.txt
Make sure that, however you install patreon
,
you install its dependencies as well
Visit the OAuth Documentation Page while logged in as a Patreon creator to register your client.
This will provide you with a client_id
and a client_secret
.
e.g., in a Flask route
import patreon
from flask import request
...
client_id = None # Replace with your data
client_secret = None # Replace with your data
creator_id = None # Replace with your data
@app.route('/oauth/redirect')
def oauth_redirect():
oauth_client = patreon.OAuth(client_id, client_secret)
tokens = oauth_client.get_tokens(request.args.get('code'), '/oauth/redirect')
access_token = tokens['access_token']
api_client = patreon.API(access_token)
user_response = api_client.get_identity()
user = user_response.data()
memberships = user.relationship('memberships')
membership = memberships[0] if memberships and len(memberships) > 0 else None
# pass user and membership to your view to render as needed
You'll notice that the user_response
does not return raw JSON data.
Instead, it returns a JSON:API resource object,
to simplify traversing the normalized graph data that the Patreon API returns.
Some available methods are:
response.data()
to get the main resourceresponse.data().attribute('full_name')
to get thefull_name
attribute from the response dataresponse.data().relationship('campaign').attribute('pledge_sum')
to get thepledge_sum
attribute from thecampaign
resource related to the main response dataresponse.find_resource_by_type_and_id('user', '123')
to find an arbitrary resource
patreon.API
instances have methods for interacting with the API based on the routes described in the docs.
All methods include includes
and fields
parameters.
ie:
get_identity(includes=None, fields=None)
List methods take page_size
and cursor
methods as well, ie:
get_campaigns(page_size, cursor=None, includes=None, fields=None)
The includes
and fields
arguments to these methods specify
the related resources
and the resource attributes
you want returned by our API, as per the JSON:API specification.
The lists of valid includes
and fields
arguments are provided on patreon.schemas
.
For instance, if you wanted to request the total amount a patron has ever paid to your campaign,
which is not included by default, you could do:
api_client = patreon.API(patron_access_token)
patron_response = api_client.get_identity(None, {
'membership': patreon.schemas.member.Attributes.currently_entitled_amount_cents
})
patreon.API
also has a utility method extract_cursor
which you can use to extract pagination links
from our json:api response documents:
api_client = patreon.API(creator_access_token)
campaign_id = api_client.get_campaigns().data()[0].id()
memberships = []
cursor = None
while True:
members_response = api_client.get_campaigns_by_id_members(campaign_id, 10, cursor=cursor)
members += members_response.data()
cursor = api_client.extract_cursor(members_response)
if not cursor:
break
names_and_membershipss = [{
'full_name': member.relationship('user').attribute('full_name'),
'amount_cents': member.attribute('amount_cents'),
} for member in members]
- Clone this repo
- Install dependencies
- If you're on Python 3:
python -m venv venv && source venv/bin/activate && python setup.py develop
- If you're on Python 2:
virtualenv venv && source venv/bin/activate && pip install -e . && pip install -r dev-requirements.txt
- If you're on Python 3:
git checkout -b my-branch-name
- make your edits, writing tests for any new functionality
- make sure tests pass with
python setup.py test
git push
- Open a pull request, explaining your changes (both problem and solution) clearly