oauth_verifier required, remove simplejson dependency, update endpoint

* Update `updateProfileBannerImage` to use the v1.1 endpoint

* Added `getProfileBannerSizes` method using the GET
/users/profile_banner.json endpoint

* Fixed a couple of endpoints using variable in the url:
  * destroyDirectMessage, createBlock, destroyBlock no longer use id in
their urls, this shouldn't break anything though.
(t.destroyDirectMessage(id=123) should still work)

* `oauth_verifier` is now **required** when calling
`get_authorized_tokens`

* Updated docs - removed getProfileImageUrl docs since it is
deprecated. Noted since `Twython` 2.7.0 that users should focus on
migrating to v1.1 endpoints since Twitter is deprecating v1 endpoints
in May!,
This commit is contained in:
Mike Helmick 2013-04-08 11:49:12 -04:00
parent 4d7526efc1
commit abaa3e558a
5 changed files with 27 additions and 46 deletions

View file

@ -11,7 +11,7 @@ Features
- Twitter lists - Twitter lists
- Timelines - Timelines
- User avatar URL - User avatar URL
- and anything found in [the docs](https://dev.twitter.com/docs/api) - and anything found in [the docs](https://dev.twitter.com/docs/api/1.1)
* Image Uploading! * Image Uploading!
- **Update user status with an image** - **Update user status with an image**
- Change user avatar - Change user avatar
@ -57,7 +57,7 @@ from twython import Twython
''' '''
oauth_token and oauth_token_secret come from the previous step oauth_token and oauth_token_secret come from the previous step
if needed, store those in a session variable or something if needed, store those in a session variable or something. oauth_verifier from the previous call is now required to pass to get_authorized_tokens
''' '''
t = Twython(app_key=app_key, t = Twython(app_key=app_key,
@ -65,7 +65,7 @@ t = Twython(app_key=app_key,
oauth_token=oauth_token, oauth_token=oauth_token,
oauth_token_secret=oauth_token_secret) oauth_token_secret=oauth_token_secret)
auth_tokens = t.get_authorized_tokens() auth_tokens = t.get_authorized_tokens(oauth_verifier)
print auth_tokens print auth_tokens
``` ```
@ -90,16 +90,6 @@ t = Twython(app_key=app_key,
print t.getHomeTimeline() print t.getHomeTimeline()
``` ```
###### Get a user avatar url *(no authentication needed)*
```python
from twython import Twython
t = Twython()
print t.getProfileImageUrl('ryanmcgrath', size='bigger')
print t.getProfileImageUrl('mikehelmick')
```
###### Streaming API ###### Streaming API
*Usage is as follows; it's designed to be open-ended enough that you can adapt it to higher-level (read: Twitter must give you access) *Usage is as follows; it's designed to be open-ended enough that you can adapt it to higher-level (read: Twitter must give you access)
streams.* streams.*
@ -122,6 +112,8 @@ Twython.stream({
Notes Notes
----- -----
Twython (as of 2.7.0) is currently in the process of ONLY supporting Twitter v1.1 endpoints and deprecating all v1 endpoints! Please see the **[Twitter v1.1 API Documentation](https://dev.twitter.com/docs/api/1.1)** to help migrate your API calls!
As of Twython 2.0.0, we have changed routes for functions to abide by the **[Twitter Spring 2012 clean up](https://dev.twitter.com/docs/deprecations/spring-2012)** Please make changes to your code accordingly. As of Twython 2.0.0, we have changed routes for functions to abide by the **[Twitter Spring 2012 clean up](https://dev.twitter.com/docs/deprecations/spring-2012)** Please make changes to your code accordingly.
Development of Twython (specifically, 1.3) Development of Twython (specifically, 1.3)

View file

@ -10,7 +10,7 @@ Features
- Twitter lists - Twitter lists
- Timelines - Timelines
- User avatar URL - User avatar URL
- and anything found in `the docs <https://dev.twitter.com/docs/api>`_ - and anything found in `the docs <https://dev.twitter.com/docs/api/1.1>`_
* Image Uploading! * Image Uploading!
- **Update user status with an image** - **Update user status with an image**
- Change user avatar - Change user avatar
@ -58,7 +58,7 @@ Handling the callback
''' '''
oauth_token and oauth_token_secret come from the previous step oauth_token and oauth_token_secret come from the previous step
if needed, store those in a session variable or something if needed, store those in a session variable or something. oauth_verifier from the previous call is now required to pass to get_authorized_tokens
''' '''
from twython import Twython from twython import Twython
@ -67,7 +67,7 @@ Handling the callback
oauth_token=oauth_token, oauth_token=oauth_token,
oauth_token_secret=oauth_token_secret) oauth_token_secret=oauth_token_secret)
auth_tokens = t.get_authorized_tokens() auth_tokens = t.get_authorized_tokens(oauth_verifier)
print auth_tokens print auth_tokens
*Function definitions (i.e. getHomeTimeline()) can be found by reading over twython/twitter_endpoints.py* *Function definitions (i.e. getHomeTimeline()) can be found by reading over twython/twitter_endpoints.py*
@ -90,15 +90,6 @@ Getting a user home timeline
# Returns an dict of the user home timeline # Returns an dict of the user home timeline
print t.getHomeTimeline() print t.getHomeTimeline()
Get a user avatar url *(no authentication needed)*
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
from twython import Twython
t = Twython()
print t.getProfileImageUrl('ryanmcgrath', size='bigger')
print t.getProfileImageUrl('mikehelmick')
Streaming API Streaming API
~~~~~~~~~~~~~ ~~~~~~~~~~~~~
@ -124,6 +115,8 @@ streams.*
Notes Notes
----- -----
* Twython (as of 2.7.0) is currently in the process of ONLY supporting Twitter v1.1 endpoints and deprecating all v1 endpoints! Please see the `Twitter API Documentation <https://dev.twitter.com/docs/api/1.1>`_ to help migrate your API calls!
* As of Twython 2.0.0, we have changed routes for functions to abide by the `Twitter Spring 2012 clean up <https://dev.twitter.com/docs/deprecations/spring-2012>`_ Please make changes to your code accordingly. * As of Twython 2.0.0, we have changed routes for functions to abide by the `Twitter Spring 2012 clean up <https://dev.twitter.com/docs/deprecations/spring-2012>`_ Please make changes to your code accordingly.

View file

@ -14,7 +14,7 @@ setup(
include_package_data=True, include_package_data=True,
# Package dependencies. # Package dependencies.
install_requires=['simplejson', 'requests>=1.0.0, <2.0.0', 'requests_oauthlib==0.3.0'], install_requires=['requests>=1.0.0, <2.0.0', 'requests_oauthlib==0.3.0'],
# Metadata for PyPI. # Metadata for PyPI.
author='Ryan McGrath', author='Ryan McGrath',

View file

@ -9,7 +9,7 @@
will be replaced with the keyword that gets passed in to the function at call time. will be replaced with the keyword that gets passed in to the function at call time.
i.e, in this case, if I pass version = 47 to any function, {{version}} will be replaced i.e, in this case, if I pass version = 47 to any function, {{version}} will be replaced
with 47, instead of defaulting to 1 (said defaulting takes place at conversion time). with 47, instead of defaulting to 1.1 (said defaulting takes place at conversion time).
This map is organized the order functions are documented at: This map is organized the order functions are documented at:
https://dev.twitter.com/docs/api/1.1 https://dev.twitter.com/docs/api/1.1
@ -87,7 +87,7 @@ api_table = {
'method': 'GET', 'method': 'GET',
}, },
'destroyDirectMessage': { 'destroyDirectMessage': {
'url': '/direct_messages/destroy/{{id}}.json', 'url': '/direct_messages/destroy.json',
'method': 'POST', 'method': 'POST',
}, },
'sendDirectMessage': { 'sendDirectMessage': {
@ -183,11 +183,11 @@ api_table = {
'method': 'GET', 'method': 'GET',
}, },
'createBlock': { 'createBlock': {
'url': '/blocks/create/{{id}}.json', 'url': '/blocks/create.json',
'method': 'POST', 'method': 'POST',
}, },
'destroyBlock': { 'destroyBlock': {
'url': '/blocks/destroy/{{id}}.json', 'url': '/blocks/destroy.json',
'method': 'POST', 'method': 'POST',
}, },
'lookupUser': { 'lookupUser': {
@ -215,6 +215,10 @@ api_table = {
'method': 'POST', 'method': 'POST',
}, },
# See twython.py for update_profile_banner # See twython.py for update_profile_banner
'getProfileBannerSizes': {
'url': '/users/profile_banner.json',
'method': 'GET',
},
# Suggested Users # Suggested Users

View file

@ -26,17 +26,9 @@ except ImportError:
from twitter_endpoints import base_url, api_table, twitter_http_status_codes from twitter_endpoints import base_url, api_table, twitter_http_status_codes
try: try:
import simplejson import simplejson as json
except ImportError: except ImportError:
try: import json
# Python 2.6 and up
import json as simplejson
except ImportError:
try:
from django.utils import simplejson
except:
# Seriously wtf is wrong with you if you get this Exception.
raise Exception("Twython requires the simplejson library (or Python 2.6) to work. http://www.undefined.org/python/")
class TwythonError(Exception): class TwythonError(Exception):
@ -194,7 +186,7 @@ class Twython(object):
# why? twitter will return invalid json with an error code in the headers # why? twitter will return invalid json with an error code in the headers
json_error = False json_error = False
try: try:
content = simplejson.loads(content) content = content.json()
except ValueError: except ValueError:
json_error = True json_error = True
content = {} content = {}
@ -437,13 +429,13 @@ class Twython(object):
**params - You may pass items that are taken in this doc **params - You may pass items that are taken in this doc
(https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media) (https://dev.twitter.com/docs/api/1.1/post/statuses/update_with_media)
""" """
subdomain = 'upload' if version == '1' else 'api'
url = 'https://%s.twitter.com/%s/statuses/update_with_media.json' % (subdomain, version) url = 'https://api.twitter.com/%s/statuses/update_with_media.json' % version
return self._media_update(url, return self._media_update(url,
{'media': (file_, open(file_, 'rb'))}, {'media': (file_, open(file_, 'rb'))},
**params) **params)
def updateProfileBannerImage(self, file_, version=1, **params): def updateProfileBannerImage(self, file_, version='1.1', **params):
"""Updates the users profile banner """Updates the users profile banner
:param file_: (required) A string to the location of the file :param file_: (required) A string to the location of the file
@ -453,7 +445,7 @@ class Twython(object):
**params - You may pass items that are taken in this doc **params - You may pass items that are taken in this doc
(https://dev.twitter.com/docs/api/1/post/account/update_profile_banner) (https://dev.twitter.com/docs/api/1/post/account/update_profile_banner)
""" """
url = 'https://api.twitter.com/%d/account/update_profile_banner.json' % version url = 'https://api.twitter.com/%s/account/update_profile_banner.json' % version
return self._media_update(url, return self._media_update(url,
{'banner': (file_, open(file_, 'rb'))}, {'banner': (file_, open(file_, 'rb'))},
**params) **params)
@ -518,7 +510,7 @@ class Twython(object):
for line in stream.iter_lines(): for line in stream.iter_lines():
if line: if line:
try: try:
callback(simplejson.loads(line)) callback(json.loads(line))
except ValueError: except ValueError:
raise TwythonError('Response was not valid JSON, unable to decode.') raise TwythonError('Response was not valid JSON, unable to decode.')