1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348 |
- # Tweepy
- # Copyright 2009-2010 Joshua Roesslein
- # See LICENSE for details.
- from __future__ import print_function
- import os
- import mimetypes
- import six
- from tweepy.binder import bind_api
- from tweepy.error import TweepError
- from tweepy.parsers import ModelParser, Parser
- from tweepy.utils import list_to_csv
- class API(object):
- """Twitter API"""
- def __init__(self, auth_handler=None,
- host='api.twitter.com', search_host='search.twitter.com',
- upload_host='upload.twitter.com', cache=None, api_root='/1.1',
- search_root='', upload_root='/1.1', retry_count=0,
- retry_delay=0, retry_errors=None, timeout=60, parser=None,
- compression=False, wait_on_rate_limit=False,
- wait_on_rate_limit_notify=False, proxy=''):
- """ Api instance Constructor
- :param auth_handler:
- :param host: url of the server of the rest api, default:'api.twitter.com'
- :param search_host: url of the search server, default:'search.twitter.com'
- :param upload_host: url of the upload server, default:'upload.twitter.com'
- :param cache: Cache to query if a GET method is used, default:None
- :param api_root: suffix of the api version, default:'/1.1'
- :param search_root: suffix of the search version, default:''
- :param upload_root: suffix of the upload version, default:'/1.1'
- :param retry_count: number of allowed retries, default:0
- :param retry_delay: delay in second between retries, default:0
- :param retry_errors: default:None
- :param timeout: delay before to consider the request as timed out in seconds, default:60
- :param parser: ModelParser instance to parse the responses, default:None
- :param compression: If the response is compressed, default:False
- :param wait_on_rate_limit: If the api wait when it hits the rate limit, default:False
- :param wait_on_rate_limit_notify: If the api print a notification when the rate limit is hit, default:False
- :param proxy: Url to use as proxy during the HTTP request, default:''
- :raise TypeError: If the given parser is not a ModelParser instance.
- """
- self.auth = auth_handler
- self.host = host
- self.search_host = search_host
- self.upload_host = upload_host
- self.api_root = api_root
- self.search_root = search_root
- self.upload_root = upload_root
- self.cache = cache
- self.compression = compression
- self.retry_count = retry_count
- self.retry_delay = retry_delay
- self.retry_errors = retry_errors
- self.timeout = timeout
- self.wait_on_rate_limit = wait_on_rate_limit
- self.wait_on_rate_limit_notify = wait_on_rate_limit_notify
- self.parser = parser or ModelParser()
- self.proxy = {}
- if proxy:
- self.proxy['https'] = proxy
- # Attempt to explain more clearly the parser argument requirements
- # https://github.com/tweepy/tweepy/issues/421
- #
- parser_type = Parser
- if not isinstance(self.parser, parser_type):
- raise TypeError(
- '"parser" argument has to be an instance of "{required}".'
- ' It is currently a {actual}.'.format(
- required=parser_type.__name__,
- actual=type(self.parser)
- )
- )
- @property
- def home_timeline(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/home_timeline
- :allowed_param:'since_id', 'max_id', 'count'
- """
- return bind_api(
- api=self,
- path='/statuses/home_timeline.json',
- payload_type='status', payload_list=True,
- allowed_param=['since_id', 'max_id', 'count'],
- require_auth=True
- )
- def statuses_lookup(self, id_, include_entities=None,
- trim_user=None, map_=None):
- return self._statuses_lookup(list_to_csv(id_), include_entities,
- trim_user, map_)
- @property
- def _statuses_lookup(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/lookup
- :allowed_param:'id', 'include_entities', 'trim_user', 'map'
- """
- return bind_api(
- api=self,
- path='/statuses/lookup.json',
- payload_type='status', payload_list=True,
- allowed_param=['id', 'include_entities', 'trim_user', 'map'],
- require_auth=True
- )
- @property
- def user_timeline(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/user_timeline
- :allowed_param:'id', 'user_id', 'screen_name', 'since_id'
- """
- return bind_api(
- api=self,
- path='/statuses/user_timeline.json',
- payload_type='status', payload_list=True,
- allowed_param=['id', 'user_id', 'screen_name', 'since_id',
- 'max_id', 'count', 'include_rts']
- )
- @property
- def mentions_timeline(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/mentions_timeline
- :allowed_param:'since_id', 'max_id', 'count'
- """
- return bind_api(
- api=self,
- path='/statuses/mentions_timeline.json',
- payload_type='status', payload_list=True,
- allowed_param=['since_id', 'max_id', 'count'],
- require_auth=True
- )
- @property
- def related_results(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/related_results/show/%3id.format
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/related_results/show/{id}.json',
- payload_type='relation', payload_list=True,
- allowed_param=['id'],
- require_auth=False
- )
- @property
- def retweets_of_me(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/retweets_of_me
- :allowed_param:'since_id', 'max_id', 'count'
- """
- return bind_api(
- api=self,
- path='/statuses/retweets_of_me.json',
- payload_type='status', payload_list=True,
- allowed_param=['since_id', 'max_id', 'count'],
- require_auth=True
- )
- @property
- def get_status(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/show/%3Aid
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/statuses/show.json',
- payload_type='status',
- allowed_param=['id']
- )
- def update_status(self, *args, **kwargs):
- """ :reference: https://dev.twitter.com/rest/reference/post/statuses/update
- :allowed_param:'status', 'in_reply_to_status_id', 'lat', 'long', 'source', 'place_id', 'display_coordinates', 'media_ids'
- """
- post_data = {}
- media_ids = kwargs.pop("media_ids", None)
- if media_ids is not None:
- post_data["media_ids"] = list_to_csv(media_ids)
- return bind_api(
- api=self,
- path='/statuses/update.json',
- method='POST',
- payload_type='status',
- allowed_param=['status', 'in_reply_to_status_id', 'lat', 'long', 'source', 'place_id', 'display_coordinates'],
- require_auth=True
- )(post_data=post_data, *args, **kwargs)
- def media_upload(self, filename, *args, **kwargs):
- """ :reference: https://dev.twitter.com/rest/reference/post/media/upload
- :allowed_param:
- """
- f = kwargs.pop('file', None)
- headers, post_data = API._pack_image(filename, 3072, form_field='media', f=f)
- kwargs.update({'headers': headers, 'post_data': post_data})
- return bind_api(
- api=self,
- path='/media/upload.json',
- method='POST',
- payload_type='media',
- allowed_param=[],
- require_auth=True,
- upload_api=True
- )(*args, **kwargs)
- def update_with_media(self, filename, *args, **kwargs):
- """ :reference: https://dev.twitter.com/rest/reference/post/statuses/update_with_media
- :allowed_param:'status', 'possibly_sensitive', 'in_reply_to_status_id', 'lat', 'long', 'place_id', 'display_coordinates'
- """
- f = kwargs.pop('file', None)
- headers, post_data = API._pack_image(filename, 3072, form_field='media[]', f=f)
- kwargs.update({'headers': headers, 'post_data': post_data})
- return bind_api(
- api=self,
- path='/statuses/update_with_media.json',
- method='POST',
- payload_type='status',
- allowed_param=[
- 'status', 'possibly_sensitive', 'in_reply_to_status_id', 'lat', 'long',
- 'place_id', 'display_coordinates'
- ],
- require_auth=True
- )(*args, **kwargs)
- @property
- def destroy_status(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/statuses/destroy/%3Aid
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/statuses/destroy/{id}.json',
- method='POST',
- payload_type='status',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def retweet(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/statuses/retweet/%3Aid
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/statuses/retweet/{id}.json',
- method='POST',
- payload_type='status',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def retweets(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/retweets/%3Aid
- :allowed_param:'id', 'count'
- """
- return bind_api(
- api=self,
- path='/statuses/retweets/{id}.json',
- payload_type='status', payload_list=True,
- allowed_param=['id', 'count'],
- require_auth=True
- )
- @property
- def retweeters(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/retweeters/ids
- :allowed_param:'id', 'cursor', 'stringify_ids
- """
- return bind_api(
- api=self,
- path='/statuses/retweeters/ids.json',
- payload_type='ids',
- allowed_param=['id', 'cursor', 'stringify_ids']
- )
- @property
- def get_user(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/users/show
- :allowed_param:'id', 'user_id', 'screen_name'
- """
- return bind_api(
- api=self,
- path='/users/show.json',
- payload_type='user',
- allowed_param=['id', 'user_id', 'screen_name']
- )
- @property
- def get_oembed(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/statuses/oembed
- :allowed_param:'id', 'url', 'maxwidth', 'hide_media', 'omit_script', 'align', 'related', 'lang'
- """
- return bind_api(
- api=self,
- path='/statuses/oembed.json',
- payload_type='json',
- allowed_param=['id', 'url', 'maxwidth', 'hide_media', 'omit_script', 'align', 'related', 'lang']
- )
- def lookup_users(self, user_ids=None, screen_names=None, include_entities=None):
- """ Perform bulk look up of users from user ID or screenname """
- post_data = {}
- if include_entities is not None:
- include_entities = 'true' if include_entities else 'false'
- post_data['include_entities'] = include_entities
- if user_ids:
- post_data['user_id'] = list_to_csv(user_ids)
- if screen_names:
- post_data['screen_name'] = list_to_csv(screen_names)
- return self._lookup_users(post_data=post_data)
- @property
- def _lookup_users(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/users/lookup
- allowed_param='user_id', 'screen_name', 'include_entities'
- """
- return bind_api(
- api=self,
- path='/users/lookup.json',
- payload_type='user', payload_list=True,
- method='POST',
- )
- def me(self):
- """ Get the authenticated user """
- return self.get_user(screen_name=self.auth.get_username())
- @property
- def search_users(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/users/search
- :allowed_param:'q', 'count', 'page'
- """
- return bind_api(
- api=self,
- path='/users/search.json',
- payload_type='user', payload_list=True,
- require_auth=True,
- allowed_param=['q', 'count', 'page']
- )
- @property
- def suggested_users(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/users/suggestions/%3Aslug
- :allowed_param:'slug', 'lang'
- """
- return bind_api(
- api=self,
- path='/users/suggestions/{slug}.json',
- payload_type='user', payload_list=True,
- require_auth=True,
- allowed_param=['slug', 'lang']
- )
- @property
- def suggested_categories(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/users/suggestions
- :allowed_param:'lang'
- """
- return bind_api(
- api=self,
- path='/users/suggestions.json',
- payload_type='category', payload_list=True,
- allowed_param=['lang'],
- require_auth=True
- )
- @property
- def suggested_users_tweets(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/users/suggestions/%3Aslug/members
- :allowed_param:'slug'
- """
- return bind_api(
- api=self,
- path='/users/suggestions/{slug}/members.json',
- payload_type='status', payload_list=True,
- allowed_param=['slug'],
- require_auth=True
- )
- @property
- def direct_messages(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/direct_messages
- :allowed_param:'since_id', 'max_id', 'count', 'full_text'
- """
- return bind_api(
- api=self,
- path='/direct_messages.json',
- payload_type='direct_message', payload_list=True,
- allowed_param=['since_id', 'max_id', 'count', 'full_text'],
- require_auth=True
- )
- @property
- def get_direct_message(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/direct_messages/show
- :allowed_param:'id', 'full_text'
- """
- return bind_api(
- api=self,
- path='/direct_messages/show/{id}.json',
- payload_type='direct_message',
- allowed_param=['id', 'full_text'],
- require_auth=True
- )
- @property
- def sent_direct_messages(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/direct_messages/sent
- :allowed_param:'since_id', 'max_id', 'count', 'page', 'full_text'
- """
- return bind_api(
- api=self,
- path='/direct_messages/sent.json',
- payload_type='direct_message', payload_list=True,
- allowed_param=['since_id', 'max_id', 'count', 'page', 'full_text'],
- require_auth=True
- )
- @property
- def send_direct_message(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/direct_messages/new
- :allowed_param:'user', 'screen_name', 'user_id', 'text'
- """
- return bind_api(
- api=self,
- path='/direct_messages/new.json',
- method='POST',
- payload_type='direct_message',
- allowed_param=['user', 'screen_name', 'user_id', 'text'],
- require_auth=True
- )
- @property
- def destroy_direct_message(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/direct_messages/destroy
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/direct_messages/destroy.json',
- method='POST',
- payload_type='direct_message',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def create_friendship(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/friendships/create
- :allowed_param:'id', 'user_id', 'screen_name', 'follow'
- """
- return bind_api(
- api=self,
- path='/friendships/create.json',
- method='POST',
- payload_type='user',
- allowed_param=['id', 'user_id', 'screen_name', 'follow'],
- require_auth=True
- )
- @property
- def destroy_friendship(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/friendships/destroy
- :allowed_param:'id', 'user_id', 'screen_name'
- """
- return bind_api(
- api=self,
- path='/friendships/destroy.json',
- method='POST',
- payload_type='user',
- allowed_param=['id', 'user_id', 'screen_name'],
- require_auth=True
- )
- @property
- def show_friendship(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/friendships/show
- :allowed_param:'source_id', 'source_screen_name'
- """
- return bind_api(
- api=self,
- path='/friendships/show.json',
- payload_type='friendship',
- allowed_param=['source_id', 'source_screen_name',
- 'target_id', 'target_screen_name']
- )
- def lookup_friendships(self, user_ids=None, screen_names=None):
- """ Perform bulk look up of friendships from user ID or screenname """
- return self._lookup_friendships(list_to_csv(user_ids), list_to_csv(screen_names))
- @property
- def _lookup_friendships(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/friendships/lookup
- :allowed_param:'user_id', 'screen_name'
- """
- return bind_api(
- api=self,
- path='/friendships/lookup.json',
- payload_type='relationship', payload_list=True,
- allowed_param=['user_id', 'screen_name'],
- require_auth=True
- )
- @property
- def friends_ids(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/friends/ids
- :allowed_param:'id', 'user_id', 'screen_name', 'cursor'
- """
- return bind_api(
- api=self,
- path='/friends/ids.json',
- payload_type='ids',
- allowed_param=['id', 'user_id', 'screen_name', 'cursor']
- )
- @property
- def friends(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/friends/list
- :allowed_param:'id', 'user_id', 'screen_name', 'cursor', 'skip_status', 'include_user_entities'
- """
- return bind_api(
- api=self,
- path='/friends/list.json',
- payload_type='user', payload_list=True,
- allowed_param=['id', 'user_id', 'screen_name', 'cursor', 'skip_status', 'include_user_entities']
- )
- @property
- def friendships_incoming(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/friendships/incoming
- :allowed_param:'cursor'
- """
- return bind_api(
- api=self,
- path='/friendships/incoming.json',
- payload_type='ids',
- allowed_param=['cursor']
- )
- @property
- def friendships_outgoing(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/friendships/outgoing
- :allowed_param:'cursor'
- """
- return bind_api(
- api=self,
- path='/friendships/outgoing.json',
- payload_type='ids',
- allowed_param=['cursor']
- )
- @property
- def followers_ids(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/followers/ids
- :allowed_param:'id', 'user_id', 'screen_name', 'cursor', 'count'
- """
- return bind_api(
- api=self,
- path='/followers/ids.json',
- payload_type='ids',
- allowed_param=['id', 'user_id', 'screen_name', 'cursor', 'count']
- )
- @property
- def followers(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/followers/list
- :allowed_param:'id', 'user_id', 'screen_name', 'cursor', 'count', 'skip_status', 'include_user_entities'
- """
- return bind_api(
- api=self,
- path='/followers/list.json',
- payload_type='user', payload_list=True,
- allowed_param=['id', 'user_id', 'screen_name', 'cursor', 'count',
- 'skip_status', 'include_user_entities']
- )
- @property
- def get_settings(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/account/settings
- """
- return bind_api(
- api=self,
- path='/account/settings.json',
- payload_type='json',
- use_cache=False
- )
- @property
- def set_settings(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/account/settings
- :allowed_param:'sleep_time_enabled', 'start_sleep_time',
- 'end_sleep_time', 'time_zone', 'trend_location_woeid',
- 'allow_contributor_request', 'lang'
- """
- return bind_api(
- api=self,
- path='/account/settings.json',
- method='POST',
- payload_type='json',
- allowed_param=['sleep_time_enabled', 'start_sleep_time',
- 'end_sleep_time', 'time_zone',
- 'trend_location_woeid', 'allow_contributor_request',
- 'lang'],
- use_cache=False
- )
- def verify_credentials(self, **kargs):
- """ :reference: https://dev.twitter.com/rest/reference/get/account/verify_credentials
- :allowed_param:'include_entities', 'skip_status', 'include_email'
- """
- try:
- return bind_api(
- api=self,
- path='/account/verify_credentials.json',
- payload_type='user',
- require_auth=True,
- allowed_param=['include_entities', 'skip_status', 'include_email'],
- )(**kargs)
- except TweepError as e:
- if e.response and e.response.status == 401:
- return False
- raise
- @property
- def rate_limit_status(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/application/rate_limit_status
- :allowed_param:'resources'
- """
- return bind_api(
- api=self,
- path='/application/rate_limit_status.json',
- payload_type='json',
- allowed_param=['resources'],
- use_cache=False
- )
- @property
- def set_delivery_device(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/account/update_delivery_device
- :allowed_param:'device'
- """
- return bind_api(
- api=self,
- path='/account/update_delivery_device.json',
- method='POST',
- allowed_param=['device'],
- payload_type='user',
- require_auth=True
- )
- @property
- def update_profile_colors(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/account/update_profile_colors
- :allowed_param:'profile_background_color', 'profile_text_color',
- 'profile_link_color', 'profile_sidebar_fill_color',
- 'profile_sidebar_border_color'],
- """
- return bind_api(
- api=self,
- path='/account/update_profile_colors.json',
- method='POST',
- payload_type='user',
- allowed_param=['profile_background_color', 'profile_text_color',
- 'profile_link_color', 'profile_sidebar_fill_color',
- 'profile_sidebar_border_color'],
- require_auth=True
- )
- def update_profile_image(self, filename, file_=None):
- """ :reference: https://dev.twitter.com/rest/reference/post/account/update_profile_image
- :allowed_param:'include_entities', 'skip_status'
- """
- headers, post_data = API._pack_image(filename, 700, f=file_)
- return bind_api(
- api=self,
- path='/account/update_profile_image.json',
- method='POST',
- payload_type='user',
- allowed_param=['include_entities', 'skip_status'],
- require_auth=True
- )(self, post_data=post_data, headers=headers)
- def update_profile_background_image(self, filename, **kargs):
- """ :reference: https://dev.twitter.com/rest/reference/post/account/update_profile_background_image
- :allowed_param:'tile', 'include_entities', 'skip_status', 'use'
- """
- f = kargs.pop('file', None)
- headers, post_data = API._pack_image(filename, 800, f=f)
- bind_api(
- api=self,
- path='/account/update_profile_background_image.json',
- method='POST',
- payload_type='user',
- allowed_param=['tile', 'include_entities', 'skip_status', 'use'],
- require_auth=True
- )(post_data=post_data, headers=headers)
- def update_profile_banner(self, filename, **kargs):
- """ :reference: https://dev.twitter.com/rest/reference/post/account/update_profile_banner
- :allowed_param:'width', 'height', 'offset_left', 'offset_right'
- """
- f = kargs.pop('file', None)
- headers, post_data = API._pack_image(filename, 700, form_field="banner", f=f)
- bind_api(
- api=self,
- path='/account/update_profile_banner.json',
- method='POST',
- allowed_param=['width', 'height', 'offset_left', 'offset_right'],
- require_auth=True
- )(post_data=post_data, headers=headers)
- @property
- def update_profile(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/account/update_profile
- :allowed_param:'name', 'url', 'location', 'description'
- """
- return bind_api(
- api=self,
- path='/account/update_profile.json',
- method='POST',
- payload_type='user',
- allowed_param=['name', 'url', 'location', 'description'],
- require_auth=True
- )
- @property
- def favorites(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/favorites/list
- :allowed_param:'screen_name', 'user_id', 'max_id', 'count', 'since_id', 'max_id'
- """
- return bind_api(
- api=self,
- path='/favorites/list.json',
- payload_type='status', payload_list=True,
- allowed_param=['screen_name', 'user_id', 'max_id', 'count', 'since_id', 'max_id']
- )
- @property
- def create_favorite(self):
- """ :reference:https://dev.twitter.com/rest/reference/post/favorites/create
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/favorites/create.json',
- method='POST',
- payload_type='status',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def destroy_favorite(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/favorites/destroy
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/favorites/destroy.json',
- method='POST',
- payload_type='status',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def create_block(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/blocks/create
- :allowed_param:'id', 'user_id', 'screen_name'
- """
- return bind_api(
- api=self,
- path='/blocks/create.json',
- method='POST',
- payload_type='user',
- allowed_param=['id', 'user_id', 'screen_name'],
- require_auth=True
- )
- @property
- def destroy_block(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/blocks/destroy
- :allowed_param:'id', 'user_id', 'screen_name'
- """
- return bind_api(
- api=self,
- path='/blocks/destroy.json',
- method='POST',
- payload_type='user',
- allowed_param=['id', 'user_id', 'screen_name'],
- require_auth=True
- )
- @property
- def blocks(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/blocks/list
- :allowed_param:'cursor'
- """
- return bind_api(
- api=self,
- path='/blocks/list.json',
- payload_type='user', payload_list=True,
- allowed_param=['cursor'],
- require_auth=True
- )
- @property
- def blocks_ids(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/blocks/ids """
- return bind_api(
- api=self,
- path='/blocks/ids.json',
- payload_type='json',
- require_auth=True
- )
- @property
- def report_spam(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/users/report_spam
- :allowed_param:'user_id', 'screen_name'
- """
- return bind_api(
- api=self,
- path='/users/report_spam.json',
- method='POST',
- payload_type='user',
- allowed_param=['user_id', 'screen_name'],
- require_auth=True
- )
- @property
- def saved_searches(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/saved_searches/show/%3Aid """
- return bind_api(
- api=self,
- path='/saved_searches/list.json',
- payload_type='saved_search', payload_list=True,
- require_auth=True
- )
- @property
- def get_saved_search(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/saved_searches/show/%3Aid
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/saved_searches/show/{id}.json',
- payload_type='saved_search',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def create_saved_search(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/saved_searches/create
- :allowed_param:'query'
- """
- return bind_api(
- api=self,
- path='/saved_searches/create.json',
- method='POST',
- payload_type='saved_search',
- allowed_param=['query'],
- require_auth=True
- )
- @property
- def destroy_saved_search(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/saved_searches/destroy/%3Aid
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/saved_searches/destroy/{id}.json',
- method='POST',
- payload_type='saved_search',
- allowed_param=['id'],
- require_auth=True
- )
- @property
- def create_list(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/lists/create
- :allowed_param:'name', 'mode', 'description'
- """
- return bind_api(
- api=self,
- path='/lists/create.json',
- method='POST',
- payload_type='list',
- allowed_param=['name', 'mode', 'description'],
- require_auth=True
- )
- @property
- def destroy_list(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/lists/destroy
- :allowed_param:'owner_screen_name', 'owner_id', 'list_id', 'slug'
- """
- return bind_api(
- api=self,
- path='/lists/destroy.json',
- method='POST',
- payload_type='list',
- allowed_param=['owner_screen_name', 'owner_id', 'list_id', 'slug'],
- require_auth=True
- )
- @property
- def update_list(self):
- """ :reference: https://dev.twitter.com/rest/reference/post/lists/update
- :allowed_param: list_id', 'slug', 'name', 'mode', 'description', 'owner_screen_name', 'owner_id'
- """
- return bind_api(
- api=self,
- path='/lists/update.json',
- method='POST',
- payload_type='list',
- allowed_param=['list_id', 'slug', 'name', 'mode', 'description', 'owner_screen_name', 'owner_id'],
- require_auth=True
- )
- @property
- def lists_all(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/lists/list
- :allowed_param:'screen_name', 'user_id'
- """
- return bind_api(
- api=self,
- path='/lists/list.json',
- payload_type='list', payload_list=True,
- allowed_param=['screen_name', 'user_id'],
- require_auth=True
- )
- @property
- def lists_memberships(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/lists/memberships
- :allowed_param:'screen_name', 'user_id', 'filter_to_owned_lists', 'cursor'
- """
- return bind_api(
- api=self,
- path='/lists/memberships.json',
- payload_type='list', payload_list=True,
- allowed_param=['screen_name', 'user_id', 'filter_to_owned_lists', 'cursor'],
- require_auth=True
- )
- @property
- def lists_subscriptions(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/lists/subscriptions
- :allowed_param:'screen_name', 'user_id', 'cursor'
- """
- return bind_api(
- api=self,
- path='/lists/subscriptions.json',
- payload_type='list', payload_list=True,
- allowed_param=['screen_name', 'user_id', 'cursor'],
- require_auth=True
- )
- @property
- def list_timeline(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/lists/statuses
- :allowed_param:'owner_screen_name', 'slug', 'owner_id', 'list_id',
- 'since_id', 'max_id', 'count', 'include_rts
- """
- return bind_api(
- api=self,
- path='/lists/statuses.json',
- payload_type='status', payload_list=True,
- allowed_param=['owner_screen_name', 'slug', 'owner_id',
- 'list_id', 'since_id', 'max_id', 'count',
- 'include_rts']
- )
- @property
- def get_list(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/lists/show
- :allowed_param:'owner_screen_name', 'owner_id', 'slug', 'list_id'
- """
- return bind_api(
- api=self,
- path='/lists/show.json',
- payload_type='list',
- allowed_param=['owner_screen_name', 'owner_id', 'slug', 'list_id']
- )
- @property
- def add_list_member(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/lists/members/create
- :allowed_param:'screen_name', 'user_id', 'owner_screen_name',
- 'owner_id', 'slug', 'list_id'
- """
- return bind_api(
- api=self,
- path='/lists/members/create.json',
- method='POST',
- payload_type='list',
- allowed_param=['screen_name', 'user_id', 'owner_screen_name',
- 'owner_id', 'slug', 'list_id'],
- require_auth=True
- )
- @property
- def remove_list_member(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/lists/members/destroy
- :allowed_param:'screen_name', 'user_id', 'owner_screen_name',
- 'owner_id', 'slug', 'list_id'
- """
- return bind_api(
- api=self,
- path='/lists/members/destroy.json',
- method='POST',
- payload_type='list',
- allowed_param=['screen_name', 'user_id', 'owner_screen_name',
- 'owner_id', 'slug', 'list_id'],
- require_auth=True
- )
- def add_list_members(self, screen_name=None, user_id=None, slug=None,
- list_id=None, owner_id=None, owner_screen_name=None):
- """ Perform bulk add of list members from user ID or screenname """
- return self._add_list_members(list_to_csv(screen_name),
- list_to_csv(user_id),
- slug, list_id, owner_id,
- owner_screen_name)
- @property
- def _add_list_members(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/lists/members/create_all
- :allowed_param:'screen_name', 'user_id', 'slug', 'list_id',
- 'owner_id', 'owner_screen_name'
- """
- return bind_api(
- api=self,
- path='/lists/members/create_all.json',
- method='POST',
- payload_type='list',
- allowed_param=['screen_name', 'user_id', 'slug', 'list_id',
- 'owner_id', 'owner_screen_name'],
- require_auth=True
- )
- def remove_list_members(self, screen_name=None, user_id=None, slug=None,
- list_id=None, owner_id=None, owner_screen_name=None):
- """ Perform bulk remove of list members from user ID or screenname """
- return self._remove_list_members(list_to_csv(screen_name),
- list_to_csv(user_id),
- slug, list_id, owner_id,
- owner_screen_name)
- @property
- def _remove_list_members(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/lists/members/destroy_all
- :allowed_param:'screen_name', 'user_id', 'slug', 'list_id',
- 'owner_id', 'owner_screen_name'
- """
- return bind_api(
- api=self,
- path='/lists/members/destroy_all.json',
- method='POST',
- payload_type='list',
- allowed_param=['screen_name', 'user_id', 'slug', 'list_id',
- 'owner_id', 'owner_screen_name'],
- require_auth=True
- )
- @property
- def list_members(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/lists/members
- :allowed_param:'owner_screen_name', 'slug', 'list_id',
- 'owner_id', 'cursor
- """
- return bind_api(
- api=self,
- path='/lists/members.json',
- payload_type='user', payload_list=True,
- allowed_param=['owner_screen_name', 'slug', 'list_id',
- 'owner_id', 'cursor']
- )
- @property
- def show_list_member(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/lists/members/show
- :allowed_param:'list_id', 'slug', 'user_id', 'screen_name',
- 'owner_screen_name', 'owner_id
- """
- return bind_api(
- api=self,
- path='/lists/members/show.json',
- payload_type='user',
- allowed_param=['list_id', 'slug', 'user_id', 'screen_name',
- 'owner_screen_name', 'owner_id']
- )
- @property
- def subscribe_list(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/lists/subscribers/create
- :allowed_param:'owner_screen_name', 'slug', 'owner_id',
- 'list_id'
- """
- return bind_api(
- api=self,
- path='/lists/subscribers/create.json',
- method='POST',
- payload_type='list',
- allowed_param=['owner_screen_name', 'slug', 'owner_id',
- 'list_id'],
- require_auth=True
- )
- @property
- def unsubscribe_list(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/post/lists/subscribers/destroy
- :allowed_param:'owner_screen_name', 'slug', 'owner_id',
- 'list_id'
- """
- return bind_api(
- api=self,
- path='/lists/subscribers/destroy.json',
- method='POST',
- payload_type='list',
- allowed_param=['owner_screen_name', 'slug', 'owner_id',
- 'list_id'],
- require_auth=True
- )
- @property
- def list_subscribers(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/lists/subscribers
- :allowed_param:'owner_screen_name', 'slug', 'owner_id',
- 'list_id', 'cursor
- """
- return bind_api(
- api=self,
- path='/lists/subscribers.json',
- payload_type='user', payload_list=True,
- allowed_param=['owner_screen_name', 'slug', 'owner_id',
- 'list_id', 'cursor']
- )
- @property
- def show_list_subscriber(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/lists/subscribers/show
- :allowed_param:'owner_screen_name', 'slug', 'screen_name',
- 'owner_id', 'list_id', 'user_id
- """
- return bind_api(
- api=self,
- path='/lists/subscribers/show.json',
- payload_type='user',
- allowed_param=['owner_screen_name', 'slug', 'screen_name',
- 'owner_id', 'list_id', 'user_id']
- )
- @property
- def trends_available(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/trends/available """
- return bind_api(
- api=self,
- path='/trends/available.json',
- payload_type='json'
- )
- @property
- def trends_place(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/trends/place
- :allowed_param:'id', 'exclude'
- """
- return bind_api(
- api=self,
- path='/trends/place.json',
- payload_type='json',
- allowed_param=['id', 'exclude']
- )
- @property
- def trends_closest(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/trends/closest
- :allowed_param:'lat', 'long'
- """
- return bind_api(
- api=self,
- path='/trends/closest.json',
- payload_type='json',
- allowed_param=['lat', 'long']
- )
- @property
- def search(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/search/tweets
- :allowed_param:'q', 'lang', 'locale', 'since_id', 'geocode',
- 'max_id', 'since', 'until', 'result_type', 'count',
- 'include_entities', 'from', 'to', 'source']
- """
- return bind_api(
- api=self,
- path='/search/tweets.json',
- payload_type='search_results',
- allowed_param=['q', 'lang', 'locale', 'since_id', 'geocode',
- 'max_id', 'since', 'until', 'result_type',
- 'count', 'include_entities', 'from',
- 'to', 'source']
- )
- @property
- def reverse_geocode(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/geo/reverse_geocode
- :allowed_param:'lat', 'long', 'accuracy', 'granularity', 'max_results'
- """
- return bind_api(
- api=self,
- path='/geo/reverse_geocode.json',
- payload_type='place', payload_list=True,
- allowed_param=['lat', 'long', 'accuracy', 'granularity',
- 'max_results']
- )
- @property
- def geo_id(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/geo/id/%3Aplace_id
- :allowed_param:'id'
- """
- return bind_api(
- api=self,
- path='/geo/id/{id}.json',
- payload_type='place',
- allowed_param=['id']
- )
- @property
- def geo_search(self):
- """ :reference: https://dev.twitter.com/docs/api/1.1/get/geo/search
- :allowed_param:'lat', 'long', 'query', 'ip', 'granularity',
- 'accuracy', 'max_results', 'contained_within
- """
- return bind_api(
- api=self,
- path='/geo/search.json',
- payload_type='place', payload_list=True,
- allowed_param=['lat', 'long', 'query', 'ip', 'granularity',
- 'accuracy', 'max_results', 'contained_within']
- )
- @property
- def geo_similar_places(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/geo/similar_places
- :allowed_param:'lat', 'long', 'name', 'contained_within'
- """
- return bind_api(
- api=self,
- path='/geo/similar_places.json',
- payload_type='place', payload_list=True,
- allowed_param=['lat', 'long', 'name', 'contained_within']
- )
- @property
- def supported_languages(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/help/languages """
- return bind_api(
- api=self,
- path='/help/languages.json',
- payload_type='json',
- require_auth=True
- )
- @property
- def configuration(self):
- """ :reference: https://dev.twitter.com/rest/reference/get/help/configuration """
- return bind_api(
- api=self,
- path='/help/configuration.json',
- payload_type='json',
- require_auth=True
- )
- """ Internal use only """
- @staticmethod
- def _pack_image(filename, max_size, form_field="image", f=None):
- """Pack image from file into multipart-formdata post body"""
- # image must be less than 700kb in size
- if f is None:
- try:
- if os.path.getsize(filename) > (max_size * 1024):
- raise TweepError('File is too big, must be less than %skb.' % max_size)
- except os.error as e:
- raise TweepError('Unable to access file: %s' % e.strerror)
- # build the mulitpart-formdata body
- fp = open(filename, 'rb')
- else:
- f.seek(0, 2) # Seek to end of file
- if f.tell() > (max_size * 1024):
- raise TweepError('File is too big, must be less than %skb.' % max_size)
- f.seek(0) # Reset to beginning of file
- fp = f
- # image must be gif, jpeg, or png
- file_type = mimetypes.guess_type(filename)
- if file_type is None:
- raise TweepError('Could not determine file type')
- file_type = file_type[0]
- if file_type not in ['image/gif', 'image/jpeg', 'image/png']:
- raise TweepError('Invalid file type for image: %s' % file_type)
- if isinstance(filename, six.text_type):
- filename = filename.encode("utf-8")
- BOUNDARY = b'Tw3ePy'
- body = list()
- body.append(b'--' + BOUNDARY)
- body.append('Content-Disposition: form-data; name="{0}";'
- ' filename="{1}"'.format(form_field, filename)
- .encode('utf-8'))
- body.append('Content-Type: {0}'.format(file_type).encode('utf-8'))
- body.append(b'')
- body.append(fp.read())
- body.append(b'--' + BOUNDARY + b'--')
- body.append(b'')
- fp.close()
- body = b'\r\n'.join(body)
- # build headers
- headers = {
- 'Content-Type': 'multipart/form-data; boundary=Tw3ePy',
- 'Content-Length': str(len(body))
- }
- return headers, body
|