twitter.py
Go to the documentation of this file.
1 # originally from https://raw.githubusercontent.com/bear/python-twitter/v1.1/twitter.py # NOQA
2 
3 import math
4 import json as simplejson
5 import requests
6 try:
7  from itertools import zip_longest
8 except ImportError:
9  from itertools import izip_longest as zip_longest
10 from requests_oauthlib import OAuth1
11 
12 import rospy
13 
14 from rostwitter.util import count_tweet_text
15 from rostwitter.util import split_tweet_text
16 from rostwitter.cv_util import extract_media_from_text
17 
18 
19 class Twitter(object):
20  def __init__(
21  self,
22  consumer_key=None,
23  consumer_secret=None,
24  access_token_key=None,
25  access_token_secret=None
26  ):
27  self._consumer_key = consumer_key
28  self._consumer_secret = consumer_secret
29  self._access_token_key = access_token_key
30  self._access_token_secret = access_token_secret
31 
32  self.__auth = OAuth1(self._consumer_key, self._consumer_secret,
35 
36  def _request_url(self, url, verb, data=None):
37  if verb == 'POST':
38  if 'media' in data:
39  return requests.post(
40  url,
41  files=data,
42  auth=self.__auth,
43  timeout=self._requests_timeout
44  )
45  else:
46  return requests.post(
47  url,
48  data=data,
49  auth=self.__auth,
50  timeout=self._requests_timeout
51  )
52  if verb == 'GET':
53  url = self._BuildUrl(url, extra_params=data)
54  return requests.get(
55  url,
56  auth=self.__auth,
57  timeout=self._requests_timeout
58  )
59  return 0 # if not a POST or GET request
60 
61  def _check_post_request(self, request):
62  valid = True
63  data = simplejson.loads(request.content)
64  if request.status_code != 200:
65  rospy.logwarn('post tweet failed. status_code: {}'
66  .format(request.status_code))
67  if 'errors' in data:
68  for error in data['errors']:
69  rospy.logwarn('Tweet error code: {}, message: {}'
70  .format(error['code'], error['message']))
71  valid = False
72  if valid:
73  return data
74 
75  def _post_update_with_reply(self, texts, media_list=None,
76  in_reply_to_status_id=None):
77  split_media_list = []
78  media_list = media_list or []
79  for i in range(0, int(math.ceil(len(media_list) / 4.0))):
80  split_media_list.append(media_list[i * 4:(i + 1) * 4])
81  for text, media_list in zip_longest(texts, split_media_list):
82  text = text or ''
83  media_list = media_list or []
84  url = 'https://api.twitter.com/1.1/statuses/update.json'
85  data = {'status': text}
86  media_ids = self._upload_media(media_list)
87  if len(media_ids) > 0:
88  data['media_ids'] = media_ids
89  if in_reply_to_status_id is not None:
90  data['in_reply_to_status_id'] = in_reply_to_status_id
91  r = self._request_url(url, 'POST', data=data)
92  data = self._check_post_request(r)
93  if data is not None:
94  in_reply_to_status_id = data['id']
95  return data
96 
97  def _upload_media(self, media_list):
98  url = 'https://upload.twitter.com/1.1/media/upload.json'
99  media_ids = []
100  for media in media_list:
101  data = {'media': media}
102  r = self._request_url(url, 'POST', data=data)
103  if r.status_code == 200:
104  rospy.loginfo('upload media success')
105  media_ids.append(str(r.json()['media_id']))
106  else:
107  rospy.logerr('upload media failed. status_code: {}'
108  .format(r.status_code))
109  media_ids = ','.join(media_ids)
110  return media_ids
111 
112  def post_update(self, status, in_reply_to_status_id=None):
113  media_list, status_list = extract_media_from_text(status)
114  for text, mlist in zip_longest(status_list, media_list):
115  text = text or ''
116  texts = split_tweet_text(text)
117  data = self._post_update_with_reply(
118  texts,
119  media_list=mlist,
120  in_reply_to_status_id=in_reply_to_status_id)
121  if data is not None:
122  in_reply_to_status_id = data['id']
123  return data
124 
125  def post_media(self, status, media, in_reply_to_status_id=None):
126  texts = split_tweet_text(status)
127  status = texts[0]
128  url = 'https://api.twitter.com/1.1/statuses/update_with_media.json'
129  data = {'status': status}
130  data['media'] = open(str(media), 'rb').read()
131  r = self._request_url(url, 'POST', data=data)
132  data = self._check_post_request(r)
133  if len(texts) > 1:
134  data = self._post_update_with_reply(
135  texts[1:],
136  in_reply_to_status_id=data['id'])
137  return data
def __init__(self, consumer_key=None, consumer_secret=None, access_token_key=None, access_token_secret=None)
Definition: twitter.py:26
def _post_update_with_reply(self, texts, media_list=None, in_reply_to_status_id=None)
Definition: twitter.py:76
def split_tweet_text(text, length=280)
Definition: util.py:41
def _upload_media(self, media_list)
Definition: twitter.py:97
def post_media(self, status, media, in_reply_to_status_id=None)
Definition: twitter.py:125
def extract_media_from_text(text)
Definition: cv_util.py:56
def _request_url(self, url, verb, data=None)
Definition: twitter.py:36
def _check_post_request(self, request)
Definition: twitter.py:61
def post_update(self, status, in_reply_to_status_id=None)
Definition: twitter.py:112


rostwitter
Author(s):
autogenerated on Sat Jun 24 2023 02:40:41