From 2b437dbf358dcb57428927e07e8d527dc6d8a17b Mon Sep 17 00:00:00 2001 From: hepeng Date: Wed, 12 Jul 2017 08:38:59 +0800 Subject: [PATCH 01/35] add api.Replyto for convenience --- twitter/api.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/twitter/api.py b/twitter/api.py index 1385fce2..c67d40e0 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -4693,6 +4693,30 @@ def VerifyCredentials(self, include_entities=None, skip_status=None, include_ema return User.NewFromJsonDict(data) + def RelayTo(self, status, in_reply_to_status_id, **kwargs): + """Relay to a status. Automatically add @username before the status for convenience. + + Args: + status (str): + The message text to be replyed.Must be less than or equal to 140 characters. + in_reply_to_status_id (int): + The ID of an existing status that the status to be posted is in reply to. + **kwargs: + The other args api.PostUpadtes need. + + Returns: + (twitter.Status) A twitter.Status instance representing the message replied. + """ + reply_status = self.GetStatus(in_reply_to_status_id) + u_status = "@%s " % reply_status.user.screen_name + if isinstance(status, str) or self._input_encoding is None: + u_status = u_status + status + else: + u_status = u_status + str(u_status, self._input_encoding) + + return self.PostUpdate(u_status, in_reply_to_status_id=in_reply_to_status_id, **kwargs) + + def SetCache(self, cache): """Override the default cache. Set to None to prevent caching. From 02049603275c57bd32066dc9508ad333bc27fab2 Mon Sep 17 00:00:00 2001 From: hepeng Date: Wed, 12 Jul 2017 20:04:54 +0800 Subject: [PATCH 02/35] Fix spell error and update the docstring of api.ReplyTo --- twitter/api.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index c67d40e0..29bce607 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -4693,8 +4693,10 @@ def VerifyCredentials(self, include_entities=None, skip_status=None, include_ema return User.NewFromJsonDict(data) - def RelayTo(self, status, in_reply_to_status_id, **kwargs): - """Relay to a status. Automatically add @username before the status for convenience. + def ReplyTo(self, status, in_reply_to_status_id, **kwargs): + """Relay to a status. Automatically add @username before the status for + convenience.This method calls api.GetStatus to get username. + Args: status (str): From 177a67e48110c6507e422aabe68ab3f7f06fb80a Mon Sep 17 00:00:00 2001 From: Rikhav Mamania Date: Mon, 9 Apr 2018 19:36:12 +0530 Subject: [PATCH 03/35] api - ssl certfication verification Added verify_ssl and cert_ssl parameters to the twitter.Api - these mirror the verify and cert parameters from requests.request --- twitter/api.py | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index f0541b85..bb4091df 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -162,7 +162,9 @@ def __init__(self, timeout=None, sleep_on_rate_limit=False, tweet_mode='compat', - proxies=None): + proxies=None, + verify_ssl=None, + cert_ssl=None): """Instantiate a new twitter.Api object. Args: @@ -216,6 +218,13 @@ def __init__(self, proxies (dict, optional): A dictionary of proxies for the request to pass through, if not specified allows requests lib to use environmental variables for proxy if any. + verify_ssl (optional): + Either a boolean, in which case it controls whether we verify + the server's TLS certificate, or a string, in which case it must be a path + to a CA bundle to use. Defaults to ``True``. + cert_ssl (optional): + If String, path to ssl client cert file (.pem). + If Tuple, ('cert', 'key') pair. """ # check to see if the library is running on a Google App Engine instance @@ -247,6 +256,8 @@ def __init__(self, self.sleep_on_rate_limit = sleep_on_rate_limit self.tweet_mode = tweet_mode self.proxies = proxies + self.verify_ssl = verify_ssl + self.cert_ssl = cert_ssl if base_url is None: self.base_url = 'https://api.twitter.com/1.1' @@ -4913,7 +4924,9 @@ def _RequestChunkedUpload(self, url, headers, data): data=data, auth=self.__auth, timeout=self._timeout, - proxies=self.proxies + proxies=self.proxies, + verify=self.verify_ssl, + cert=self.cert_ssl ) except requests.RequestException as e: raise TwitterError(str(e)) @@ -4954,20 +4967,20 @@ def _RequestUrl(self, url, verb, data=None, json=None, enforce_auth=True): if data: if 'media_ids' in data: url = self._BuildUrl(url, extra_params={'media_ids': data['media_ids']}) - resp = requests.post(url, data=data, auth=self.__auth, timeout=self._timeout, proxies=self.proxies) + resp = requests.post(url, data=data, auth=self.__auth, timeout=self._timeout, proxies=self.proxies, verify=self.verify_ssl, cert=self.cert_ssl) elif 'media' in data: - resp = requests.post(url, files=data, auth=self.__auth, timeout=self._timeout, proxies=self.proxies) + resp = requests.post(url, files=data, auth=self.__auth, timeout=self._timeout, proxies=self.proxies, verify=self.verify_ssl, cert=self.cert_ssl) else: - resp = requests.post(url, data=data, auth=self.__auth, timeout=self._timeout, proxies=self.proxies) + resp = requests.post(url, data=data, auth=self.__auth, timeout=self._timeout, proxies=self.proxies, verify=self.verify_ssl, cert=self.cert_ssl) elif json: - resp = requests.post(url, json=json, auth=self.__auth, timeout=self._timeout, proxies=self.proxies) + resp = requests.post(url, json=json, auth=self.__auth, timeout=self._timeout, proxies=self.proxies, verify=self.verify_ssl, cert=self.cert_ssl) else: resp = 0 # POST request, but without data or json elif verb == 'GET': data['tweet_mode'] = self.tweet_mode url = self._BuildUrl(url, extra_params=data) - resp = requests.get(url, auth=self.__auth, timeout=self._timeout, proxies=self.proxies) + resp = requests.get(url, auth=self.__auth, timeout=self._timeout, proxies=self.proxies, verify=self.verify_ssl, cert=self.cert_ssl) else: resp = 0 # if not a POST or GET request @@ -5002,14 +5015,17 @@ def _RequestStream(self, url, verb, data=None, session=None): return session.post(url, data=data, stream=True, auth=self.__auth, timeout=self._timeout, - proxies=self.proxies) + proxies=self.proxies, + verify=self.verify_ssl, + cert=self.cert_ssl) except requests.RequestException as e: raise TwitterError(str(e)) if verb == 'GET': url = self._BuildUrl(url, extra_params=data) try: return session.get(url, stream=True, auth=self.__auth, - timeout=self._timeout, proxies=self.proxies) + timeout=self._timeout, proxies=self.proxies, + verify=self.verify_ssl, cert=self.cert_ssl) except requests.RequestException as e: raise TwitterError(str(e)) return 0 # if not a POST or GET request From 88fff545da6064f974a9b4b663ea28d0ba32fda1 Mon Sep 17 00:00:00 2001 From: Rikhav Mamania Date: Mon, 9 Apr 2018 19:39:52 +0530 Subject: [PATCH 04/35] api - ssl certificate verification included parameters in twitter.Api to mirror requests.request verify and cert parameters --- twitter/api.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index bb4091df..861cda6b 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -163,8 +163,8 @@ def __init__(self, sleep_on_rate_limit=False, tweet_mode='compat', proxies=None, - verify_ssl=None, - cert_ssl=None): + verify_ssl=None, + cert_ssl=None): """Instantiate a new twitter.Api object. Args: @@ -218,8 +218,8 @@ def __init__(self, proxies (dict, optional): A dictionary of proxies for the request to pass through, if not specified allows requests lib to use environmental variables for proxy if any. - verify_ssl (optional): - Either a boolean, in which case it controls whether we verify + verify_ssl (optional): + Either a boolean, in which case it controls whether we verify the server's TLS certificate, or a string, in which case it must be a path to a CA bundle to use. Defaults to ``True``. cert_ssl (optional): @@ -4926,7 +4926,7 @@ def _RequestChunkedUpload(self, url, headers, data): timeout=self._timeout, proxies=self.proxies, verify=self.verify_ssl, - cert=self.cert_ssl + cert=self.cert_ssl ) except requests.RequestException as e: raise TwitterError(str(e)) From 2e6c6a034dbb58140a3b219b12c39909e50aa038 Mon Sep 17 00:00:00 2001 From: Louis Sautier Date: Tue, 19 Jun 2018 21:48:57 +0200 Subject: [PATCH 05/35] Include doc, examples and tests in source distributions --- MANIFEST.in | 1 + 1 file changed, 1 insertion(+) diff --git a/MANIFEST.in b/MANIFEST.in index a04a897d..ca78efe0 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -5,3 +5,4 @@ include NOTICE include *.rst include requirements.txt prune .DS_Store +graft doc examples testdata tests From f4d9161adb44b1fab7a6d88de00b4ddcf196fd55 Mon Sep 17 00:00:00 2001 From: Louis Sautier Date: Tue, 19 Jun 2018 22:18:15 +0200 Subject: [PATCH 06/35] Remove unnecessary pytest-runner from install_requires --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index 99635fee..dece197e 100755 --- a/setup.py +++ b/setup.py @@ -57,7 +57,6 @@ def extract_metaitem(meta): packages=find_packages(exclude=('tests', 'docs')), platforms=['Any'], install_requires=['future', 'requests', 'requests-oauthlib'], - setup_requires=['pytest-runner'], tests_require=['pytest'], keywords='twitter api', classifiers=[ From 15d703f3ce8a987399cdbe781dcc47c244605b19 Mon Sep 17 00:00:00 2001 From: tuftedocelot Date: Wed, 4 Jul 2018 17:05:43 -0500 Subject: [PATCH 07/35] Add support for the Geo API and Place models --- tests/test_place.py | 141 ++++++++++++++++++++++++++++++++++++++++++++ twitter/__init__.py | 1 + twitter/api.py | 7 +++ twitter/models.py | 32 ++++++++++ 4 files changed, 181 insertions(+) create mode 100644 tests/test_place.py diff --git a/tests/test_place.py b/tests/test_place.py new file mode 100644 index 00000000..fb343517 --- /dev/null +++ b/tests/test_place.py @@ -0,0 +1,141 @@ +import twitter +import json +import sys +import unittest + + +class PlaceTest(unittest.TestCase): + SAMPLE_JSON = '''{"id": "df51dec6f4ee2b2c", "url": "https://api.twitter.com/1.1/geo/id/df51dec6f4ee2b2c.json", "place_type": "neighborhood", "name": "Presidio", "full_name": "Presidio, San Francisco", "country_code": "US", "country": "United States", "contained_within": [{"id": "5a110d312052166f", "url": "https://api.twitter.com/1.1/geo/id/5a110d312052166f.json", "place_type": "city", "name": "San Francisco", "full_name": "San Francisco, CA", "country_code": "US", "country": "United States", "centroid": [-122.4461400159226, 37.759828999999996], "bounding_box": {"type": "Polygon", "coordinates": [[[-122.514926, 37.708075], [-122.514926, 37.833238], [-122.357031, 37.833238], [-122.357031, 37.708075], [-122.514926, 37.708075]]]}, "attributes": {}}], "geometry": null, "polylines": [], "centroid": [-122.46598425785236, 37.79989625], "bounding_box": {"type": "Polygon", "coordinates": [[[-122.4891333, 37.786925], [-122.4891333, 37.8128675], [-122.446306, 37.8128675], [-122.446306, 37.786925], [-122.4891333, 37.786925]]]}, "attributes": {"geotagCount": "6", "162834:id": "2202"}}''' + + def _GetSampleContainedPlace(self): + return twitter.Place(id='5a110d312052166f', + url='https://api.twitter.com/1.1/geo/id/5a110d312052166f.json', + place_type='city', + name='San Franciso', + full_name='San Francisco, CA', + country_code='US', + country='United States', + centroid=[-122.4461400159226, + 37.759828999999996], + bounding_box=dict( + type='Polygon', + coordinates=[ + [ + [-122.514926, 37.708075], + [-122.514926, 37.833238], + [-122.357031, 37.833238], + [-122.357031, 37.708075], + [-122.514926, 37.708075] + ] + ], + attributes=dict() + ) + ) + + def _GetSamplePlace(self): + return twitter.Place(id='df51dec6f4ee2b2c', + url='https://api.twitter.com/1.1/geo/id/df51dec6f4ee2b2c.json', + place_type='neighborhood', + name='Presidio', + full_name='Presidio, San Francisco', + country_code='US', + country='United States', + contained_within=[ + self._GetSampleContainedPlace() + ], + geometry='null', + polylines=[], + centroid=[-122.46598425785236, 37.79989625], + bounding_box=dict( + type='Polygon', + coordinates=[ + [ + [-122.4891333, 37.786925], + [-122.4891333, 37.8128675], + [-122.446306, 37.8128675], + [-122.446306, 37.786925], + [-122.4891333, 37.786925] + ] + ] + ), + attributes={ + 'geotagCount': '6', + '162834:id': '2202' + } + ) + + def testProperties(self): + '''Test all of the twitter.Place properties''' + place = twitter.Place() + place.id = 'df51dec6f4ee2b2c' + self.assertEqual('df51dec6f4ee2b2c', place.id) + place.name = 'Presidio' + self.assertEqual('Presidio', place.name) + place.full_name = 'Presidio, San Francisco' + self.assertEqual('Presidio, San Francisco', place.full_name) + place.country_code = 'US' + self.assertEqual('US', place.country_code) + place.country = 'United States' + self.assertEqual('United States', place.country) + place.url = 'https://api.twitter.com/1.1/geo/id/df51dec6f4ee2b2c.json' + self.assertEqual('https://api.twitter.com/1.1/geo/id/df51dec6f4ee2b2c.json', place.url) + place.contained_within = [self._GetSampleContainedPlace()] + self.assertEqual('5a110d312052166f', place.contained_within[0].id) + + @unittest.skipIf(sys.version_info.major >= 3, "skipped until fix found for v3 python") + def testAsJsonString(self): + '''Test the twitter.Place AsJsonString method''' + self.assertEqual(PlaceTest.SAMPLE_JSON, + self._GetSamplePlace().AsJsonString()) + + def testAsDict(self): + '''Test the twitter.Place AsDict method''' + place = self._GetSamplePlace() + data = place.AsDict() + self.assertEqual('df51dec6f4ee2b2c', data['id']) + self.assertEqual('Presidio', data['name']) + self.assertEqual('Presidio, San Francisco', data['full_name']) + self.assertEqual('US', data['country_code']) + self.assertEqual('United States', data['country']) + self.assertEqual('https://api.twitter.com/1.1/geo/id/df51dec6f4ee2b2c.json', data['url']) + + def testEq(self): + '''Test the twitter.Place __eq__ method''' + place = twitter.Place() + place.id = 'df51dec6f4ee2b2c' + place.name = 'Presidio' + place.full_name = 'Presidio, San Francisco' + place.country_code = 'US' + place.country = 'United States' + place.url = 'https://api.twitter.com/1.1/geo/id/df51dec6f4ee2b2c.json' + place.place_type = 'neighborhood' + place.centroid = [-122.4461400159226, 37.759828999999996] + place.geometry = 'null' + place.polylines = [] + place.bounding_box = dict(type='Polygon', + coordinates=[ + [ + [-122.4891333, 37.786925], + [-122.4891333, 37.8128675], + [-122.446306, 37.8128675], + [-122.446306, 37.786925], + [-122.4891333, 37.786925] + ] + ] + ) + place.attributes = { + 'geotagCount': '6', + '162834:id': '2202' + } + self.assertEqual(place, self._GetSamplePlace()) + + def testHash(self): + '''Test the twitter.Place __hash__ method''' + place = self._GetSamplePlace() + self.assertEqual(hash(place), hash(place.id)) + + def testNewFromJsonDict(self): + '''Test the twitter.Status NewFromJsonDict method''' + data = json.loads(PlaceTest.SAMPLE_JSON) + place = twitter.Place.NewFromJsonDict(data) + self.assertEqual(self._GetSamplePlace(), place) diff --git a/twitter/__init__.py b/twitter/__init__.py index c6e433f8..96b058bd 100644 --- a/twitter/__init__.py +++ b/twitter/__init__.py @@ -45,6 +45,7 @@ Hashtag, # noqa List, # noqa Media, # noqa + Place, # noga Trend, # noqa Url, # noqa User, # noqa diff --git a/twitter/api.py b/twitter/api.py index 94bbbbc1..33290ff8 100644 --- a/twitter/api.py +++ b/twitter/api.py @@ -49,6 +49,7 @@ Category, DirectMessage, List, + Place, Status, Trend, User, @@ -4648,6 +4649,12 @@ def GetUserStream(self, elif include_keepalive: yield None + def GetPlace(self, id): + url = '{}/geo/id/{}.json'.format(self.base_url, id) + resp = self._RequestUrl(url, 'GET') + data = self._ParseAndCheckTwitter(resp.content.decode('utf-8')) + return Place.NewFromJsonDict(data) + def VerifyCredentials(self, include_entities=None, skip_status=None, include_email=None): """Returns a twitter.User instance if the authenticating user is valid. diff --git a/twitter/models.py b/twitter/models.py index 82dc3ada..1dfda872 100644 --- a/twitter/models.py +++ b/twitter/models.py @@ -537,3 +537,35 @@ def NewFromJsonDict(cls, data, **kwargs): urls=urls, user=user, user_mentions=user_mentions) + + +class Place(TwitterModel): + """A class representing the Place structure used by the twitter API.""" + + def __init__(self, **kwargs): + self.param_defaults = { + 'id': None, + 'url': None, + 'place_type': None, + 'name': None, + 'full_name': None, + 'country_code': None, + 'country': None, + 'bounding_box': None, + 'attributes': None + } + + for (param, default) in self.param_defaults.items(): + setattr(self, param, kwargs.get(param, default)) + + def __repr__(self): + """ A string representation of this twitter.Place instance. + The return value is the ID of status, username and datetime. + + Returns: + string: A string representation of this twitter.Placeinstance with + the ID of status, name, and country. + """ + return "Place(ID={0}, Name={1}, Country={2})".format(self.id, + self.name, + self.country) From ccc4cb47b19e3176351e3085ff8098beed56c756 Mon Sep 17 00:00:00 2001 From: tuftedocelot Date: Thu, 5 Jul 2018 15:30:54 -0500 Subject: [PATCH 08/35] Link Place model to Status --- tests/test_status.py | 25 +++++++++++++++++++++++++ twitter/models.py | 6 +++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/tests/test_status.py b/tests/test_status.py index 475ac154..4ddfe122 100644 --- a/tests/test_status.py +++ b/tests/test_status.py @@ -26,6 +26,29 @@ def _GetSampleStatus(self): text=u'A légpárnás hajóm tele van angolnákkal.', user=self._GetSampleUser()) + def _GetSamplePlace(self): + return twitter.Place( + id='07d9db48bc083000', + url='https://api.twitter.com/1.1/geo/id/07d9db48bc083000.json', + place_type='poi', + name='McIntosh Lake', + full_name='McIntosh Lake', + country_code='US', + country='United States', + bounding_box=dict( + type='Polygon', + coordinates=[ + [ + [-105.14544, 40.192138], + [-105.14544, 40.192138], + [-105.14544, 40.192138], + [-105.14544, 40.192138] + ] + ] + ), + attributes={} + ) + def testInit(self): '''Test the twitter.Status constructor''' twitter.Status(created_at='Fri Jan 26 23:17:14 +0000 2007', @@ -43,7 +66,9 @@ def testProperties(self): self.assertEqual('Fri Jan 26 23:17:14 +0000 2007', status.created_at) self.assertEqual(created_at, status.created_at_in_seconds) status.user = self._GetSampleUser() + status.place = self._GetSamplePlace() self.assertEqual(718443, status.user.id) + self.assertEqual('07d9db48bc083000', status.place.id) @unittest.skipIf(sys.version_info.major >= 3, "skipped until fix found for v3 python") def testAsJsonString(self): diff --git a/twitter/models.py b/twitter/models.py index 1dfda872..88d7b01c 100644 --- a/twitter/models.py +++ b/twitter/models.py @@ -498,6 +498,7 @@ def NewFromJsonDict(cls, data, **kwargs): urls = None user = None user_mentions = None + place = None # for loading extended tweets from the streaming API. if 'extended_tweet' in data: @@ -512,6 +513,8 @@ def NewFromJsonDict(cls, data, **kwargs): current_user_retweet = data['current_user_retweet']['id'] if 'quoted_status' in data: quoted_status = Status.NewFromJsonDict(data.get('quoted_status')) + if 'place' in data and data['place'] is not None: + place = Place.NewFromJsonDict(data['place']) if 'entities' in data: if 'urls' in data['entities']: @@ -536,7 +539,8 @@ def NewFromJsonDict(cls, data, **kwargs): retweeted_status=retweeted_status, urls=urls, user=user, - user_mentions=user_mentions) + user_mentions=user_mentions, + place=place) class Place(TwitterModel): From be3f1b422d063a676a1ecc91c2ed13fe21c39927 Mon Sep 17 00:00:00 2001 From: tuftedocelot Date: Sun, 14 Oct 2018 14:50:37 -0500 Subject: [PATCH 09/35] Add initial tests of status and Place API usage For now, Place models are only accessible via a Status. Querying the API for Places is to come later --- testdata/get_status_with_place.json | 185 ++++++++++++++++++++++++++++ tests/test_status_place.py | 45 +++++++ 2 files changed, 230 insertions(+) create mode 100644 testdata/get_status_with_place.json create mode 100644 tests/test_status_place.py diff --git a/testdata/get_status_with_place.json b/testdata/get_status_with_place.json new file mode 100644 index 00000000..f4c82bc6 --- /dev/null +++ b/testdata/get_status_with_place.json @@ -0,0 +1,185 @@ +{ + "created_at": "Sat Oct 13 20:15:27 +0000 2018", + "hashtags": [], + "id": 1051204790334746624, + "id_str": "1051204790334746624", + "lang": "en", + "place": { + "attributes": {}, + "bounding_box": { + "coordinates": [ + [ + [ + -87.940033, + 41.644102 + ], + [ + -87.523993, + 41.644102 + ], + [ + -87.523993, + 42.0230669 + ], + [ + -87.940033, + 42.0230669 + ] + ] + ], + "type": "Polygon" + }, + "contained_within": [], + "country": "United States", + "country_code": "US", + "full_name": "Chicago, IL", + "id": "1d9a5370a355ab0c", + "name": "Chicago", + "place_type": "city", + "url": "https://api.twitter.com/1.1/geo/id/1d9a5370a355ab0c.json" + }, + "quoted_status": { + "created_at": "Fri Oct 12 20:38:11 +0000 2018", + "favorite_count": 24161, + "hashtags": [], + "id": 1050848124036685824, + "id_str": "1050848124036685824", + "lang": "en", + "media": [ + { + "display_url": "pic.twitter.com/7BhtdUPIQD", + "expanded_url": "https://twitter.com/fazopri/status/1049144383457677317/video/1", + "id": 1049144139172855808, + "media_url": "http://pbs.twimg.com/ext_tw_video_thumb/1049144139172855808/pu/img/WaU8axg3hOI425zK.jpg", + "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/1049144139172855808/pu/img/WaU8axg3hOI425zK.jpg", + "sizes": { + "large": { + "h": 720, + "resize": "fit", + "w": 720 + }, + "medium": { + "h": 720, + "resize": "fit", + "w": 720 + }, + "small": { + "h": 680, + "resize": "fit", + "w": 680 + }, + "thumb": { + "h": 150, + "resize": "crop", + "w": 150 + } + }, + "type": "video", + "url": "https://t.co/7BhtdUPIQD", + "video_info": { + "aspect_ratio": [ + 1, + 1 + ], + "duration_millis": 26153, + "variants": [ + { + "content_type": "application/x-mpegURL", + "url": "https://video.twimg.com/ext_tw_video/1049144139172855808/pu/pl/TQ2FvESC2EWTKpxR.m3u8?tag=5" + }, + { + "bitrate": 256000, + "content_type": "video/mp4", + "url": "https://video.twimg.com/ext_tw_video/1049144139172855808/pu/vid/240x240/7O7a4ritrh587trx.mp4?tag=5" + }, + { + "bitrate": 832000, + "content_type": "video/mp4", + "url": "https://video.twimg.com/ext_tw_video/1049144139172855808/pu/vid/480x480/BXTtsb-hW9DvNJFR.mp4?tag=5" + }, + { + "bitrate": 1280000, + "content_type": "video/mp4", + "url": "https://video.twimg.com/ext_tw_video/1049144139172855808/pu/vid/720x720/_Xb-Q1NmNlv-hY-x.mp4?tag=5" + } + ] + } + } + ], + "possibly_sensitive": true, + "retweet_count": 9042, + "source": "Twitter for iPhone", + "text": "Swallowing when you have a sore throat then remembering how you used to swallow painlessly\n\n https://t.co/7BhtdUPIQD", + "urls": [], + "user": { + "created_at": "Wed Dec 01 19:30:08 +0000 2010", + "description": "Artist |bookings/beats: supermanage17@gmail.com", + "favourites_count": 15056, + "followers_count": 2680, + "friends_count": 1566, + "geo_enabled": true, + "id": 221843085, + "id_str": "221843085", + "lang": "en", + "listed_count": 40, + "location": "The Mountains", + "name": "O\u2019dack Black", + "profile_background_color": "C0DEED", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": true, + "profile_banner_url": "https://pbs.twimg.com/profile_banners/221843085/1530302259", + "profile_image_url": "http://pbs.twimg.com/profile_images/1036223132032483328/qu1sNzYk_normal.jpg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/1036223132032483328/qu1sNzYk_normal.jpg", + "profile_link_color": "0084B4", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "D633D6", + "profile_use_background_image": true, + "screen_name": "iamodeal", + "statuses_count": 15429, + "url": "https://t.co/RWx3Olu79R" + }, + "user_mentions": [] + }, + "quoted_status_id": 1050848124036685824, + "quoted_status_id_str": "1050848124036685824", + "source": "Twitter for iPhone", + "text": "OXJKDS ME LAST NIGHT https://t.co/yyFEAn8ZM8", + "urls": [ + { + "expanded_url": "https://twitter.com/iamodeal/status/1050848124036685824", + "url": "https://t.co/yyFEAn8ZM8" + } + ], + "user": { + "created_at": "Tue Feb 05 01:30:25 +0000 2013", + "description": "I wish everyone was a lil nicer to each other. photographer. 19 years old. business: haley.paolini@icloud.com", + "favourites_count": 86250, + "followers_count": 15571, + "friends_count": 707, + "geo_enabled": true, + "id": 1149579998, + "id_str": "1149579998", + "lang": "en", + "listed_count": 270, + "location": "Chicago, IL, USA", + "name": "haley", + "profile_background_color": "FFFFFF", + "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", + "profile_background_tile": true, + "profile_banner_url": "https://pbs.twimg.com/profile_banners/1149579998/1538861179", + "profile_image_url": "http://pbs.twimg.com/profile_images/1048685903886147591/LW8shQOq_normal.jpg", + "profile_image_url_https": "https://pbs.twimg.com/profile_images/1048685903886147591/LW8shQOq_normal.jpg", + "profile_link_color": "664479", + "profile_sidebar_border_color": "FFFFFF", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "0084B4", + "profile_use_background_image": true, + "screen_name": "haleypaolini", + "statuses_count": 194551, + "url": "https://t.co/qlr16Jh9XJ" + }, + "user_mentions": [] +} \ No newline at end of file diff --git a/tests/test_status_place.py b/tests/test_status_place.py new file mode 100644 index 00000000..fd485ae1 --- /dev/null +++ b/tests/test_status_place.py @@ -0,0 +1,45 @@ +import unittest +import re +import sys +import twitter +import responses +from responses import GET + +DEFAULT_URL = re.compile(r'https?://.*\.twitter.com/1\.1/.*') + + +class ErrNull(object): + """ Suppress output of tests while writing to stdout or stderr. This just + takes in data and does nothing with it. + """ + + def write(self, data): + pass + + +class ApiPlaceTest(unittest.TestCase): + def setUp(self): + self.api = twitter.Api( + consumer_key='test', + consumer_secret='test', + access_token_key='test', + access_token_secret='test' + ) + self.base_url = 'https://api.twitter.com/1.1' + self._stderr = sys.stderr + sys.stderr = ErrNull() + + def tearDown(self): + sys.stderr = self._stderr + pass + + @responses.activate + def testGetStatusWithPlace(self): + with open('testdata/get_status_with_place.json') as f: + resp_data = f.read() + responses.add(GET, DEFAULT_URL, body=resp_data) + + resp = self.api.GetStatus(1051204790334746624) + self.assertTrue(isinstance(resp, twitter.Status)) + self.assertTrue(isinstance(resp.place, twitter.Place)) + self.assertEqual(resp.id, 1051204790334746624) From a38ac1d6601f19bc99da9c2fe0f606397f2bfe2f Mon Sep 17 00:00:00 2001 From: tuftedocelot Date: Sun, 14 Oct 2018 15:56:50 -0500 Subject: [PATCH 10/35] Add testing of using a Place when posting a new update --- testdata/post_update_with_place.json | 59 ++++++++++++++++++++++++++++ tests/test_status_place.py | 11 +++++- 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 testdata/post_update_with_place.json diff --git a/testdata/post_update_with_place.json b/testdata/post_update_with_place.json new file mode 100644 index 00000000..ee3369cd --- /dev/null +++ b/testdata/post_update_with_place.json @@ -0,0 +1,59 @@ +{ + "created_at": "Sun Oct 14 20:44:37 +0000 2018", + "hashtags": [], + "id": 1051574521818435584, + "id_str": "1051574521818435584", + "lang": "en", + "place": { + "bounding_box": { + "coordinates": [ + [ + [ + -105.14544044849526, + 40.19213775503984 + ], + [ + -105.14544044849526, + 40.19213775503984 + ], + [ + -105.14544044849526, + 40.19213775503984 + ], + [ + -105.14544044849526, + 40.19213775503984 + ] + ] + ], + "type": "Polygon" + }, + "full_name": "McIntosh Lake", + "id": "07d9db48bc083000", + "name": "McIntosh Lake", + "place_type": "poi", + "url": "https://api.twitter.com/1.1/geo/id/07d9db48bc083000.json" + }, + "urls": [], + "user": { + "created_at": "Sat May 26 17:34:57 +0000 2018", + "default_profile": true, + "default_profile_image": true, + "geo_enabled": true, + "id": 1000430098892378113, + "id_str": "1000430098892378113", + "lang": "en", + "name": "DECKSET", + "profile_background_color": "F5F8FA", + "profile_image_url": "http://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png", + "profile_image_url_https": "https://abs.twimg.com/sticky/default_profile_images/default_profile_normal.png", + "profile_link_color": "1DA1F2", + "profile_sidebar_border_color": "C0DEED", + "profile_sidebar_fill_color": "DDEEF6", + "profile_text_color": "333333", + "profile_use_background_image": true, + "screen_name": "DECKSET1", + "statuses_count": 1 + }, + "user_mentions": [] +} \ No newline at end of file diff --git a/tests/test_status_place.py b/tests/test_status_place.py index fd485ae1..628bc229 100644 --- a/tests/test_status_place.py +++ b/tests/test_status_place.py @@ -3,7 +3,7 @@ import sys import twitter import responses -from responses import GET +from responses import GET, POST DEFAULT_URL = re.compile(r'https?://.*\.twitter.com/1\.1/.*') @@ -43,3 +43,12 @@ def testGetStatusWithPlace(self): self.assertTrue(isinstance(resp, twitter.Status)) self.assertTrue(isinstance(resp.place, twitter.Place)) self.assertEqual(resp.id, 1051204790334746624) + + @responses.activate + def testPostUpdateWithPlace(self): + with open('testdata/post_update_with_place.json') as f: + resp_data = f.read() + responses.add(POST, DEFAULT_URL, body=resp_data, status=200) + + post = self.api.PostUpdate('test place', place_id='07d9db48bc083000') + self.assertEqual(post.place.id, '07d9db48bc083000') From 0d51325049edf8801beac79503de0db192091f10 Mon Sep 17 00:00:00 2001 From: Fitblip Date: Thu, 21 Feb 2019 16:46:48 -0500 Subject: [PATCH 11/35] Fix typing issue in `Api._ParseAndCheckTwitter` Right now whenever the twitter API returns an un-parsable response that isn't explicitly known/handled, the TwitterException sets the message parameter to a `set` type, not a `dict` type or a `str` type (which is used in some cases elsewhere). This is causing errors for me as I'm inspecting this exception for graceful error handling, and received a `set` much to my surprise! Looks to me like a copy/paste bug. I'd like to have it be a `dict`, but if you think a `str` is more appropriate that works too! Thanks for the great library :) --- twitter/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/twitter/api.py b/twitter/api.py index b1268bcf..b01a6272 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -4965,7 +4965,7 @@ def _ParseAndCheckTwitter(self, json_data): raise TwitterError({'message': "Exceeded connection limit for user"}) if "Error 401 Unauthorized" in json_data: raise TwitterError({'message': "Unauthorized"}) - raise TwitterError({'Unknown error': '{0}'.format(json_data)}) + raise TwitterError({'message': 'Unknown error': '{0}'.format(json_data)}) self._CheckForTwitterError(data) return data From 5afb1563c79e9efe912df98e00c44ae4fdfdf710 Mon Sep 17 00:00:00 2001 From: Martin Kolman Date: Tue, 14 Jan 2020 02:20:15 +0100 Subject: [PATCH 12/35] Add documented but missing count to GetLists() The GetLists() method documents the count parameter, which is actually not available in the method signature and can't be used. Due to this, the GetLists() method is basically limited to retrieving ~300 lists at once, as the internally called GetListsPaged() method will retrieve only 20 lists at once and will hit rate limits after 15 calls in a row. So add "count" to the method signature and pass it to GetListsPaged(). Also add a note about rate limits & hint to bump "count" once they start to be hit. With this change a caller that passes say 500 as "count" (tested) can retrieve 300+ lists without unnecessarily hitting rate limits. --- twitter/api.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..40b94857 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -4470,7 +4470,8 @@ def GetListsPaged(self, def GetLists(self, user_id=None, - screen_name=None): + screen_name=None, + count=20): """Fetch the sequence of lists for a user. If no user_id or screen_name is passed, the data returned will be for the authenticated user. @@ -4482,6 +4483,8 @@ def GetLists(self, for. [Optional] count: The amount of results to return per page. + Consider bumping this up if you are getting rate limit issues + with GetLists(), generally at > 15 * 20 = 300 lists. No more than 1000 results will ever be returned in a single page. Defaults to 20. [Optional] cursor: @@ -4500,7 +4503,8 @@ def GetLists(self, next_cursor, prev_cursor, lists = self.GetListsPaged( user_id=user_id, screen_name=screen_name, - cursor=cursor) + cursor=cursor, + count=count) result += lists if next_cursor == 0 or next_cursor == prev_cursor: break From eecccff4b2886ca00c062b4139169d0db4a64cf6 Mon Sep 17 00:00:00 2001 From: Miguel Sozinho Ramalho <19508417+msramalho@users.noreply.github.com> Date: Fri, 14 Feb 2020 15:13:12 +0000 Subject: [PATCH 13/35] fixed inconsistent naming of variable GetRetweets used to have `statusid` instead of `status_id` --- twitter/api.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..0cbd8be9 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -1676,14 +1676,14 @@ def GetReplies(self, exclude_replies=False, include_rts=False) def GetRetweets(self, - statusid, + status_id, count=None, trim_user=False): """Returns up to 100 of the first retweets of the tweet identified - by statusid + by status_id Args: - statusid (int): + status_id (int): The ID of the tweet for which retweets should be searched for count (int, optional): The number of status messages to retrieve. @@ -1692,9 +1692,9 @@ def GetRetweets(self, otherwise the payload will contain the full user data item. Returns: - A list of twitter.Status instances, which are retweets of statusid + A list of twitter.Status instances, which are retweets of status_id """ - url = '%s/statuses/retweets/%s.json' % (self.base_url, statusid) + url = '%s/statuses/retweets/%s.json' % (self.base_url, status_id) parameters = { 'trim_user': enf_type('trim_user', bool, trim_user), } From 71a33d4e07caa3bab64d0113cd86b56b6426c30f Mon Sep 17 00:00:00 2001 From: Simon Bohnen Date: Tue, 24 Mar 2020 09:36:02 +0100 Subject: [PATCH 14/35] Update documentation for GetListMembers --- twitter/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..a09b5851 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -4261,10 +4261,10 @@ def GetListMembers(self, user_timeline. Helpful for disambiguating when a valid screen name is also a user ID. skip_status (bool, optional): - If True the statuses will not be returned in the user items. + If True the statuses will not be returned in the user items. Defaults to False. include_entities (bool, optional): If False, the timeline will not contain additional metadata. - Defaults to True. + Defaults to False. Returns: list: A sequence of twitter.user.User instances, one for each From 6931e9a064c647319e6de12968dd5bee718fc913 Mon Sep 17 00:00:00 2001 From: Stephen Cowley Date: Sat, 11 Apr 2020 17:28:05 -0600 Subject: [PATCH 15/35] Update getting_started.rst --- doc/getting_started.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/getting_started.rst b/doc/getting_started.rst index 6dd64af6..b5044a18 100644 --- a/doc/getting_started.rst +++ b/doc/getting_started.rst @@ -52,6 +52,6 @@ At this point, you can test out your application using the keys under "Your Appl Note: Make sure to enclose your keys in quotes (ie, api = twitter.Api(consumer_key='1234567', ...) and so on) or you will receive a NameError. -If you are creating an application for end users/consumers, then you will want them to authorize you application, but that is outside the scope of this document. +If you are creating an application for end users/consumers, then you will want them to authorize your application, but that is outside the scope of this document. And that should be it! If you need a little more help, check out the `examples on Github `_. If you have an open source application using python-twitter, send us a link and we'll add a link to it here. From 29647e6cb2a050e9e9c4a02c865d0231e2e497fc Mon Sep 17 00:00:00 2001 From: Robert Huselius Date: Wed, 29 Apr 2020 23:44:03 +0200 Subject: [PATCH 16/35] Always add tweet_mode to API requests --- .gitignore | 6 ++++++ twitter/api.py | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 7ef3b53c..f5955911 100644 --- a/.gitignore +++ b/.gitignore @@ -53,3 +53,9 @@ violations.flake8.txt # Built docs doc/_build/** + +# Mypy cache +**/.mypy_cache + +# VS Code +**/.vscode diff --git a/twitter/api.py b/twitter/api.py index 13d88799..986b35f5 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -5107,6 +5107,8 @@ def _RequestUrl(self, url, verb, data=None, json=None, enforce_auth=True): if not data: data = {} + data['tweet_mode'] = self.tweet_mode + if verb == 'POST': if data: if 'media_ids' in data: @@ -5122,7 +5124,6 @@ def _RequestUrl(self, url, verb, data=None, json=None, enforce_auth=True): resp = 0 # POST request, but without data or json elif verb == 'GET': - data['tweet_mode'] = self.tweet_mode url = self._BuildUrl(url, extra_params=data) resp = self._session.get(url, auth=self.__auth, timeout=self._timeout, proxies=self.proxies) From 56ce285c04bf96a1beade0275bbbfadd2c3b6275 Mon Sep 17 00:00:00 2001 From: Thomas Braccia Date: Tue, 12 May 2020 13:57:19 -0600 Subject: [PATCH 17/35] Added code to check if it is a gif and over 5MB and if so notify twitter that it is a gif so that it will be uploaded. --- twitter/api.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..868d7b5b 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -1277,6 +1277,10 @@ def _UploadMediaChunkedInit(self, parameters['media_type'] = media_type parameters['total_bytes'] = file_size + # Without this GIF files over 5MB but less than 15MB will fail uploading. + if media_type == 'image/gif' and file_size > 5242880: + parameters['media_category'] = 'tweet_gif' + resp = self._RequestUrl(url, 'POST', data=parameters) data = self._ParseAndCheckTwitter(resp.content.decode('utf-8')) From fa1b12a68151fbe6df89d8739b9d3e83e318049f Mon Sep 17 00:00:00 2001 From: Armin Samii Date: Mon, 31 Aug 2020 19:41:20 -0400 Subject: [PATCH 18/35] Remove redundant PostDirectMessage it was listed twice --- twitter/api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..2c9a5a48 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -120,7 +120,6 @@ class Api(object): There are many other methods, including: >>> api.PostUpdates(status) - >>> api.PostDirectMessage(user, text) >>> api.GetUser(user) >>> api.GetReplies() >>> api.GetUserTimeline(user) From 913644a0030095798cc99dfbcf801bd398c335e7 Mon Sep 17 00:00:00 2001 From: BennyThink Date: Tue, 1 Dec 2020 13:10:59 +0800 Subject: [PATCH 19/35] replace mimetypes to filetype mimetypes relies on file extension, while filetype relies on file header which is more stable. --- requirements.txt | 1 + setup.py | 2 +- twitter/twitter_utils.py | 7 ++----- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index cbbb9376..fc12ad28 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ requests requests-oauthlib +filetype diff --git a/setup.py b/setup.py index 1a0a4120..38062f47 100755 --- a/setup.py +++ b/setup.py @@ -56,7 +56,7 @@ def extract_metaitem(meta): download_url=extract_metaitem('download_url'), packages=find_packages(exclude=('tests', 'docs')), platforms=['Any'], - install_requires=['requests', 'requests-oauthlib'], + install_requires=['requests', 'requests-oauthlib', 'filetype'], setup_requires=['pytest-runner'], tests_require=['pytest'], keywords='twitter api', diff --git a/twitter/twitter_utils.py b/twitter/twitter_utils.py index a4a07a36..02e1ded3 100644 --- a/twitter/twitter_utils.py +++ b/twitter/twitter_utils.py @@ -2,7 +2,7 @@ """Collection of utilities for use in API calls, functions.""" from __future__ import unicode_literals -import mimetypes +import filetype import os import re import sys @@ -274,10 +274,7 @@ def parse_media_file(passed_media, async_upload=False): except Exception as e: pass - media_type = mimetypes.guess_type(os.path.basename(filename))[0] - # The .srt extension is not recognised by the mimetypes module. - if os.path.basename(filename).endswith('.srt'): - media_type = 'text/srt' + media_type = filetype.guess_mime(data_file.name) if media_type is not None: if media_type in img_formats and file_size > 5 * 1048576: raise TwitterError({'message': 'Images must be less than 5MB.'}) From dc449cc39d63a4fdb354bf9165611b49816aa50d Mon Sep 17 00:00:00 2001 From: Tim Gates Date: Thu, 24 Dec 2020 17:51:45 +1100 Subject: [PATCH 20/35] docs: fix simple typo, unsuccesful -> unsuccessful There is a small typo in twitter/api.py. Should read `unsuccessful` rather than `unsuccesful`. --- twitter/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..c6e96212 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -1403,7 +1403,7 @@ def UploadMediaChunked(self, Returns: media_id: ID of the uploaded media returned by the Twitter API. Raises if - unsuccesful. + unsuccessful. """ media_id, media_fp, filename = self._UploadMediaChunkedInit(media=media, From 2b99c95677d12ec4152696bdd7b12c341895ee81 Mon Sep 17 00:00:00 2001 From: Oliver Cardoza Date: Sun, 27 Dec 2020 02:32:12 -0500 Subject: [PATCH 21/35] fixed "ambiguous error name" error blocking tests --- tests/test_api_30.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/test_api_30.py b/tests/test_api_30.py index 1cd09f49..d6e349e9 100644 --- a/tests/test_api_30.py +++ b/tests/test_api_30.py @@ -1017,7 +1017,7 @@ def testGetSubscriptionsSN(self): resp = self.api.GetSubscriptions(screen_name='inky') self.assertEqual(len(resp), 20) - self.assertTrue([isinstance(l, twitter.List) for l in resp]) + self.assertTrue([isinstance(lst, twitter.List) for lst in resp]) @responses.activate def testGetMemberships(self): @@ -1289,7 +1289,7 @@ def testGetStatuses(self): rsps.add(GET, DEFAULT_URL, body=resp_data) with open('testdata/get_statuses.ids.txt') as f: - status_ids = [int(l) for l in f] + status_ids = [int(line) for line in f] resp = self.api.GetStatuses(status_ids) @@ -1312,7 +1312,7 @@ def testGetStatusesMap(self): rsps.add(GET, DEFAULT_URL, body=resp_data) with open('testdata/get_statuses.ids.txt') as f: - status_ids = [int(l) for l in f] + status_ids = [int(line) for line in f] resp = self.api.GetStatuses(status_ids, map=True) From c0160881349a17fe9ae353656f42fb599a2ac692 Mon Sep 17 00:00:00 2001 From: Oliver Cardoza Date: Sun, 27 Dec 2020 02:57:24 -0500 Subject: [PATCH 22/35] Fix issue where GetListMembers would only return the first 100 members. The Twitter API appears to return the same value for `next_cursor` and `previous_cursor` even when there is another page. I've updated the test data to reflect reality. Then I added test assertions to verify pages are concatenated. Finally applied fix to ensure test passes. --- testdata/get_list_members_0.json | 2 +- tests/test_api_30.py | 6 +++++- twitter/api.py | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/testdata/get_list_members_0.json b/testdata/get_list_members_0.json index aa1488dd..651cce5c 100644 --- a/testdata/get_list_members_0.json +++ b/testdata/get_list_members_0.json @@ -1 +1 @@ -{"next_cursor": 4611686020936348428, "users": [{"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 24, "profile_image_url": "http://pbs.twimg.com/profile_images/659410881806135296/PdVxDc0W_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 362, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 4048395140, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 106, "friends_count": 0, "location": "", "description": "I am a bot that simulates a series of mechanical linkages (+ noise) to draw a curve 4x/day. // by @tinysubversions, inspired by @ra & @bahrami_", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/659410881806135296/PdVxDc0W_normal.png", "geo_enabled": false, "time_zone": null, "name": "Spinny Machine", "id_str": "4048395140", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CZ9xAlyWQAAVsZk.mp4"}], "aspect_ratio": [1, 1]}, "id": 693397122595569664, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "display_url": "pic.twitter.com/n6lbayOFFQ", "indices": [30, 53], "expanded_url": "http://twitter.com/spinnymachine/status/693397123023396864/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 360, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 360, "h": 360}}, "id_str": "693397122595569664", "url": "https://t.co/n6lbayOFFQ"}]}, "truncated": false, "id": 693397123023396864, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "a casually scorched northeast https://t.co/n6lbayOFFQ", "id_str": "693397123023396864", "entities": {"media": [{"type": "photo", "id": 693397122595569664, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "display_url": "pic.twitter.com/n6lbayOFFQ", "indices": [30, 53], "expanded_url": "http://twitter.com/spinnymachine/status/693397123023396864/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 360, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 360, "h": 360}}, "id_str": "693397122595569664", "url": "https://t.co/n6lbayOFFQ"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Spinny Machine", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 11:35:31 +0000 2016"}, "is_translator": false, "screen_name": "spinnymachine", "created_at": "Wed Oct 28 16:43:01 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 6, "profile_image_url": "http://pbs.twimg.com/profile_images/658781950472138752/FOQCSbLg_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "https://t.co/OOS2jbeYND", "statuses_count": 135, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 4029020052, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "DBAF44", "followers_count": 23, "friends_count": 2, "location": "TV", "profile_banner_url": "https://pbs.twimg.com/profile_banners/4029020052/1445900976", "description": "I'm a bot that tweets fake Empire plots, inspired by @eveewing https://t.co/OOS2jbeYND // by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/658781950472138752/FOQCSbLg_normal.png", "geo_enabled": false, "time_zone": null, "name": "Empire Plots Bot", "id_str": "4029020052", "entities": {"description": {"urls": [{"display_url": "twitter.com/eveewing/statu\u2026", "indices": [63, 86], "expanded_url": "https://twitter.com/eveewing/status/658478802327183360", "url": "https://t.co/OOS2jbeYND"}]}, "url": {"urls": [{"display_url": "twitter.com/eveewing/statu\u2026", "indices": [0, 23], "expanded_url": "https://twitter.com/eveewing/status/658478802327183360", "url": "https://t.co/OOS2jbeYND"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 671831157646876672, "media_url": "http://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "media_url_https": "https://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "display_url": "pic.twitter.com/EQ8oGhG502", "indices": [101, 124], "expanded_url": "http://twitter.com/EmpirePlots/status/671831157739118593/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 400}, "small": {"resize": "fit", "w": 300, "h": 400}, "large": {"resize": "fit", "w": 300, "h": 400}}, "id_str": "671831157646876672", "url": "https://t.co/EQ8oGhG502"}]}, "truncated": false, "id": 671831157739118593, "place": null, "favorite_count": 1, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Jamal is stuck in a wild forest with Kene Holliday and can't find their way out (it's just a dream). https://t.co/EQ8oGhG502", "id_str": "671831157739118593", "entities": {"media": [{"type": "photo", "id": 671831157646876672, "media_url": "http://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "media_url_https": "https://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "display_url": "pic.twitter.com/EQ8oGhG502", "indices": [101, 124], "expanded_url": "http://twitter.com/EmpirePlots/status/671831157739118593/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 400}, "small": {"resize": "fit", "w": 300, "h": 400}, "large": {"resize": "fit", "w": 300, "h": 400}}, "id_str": "671831157646876672", "url": "https://t.co/EQ8oGhG502"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Empire Plots Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Tue Dec 01 23:20:04 +0000 2015"}, "is_translator": false, "screen_name": "EmpirePlots", "created_at": "Mon Oct 26 22:49:42 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 25, "profile_image_url": "http://pbs.twimg.com/profile_images/652238580765462528/BQVTvFS9_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 346, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3829470974, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "027F45", "followers_count": 287, "friends_count": 1, "location": "Portland, OR", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3829470974/1444340849", "description": "Portland is such a weird place! We show real pics of places in Portland! ONLY IN PORTLAND as they say! // a bot by @tinysubversions, 4x daily", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/652238580765462528/BQVTvFS9_normal.png", "geo_enabled": false, "time_zone": null, "name": "Wow So Portland!", "id_str": "3829470974", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693471873166761984, "media_url": "http://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "display_url": "pic.twitter.com/CF8JrGCQcY", "indices": [57, 80], "expanded_url": "http://twitter.com/wowsoportland/status/693471873246502912/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 600, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 170}, "medium": {"resize": "fit", "w": 600, "h": 300}}, "id_str": "693471873166761984", "url": "https://t.co/CF8JrGCQcY"}]}, "truncated": false, "id": 693471873246502912, "place": null, "favorite_count": 1, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "those silly Portlanders are always up to something funny https://t.co/CF8JrGCQcY", "id_str": "693471873246502912", "entities": {"media": [{"type": "photo", "id": 693471873166761984, "media_url": "http://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "display_url": "pic.twitter.com/CF8JrGCQcY", "indices": [57, 80], "expanded_url": "http://twitter.com/wowsoportland/status/693471873246502912/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 600, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 170}, "medium": {"resize": "fit", "w": 600, "h": 300}}, "id_str": "693471873166761984", "url": "https://t.co/CF8JrGCQcY"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Wow so portland", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 16:32:33 +0000 2016"}, "is_translator": false, "screen_name": "wowsoportland", "created_at": "Thu Oct 08 21:38:27 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 28, "profile_image_url": "http://pbs.twimg.com/profile_images/650161232540909568/yyvPEOnF_normal.jpg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "https://t.co/8fYJI1TWEs", "statuses_count": 515, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3765991992, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "ABB8C2", "followers_count": 331, "friends_count": 1, "location": "Mare Tranquilitatis", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3765991992/1443845573", "description": "Tweeting pics from the Project Apollo Archive, four times a day. Not affiliated with the Project Apollo Archive. // a bot by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": -28800, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/650161232540909568/yyvPEOnF_normal.jpg", "geo_enabled": false, "time_zone": "Pacific Time (US & Canada)", "name": "Moon Shot Bot", "id_str": "3765991992", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "flickr.com/photos/project\u2026", "indices": [0, 23], "expanded_url": "https://www.flickr.com/photos/projectapolloarchive/", "url": "https://t.co/8fYJI1TWEs"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693470001316171776, "media_url": "http://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "display_url": "pic.twitter.com/2j5ezW6i9G", "indices": [103, 126], "expanded_url": "http://twitter.com/moonshotbot/status/693470003249684481/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1070}, "small": {"resize": "fit", "w": 340, "h": 355}, "medium": {"resize": "fit", "w": 600, "h": 627}}, "id_str": "693470001316171776", "url": "https://t.co/2j5ezW6i9G"}]}, "truncated": false, "id": 693470003249684481, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "\ud83c\udf0c\ud83c\udf18\ud83c\udf1b\nApollo 15 Hasselblad image from film magazine 97/O - lunar orbit view\n\ud83d\ude80\ud83c\udf1a\ud83c\udf19\n https://t.co/n4WH1ZTyuZ https://t.co/2j5ezW6i9G", "id_str": "693470003249684481", "entities": {"media": [{"type": "photo", "id": 693470001316171776, "media_url": "http://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "display_url": "pic.twitter.com/2j5ezW6i9G", "indices": [103, 126], "expanded_url": "http://twitter.com/moonshotbot/status/693470003249684481/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1070}, "small": {"resize": "fit", "w": 340, "h": 355}, "medium": {"resize": "fit", "w": 600, "h": 627}}, "id_str": "693470001316171776", "url": "https://t.co/2j5ezW6i9G"}], "hashtags": [], "urls": [{"display_url": "flickr.com/photos/project\u2026", "indices": [79, 102], "expanded_url": "https://www.flickr.com/photos/projectapolloarchive/21831461788", "url": "https://t.co/n4WH1ZTyuZ"}], "symbols": [], "user_mentions": []}, "source": "Moon Shot Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 16:25:07 +0000 2016"}, "is_translator": false, "screen_name": "moonshotbot", "created_at": "Sat Oct 03 04:03:02 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 17, "profile_image_url": "http://pbs.twimg.com/profile_images/629374160993710081/q-lr9vsE_normal.jpg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/mRUwkqVO7i", "statuses_count": 598, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3406094211, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 133, "friends_count": 0, "location": "Not affiliated with the FBI", "description": "I tweet random pages from FOIA-requested FBI records, 4x/day. I'm a bot by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/629374160993710081/q-lr9vsE_normal.jpg", "geo_enabled": false, "time_zone": null, "name": "FBI Bot", "id_str": "3406094211", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "vault.fbi.gov", "indices": [0, 22], "expanded_url": "http://vault.fbi.gov", "url": "http://t.co/mRUwkqVO7i"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693483330080210944, "media_url": "http://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "media_url_https": "https://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "display_url": "pic.twitter.com/Dey5JLxCvb", "indices": [63, 86], "expanded_url": "http://twitter.com/FBIbot/status/693483330218622976/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 776}, "small": {"resize": "fit", "w": 340, "h": 439}, "large": {"resize": "fit", "w": 1000, "h": 1294}}, "id_str": "693483330080210944", "url": "https://t.co/Dey5JLxCvb"}]}, "truncated": false, "id": 693483330218622976, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "The FBI was watching Fred G. Randaccio https://t.co/NAkQc4FYKp https://t.co/Dey5JLxCvb", "id_str": "693483330218622976", "entities": {"media": [{"type": "photo", "id": 693483330080210944, "media_url": "http://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "media_url_https": "https://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "display_url": "pic.twitter.com/Dey5JLxCvb", "indices": [63, 86], "expanded_url": "http://twitter.com/FBIbot/status/693483330218622976/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 776}, "small": {"resize": "fit", "w": 340, "h": 439}, "large": {"resize": "fit", "w": 1000, "h": 1294}}, "id_str": "693483330080210944", "url": "https://t.co/Dey5JLxCvb"}], "hashtags": [], "urls": [{"display_url": "vault.fbi.gov/frank-randaccio", "indices": [39, 62], "expanded_url": "https://vault.fbi.gov/frank-randaccio", "url": "https://t.co/NAkQc4FYKp"}], "symbols": [], "user_mentions": []}, "source": "FBIBot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 17:18:04 +0000 2016"}, "is_translator": false, "screen_name": "FBIbot", "created_at": "Thu Aug 06 19:28:10 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 23, "profile_image_url": "http://pbs.twimg.com/profile_images/631231593164607488/R4hRHjBI_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/6cpr8h0hGa", "statuses_count": 664, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3312790286, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "4A913C", "followers_count": 239, "friends_count": 0, "location": "", "description": "Animal videos sourced from @macaulaylibrary. Turn up the sound! // A bot by @tinysubversions. Not affiliated with the Macaulay Library.", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/631231593164607488/R4hRHjBI_normal.png", "geo_enabled": false, "time_zone": null, "name": "Animal Video Bot", "id_str": "3312790286", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "macaulaylibrary.org", "indices": [0, 22], "expanded_url": "http://macaulaylibrary.org/", "url": "http://t.co/6cpr8h0hGa"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "ro", "extended_entities": {"media": [{"type": "video", "video_info": {"variants": [{"content_type": "video/webm", "bitrate": 832000, "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/vid/640x360/hY01KGCSXl-isZzt.webm"}, {"content_type": "video/mp4", "bitrate": 320000, "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/vid/320x180/3NEGIMyzX2tdBm5i.mp4"}, {"content_type": "video/mp4", "bitrate": 832000, "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/vid/640x360/hY01KGCSXl-isZzt.mp4"}, {"content_type": "application/x-mpegURL", "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/pl/G53mlN6oslnMAWd5.m3u8"}, {"content_type": "application/dash+xml", "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/pl/G53mlN6oslnMAWd5.mpd"}], "aspect_ratio": [16, 9], "duration_millis": 20021}, "id": 693439580935094273, "media_url": "http://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "display_url": "pic.twitter.com/aaGNPmPpni", "indices": [85, 108], "expanded_url": "http://twitter.com/AnimalVidBot/status/693439595946479617/video/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 640, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 191}, "medium": {"resize": "fit", "w": 600, "h": 338}}, "id_str": "693439580935094273", "url": "https://t.co/aaGNPmPpni"}]}, "truncated": false, "id": 693439595946479617, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Maui Parrotbill\n\nPseudonestor xanthophrys\nBarksdale, Timothy https://t.co/c6n9M2Cjnv https://t.co/aaGNPmPpni", "id_str": "693439595946479617", "entities": {"media": [{"type": "photo", "id": 693439580935094273, "media_url": "http://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "display_url": "pic.twitter.com/aaGNPmPpni", "indices": [85, 108], "expanded_url": "http://twitter.com/AnimalVidBot/status/693439595946479617/video/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 640, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 191}, "medium": {"resize": "fit", "w": 600, "h": 338}}, "id_str": "693439580935094273", "url": "https://t.co/aaGNPmPpni"}], "hashtags": [], "urls": [{"display_url": "macaulaylibrary.org/video/428118", "indices": [61, 84], "expanded_url": "http://macaulaylibrary.org/video/428118", "url": "https://t.co/c6n9M2Cjnv"}], "symbols": [], "user_mentions": []}, "source": "Animal Video Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 14:24:17 +0000 2016"}, "is_translator": false, "screen_name": "AnimalVidBot", "created_at": "Tue Aug 11 22:25:35 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 10, "profile_image_url": "http://pbs.twimg.com/profile_images/624358417818238976/CfSPOEr4_normal.jpg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/YEWmunbcFZ", "statuses_count": 4, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3300809963, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 56, "friends_count": 0, "location": "The Most Relevant Ad Agency", "description": "The most happenin' new trends on the internet. // A bot by @tinysubversions.", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/624358417818238976/CfSPOEr4_normal.jpg", "geo_enabled": false, "time_zone": null, "name": "Trend Reportz", "id_str": "3300809963", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "slideshare.net/trendreportz", "indices": [0, 22], "expanded_url": "http://www.slideshare.net/trendreportz", "url": "http://t.co/YEWmunbcFZ"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 1, "lang": "en", "truncated": false, "id": 638389840472600576, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "NEW REPORT! Learn what steamers mean to 7-18 y/o men http://t.co/veQGWz1Lqn", "id_str": "638389840472600576", "entities": {"hashtags": [], "urls": [{"display_url": "slideshare.net/trendreportz/t\u2026", "indices": [53, 75], "expanded_url": "http://www.slideshare.net/trendreportz/trends-in-steamers", "url": "http://t.co/veQGWz1Lqn"}], "symbols": [], "user_mentions": []}, "source": "Trend Reportz", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Mon Aug 31 16:36:13 +0000 2015"}, "is_translator": false, "screen_name": "TrendReportz", "created_at": "Wed May 27 19:43:37 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 14, "profile_image_url": "http://pbs.twimg.com/profile_images/585540228439498752/OPHSe1Yw_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/lrCYkDGPrm", "statuses_count": 888, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3145355109, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 106, "friends_count": 1, "location": "The Middle East", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3145355109/1428438665", "description": "Public domain photos from the Qatar Digital Library of Middle Eastern (& nearby) history. Tweets 4x/day. // bot by @tinysubversions, not affiliated with the QDL", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/585540228439498752/OPHSe1Yw_normal.png", "geo_enabled": false, "time_zone": null, "name": "Middle East History", "id_str": "3145355109", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "qdl.qa/en/search/site\u2026", "indices": [0, 22], "expanded_url": "http://www.qdl.qa/en/search/site/?f%5B0%5D=document_source%3Aarchive_source", "url": "http://t.co/lrCYkDGPrm"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693479308619300866, "media_url": "http://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "display_url": "pic.twitter.com/xojYCSnUZu", "indices": [72, 95], "expanded_url": "http://twitter.com/MidEastHistory/status/693479308745113600/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1024}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 600, "h": 600}}, "id_str": "693479308619300866", "url": "https://t.co/xojYCSnUZu"}]}, "truncated": false, "id": 693479308745113600, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "'Distant View of Hormuz.' Photographer: Unknown https://t.co/hkDmSbTLgT https://t.co/xojYCSnUZu", "id_str": "693479308745113600", "entities": {"media": [{"type": "photo", "id": 693479308619300866, "media_url": "http://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "display_url": "pic.twitter.com/xojYCSnUZu", "indices": [72, 95], "expanded_url": "http://twitter.com/MidEastHistory/status/693479308745113600/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1024}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 600, "h": 600}}, "id_str": "693479308619300866", "url": "https://t.co/xojYCSnUZu"}], "hashtags": [], "urls": [{"display_url": "qdl.qa//en/archive/81\u2026", "indices": [48, 71], "expanded_url": "http://www.qdl.qa//en/archive/81055/vdc_100024111424.0x00000f", "url": "https://t.co/hkDmSbTLgT"}], "symbols": [], "user_mentions": []}, "source": "Mid east history pics", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 17:02:06 +0000 2016"}, "is_translator": false, "screen_name": "MidEastHistory", "created_at": "Tue Apr 07 20:27:15 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 99, "profile_image_url": "http://pbs.twimg.com/profile_images/584076161325473793/gufAEGJv_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/s6OmUwb6Bn", "statuses_count": 91531, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3131670665, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "ABB8C2", "followers_count": 46186, "friends_count": 1, "location": "Hogwarts", "description": "I'm the Sorting Hat and I'm here to say / I love sorting students in a major way // a bot by @tinysubversions, follow to get sorted!", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 1, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/584076161325473793/gufAEGJv_normal.png", "geo_enabled": false, "time_zone": null, "name": "The Sorting Hat Bot", "id_str": "3131670665", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "tinysubversions.com/notes/sorting-\u2026", "indices": [0, 22], "expanded_url": "http://tinysubversions.com/notes/sorting-bot/", "url": "http://t.co/s6OmUwb6Bn"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693474779018362880, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": 1210222826, "in_reply_to_status_id": null, "in_reply_to_screen_name": "Nyrfall", "text": "@Nyrfall The Sorting time is here at last, I know each time you send\nI've figured out that Slytherin's the right place for your blend", "id_str": "693474779018362880", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": [{"indices": [0, 8], "id": 1210222826, "name": "Desi Sobrino", "screen_name": "Nyrfall", "id_str": "1210222826"}]}, "source": "The Sorting Hat Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": "1210222826", "retweeted": false, "created_at": "Sat Jan 30 16:44:06 +0000 2016"}, "is_translator": false, "screen_name": "SortingBot", "created_at": "Fri Apr 03 19:27:31 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 34, "profile_image_url": "http://pbs.twimg.com/profile_images/580173179236196352/nWsIPbqH_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/2YPE0x0Knw", "statuses_count": 1233, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3105672877, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 424, "friends_count": 0, "location": "NYC", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3105672877/1427159206", "description": "Posting random flyers from hip hop's formative years every 6 hours. Most art by Buddy Esquire and Phase 2. Full collection at link. // a bot by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/580173179236196352/nWsIPbqH_normal.png", "geo_enabled": false, "time_zone": null, "name": "Old School Flyers", "id_str": "3105672877", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "toledohiphop.org/images/old_sch\u2026", "indices": [0, 22], "expanded_url": "http://www.toledohiphop.org/images/old_school_source_code/", "url": "http://t.co/2YPE0x0Knw"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "und", "extended_entities": {"media": [{"type": "photo", "id": 693422418480742400, "media_url": "http://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "display_url": "pic.twitter.com/B7jv7lwB9S", "indices": [0, 23], "expanded_url": "http://twitter.com/oldschoolflyers/status/693422418929524736/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 503, "h": 646}, "small": {"resize": "fit", "w": 340, "h": 435}, "medium": {"resize": "fit", "w": 503, "h": 646}}, "id_str": "693422418480742400", "url": "https://t.co/B7jv7lwB9S"}]}, "truncated": false, "id": 693422418929524736, "place": null, "favorite_count": 1, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "https://t.co/B7jv7lwB9S", "id_str": "693422418929524736", "entities": {"media": [{"type": "photo", "id": 693422418480742400, "media_url": "http://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "display_url": "pic.twitter.com/B7jv7lwB9S", "indices": [0, 23], "expanded_url": "http://twitter.com/oldschoolflyers/status/693422418929524736/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 503, "h": 646}, "small": {"resize": "fit", "w": 340, "h": 435}, "medium": {"resize": "fit", "w": 503, "h": 646}}, "id_str": "693422418480742400", "url": "https://t.co/B7jv7lwB9S"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "oldschoolflyers", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 13:16:02 +0000 2016"}, "is_translator": false, "screen_name": "oldschoolflyers", "created_at": "Tue Mar 24 00:55:10 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 41, "profile_image_url": "http://pbs.twimg.com/profile_images/561971159927771136/sEQ5u1zM_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 1396, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3010688583, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "961EE4", "followers_count": 243, "friends_count": 1, "location": "", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3010688583/1422819642", "description": "DAD: weird conversation joke is bae ME: ugh dad no DAD: [something unhip] // a bot by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/561971159927771136/sEQ5u1zM_normal.png", "geo_enabled": false, "time_zone": null, "name": "Weird Convo Bot", "id_str": "3010688583", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693429980093620224, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "DOG: Wtf are you bae'\nME: fart. Ugh.\nDOG: so sex with me is sex vape\nME: Wtf are you skeleton'", "id_str": "693429980093620224", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "WeirdConvoBot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 13:46:05 +0000 2016"}, "is_translator": false, "screen_name": "WeirdConvoBot", "created_at": "Sun Feb 01 19:05:21 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 110, "profile_image_url": "http://pbs.twimg.com/profile_images/556129692554493953/82ISdQxF_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/3gDtETAFpu", "statuses_count": 1510, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2981339967, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 1308, "friends_count": 1, "location": "Frankfurt School", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2981339967/1421426775", "description": "We love #innovation and are always thinking of the next #disruptive startup #idea! // a bot by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 1, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/556129692554493953/82ISdQxF_normal.png", "geo_enabled": false, "time_zone": null, "name": "Hottest Startups", "id_str": "2981339967", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "marxists.org/archive/index.\u2026", "indices": [0, 22], "expanded_url": "http://www.marxists.org/archive/index.htm", "url": "http://t.co/3gDtETAFpu"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693477791883350016, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Startup idea: The architect thinks of the building contractor as a layman who tells him what he needs and what he can pay.", "id_str": "693477791883350016", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "hottest startups", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 16:56:04 +0000 2016"}, "is_translator": false, "screen_name": "HottestStartups", "created_at": "Fri Jan 16 16:33:45 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 40, "profile_image_url": "http://pbs.twimg.com/profile_images/549979314541039617/fZ_XDnWz_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 6748, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 2951486632, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "FFCC4D", "followers_count": 3155, "friends_count": 1, "location": "(bot by @tinysubversions)", "description": "We are the Academy For Annual Recognition and each year we give out the Yearly Awards. Follow (or re-follow) for your award! Warning: sometimes it's mean.", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 2, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/549979314541039617/fZ_XDnWz_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "The Yearly Awards", "id_str": "2951486632", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CZ-2l2fWwAEH6MB.mp4"}], "aspect_ratio": [4, 3]}, "id": 693473629036789761, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "display_url": "pic.twitter.com/XGDD3tMJPF", "indices": [86, 109], "expanded_url": "http://twitter.com/YearlyAwards/status/693473629766598656/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 400, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 255}, "large": {"resize": "fit", "w": 400, "h": 300}}, "id_str": "693473629036789761", "url": "https://t.co/XGDD3tMJPF"}]}, "truncated": false, "id": 693473629766598656, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": 4863901738, "in_reply_to_status_id": null, "in_reply_to_screen_name": "know_fast", "text": "@know_fast It's official: you're the Least Prodigiously Despondent Confidant of 2015! https://t.co/XGDD3tMJPF", "id_str": "693473629766598656", "entities": {"media": [{"type": "photo", "id": 693473629036789761, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "display_url": "pic.twitter.com/XGDD3tMJPF", "indices": [86, 109], "expanded_url": "http://twitter.com/YearlyAwards/status/693473629766598656/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 400, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 255}, "large": {"resize": "fit", "w": 400, "h": 300}}, "id_str": "693473629036789761", "url": "https://t.co/XGDD3tMJPF"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": [{"indices": [0, 10], "id": 4863901738, "name": "Know Fast", "screen_name": "know_fast", "id_str": "4863901738"}]}, "source": "The Yearly Awards", "contributors": null, "favorited": false, "in_reply_to_user_id_str": "4863901738", "retweeted": false, "created_at": "Sat Jan 30 16:39:32 +0000 2016"}, "is_translator": false, "screen_name": "YearlyAwards", "created_at": "Tue Dec 30 16:59:34 +0000 2014"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 20, "profile_image_url": "http://pbs.twimg.com/profile_images/512673377283080194/eFnJQJSp_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 1972, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 2817629347, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "ABB8C2", "followers_count": 93, "friends_count": 1, "location": "", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2817629347/1411065932", "description": "Wise sayings, four times daily. by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/512673377283080194/eFnJQJSp_normal.png", "geo_enabled": false, "time_zone": null, "name": "Received Wisdom", "id_str": "2817629347", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693418402392719360, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Water is thicker than blood.", "id_str": "693418402392719360", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Received Wisdom", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 13:00:04 +0000 2016"}, "is_translator": false, "screen_name": "received_wisdom", "created_at": "Thu Sep 18 18:32:38 +0000 2014"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 11, "profile_image_url": "http://pbs.twimg.com/profile_images/517404591218900992/kf2iYD1f_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 1767, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 2798799669, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "4A913C", "followers_count": 40, "friends_count": 0, "location": "Everywhere", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2798799669/1412195008", "description": "Chronicling men doing things. // A bot by @tinysubversions, Powered By Giphy", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/517404591218900992/kf2iYD1f_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "Men Doing Things", "id_str": "2798799669", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CZ-WORAWQAED6It.mp4"}], "aspect_ratio": [167, 104]}, "id": 693438039465541633, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "display_url": "pic.twitter.com/wsk2GyEsGh", "indices": [37, 60], "expanded_url": "http://twitter.com/MenDoing/status/693438039801073664/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 334, "h": 208}, "small": {"resize": "fit", "w": 334, "h": 208}, "large": {"resize": "fit", "w": 334, "h": 208}}, "id_str": "693438039465541633", "url": "https://t.co/wsk2GyEsGh"}]}, "truncated": false, "id": 693438039801073664, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Men Authoring Landmarks in Manhattan https://t.co/wsk2GyEsGh", "id_str": "693438039801073664", "entities": {"media": [{"type": "photo", "id": 693438039465541633, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "display_url": "pic.twitter.com/wsk2GyEsGh", "indices": [37, 60], "expanded_url": "http://twitter.com/MenDoing/status/693438039801073664/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 334, "h": 208}, "small": {"resize": "fit", "w": 334, "h": 208}, "large": {"resize": "fit", "w": 334, "h": 208}}, "id_str": "693438039465541633", "url": "https://t.co/wsk2GyEsGh"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Men Doing Things", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 14:18:06 +0000 2016"}, "is_translator": false, "screen_name": "MenDoing", "created_at": "Wed Oct 01 19:59:55 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 139, "profile_image_url": "http://pbs.twimg.com/profile_images/495988901790482432/le2-dKgs_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/r2HzjsqHTU", "statuses_count": 2157, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2704554914, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 1172, "friends_count": 1, "location": "", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2704554914/1407087962", "description": "A bot that picks a word and then draws randomly until an OCR library (http://t.co/XmDeI5TWoF) reads that word. 4x daily. Also on Tumblr. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/495988901790482432/le2-dKgs_normal.png", "geo_enabled": false, "time_zone": null, "name": "Reverse OCR", "id_str": "2704554914", "entities": {"description": {"urls": [{"display_url": "antimatter15.com/ocrad.js/demo.\u2026", "indices": [70, 92], "expanded_url": "http://antimatter15.com/ocrad.js/demo.html", "url": "http://t.co/XmDeI5TWoF"}]}, "url": {"urls": [{"display_url": "reverseocr.tumblr.com", "indices": [0, 22], "expanded_url": "http://reverseocr.tumblr.com", "url": "http://t.co/r2HzjsqHTU"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "und", "extended_entities": {"media": [{"type": "photo", "id": 693404391072776192, "media_url": "http://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "display_url": "pic.twitter.com/WbD9lkNarf", "indices": [8, 31], "expanded_url": "http://twitter.com/reverseocr/status/693404391160860673/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 150}, "small": {"resize": "fit", "w": 340, "h": 85}, "large": {"resize": "fit", "w": 800, "h": 200}}, "id_str": "693404391072776192", "url": "https://t.co/WbD9lkNarf"}]}, "truncated": false, "id": 693404391160860673, "place": null, "favorite_count": 2, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "larceny https://t.co/WbD9lkNarf", "id_str": "693404391160860673", "entities": {"media": [{"type": "photo", "id": 693404391072776192, "media_url": "http://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "display_url": "pic.twitter.com/WbD9lkNarf", "indices": [8, 31], "expanded_url": "http://twitter.com/reverseocr/status/693404391160860673/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 150}, "small": {"resize": "fit", "w": 340, "h": 85}, "large": {"resize": "fit", "w": 800, "h": 200}}, "id_str": "693404391072776192", "url": "https://t.co/WbD9lkNarf"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Reverse OCR", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 12:04:24 +0000 2016"}, "is_translator": false, "screen_name": "reverseocr", "created_at": "Sun Aug 03 17:26:28 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 5, "profile_image_url": "http://pbs.twimg.com/profile_images/479836451182362624/0fAtv_AN_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 2, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2577963498, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 14, "friends_count": 1, "location": "", "description": "Deploying GIFs every six hours. // by @tinysubvesions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/479836451182362624/0fAtv_AN_normal.png", "geo_enabled": false, "time_zone": null, "name": "GIF Deployer", "id_str": "2577963498", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/BqkTB2fIEAA8zCs.mp4"}], "aspect_ratio": [1, 1]}, "id": 479935757818531840, "media_url": "http://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "display_url": "pic.twitter.com/WEYISUSsJR", "indices": [21, 43], "expanded_url": "http://twitter.com/gifDeployer/status/479935760033153024/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 600}, "small": {"resize": "fit", "w": 340, "h": 340}, "large": {"resize": "fit", "w": 612, "h": 612}}, "id_str": "479935757818531840", "url": "http://t.co/WEYISUSsJR"}]}, "truncated": false, "id": 479935760033153024, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Vietnamese decadence http://t.co/WEYISUSsJR", "id_str": "479935760033153024", "entities": {"media": [{"type": "photo", "id": 479935757818531840, "media_url": "http://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "display_url": "pic.twitter.com/WEYISUSsJR", "indices": [21, 43], "expanded_url": "http://twitter.com/gifDeployer/status/479935760033153024/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 600}, "small": {"resize": "fit", "w": 340, "h": 340}, "large": {"resize": "fit", "w": 612, "h": 612}}, "id_str": "479935757818531840", "url": "http://t.co/WEYISUSsJR"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "GIF Deployer", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Fri Jun 20 10:36:16 +0000 2014"}, "is_translator": false, "screen_name": "gifDeployer", "created_at": "Fri Jun 20 03:56:13 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 48, "profile_image_url": "http://pbs.twimg.com/profile_images/479364877551538176/HN0wLHbt_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/XJeqwaDhQg", "statuses_count": 11970, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2575445382, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 428, "friends_count": 1, "location": "", "description": "Generating new aesthetics every hour. Botpunk. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": -18000, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/479364877551538176/HN0wLHbt_normal.png", "geo_enabled": false, "time_zone": "Eastern Time (US & Canada)", "name": "Brand New Aesthetics", "id_str": "2575445382", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "brand-new-aesthetics.tumblr.com", "indices": [0, 22], "expanded_url": "http://brand-new-aesthetics.tumblr.com", "url": "http://t.co/XJeqwaDhQg"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "da", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CX5BF-lWMAEyoPA.mp4"}], "aspect_ratio": [3, 2]}, "id": 684055764361687041, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "display_url": "pic.twitter.com/d4ZGIYqyt9", "indices": [13, 36], "expanded_url": "http://twitter.com/neweraesthetics/status/684055764768522240/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 200}, "small": {"resize": "fit", "w": 300, "h": 200}, "large": {"resize": "fit", "w": 300, "h": 200}}, "id_str": "684055764361687041", "url": "https://t.co/d4ZGIYqyt9"}]}, "truncated": false, "id": 684055764768522240, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "SOLUTIONPUNK https://t.co/d4ZGIYqyt9", "id_str": "684055764768522240", "entities": {"media": [{"type": "photo", "id": 684055764361687041, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "display_url": "pic.twitter.com/d4ZGIYqyt9", "indices": [13, 36], "expanded_url": "http://twitter.com/neweraesthetics/status/684055764768522240/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 200}, "small": {"resize": "fit", "w": 300, "h": 200}, "large": {"resize": "fit", "w": 300, "h": 200}}, "id_str": "684055764361687041", "url": "https://t.co/d4ZGIYqyt9"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Brand New Aesthetics", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Mon Jan 04 16:56:18 +0000 2016"}, "is_translator": false, "screen_name": "neweraesthetics", "created_at": "Wed Jun 18 20:39:25 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 12, "profile_image_url": "http://pbs.twimg.com/profile_images/479355596076892160/p_jT5KqM_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/DZYA6d8tU5", "statuses_count": 8587, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2575407888, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 113, "friends_count": 1, "location": "Bodymore, Murdaland", "description": "This Twitter account automatically tweets GIFs of The Wire. Also a Tumblr. Updates hourly. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 1, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/479355596076892160/p_jT5KqM_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "Scenes from The Wire", "id_str": "2575407888", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "wirescenes.tumblr.com", "indices": [0, 22], "expanded_url": "http://wirescenes.tumblr.com/", "url": "http://t.co/DZYA6d8tU5"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "und", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/COXAcgVU8AACS4W.mp4"}], "aspect_ratio": [132, 119]}, "id": 641130117918420992, "media_url": "http://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "display_url": "pic.twitter.com/XBoaB2klZq", "indices": [0, 22], "expanded_url": "http://twitter.com/wirescenes/status/641130118132314112/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 264, "h": 238}, "small": {"resize": "fit", "w": 264, "h": 238}, "medium": {"resize": "fit", "w": 264, "h": 238}}, "id_str": "641130117918420992", "url": "http://t.co/XBoaB2klZq"}]}, "truncated": false, "id": 641130118132314112, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "http://t.co/XBoaB2klZq", "id_str": "641130118132314112", "entities": {"media": [{"type": "photo", "id": 641130117918420992, "media_url": "http://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "display_url": "pic.twitter.com/XBoaB2klZq", "indices": [0, 22], "expanded_url": "http://twitter.com/wirescenes/status/641130118132314112/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 264, "h": 238}, "small": {"resize": "fit", "w": 264, "h": 238}, "medium": {"resize": "fit", "w": 264, "h": 238}}, "id_str": "641130117918420992", "url": "http://t.co/XBoaB2klZq"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Scenes from The Wire", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Tue Sep 08 06:05:06 +0000 2015"}, "is_translator": false, "screen_name": "wirescenes", "created_at": "Wed Jun 18 20:08:31 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 229, "profile_image_url": "http://pbs.twimg.com/profile_images/468570294253150208/DlK5sGe2_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/qTVWPkaIgo", "statuses_count": 2026, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2508960524, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 4176, "friends_count": 1, "location": "(not affiliated with the Met)", "description": "I am a bot that tweets a random high-res Open Access image from the Metropolitan Museum of Art, four times a day. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 3, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/468570294253150208/DlK5sGe2_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "Museum Bot", "id_str": "2508960524", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "metmuseum.org/about-the-muse\u2026", "indices": [0, 22], "expanded_url": "http://metmuseum.org/about-the-museum/press-room/news/2014/oasc-access", "url": "http://t.co/qTVWPkaIgo"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 3, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693407092623949824, "media_url": "http://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "display_url": "pic.twitter.com/mRktzdlEB1", "indices": [33, 56], "expanded_url": "http://twitter.com/MuseumBot/status/693407092863033344/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1247}, "small": {"resize": "fit", "w": 340, "h": 414}, "medium": {"resize": "fit", "w": 600, "h": 730}}, "id_str": "693407092623949824", "url": "https://t.co/mRktzdlEB1"}]}, "truncated": false, "id": 693407092863033344, "place": null, "favorite_count": 2, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Nativity https://t.co/OpNseJO3oL https://t.co/mRktzdlEB1", "id_str": "693407092863033344", "entities": {"media": [{"type": "photo", "id": 693407092623949824, "media_url": "http://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "display_url": "pic.twitter.com/mRktzdlEB1", "indices": [33, 56], "expanded_url": "http://twitter.com/MuseumBot/status/693407092863033344/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1247}, "small": {"resize": "fit", "w": 340, "h": 414}, "medium": {"resize": "fit", "w": 600, "h": 730}}, "id_str": "693407092623949824", "url": "https://t.co/mRktzdlEB1"}], "hashtags": [], "urls": [{"display_url": "metmuseum.org/collection/the\u2026", "indices": [9, 32], "expanded_url": "http://www.metmuseum.org/collection/the-collection-online/search/462886?rpp=30&pg=1413&rndkey=20160130&ao=on&ft=*&pos=42373", "url": "https://t.co/OpNseJO3oL"}], "symbols": [], "user_mentions": []}, "source": "Museum bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 12:15:08 +0000 2016"}, "is_translator": false, "screen_name": "MuseumBot", "created_at": "Tue May 20 01:32:24 +0000 2014"}], "previous_cursor_str": "0", "next_cursor_str": "4611686020936348428", "previous_cursor": 0} \ No newline at end of file +{"next_cursor": 4611686020936348428, "users": [{"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 24, "profile_image_url": "http://pbs.twimg.com/profile_images/659410881806135296/PdVxDc0W_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 362, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 4048395140, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 106, "friends_count": 0, "location": "", "description": "I am a bot that simulates a series of mechanical linkages (+ noise) to draw a curve 4x/day. // by @tinysubversions, inspired by @ra & @bahrami_", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/659410881806135296/PdVxDc0W_normal.png", "geo_enabled": false, "time_zone": null, "name": "Spinny Machine", "id_str": "4048395140", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CZ9xAlyWQAAVsZk.mp4"}], "aspect_ratio": [1, 1]}, "id": 693397122595569664, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "display_url": "pic.twitter.com/n6lbayOFFQ", "indices": [30, 53], "expanded_url": "http://twitter.com/spinnymachine/status/693397123023396864/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 360, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 360, "h": 360}}, "id_str": "693397122595569664", "url": "https://t.co/n6lbayOFFQ"}]}, "truncated": false, "id": 693397123023396864, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "a casually scorched northeast https://t.co/n6lbayOFFQ", "id_str": "693397123023396864", "entities": {"media": [{"type": "photo", "id": 693397122595569664, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ9xAlyWQAAVsZk.png", "display_url": "pic.twitter.com/n6lbayOFFQ", "indices": [30, 53], "expanded_url": "http://twitter.com/spinnymachine/status/693397123023396864/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 360, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 360, "h": 360}}, "id_str": "693397122595569664", "url": "https://t.co/n6lbayOFFQ"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Spinny Machine", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 11:35:31 +0000 2016"}, "is_translator": false, "screen_name": "spinnymachine", "created_at": "Wed Oct 28 16:43:01 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 6, "profile_image_url": "http://pbs.twimg.com/profile_images/658781950472138752/FOQCSbLg_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "https://t.co/OOS2jbeYND", "statuses_count": 135, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 4029020052, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "DBAF44", "followers_count": 23, "friends_count": 2, "location": "TV", "profile_banner_url": "https://pbs.twimg.com/profile_banners/4029020052/1445900976", "description": "I'm a bot that tweets fake Empire plots, inspired by @eveewing https://t.co/OOS2jbeYND // by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/658781950472138752/FOQCSbLg_normal.png", "geo_enabled": false, "time_zone": null, "name": "Empire Plots Bot", "id_str": "4029020052", "entities": {"description": {"urls": [{"display_url": "twitter.com/eveewing/statu\u2026", "indices": [63, 86], "expanded_url": "https://twitter.com/eveewing/status/658478802327183360", "url": "https://t.co/OOS2jbeYND"}]}, "url": {"urls": [{"display_url": "twitter.com/eveewing/statu\u2026", "indices": [0, 23], "expanded_url": "https://twitter.com/eveewing/status/658478802327183360", "url": "https://t.co/OOS2jbeYND"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 671831157646876672, "media_url": "http://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "media_url_https": "https://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "display_url": "pic.twitter.com/EQ8oGhG502", "indices": [101, 124], "expanded_url": "http://twitter.com/EmpirePlots/status/671831157739118593/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 400}, "small": {"resize": "fit", "w": 300, "h": 400}, "large": {"resize": "fit", "w": 300, "h": 400}}, "id_str": "671831157646876672", "url": "https://t.co/EQ8oGhG502"}]}, "truncated": false, "id": 671831157739118593, "place": null, "favorite_count": 1, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Jamal is stuck in a wild forest with Kene Holliday and can't find their way out (it's just a dream). https://t.co/EQ8oGhG502", "id_str": "671831157739118593", "entities": {"media": [{"type": "photo", "id": 671831157646876672, "media_url": "http://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "media_url_https": "https://pbs.twimg.com/media/CVLS4NyU4AAshFm.png", "display_url": "pic.twitter.com/EQ8oGhG502", "indices": [101, 124], "expanded_url": "http://twitter.com/EmpirePlots/status/671831157739118593/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 400}, "small": {"resize": "fit", "w": 300, "h": 400}, "large": {"resize": "fit", "w": 300, "h": 400}}, "id_str": "671831157646876672", "url": "https://t.co/EQ8oGhG502"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Empire Plots Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Tue Dec 01 23:20:04 +0000 2015"}, "is_translator": false, "screen_name": "EmpirePlots", "created_at": "Mon Oct 26 22:49:42 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 25, "profile_image_url": "http://pbs.twimg.com/profile_images/652238580765462528/BQVTvFS9_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 346, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3829470974, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "027F45", "followers_count": 287, "friends_count": 1, "location": "Portland, OR", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3829470974/1444340849", "description": "Portland is such a weird place! We show real pics of places in Portland! ONLY IN PORTLAND as they say! // a bot by @tinysubversions, 4x daily", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/652238580765462528/BQVTvFS9_normal.png", "geo_enabled": false, "time_zone": null, "name": "Wow So Portland!", "id_str": "3829470974", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693471873166761984, "media_url": "http://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "display_url": "pic.twitter.com/CF8JrGCQcY", "indices": [57, 80], "expanded_url": "http://twitter.com/wowsoportland/status/693471873246502912/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 600, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 170}, "medium": {"resize": "fit", "w": 600, "h": 300}}, "id_str": "693471873166761984", "url": "https://t.co/CF8JrGCQcY"}]}, "truncated": false, "id": 693471873246502912, "place": null, "favorite_count": 1, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "those silly Portlanders are always up to something funny https://t.co/CF8JrGCQcY", "id_str": "693471873246502912", "entities": {"media": [{"type": "photo", "id": 693471873166761984, "media_url": "http://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-0_pXUYAAGzn4.jpg", "display_url": "pic.twitter.com/CF8JrGCQcY", "indices": [57, 80], "expanded_url": "http://twitter.com/wowsoportland/status/693471873246502912/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 600, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 170}, "medium": {"resize": "fit", "w": 600, "h": 300}}, "id_str": "693471873166761984", "url": "https://t.co/CF8JrGCQcY"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Wow so portland", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 16:32:33 +0000 2016"}, "is_translator": false, "screen_name": "wowsoportland", "created_at": "Thu Oct 08 21:38:27 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 28, "profile_image_url": "http://pbs.twimg.com/profile_images/650161232540909568/yyvPEOnF_normal.jpg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "https://t.co/8fYJI1TWEs", "statuses_count": 515, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3765991992, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "ABB8C2", "followers_count": 331, "friends_count": 1, "location": "Mare Tranquilitatis", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3765991992/1443845573", "description": "Tweeting pics from the Project Apollo Archive, four times a day. Not affiliated with the Project Apollo Archive. // a bot by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": -28800, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/650161232540909568/yyvPEOnF_normal.jpg", "geo_enabled": false, "time_zone": "Pacific Time (US & Canada)", "name": "Moon Shot Bot", "id_str": "3765991992", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "flickr.com/photos/project\u2026", "indices": [0, 23], "expanded_url": "https://www.flickr.com/photos/projectapolloarchive/", "url": "https://t.co/8fYJI1TWEs"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693470001316171776, "media_url": "http://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "display_url": "pic.twitter.com/2j5ezW6i9G", "indices": [103, 126], "expanded_url": "http://twitter.com/moonshotbot/status/693470003249684481/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1070}, "small": {"resize": "fit", "w": 340, "h": 355}, "medium": {"resize": "fit", "w": 600, "h": 627}}, "id_str": "693470001316171776", "url": "https://t.co/2j5ezW6i9G"}]}, "truncated": false, "id": 693470003249684481, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "\ud83c\udf0c\ud83c\udf18\ud83c\udf1b\nApollo 15 Hasselblad image from film magazine 97/O - lunar orbit view\n\ud83d\ude80\ud83c\udf1a\ud83c\udf19\n https://t.co/n4WH1ZTyuZ https://t.co/2j5ezW6i9G", "id_str": "693470003249684481", "entities": {"media": [{"type": "photo", "id": 693470001316171776, "media_url": "http://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-zSsLXEAAhEia.jpg", "display_url": "pic.twitter.com/2j5ezW6i9G", "indices": [103, 126], "expanded_url": "http://twitter.com/moonshotbot/status/693470003249684481/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1070}, "small": {"resize": "fit", "w": 340, "h": 355}, "medium": {"resize": "fit", "w": 600, "h": 627}}, "id_str": "693470001316171776", "url": "https://t.co/2j5ezW6i9G"}], "hashtags": [], "urls": [{"display_url": "flickr.com/photos/project\u2026", "indices": [79, 102], "expanded_url": "https://www.flickr.com/photos/projectapolloarchive/21831461788", "url": "https://t.co/n4WH1ZTyuZ"}], "symbols": [], "user_mentions": []}, "source": "Moon Shot Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 16:25:07 +0000 2016"}, "is_translator": false, "screen_name": "moonshotbot", "created_at": "Sat Oct 03 04:03:02 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 17, "profile_image_url": "http://pbs.twimg.com/profile_images/629374160993710081/q-lr9vsE_normal.jpg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/mRUwkqVO7i", "statuses_count": 598, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3406094211, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 133, "friends_count": 0, "location": "Not affiliated with the FBI", "description": "I tweet random pages from FOIA-requested FBI records, 4x/day. I'm a bot by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/629374160993710081/q-lr9vsE_normal.jpg", "geo_enabled": false, "time_zone": null, "name": "FBI Bot", "id_str": "3406094211", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "vault.fbi.gov", "indices": [0, 22], "expanded_url": "http://vault.fbi.gov", "url": "http://t.co/mRUwkqVO7i"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693483330080210944, "media_url": "http://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "media_url_https": "https://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "display_url": "pic.twitter.com/Dey5JLxCvb", "indices": [63, 86], "expanded_url": "http://twitter.com/FBIbot/status/693483330218622976/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 776}, "small": {"resize": "fit", "w": 340, "h": 439}, "large": {"resize": "fit", "w": 1000, "h": 1294}}, "id_str": "693483330080210944", "url": "https://t.co/Dey5JLxCvb"}]}, "truncated": false, "id": 693483330218622976, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "The FBI was watching Fred G. Randaccio https://t.co/NAkQc4FYKp https://t.co/Dey5JLxCvb", "id_str": "693483330218622976", "entities": {"media": [{"type": "photo", "id": 693483330080210944, "media_url": "http://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "media_url_https": "https://pbs.twimg.com/media/CZ-_ahsWAAADnwA.png", "display_url": "pic.twitter.com/Dey5JLxCvb", "indices": [63, 86], "expanded_url": "http://twitter.com/FBIbot/status/693483330218622976/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 776}, "small": {"resize": "fit", "w": 340, "h": 439}, "large": {"resize": "fit", "w": 1000, "h": 1294}}, "id_str": "693483330080210944", "url": "https://t.co/Dey5JLxCvb"}], "hashtags": [], "urls": [{"display_url": "vault.fbi.gov/frank-randaccio", "indices": [39, 62], "expanded_url": "https://vault.fbi.gov/frank-randaccio", "url": "https://t.co/NAkQc4FYKp"}], "symbols": [], "user_mentions": []}, "source": "FBIBot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 17:18:04 +0000 2016"}, "is_translator": false, "screen_name": "FBIbot", "created_at": "Thu Aug 06 19:28:10 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 23, "profile_image_url": "http://pbs.twimg.com/profile_images/631231593164607488/R4hRHjBI_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/6cpr8h0hGa", "statuses_count": 664, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3312790286, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "4A913C", "followers_count": 239, "friends_count": 0, "location": "", "description": "Animal videos sourced from @macaulaylibrary. Turn up the sound! // A bot by @tinysubversions. Not affiliated with the Macaulay Library.", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/631231593164607488/R4hRHjBI_normal.png", "geo_enabled": false, "time_zone": null, "name": "Animal Video Bot", "id_str": "3312790286", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "macaulaylibrary.org", "indices": [0, 22], "expanded_url": "http://macaulaylibrary.org/", "url": "http://t.co/6cpr8h0hGa"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "ro", "extended_entities": {"media": [{"type": "video", "video_info": {"variants": [{"content_type": "video/webm", "bitrate": 832000, "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/vid/640x360/hY01KGCSXl-isZzt.webm"}, {"content_type": "video/mp4", "bitrate": 320000, "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/vid/320x180/3NEGIMyzX2tdBm5i.mp4"}, {"content_type": "video/mp4", "bitrate": 832000, "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/vid/640x360/hY01KGCSXl-isZzt.mp4"}, {"content_type": "application/x-mpegURL", "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/pl/G53mlN6oslnMAWd5.m3u8"}, {"content_type": "application/dash+xml", "url": "https://video.twimg.com/ext_tw_video/693439580935094273/pu/pl/G53mlN6oslnMAWd5.mpd"}], "aspect_ratio": [16, 9], "duration_millis": 20021}, "id": 693439580935094273, "media_url": "http://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "display_url": "pic.twitter.com/aaGNPmPpni", "indices": [85, 108], "expanded_url": "http://twitter.com/AnimalVidBot/status/693439595946479617/video/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 640, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 191}, "medium": {"resize": "fit", "w": 600, "h": 338}}, "id_str": "693439580935094273", "url": "https://t.co/aaGNPmPpni"}]}, "truncated": false, "id": 693439595946479617, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Maui Parrotbill\n\nPseudonestor xanthophrys\nBarksdale, Timothy https://t.co/c6n9M2Cjnv https://t.co/aaGNPmPpni", "id_str": "693439595946479617", "entities": {"media": [{"type": "photo", "id": 693439580935094273, "media_url": "http://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "media_url_https": "https://pbs.twimg.com/ext_tw_video_thumb/693439580935094273/pu/img/K0BdyKh0qQc3P5_N.jpg", "display_url": "pic.twitter.com/aaGNPmPpni", "indices": [85, 108], "expanded_url": "http://twitter.com/AnimalVidBot/status/693439595946479617/video/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 640, "h": 360}, "small": {"resize": "fit", "w": 340, "h": 191}, "medium": {"resize": "fit", "w": 600, "h": 338}}, "id_str": "693439580935094273", "url": "https://t.co/aaGNPmPpni"}], "hashtags": [], "urls": [{"display_url": "macaulaylibrary.org/video/428118", "indices": [61, 84], "expanded_url": "http://macaulaylibrary.org/video/428118", "url": "https://t.co/c6n9M2Cjnv"}], "symbols": [], "user_mentions": []}, "source": "Animal Video Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 14:24:17 +0000 2016"}, "is_translator": false, "screen_name": "AnimalVidBot", "created_at": "Tue Aug 11 22:25:35 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 10, "profile_image_url": "http://pbs.twimg.com/profile_images/624358417818238976/CfSPOEr4_normal.jpg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/YEWmunbcFZ", "statuses_count": 4, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3300809963, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 56, "friends_count": 0, "location": "The Most Relevant Ad Agency", "description": "The most happenin' new trends on the internet. // A bot by @tinysubversions.", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/624358417818238976/CfSPOEr4_normal.jpg", "geo_enabled": false, "time_zone": null, "name": "Trend Reportz", "id_str": "3300809963", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "slideshare.net/trendreportz", "indices": [0, 22], "expanded_url": "http://www.slideshare.net/trendreportz", "url": "http://t.co/YEWmunbcFZ"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 1, "lang": "en", "truncated": false, "id": 638389840472600576, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "NEW REPORT! Learn what steamers mean to 7-18 y/o men http://t.co/veQGWz1Lqn", "id_str": "638389840472600576", "entities": {"hashtags": [], "urls": [{"display_url": "slideshare.net/trendreportz/t\u2026", "indices": [53, 75], "expanded_url": "http://www.slideshare.net/trendreportz/trends-in-steamers", "url": "http://t.co/veQGWz1Lqn"}], "symbols": [], "user_mentions": []}, "source": "Trend Reportz", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Mon Aug 31 16:36:13 +0000 2015"}, "is_translator": false, "screen_name": "TrendReportz", "created_at": "Wed May 27 19:43:37 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 14, "profile_image_url": "http://pbs.twimg.com/profile_images/585540228439498752/OPHSe1Yw_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/lrCYkDGPrm", "statuses_count": 888, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3145355109, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 106, "friends_count": 1, "location": "The Middle East", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3145355109/1428438665", "description": "Public domain photos from the Qatar Digital Library of Middle Eastern (& nearby) history. Tweets 4x/day. // bot by @tinysubversions, not affiliated with the QDL", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/585540228439498752/OPHSe1Yw_normal.png", "geo_enabled": false, "time_zone": null, "name": "Middle East History", "id_str": "3145355109", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "qdl.qa/en/search/site\u2026", "indices": [0, 22], "expanded_url": "http://www.qdl.qa/en/search/site/?f%5B0%5D=document_source%3Aarchive_source", "url": "http://t.co/lrCYkDGPrm"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693479308619300866, "media_url": "http://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "display_url": "pic.twitter.com/xojYCSnUZu", "indices": [72, 95], "expanded_url": "http://twitter.com/MidEastHistory/status/693479308745113600/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1024}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 600, "h": 600}}, "id_str": "693479308619300866", "url": "https://t.co/xojYCSnUZu"}]}, "truncated": false, "id": 693479308745113600, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "'Distant View of Hormuz.' Photographer: Unknown https://t.co/hkDmSbTLgT https://t.co/xojYCSnUZu", "id_str": "693479308745113600", "entities": {"media": [{"type": "photo", "id": 693479308619300866, "media_url": "http://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-7wclWQAIpxlu.jpg", "display_url": "pic.twitter.com/xojYCSnUZu", "indices": [72, 95], "expanded_url": "http://twitter.com/MidEastHistory/status/693479308745113600/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1024}, "small": {"resize": "fit", "w": 340, "h": 340}, "medium": {"resize": "fit", "w": 600, "h": 600}}, "id_str": "693479308619300866", "url": "https://t.co/xojYCSnUZu"}], "hashtags": [], "urls": [{"display_url": "qdl.qa//en/archive/81\u2026", "indices": [48, 71], "expanded_url": "http://www.qdl.qa//en/archive/81055/vdc_100024111424.0x00000f", "url": "https://t.co/hkDmSbTLgT"}], "symbols": [], "user_mentions": []}, "source": "Mid east history pics", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 17:02:06 +0000 2016"}, "is_translator": false, "screen_name": "MidEastHistory", "created_at": "Tue Apr 07 20:27:15 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 99, "profile_image_url": "http://pbs.twimg.com/profile_images/584076161325473793/gufAEGJv_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/s6OmUwb6Bn", "statuses_count": 91531, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3131670665, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "ABB8C2", "followers_count": 46186, "friends_count": 1, "location": "Hogwarts", "description": "I'm the Sorting Hat and I'm here to say / I love sorting students in a major way // a bot by @tinysubversions, follow to get sorted!", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 1, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/584076161325473793/gufAEGJv_normal.png", "geo_enabled": false, "time_zone": null, "name": "The Sorting Hat Bot", "id_str": "3131670665", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "tinysubversions.com/notes/sorting-\u2026", "indices": [0, 22], "expanded_url": "http://tinysubversions.com/notes/sorting-bot/", "url": "http://t.co/s6OmUwb6Bn"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693474779018362880, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": 1210222826, "in_reply_to_status_id": null, "in_reply_to_screen_name": "Nyrfall", "text": "@Nyrfall The Sorting time is here at last, I know each time you send\nI've figured out that Slytherin's the right place for your blend", "id_str": "693474779018362880", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": [{"indices": [0, 8], "id": 1210222826, "name": "Desi Sobrino", "screen_name": "Nyrfall", "id_str": "1210222826"}]}, "source": "The Sorting Hat Bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": "1210222826", "retweeted": false, "created_at": "Sat Jan 30 16:44:06 +0000 2016"}, "is_translator": false, "screen_name": "SortingBot", "created_at": "Fri Apr 03 19:27:31 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 34, "profile_image_url": "http://pbs.twimg.com/profile_images/580173179236196352/nWsIPbqH_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/2YPE0x0Knw", "statuses_count": 1233, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 3105672877, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 424, "friends_count": 0, "location": "NYC", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3105672877/1427159206", "description": "Posting random flyers from hip hop's formative years every 6 hours. Most art by Buddy Esquire and Phase 2. Full collection at link. // a bot by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/580173179236196352/nWsIPbqH_normal.png", "geo_enabled": false, "time_zone": null, "name": "Old School Flyers", "id_str": "3105672877", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "toledohiphop.org/images/old_sch\u2026", "indices": [0, 22], "expanded_url": "http://www.toledohiphop.org/images/old_school_source_code/", "url": "http://t.co/2YPE0x0Knw"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "und", "extended_entities": {"media": [{"type": "photo", "id": 693422418480742400, "media_url": "http://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "display_url": "pic.twitter.com/B7jv7lwB9S", "indices": [0, 23], "expanded_url": "http://twitter.com/oldschoolflyers/status/693422418929524736/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 503, "h": 646}, "small": {"resize": "fit", "w": 340, "h": 435}, "medium": {"resize": "fit", "w": 503, "h": 646}}, "id_str": "693422418480742400", "url": "https://t.co/B7jv7lwB9S"}]}, "truncated": false, "id": 693422418929524736, "place": null, "favorite_count": 1, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "https://t.co/B7jv7lwB9S", "id_str": "693422418929524736", "entities": {"media": [{"type": "photo", "id": 693422418480742400, "media_url": "http://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ-IBATWQAAhkZA.jpg", "display_url": "pic.twitter.com/B7jv7lwB9S", "indices": [0, 23], "expanded_url": "http://twitter.com/oldschoolflyers/status/693422418929524736/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 503, "h": 646}, "small": {"resize": "fit", "w": 340, "h": 435}, "medium": {"resize": "fit", "w": 503, "h": 646}}, "id_str": "693422418480742400", "url": "https://t.co/B7jv7lwB9S"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "oldschoolflyers", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 13:16:02 +0000 2016"}, "is_translator": false, "screen_name": "oldschoolflyers", "created_at": "Tue Mar 24 00:55:10 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 41, "profile_image_url": "http://pbs.twimg.com/profile_images/561971159927771136/sEQ5u1zM_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 1396, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 3010688583, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "961EE4", "followers_count": 243, "friends_count": 1, "location": "", "profile_banner_url": "https://pbs.twimg.com/profile_banners/3010688583/1422819642", "description": "DAD: weird conversation joke is bae ME: ugh dad no DAD: [something unhip] // a bot by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/561971159927771136/sEQ5u1zM_normal.png", "geo_enabled": false, "time_zone": null, "name": "Weird Convo Bot", "id_str": "3010688583", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693429980093620224, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "DOG: Wtf are you bae'\nME: fart. Ugh.\nDOG: so sex with me is sex vape\nME: Wtf are you skeleton'", "id_str": "693429980093620224", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "WeirdConvoBot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 13:46:05 +0000 2016"}, "is_translator": false, "screen_name": "WeirdConvoBot", "created_at": "Sun Feb 01 19:05:21 +0000 2015"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 110, "profile_image_url": "http://pbs.twimg.com/profile_images/556129692554493953/82ISdQxF_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/3gDtETAFpu", "statuses_count": 1510, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2981339967, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 1308, "friends_count": 1, "location": "Frankfurt School", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2981339967/1421426775", "description": "We love #innovation and are always thinking of the next #disruptive startup #idea! // a bot by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 1, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/556129692554493953/82ISdQxF_normal.png", "geo_enabled": false, "time_zone": null, "name": "Hottest Startups", "id_str": "2981339967", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "marxists.org/archive/index.\u2026", "indices": [0, 22], "expanded_url": "http://www.marxists.org/archive/index.htm", "url": "http://t.co/3gDtETAFpu"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693477791883350016, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Startup idea: The architect thinks of the building contractor as a layman who tells him what he needs and what he can pay.", "id_str": "693477791883350016", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "hottest startups", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 16:56:04 +0000 2016"}, "is_translator": false, "screen_name": "HottestStartups", "created_at": "Fri Jan 16 16:33:45 +0000 2015"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 40, "profile_image_url": "http://pbs.twimg.com/profile_images/549979314541039617/fZ_XDnWz_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 6748, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 2951486632, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "FFCC4D", "followers_count": 3155, "friends_count": 1, "location": "(bot by @tinysubversions)", "description": "We are the Academy For Annual Recognition and each year we give out the Yearly Awards. Follow (or re-follow) for your award! Warning: sometimes it's mean.", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 2, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/549979314541039617/fZ_XDnWz_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "The Yearly Awards", "id_str": "2951486632", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CZ-2l2fWwAEH6MB.mp4"}], "aspect_ratio": [4, 3]}, "id": 693473629036789761, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "display_url": "pic.twitter.com/XGDD3tMJPF", "indices": [86, 109], "expanded_url": "http://twitter.com/YearlyAwards/status/693473629766598656/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 400, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 255}, "large": {"resize": "fit", "w": 400, "h": 300}}, "id_str": "693473629036789761", "url": "https://t.co/XGDD3tMJPF"}]}, "truncated": false, "id": 693473629766598656, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": 4863901738, "in_reply_to_status_id": null, "in_reply_to_screen_name": "know_fast", "text": "@know_fast It's official: you're the Least Prodigiously Despondent Confidant of 2015! https://t.co/XGDD3tMJPF", "id_str": "693473629766598656", "entities": {"media": [{"type": "photo", "id": 693473629036789761, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-2l2fWwAEH6MB.png", "display_url": "pic.twitter.com/XGDD3tMJPF", "indices": [86, 109], "expanded_url": "http://twitter.com/YearlyAwards/status/693473629766598656/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 400, "h": 300}, "small": {"resize": "fit", "w": 340, "h": 255}, "large": {"resize": "fit", "w": 400, "h": 300}}, "id_str": "693473629036789761", "url": "https://t.co/XGDD3tMJPF"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": [{"indices": [0, 10], "id": 4863901738, "name": "Know Fast", "screen_name": "know_fast", "id_str": "4863901738"}]}, "source": "The Yearly Awards", "contributors": null, "favorited": false, "in_reply_to_user_id_str": "4863901738", "retweeted": false, "created_at": "Sat Jan 30 16:39:32 +0000 2016"}, "is_translator": false, "screen_name": "YearlyAwards", "created_at": "Tue Dec 30 16:59:34 +0000 2014"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 20, "profile_image_url": "http://pbs.twimg.com/profile_images/512673377283080194/eFnJQJSp_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 1972, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 2817629347, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "ABB8C2", "followers_count": 93, "friends_count": 1, "location": "", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2817629347/1411065932", "description": "Wise sayings, four times daily. by @tinysubversions", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/512673377283080194/eFnJQJSp_normal.png", "geo_enabled": false, "time_zone": null, "name": "Received Wisdom", "id_str": "2817629347", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "truncated": false, "id": 693418402392719360, "place": null, "favorite_count": 0, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Water is thicker than blood.", "id_str": "693418402392719360", "entities": {"hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Received Wisdom", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 13:00:04 +0000 2016"}, "is_translator": false, "screen_name": "received_wisdom", "created_at": "Thu Sep 18 18:32:38 +0000 2014"}, {"notifications": false, "profile_use_background_image": false, "has_extended_profile": false, "listed_count": 11, "profile_image_url": "http://pbs.twimg.com/profile_images/517404591218900992/kf2iYD1f_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 1767, "profile_text_color": "000000", "profile_background_tile": false, "follow_request_sent": false, "id": 2798799669, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "4A913C", "followers_count": 40, "friends_count": 0, "location": "Everywhere", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2798799669/1412195008", "description": "Chronicling men doing things. // A bot by @tinysubversions, Powered By Giphy", "profile_sidebar_fill_color": "000000", "default_profile": false, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "000000", "is_translation_enabled": false, "profile_sidebar_border_color": "000000", "profile_image_url_https": "https://pbs.twimg.com/profile_images/517404591218900992/kf2iYD1f_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "Men Doing Things", "id_str": "2798799669", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CZ-WORAWQAED6It.mp4"}], "aspect_ratio": [167, 104]}, "id": 693438039465541633, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "display_url": "pic.twitter.com/wsk2GyEsGh", "indices": [37, 60], "expanded_url": "http://twitter.com/MenDoing/status/693438039801073664/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 334, "h": 208}, "small": {"resize": "fit", "w": 334, "h": 208}, "large": {"resize": "fit", "w": 334, "h": 208}}, "id_str": "693438039465541633", "url": "https://t.co/wsk2GyEsGh"}]}, "truncated": false, "id": 693438039801073664, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Men Authoring Landmarks in Manhattan https://t.co/wsk2GyEsGh", "id_str": "693438039801073664", "entities": {"media": [{"type": "photo", "id": 693438039465541633, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CZ-WORAWQAED6It.png", "display_url": "pic.twitter.com/wsk2GyEsGh", "indices": [37, 60], "expanded_url": "http://twitter.com/MenDoing/status/693438039801073664/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 334, "h": 208}, "small": {"resize": "fit", "w": 334, "h": 208}, "large": {"resize": "fit", "w": 334, "h": 208}}, "id_str": "693438039465541633", "url": "https://t.co/wsk2GyEsGh"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Men Doing Things", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 14:18:06 +0000 2016"}, "is_translator": false, "screen_name": "MenDoing", "created_at": "Wed Oct 01 19:59:55 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 139, "profile_image_url": "http://pbs.twimg.com/profile_images/495988901790482432/le2-dKgs_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/r2HzjsqHTU", "statuses_count": 2157, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2704554914, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 1172, "friends_count": 1, "location": "", "profile_banner_url": "https://pbs.twimg.com/profile_banners/2704554914/1407087962", "description": "A bot that picks a word and then draws randomly until an OCR library (http://t.co/XmDeI5TWoF) reads that word. 4x daily. Also on Tumblr. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/495988901790482432/le2-dKgs_normal.png", "geo_enabled": false, "time_zone": null, "name": "Reverse OCR", "id_str": "2704554914", "entities": {"description": {"urls": [{"display_url": "antimatter15.com/ocrad.js/demo.\u2026", "indices": [70, 92], "expanded_url": "http://antimatter15.com/ocrad.js/demo.html", "url": "http://t.co/XmDeI5TWoF"}]}, "url": {"urls": [{"display_url": "reverseocr.tumblr.com", "indices": [0, 22], "expanded_url": "http://reverseocr.tumblr.com", "url": "http://t.co/r2HzjsqHTU"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "und", "extended_entities": {"media": [{"type": "photo", "id": 693404391072776192, "media_url": "http://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "display_url": "pic.twitter.com/WbD9lkNarf", "indices": [8, 31], "expanded_url": "http://twitter.com/reverseocr/status/693404391160860673/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 150}, "small": {"resize": "fit", "w": 340, "h": 85}, "large": {"resize": "fit", "w": 800, "h": 200}}, "id_str": "693404391072776192", "url": "https://t.co/WbD9lkNarf"}]}, "truncated": false, "id": 693404391160860673, "place": null, "favorite_count": 2, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "larceny https://t.co/WbD9lkNarf", "id_str": "693404391160860673", "entities": {"media": [{"type": "photo", "id": 693404391072776192, "media_url": "http://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ93nq-WwAAdSAo.jpg", "display_url": "pic.twitter.com/WbD9lkNarf", "indices": [8, 31], "expanded_url": "http://twitter.com/reverseocr/status/693404391160860673/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 150}, "small": {"resize": "fit", "w": 340, "h": 85}, "large": {"resize": "fit", "w": 800, "h": 200}}, "id_str": "693404391072776192", "url": "https://t.co/WbD9lkNarf"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Reverse OCR", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 12:04:24 +0000 2016"}, "is_translator": false, "screen_name": "reverseocr", "created_at": "Sun Aug 03 17:26:28 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 5, "profile_image_url": "http://pbs.twimg.com/profile_images/479836451182362624/0fAtv_AN_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": null, "statuses_count": 2, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2577963498, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 14, "friends_count": 1, "location": "", "description": "Deploying GIFs every six hours. // by @tinysubvesions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/479836451182362624/0fAtv_AN_normal.png", "geo_enabled": false, "time_zone": null, "name": "GIF Deployer", "id_str": "2577963498", "entities": {"description": {"urls": []}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "en", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/BqkTB2fIEAA8zCs.mp4"}], "aspect_ratio": [1, 1]}, "id": 479935757818531840, "media_url": "http://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "display_url": "pic.twitter.com/WEYISUSsJR", "indices": [21, 43], "expanded_url": "http://twitter.com/gifDeployer/status/479935760033153024/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 600}, "small": {"resize": "fit", "w": 340, "h": 340}, "large": {"resize": "fit", "w": 612, "h": 612}}, "id_str": "479935757818531840", "url": "http://t.co/WEYISUSsJR"}]}, "truncated": false, "id": 479935760033153024, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Vietnamese decadence http://t.co/WEYISUSsJR", "id_str": "479935760033153024", "entities": {"media": [{"type": "photo", "id": 479935757818531840, "media_url": "http://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/BqkTB2fIEAA8zCs.png", "display_url": "pic.twitter.com/WEYISUSsJR", "indices": [21, 43], "expanded_url": "http://twitter.com/gifDeployer/status/479935760033153024/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 600, "h": 600}, "small": {"resize": "fit", "w": 340, "h": 340}, "large": {"resize": "fit", "w": 612, "h": 612}}, "id_str": "479935757818531840", "url": "http://t.co/WEYISUSsJR"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "GIF Deployer", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Fri Jun 20 10:36:16 +0000 2014"}, "is_translator": false, "screen_name": "gifDeployer", "created_at": "Fri Jun 20 03:56:13 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 48, "profile_image_url": "http://pbs.twimg.com/profile_images/479364877551538176/HN0wLHbt_normal.png", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/XJeqwaDhQg", "statuses_count": 11970, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2575445382, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 428, "friends_count": 1, "location": "", "description": "Generating new aesthetics every hour. Botpunk. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": -18000, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 0, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/479364877551538176/HN0wLHbt_normal.png", "geo_enabled": false, "time_zone": "Eastern Time (US & Canada)", "name": "Brand New Aesthetics", "id_str": "2575445382", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "brand-new-aesthetics.tumblr.com", "indices": [0, 22], "expanded_url": "http://brand-new-aesthetics.tumblr.com", "url": "http://t.co/XJeqwaDhQg"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "da", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/CX5BF-lWMAEyoPA.mp4"}], "aspect_ratio": [3, 2]}, "id": 684055764361687041, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "display_url": "pic.twitter.com/d4ZGIYqyt9", "indices": [13, 36], "expanded_url": "http://twitter.com/neweraesthetics/status/684055764768522240/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 200}, "small": {"resize": "fit", "w": 300, "h": 200}, "large": {"resize": "fit", "w": 300, "h": 200}}, "id_str": "684055764361687041", "url": "https://t.co/d4ZGIYqyt9"}]}, "truncated": false, "id": 684055764768522240, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "SOLUTIONPUNK https://t.co/d4ZGIYqyt9", "id_str": "684055764768522240", "entities": {"media": [{"type": "photo", "id": 684055764361687041, "media_url": "http://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/CX5BF-lWMAEyoPA.png", "display_url": "pic.twitter.com/d4ZGIYqyt9", "indices": [13, 36], "expanded_url": "http://twitter.com/neweraesthetics/status/684055764768522240/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "medium": {"resize": "fit", "w": 300, "h": 200}, "small": {"resize": "fit", "w": 300, "h": 200}, "large": {"resize": "fit", "w": 300, "h": 200}}, "id_str": "684055764361687041", "url": "https://t.co/d4ZGIYqyt9"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Brand New Aesthetics", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Mon Jan 04 16:56:18 +0000 2016"}, "is_translator": false, "screen_name": "neweraesthetics", "created_at": "Wed Jun 18 20:39:25 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 12, "profile_image_url": "http://pbs.twimg.com/profile_images/479355596076892160/p_jT5KqM_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/DZYA6d8tU5", "statuses_count": 8587, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2575407888, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 113, "friends_count": 1, "location": "Bodymore, Murdaland", "description": "This Twitter account automatically tweets GIFs of The Wire. Also a Tumblr. Updates hourly. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 1, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/479355596076892160/p_jT5KqM_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "Scenes from The Wire", "id_str": "2575407888", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "wirescenes.tumblr.com", "indices": [0, 22], "expanded_url": "http://wirescenes.tumblr.com/", "url": "http://t.co/DZYA6d8tU5"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 0, "lang": "und", "extended_entities": {"media": [{"type": "animated_gif", "video_info": {"variants": [{"content_type": "video/mp4", "bitrate": 0, "url": "https://pbs.twimg.com/tweet_video/COXAcgVU8AACS4W.mp4"}], "aspect_ratio": [132, 119]}, "id": 641130117918420992, "media_url": "http://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "display_url": "pic.twitter.com/XBoaB2klZq", "indices": [0, 22], "expanded_url": "http://twitter.com/wirescenes/status/641130118132314112/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 264, "h": 238}, "small": {"resize": "fit", "w": 264, "h": 238}, "medium": {"resize": "fit", "w": 264, "h": 238}}, "id_str": "641130117918420992", "url": "http://t.co/XBoaB2klZq"}]}, "truncated": false, "id": 641130118132314112, "place": null, "favorite_count": 0, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "http://t.co/XBoaB2klZq", "id_str": "641130118132314112", "entities": {"media": [{"type": "photo", "id": 641130117918420992, "media_url": "http://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "media_url_https": "https://pbs.twimg.com/tweet_video_thumb/COXAcgVU8AACS4W.png", "display_url": "pic.twitter.com/XBoaB2klZq", "indices": [0, 22], "expanded_url": "http://twitter.com/wirescenes/status/641130118132314112/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 264, "h": 238}, "small": {"resize": "fit", "w": 264, "h": 238}, "medium": {"resize": "fit", "w": 264, "h": 238}}, "id_str": "641130117918420992", "url": "http://t.co/XBoaB2klZq"}], "hashtags": [], "urls": [], "symbols": [], "user_mentions": []}, "source": "Scenes from The Wire", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Tue Sep 08 06:05:06 +0000 2015"}, "is_translator": false, "screen_name": "wirescenes", "created_at": "Wed Jun 18 20:08:31 +0000 2014"}, {"notifications": false, "profile_use_background_image": true, "has_extended_profile": false, "listed_count": 229, "profile_image_url": "http://pbs.twimg.com/profile_images/468570294253150208/DlK5sGe2_normal.jpeg", "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png", "verified": false, "lang": "en", "protected": false, "url": "http://t.co/qTVWPkaIgo", "statuses_count": 2026, "profile_text_color": "333333", "profile_background_tile": false, "follow_request_sent": false, "id": 2508960524, "default_profile_image": false, "contributors_enabled": false, "following": false, "profile_link_color": "0084B4", "followers_count": 4176, "friends_count": 1, "location": "(not affiliated with the Met)", "description": "I am a bot that tweets a random high-res Open Access image from the Metropolitan Museum of Art, four times a day. // by @tinysubversions", "profile_sidebar_fill_color": "DDEEF6", "default_profile": true, "utc_offset": null, "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png", "favourites_count": 3, "profile_background_color": "C0DEED", "is_translation_enabled": false, "profile_sidebar_border_color": "C0DEED", "profile_image_url_https": "https://pbs.twimg.com/profile_images/468570294253150208/DlK5sGe2_normal.jpeg", "geo_enabled": false, "time_zone": null, "name": "Museum Bot", "id_str": "2508960524", "entities": {"description": {"urls": []}, "url": {"urls": [{"display_url": "metmuseum.org/about-the-muse\u2026", "indices": [0, 22], "expanded_url": "http://metmuseum.org/about-the-museum/press-room/news/2014/oasc-access", "url": "http://t.co/qTVWPkaIgo"}]}}, "status": {"coordinates": null, "is_quote_status": false, "geo": null, "retweet_count": 3, "lang": "en", "extended_entities": {"media": [{"type": "photo", "id": 693407092623949824, "media_url": "http://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "display_url": "pic.twitter.com/mRktzdlEB1", "indices": [33, 56], "expanded_url": "http://twitter.com/MuseumBot/status/693407092863033344/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1247}, "small": {"resize": "fit", "w": 340, "h": 414}, "medium": {"resize": "fit", "w": 600, "h": 730}}, "id_str": "693407092623949824", "url": "https://t.co/mRktzdlEB1"}]}, "truncated": false, "id": 693407092863033344, "place": null, "favorite_count": 2, "possibly_sensitive": false, "in_reply_to_status_id_str": null, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "in_reply_to_screen_name": null, "text": "Nativity https://t.co/OpNseJO3oL https://t.co/mRktzdlEB1", "id_str": "693407092863033344", "entities": {"media": [{"type": "photo", "id": 693407092623949824, "media_url": "http://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "media_url_https": "https://pbs.twimg.com/media/CZ96E7CWQAAVYYz.jpg", "display_url": "pic.twitter.com/mRktzdlEB1", "indices": [33, 56], "expanded_url": "http://twitter.com/MuseumBot/status/693407092863033344/photo/1", "sizes": {"thumb": {"resize": "crop", "w": 150, "h": 150}, "large": {"resize": "fit", "w": 1024, "h": 1247}, "small": {"resize": "fit", "w": 340, "h": 414}, "medium": {"resize": "fit", "w": 600, "h": 730}}, "id_str": "693407092623949824", "url": "https://t.co/mRktzdlEB1"}], "hashtags": [], "urls": [{"display_url": "metmuseum.org/collection/the\u2026", "indices": [9, 32], "expanded_url": "http://www.metmuseum.org/collection/the-collection-online/search/462886?rpp=30&pg=1413&rndkey=20160130&ao=on&ft=*&pos=42373", "url": "https://t.co/OpNseJO3oL"}], "symbols": [], "user_mentions": []}, "source": "Museum bot", "contributors": null, "favorited": false, "in_reply_to_user_id_str": null, "retweeted": false, "created_at": "Sat Jan 30 12:15:08 +0000 2016"}, "is_translator": false, "screen_name": "MuseumBot", "created_at": "Tue May 20 01:32:24 +0000 2014"}], "previous_cursor_str": "4611686020936348428", "next_cursor_str": "4611686020936348428", "previous_cursor": 4611686020936348428} diff --git a/tests/test_api_30.py b/tests/test_api_30.py index d6e349e9..fc69705b 100644 --- a/tests/test_api_30.py +++ b/tests/test_api_30.py @@ -809,6 +809,7 @@ def testGetListMembers(self): resp = self.api.GetListMembers(list_id=93527328) self.assertTrue(type(resp[0]) is twitter.User) self.assertEqual(resp[0].id, 4048395140) + self.assertEqual(len(resp), 47) @responses.activate def testGetListMembersPaged(self): @@ -820,8 +821,10 @@ def testGetListMembersPaged(self): body=resp_data, match_querystring=True, status=200) - resp = self.api.GetListMembersPaged(list_id=93527328, cursor=4611686020936348428) + _, _, resp = self.api.GetListMembersPaged(list_id=93527328, + cursor=4611686020936348428) self.assertTrue([isinstance(u, twitter.User) for u in resp]) + self.assertEqual(len(resp), 20) with open('testdata/get_list_members_extra_params.json') as f: resp_data = f.read() @@ -837,6 +840,7 @@ def testGetListMembersPaged(self): include_entities=False, count=100) self.assertFalse(resp[0].status) + self.assertEqual(len(resp), 27) @responses.activate def testGetListTimeline(self): diff --git a/twitter/api.py b/twitter/api.py index 13d88799..f663736c 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -4283,7 +4283,7 @@ def GetListMembers(self, include_entities=include_entities) result += users - if next_cursor == 0 or next_cursor == previous_cursor: + if next_cursor == 0: break else: cursor = next_cursor From 3c7fca8e40b9ba5ab5b7ec2adfecf94a78d4cc41 Mon Sep 17 00:00:00 2001 From: Wanda Evans <39149409+derpwanda@users.noreply.github.com> Date: Wed, 17 Feb 2021 13:55:36 -0600 Subject: [PATCH 23/35] update comments update comments on lines 3552 & 3554, from 'mark' to 'unmark' --- twitter/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index 13d88799..b7a96b1d 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -3549,9 +3549,9 @@ def DestroyFavorite(self, Args: status_id (int, optional): - The id of the twitter status to mark as a favorite. + The id of the twitter status to unmark as a favorite. status (twitter.Status, optional): - The twitter.Status object to mark as a favorite. + The twitter.Status object to unmark as a favorite. include_entities (bool, optional): The entities node will be omitted when set to False. From 9eca1901ae80e0333ae764ee645205df3245b003 Mon Sep 17 00:00:00 2001 From: Wanda Evans <39149409+derpwanda@users.noreply.github.com> Date: Wed, 17 Feb 2021 14:26:17 -0600 Subject: [PATCH 24/35] update comments in api.py update comments on lines 3518 & 3520 from "mark" to "unmark" --- twitter/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index b7a96b1d..e3ecd836 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -3515,9 +3515,9 @@ def CreateFavorite(self, Args: status_id (int, optional): - The id of the twitter status to mark as a favorite. + The id of the twitter status to unmark as a favorite. status (twitter.Status, optional): - The twitter.Status object to mark as a favorite. + The twitter.Status object to unmark as a favorite. include_entities (bool, optional): The entities node will be omitted when set to False. From 91e711420525dffc44f81ed286f292fd527711bc Mon Sep 17 00:00:00 2001 From: Wanda Evans <39149409+derpwanda@users.noreply.github.com> Date: Wed, 17 Feb 2021 17:56:57 -0600 Subject: [PATCH 25/35] correction Changed lines 3518 & 3520 from "unmark" to "mark" --- twitter/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index e3ecd836..b7a96b1d 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -3515,9 +3515,9 @@ def CreateFavorite(self, Args: status_id (int, optional): - The id of the twitter status to unmark as a favorite. + The id of the twitter status to mark as a favorite. status (twitter.Status, optional): - The twitter.Status object to unmark as a favorite. + The twitter.Status object to mark as a favorite. include_entities (bool, optional): The entities node will be omitted when set to False. From cbcf58ba9a07fa40ec4d75719625ccda5cbf0231 Mon Sep 17 00:00:00 2001 From: Wanda Evans <39149409+derpwanda@users.noreply.github.com> Date: Thu, 18 Feb 2021 23:01:56 -0600 Subject: [PATCH 26/35] corrected comments for DestoryBlock, DestroyMute DestroyBlock comments: block to unblock. DestroyMute comments: mute to unmute. --- twitter/api.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index b7a96b1d..832932e6 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -2209,17 +2209,17 @@ def DestroyBlock(self, Args: user_id (int, optional) - The numerical ID of the user to block. + The numerical ID of the user to unblock. screen_name (str, optional): - The screen name of the user to block. + The screen name of the user to unblock. include_entities (bool, optional): The entities node will not be included if set to False. skip_status (bool, optional): - When set to False, the blocked User's statuses will not be included + When set to False, the unblocked User's statuses will not be included with the returned User object. Returns: - A twitter.User instance representing the blocked user. + A twitter.User instance representing the unblocked user. """ return self._BlockMute(action='destroy', endpoint='block', @@ -2265,13 +2265,13 @@ def DestroyMute(self, Args: user_id (int, optional) - The numerical ID of the user to mute. + The numerical ID of the user to unmute. screen_name (str, optional): - The screen name of the user to mute. + The screen name of the user to unmute. include_entities (bool, optional): The entities node will not be included if set to False. skip_status (bool, optional): - When set to False, the muted User's statuses will not be included + When set to False, the unmuted User's statuses will not be included with the returned User object. Returns: From 1ade878f8d912264b0f2723f10e4d8886dd37392 Mon Sep 17 00:00:00 2001 From: yu9824 <58211916+yu9824@users.noreply.github.com> Date: Sat, 10 Jul 2021 19:43:54 +0900 Subject: [PATCH 27/35] Specifies the text type of long_description. --- setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/setup.py b/setup.py index 1a0a4120..39c67ef5 100755 --- a/setup.py +++ b/setup.py @@ -48,6 +48,7 @@ def extract_metaitem(meta): long_description=(read('README.rst') + '\n\n' + read('AUTHORS.rst') + '\n\n' + read('CHANGES')), + long_description_content_type = 'text/x-rst', author=extract_metaitem('author'), author_email=extract_metaitem('email'), maintainer=extract_metaitem('author'), From 719a507d8128a3e65d25e8b15640041b284835e5 Mon Sep 17 00:00:00 2001 From: yu9824 <58211916+yu9824@users.noreply.github.com> Date: Sat, 10 Jul 2021 19:50:30 +0900 Subject: [PATCH 28/35] Change project name to debug no pypitest server because I can not upload to project 'python-twitter'. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 39c67ef5..d415b2c4 100755 --- a/setup.py +++ b/setup.py @@ -41,7 +41,7 @@ def extract_metaitem(meta): raise RuntimeError('Unable to find __{meta}__ string.'.format(meta=meta)) setup( - name='python-twitter', + name='python-twitter_test', version=extract_metaitem('version'), license=extract_metaitem('license'), description=extract_metaitem('description'), From 378447974fdbc18841cf6d9ae8bb5051f39e47e8 Mon Sep 17 00:00:00 2001 From: yu9824 <58211916+yu9824@users.noreply.github.com> Date: Sat, 10 Jul 2021 20:03:07 +0900 Subject: [PATCH 29/35] Modify README.rst to deal with syntax errors. --- README.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 6e7931a3..5d006db7 100644 --- a/README.rst +++ b/README.rst @@ -111,9 +111,9 @@ Using The library provides a Python wrapper around the Twitter API and the Twitter data model. To get started, check out the examples in the examples/ folder or read the documentation at https://python-twitter.readthedocs.io which contains information about getting your authentication keys from Twitter and using the library. ----- +------------------ Using with Django ----- +------------------ Additional template tags that expand tweet urls and urlize tweet text. See the django template tags available for use with python-twitter: https://github.com/radzhome/python-twitter-django-tags @@ -195,9 +195,9 @@ or check out the inline documentation with:: $ pydoc twitter.Api ----- +------ Todo ----- +------ Patches, pull requests, and bug reports are `welcome `_, just please keep the style consistent with the original source. From 84ddd920c534e390fdaa75e4da3dbb48b96cb426 Mon Sep 17 00:00:00 2001 From: yu9824 <58211916+yu9824@users.noreply.github.com> Date: Sat, 10 Jul 2021 21:45:11 +0900 Subject: [PATCH 30/35] Define a function that converts text that causes errors due to indentation. --- setup.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/setup.py b/setup.py index d415b2c4..b4b52e19 100755 --- a/setup.py +++ b/setup.py @@ -18,6 +18,7 @@ # limitations under the License. import os +from pdb import set_trace import re import codecs @@ -30,6 +31,19 @@ def read(filename): with codecs.open(os.path.join(cwd, filename), 'rb', 'utf-8') as h: return h.read() +def convert_txt(txt): + lst_txt = txt.split('\n') + for i in range(len(lst_txt)): + line = lst_txt[i] + match = re.match(r' +(\S.+)', line) + if match is not None: + lst_txt[i] = '\n| {}'.format(match.group(1)) + else: + match_date = re.match(r'(\d+-\d+-\d+)', line) + if match_date is not None: + lst_txt[i] = '\n**{}**'.format(match_date.group(1)) + return '\n'.join(lst_txt) + metadata = read(os.path.join(cwd, 'twitter', '__init__.py')) def extract_metaitem(meta): @@ -41,13 +55,13 @@ def extract_metaitem(meta): raise RuntimeError('Unable to find __{meta}__ string.'.format(meta=meta)) setup( - name='python-twitter_test', + name='python-twitter', version=extract_metaitem('version'), license=extract_metaitem('license'), description=extract_metaitem('description'), long_description=(read('README.rst') + '\n\n' + read('AUTHORS.rst') + '\n\n' + - read('CHANGES')), + convert_txt(read('CHANGES'))), long_description_content_type = 'text/x-rst', author=extract_metaitem('author'), author_email=extract_metaitem('email'), From 202e62c3e55164c57f0e5b3eaf227223ec5ecf38 Mon Sep 17 00:00:00 2001 From: yu9824 <58211916+yu9824@users.noreply.github.com> Date: Sat, 10 Jul 2021 21:48:18 +0900 Subject: [PATCH 31/35] Delete from pdb import set_trace --- setup.py | 1 - 1 file changed, 1 deletion(-) diff --git a/setup.py b/setup.py index b4b52e19..0e0f0e36 100755 --- a/setup.py +++ b/setup.py @@ -18,7 +18,6 @@ # limitations under the License. import os -from pdb import set_trace import re import codecs From eee5167dacff3d4b690987bd47def0ec05c5ef4f Mon Sep 17 00:00:00 2001 From: Dash <16400857+analogdash@users.noreply.github.com> Date: Sun, 25 Jul 2021 00:03:40 +0800 Subject: [PATCH 32/35] Fix docs to fit expected keyword argument --- twitter/api.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/twitter/api.py b/twitter/api.py index 832932e6..307644c2 100755 --- a/twitter/api.py +++ b/twitter/api.py @@ -3318,11 +3318,11 @@ def ShowFriendship(self, """Returns information about the relationship between the two users. Args: - source_id: + source_user_id: The user_id of the subject user [Optional] source_screen_name: The screen_name of the subject user [Optional] - target_id: + target_user_id: The user_id of the target user [Optional] target_screen_name: The screen_name of the target user [Optional] From 9a11ef2666210365656bccfacac26d7cc9bb2f2f Mon Sep 17 00:00:00 2001 From: sharkykh Date: Thu, 2 May 2019 01:08:45 +0300 Subject: [PATCH 33/35] Remove `future` dependency (again) Accidentally re-added in #573. --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index dece197e..95c7832e 100755 --- a/setup.py +++ b/setup.py @@ -56,7 +56,7 @@ def extract_metaitem(meta): download_url=extract_metaitem('download_url'), packages=find_packages(exclude=('tests', 'docs')), platforms=['Any'], - install_requires=['future', 'requests', 'requests-oauthlib'], + install_requires=['requests', 'requests-oauthlib'], tests_require=['pytest'], keywords='twitter api', classifiers=[ From ce60ed52674b4aa6ea3ef05cfb8e83df8d7fd892 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Wed, 7 Aug 2024 19:14:34 -0400 Subject: [PATCH 34/35] Update README.rst Adding a note to mark that I'm archiving this repo --- README.rst | 28 +++++----------------------- 1 file changed, 5 insertions(+), 23 deletions(-) diff --git a/README.rst b/README.rst index 5d006db7..0b831bfa 100644 --- a/README.rst +++ b/README.rst @@ -4,29 +4,11 @@ A Python wrapper around the Twitter API. By the `Python-Twitter Developers `_ -.. image:: https://img.shields.io/pypi/v/python-twitter.svg - :target: https://pypi.python.org/pypi/python-twitter/ - :alt: Downloads - -.. image:: https://readthedocs.org/projects/python-twitter/badge/?version=latest - :target: http://python-twitter.readthedocs.org/en/latest/?badge=latest - :alt: Documentation Status - -.. image:: https://circleci.com/gh/bear/python-twitter.svg?style=svg - :target: https://circleci.com/gh/bear/python-twitter - :alt: Circle CI - -.. image:: http://codecov.io/github/bear/python-twitter/coverage.svg?branch=master - :target: http://codecov.io/github/bear/python-twitter - :alt: Codecov - -.. image:: https://requires.io/github/bear/python-twitter/requirements.svg?branch=master - :target: https://requires.io/github/bear/python-twitter/requirements/?branch=master - :alt: Requirements Status - -.. image:: https://dependencyci.com/github/bear/python-twitter/badge - :target: https://dependencyci.com/github/bear/python-twitter - :alt: Dependency Status +============- +NOTICE +============ +I've archived this repo to mark that I'm not going to be maintaining it. It's open-source so anyone using it can fork or take it over. +Thank you to all the people that contributed to it in the past ============ Introduction From da1e9986f179622fa2d85f5b125a3f12f3e63177 Mon Sep 17 00:00:00 2001 From: Mike Taylor Date: Wed, 7 Aug 2024 19:14:50 -0400 Subject: [PATCH 35/35] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 0b831bfa..bed3afb3 100644 --- a/README.rst +++ b/README.rst @@ -4,7 +4,7 @@ A Python wrapper around the Twitter API. By the `Python-Twitter Developers `_ -============- +============ NOTICE ============ I've archived this repo to mark that I'm not going to be maintaining it. It's open-source so anyone using it can fork or take it over.