Пример #1
0
    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()
Пример #2
0
    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()
Пример #3
0
    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()