def get(self): current_user = self.get_current_user() if not current_user: raise HTTPError(403, "Not logged in") this_username = current_user['username'] access_token = current_user['access_token'] key = 'friends:%s' % this_username result = self.redis.get(key) if result: if result == 'null': # pragma: no cover result = None elif 'next_cursor_str' in result: # pragma: no cover result = None if result is None: result = yield tornado.gen.Task(self.twitter_request, "/friends/ids", screen_name=this_username, access_token=access_token) if 'ids' in result: result = result['ids'] if result: self.redis.setex(key, json_encode(result), 60 * 60) else: raise NotImplementedError else: result = json_decode(result) # now turn these IDs into real screen names unknown = [] screen_names = [] for id_ in result: user = self.db.User.find_one({'user_id': id_}) if user: screen_names.append(user['username']) else: key = 'screen_name:%s' % id_ screen_name = self.redis.get(key) if screen_name is None: unknown.append(id_) else: screen_names.append(screen_name) buckets = utils.bucketize(unknown, 100) for bucket in buckets: users = None attempts = 0 while True: users = yield tornado.gen.Task(self.twitter_request, "/users/lookup", user_id=','.join( str(x) for x in bucket)) if users is not None: break else: time.sleep(1) attempts += 1 if attempts > 3: result = {'ERROR': 'Unable to connect to Twitter'} self.write_json(result) self.finish() return for user in users: username = user['screen_name'] key = 'screen_name:%s' % user['id'] self.save_tweeter_user(user) self.redis.setex(key, username, 7 * 24 * 60 * 60) screen_names.append(username) if len(result) != len(screen_names): logging.error('RESULT (%d): %r' % (len(result), result)) logging.error('SCREEN_NAMES (%d): %r' % (len(screen_names), screen_names)) raise ValueError('Invalid number of results') screen_names.sort() self.write_json(screen_names) self.finish()
def get(self): current_user = self.get_current_user() if not current_user: raise HTTPError(403, "Not logged in") this_username = current_user['username'] access_token = current_user['access_token'] key = 'friends:%s' % this_username result = self.redis.get(key) if result: if result == 'null': # pragma: no cover result = None elif 'next_cursor_str' in result: # pragma: no cover result = None if result is None: result = yield tornado.gen.Task(self.twitter_request, "/friends/ids", screen_name=this_username, access_token=access_token ) if 'ids' in result: result = result['ids'] if result: self.redis.setex(key, json_encode(result), 60 * 60) else: raise NotImplementedError else: result = json_decode(result) # now turn these IDs into real screen names unknown = [] screen_names = [] for id_ in result: user = self.db.User.find_one({'user_id': id_}) if user: screen_names.append(user['username']) else: key = 'screen_name:%s' % id_ screen_name = self.redis.get(key) if screen_name is None: unknown.append(id_) else: screen_names.append(screen_name) buckets = utils.bucketize(unknown, 100) for bucket in buckets: users = None attempts = 0 while True: users = yield tornado.gen.Task(self.twitter_request, "/users/lookup", user_id=','.join(str(x) for x in bucket) ) if users is not None: break else: time.sleep(1) attempts += 1 if attempts > 3: result = {'ERROR': 'Unable to connect to Twitter'} self.write_json(result) self.finish() return for user in users: username = user['screen_name'] key = 'screen_name:%s' % user['id'] self.save_tweeter_user(user) self.redis.setex(key, username, 7 * 24 * 60 * 60) screen_names.append(username) if len(result) != len(screen_names): logging.error('RESULT (%d): %r' % (len(result), result)) logging.error('SCREEN_NAMES (%d): %r' % (len(screen_names), screen_names)) raise ValueError('Invalid number of results') screen_names.sort() self.write_json(screen_names) self.finish()
def get(self): current_user = self.get_current_user() if not current_user: raise HTTPError(403, "Not logged in") this_username = current_user['username'] access_token = current_user['access_token'] key = 'friends:%s' % this_username result = self.redis.get(key) if result is None: result = yield tornado.gen.Task(self.twitter_request, "/friends/ids", screen_name=this_username, access_token=access_token ) self.redis.setex(key, json_encode(result), 60 * 60) else: result = json_decode(result) # now turn these IDs into real screen names unknown = [] screen_names = [] for id_ in result: user = self.db.User.find_one({'user_id': id_}) if user: screen_names.append(user['username']) else: key = 'screen_name:%s' % id_ screen_name = self.redis.get(key) if screen_name is None: unknown.append(id_) else: screen_names.append(screen_name) buckets = utils.bucketize(unknown, 100) for bucket in buckets: users = None attempts = 0 while True: users = yield tornado.gen.Task(self.twitter_request, "/users/lookup", user_id=','.join(str(x) for x in bucket) ) if users is not None: break else: from time import sleep sleep(1) attempts += 1 if attempts > 3: raise HTTPError(500, "Unable to connect to twitter") for user in users: username = user['screen_name'] key = 'screen_name:%s' % user['id'] self.save_tweeter_user(user) self.redis.setex(key, username, 7 * 24 * 60 * 60) screen_names.append(username) assert len(result) == len(screen_names) screen_names.sort() self.write_json(screen_names) self.finish()