Пример #1
0
    def post(self, *args, **keywords):

        task_type = args[0]

        try:
            from drenaj_api.utils.drenajneo4jmanager import init_user_to_graph_aux, upsert_campaign

            task_definition = bson.json_util.loads(self.get_argument('task_definition'))
            queue = self.get_argument('queue')
            metadata = task_definition['metadata']
            campaign_id = self.get_argument('campaign_id', 'default')
            campaign_node = upsert_campaign(campaign_id)
            user = init_user_to_graph_aux(campaign_node, metadata['user'])
            # user = self.application.db.get_user_from_watchlist(metadata['user'])
            print user
            if task_type == 'timeline':
                timeline_task_state = [rel for rel in user.match_incoming('TIMELINE_TASK_STATE')][0]
                user_object = dict(user.properties)
                user_object.update({'campaign_ids': campaign_id})
                res = app_object.send_task('timeline_retrieve_userlist',
                                           [[[user_object,
                                              timeline_task_state.properties['since_tweet_id'],
                                              timeline_task_state.properties['page_not_found']]]],
                                           queue=queue)
                timeline_task_state.properties['state'] = 1
                timeline_task_state.push()
            elif task_type == 'friendfollower':
                friendfollower_task_state = \
                    [rel for rel in user.match_incoming('FRIENDFOLLOWER_TASK_STATE')][0]
                res = app_object.send_task('crawl_friends_or_followers',
                                           [[[dict(user.properties),
                                              friendfollower_task_state.properties[
                                                  'page_not_found']]]],
                                           queue=queue)
                friendfollower_task_state.properties['state'] = 1
                friendfollower_task_state.push()
            elif task_type == 'userinfo':
                userinfo_task_state = \
                    [rel for rel in user.match_incoming('USER_INFO_HARVESTER_TASK_STATE')][0]
                res = app_object.send_task('crawl_user_info',
                                           [[[dict(user.properties),
                                              0]]],
                                           queue=queue)
                userinfo_task_state.properties['state'] = 1
                userinfo_task_state.push()
            else:
                raise MissingArgumentError('timeline or friendfollower')

            self.write(bson.json_util.dumps({'result': 'successful', 'message': res.task_id}))
            self.add_header('Content-Type', 'application/json')

        except MissingArgumentError as e:
            raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name)
Пример #2
0
    def post(self, *args):
        """ I chose to handle all options at once, using only POST requests
        for API requests. GET requests will be used for browser examination.
        """

        (friends_or_followers, ids_or_list, store_or_view) = args

        print "FollowerHandler: {} {} {}".format(friends_or_followers,
                                                 ids_or_list, store_or_view)

        auth_user_id = self.get_argument('auth_user_id')

        if ((store_or_view != None and store_or_view == 'view')
                or (store_or_view == None)):
            try:
                user_id = self.get_argument('user_id')
                # if no user_id is supplied.
                if user_id == '':
                    tmp = []
                else:

                    # friends or followers
                    if friends_or_followers == 'followers':
                        id_field_prefix_graph_query = 'friend_'
                        id_field_prefix_graph_query_opposite = ''
                    elif friends_or_followers == 'friends':
                        id_field_prefix_graph_query = ''
                        id_field_prefix_graph_query_opposite = 'friend_'

                    tx = graph.cypher.begin()
                    if friends_or_followers == 'followers':
                        tx.append(
                            "MATCH (u { id_str:{id_str} })<--(u2) RETURN u2",
                            {"id_str": str(user_id)})
                    elif friends_or_followers == 'friends':
                        tx.append(
                            "MATCH (u { id_str:{id_str} })-->(u2) RETURN u2",
                            {"id_str": str(user_id)})
                    results = tx.commit()
                    # take only the first line
                    results = results[0]

                    tmp = []
                    if ids_or_list == 'ids':
                        tmp = [x.u2.properties['id_str'] for x in results]
                    elif ids_or_list == 'list':
                        tmp = [x.u2.properties for x in results]
                self.write(bson.json_util.dumps({'results': tmp}))
                self.add_header('Content-Type', 'application/json')
            except MissingArgumentError as e:
                # TODO: implement logging.
                raise HTTPError(
                    500, 'You didn'
                    't supply %s as an argument' % e.arg_name)
        elif (store_or_view == 'store'):
            try:
                raise HTTPError(
                    500, "This functionality is not available for now.")
                # WARN: This functionality is not available for now.
                # # Check long int/str versions
                # id_str = str(self.get_argument('id_str'))
                # campaign_id = self.get_argument('campaign_id', 'default')
                # user_objects_str = self.get_argument('user_objects', '[]')
                #
                # res = app_object.send_task('store_friendsfollowers_in_neo4j_offline',
                #                            [[id_str, campaign_id, user_objects_str,
                #                              friends_or_followers]],
                #                            queue="offline_jobs")
                #
                # self.write(bson.json_util.dumps({'status': res.task_id}))

            except MissingArgumentError as e:
                # TODO: implement logging.
                raise HTTPError(
                    500, 'You didn'
                    't supply %s as an argument' % e.arg_name)
            pass
        elif store_or_view == 'store_user_info':
            try:
                user_object = self.get_argument('user_object', '{}')
                user_object = bson.json_util.loads(user_object)

                user_node = init_user_to_graph_aux('default', user_object)

                if user_node:
                    tx = graph.cypher.begin()
                    tx.append(
                        "MATCH (u:User { id_str: {id_str} })<-[r]-(t:USER_INFO_HARVESTER_TASK {id: 1}) DELETE r",
                        {'id_str': user_object['id_str']})
                    tx.commit()
                else:
                    self.write(bson.json_util.dumps({'status': 'error'}))

            except MissingArgumentError as e:
                # TODO: implement logging.
                raise HTTPError(
                    500, 'You didn'
                    't supply %s as an argument' % e.arg_name)
            pass
Пример #3
0
    def post(self, *args, **keywords):

        task_type = args[0]

        try:
            from drenaj_api.utils.drenajneo4jmanager import init_user_to_graph_aux, upsert_campaign

            task_definition = bson.json_util.loads(
                self.get_argument('task_definition'))
            queue = self.get_argument('queue')
            metadata = task_definition['metadata']
            campaign_id = self.get_argument('campaign_id', 'default')
            campaign_node = upsert_campaign(campaign_id)
            user = init_user_to_graph_aux(campaign_node, metadata['user'])
            # user = self.application.db.get_user_from_watchlist(metadata['user'])
            print user
            if task_type == 'timeline':
                timeline_task_state = [
                    rel for rel in user.match_incoming('TIMELINE_TASK_STATE')
                ][0]
                user_object = dict(user.properties)
                user_object.update({'campaign_ids': campaign_id})
                res = app_object.send_task('timeline_retrieve_userlist', [[[
                    user_object,
                    timeline_task_state.properties['since_tweet_id'],
                    timeline_task_state.properties['page_not_found']
                ]]],
                                           queue=queue)
                timeline_task_state.properties['state'] = 1
                timeline_task_state.push()
            elif task_type == 'friendfollower':
                friendfollower_task_state = \
                    [rel for rel in user.match_incoming('FRIENDFOLLOWER_TASK_STATE')][0]
                res = app_object.send_task('crawl_friends_or_followers', [[[
                    dict(user.properties),
                    friendfollower_task_state.properties['page_not_found']
                ]]],
                                           queue=queue)
                friendfollower_task_state.properties['state'] = 1
                friendfollower_task_state.push()
            elif task_type == 'userinfo':
                userinfo_task_state = \
                    [rel for rel in user.match_incoming('USER_INFO_HARVESTER_TASK_STATE')][0]
                res = app_object.send_task('crawl_user_info',
                                           [[[dict(user.properties), 0]]],
                                           queue=queue)
                userinfo_task_state.properties['state'] = 1
                userinfo_task_state.push()
            else:
                raise MissingArgumentError('timeline or friendfollower')

            self.write(
                bson.json_util.dumps({
                    'result': 'successful',
                    'message': res.task_id
                }))
            self.add_header('Content-Type', 'application/json')

        except MissingArgumentError as e:
            raise HTTPError(
                500, 'You didn'
                't supply %s as an argument' % e.arg_name)
Пример #4
0
    def post(self, *args):
        """ I chose to handle all options at once, using only POST requests
        for API requests. GET requests will be used for browser examination.
        """

        (friends_or_followers, ids_or_list, store_or_view) = args

        print "FollowerHandler: {} {} {}".format(friends_or_followers, ids_or_list, store_or_view)

        auth_user_id = self.get_argument('auth_user_id')

        if ((store_or_view != None and store_or_view == 'view') or (store_or_view == None)):
            try:
                user_id = self.get_argument('user_id')
                # if no user_id is supplied.
                if user_id == '':
                    tmp = []
                else:

                    # friends or followers
                    if friends_or_followers == 'followers':
                        id_field_prefix_graph_query = 'friend_'
                        id_field_prefix_graph_query_opposite = ''
                    elif friends_or_followers == 'friends':
                        id_field_prefix_graph_query = ''
                        id_field_prefix_graph_query_opposite = 'friend_'

                    tx = graph.cypher.begin()
                    if friends_or_followers == 'followers':
                        tx.append("MATCH (u { id_str:{id_str} })<--(u2) RETURN u2",
                                  {"id_str": str(user_id)})
                    elif friends_or_followers == 'friends':
                        tx.append("MATCH (u { id_str:{id_str} })-->(u2) RETURN u2",
                                  {"id_str": str(user_id)})
                    results = tx.commit()
                    # take only the first line
                    results = results[0]

                    tmp = []
                    if ids_or_list == 'ids':
                        tmp = [x.u2.properties['id_str'] for x in results]
                    elif ids_or_list == 'list':
                        tmp = [x.u2.properties for x in results]
                self.write(bson.json_util.dumps({'results': tmp}))
                self.add_header('Content-Type', 'application/json')
            except MissingArgumentError as e:
                # TODO: implement logging.
                raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name)
        elif (store_or_view == 'store'):
            try:
                raise HTTPError(500, "This functionality is not available for now.")
                # WARN: This functionality is not available for now.
                # # Check long int/str versions
                # id_str = str(self.get_argument('id_str'))
                # campaign_id = self.get_argument('campaign_id', 'default')
                # user_objects_str = self.get_argument('user_objects', '[]')
                #
                # res = app_object.send_task('store_friendsfollowers_in_neo4j_offline',
                #                            [[id_str, campaign_id, user_objects_str,
                #                              friends_or_followers]],
                #                            queue="offline_jobs")
                #
                # self.write(bson.json_util.dumps({'status': res.task_id}))

            except MissingArgumentError as e:
                # TODO: implement logging.
                raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name)
            pass
        elif store_or_view == 'store_user_info':
            try:
                user_object = self.get_argument('user_object', '{}')
                user_object = bson.json_util.loads(user_object)

                user_node = init_user_to_graph_aux('default', user_object)

                if user_node:
                    tx = graph.cypher.begin()
                    tx.append(
                        "MATCH (u:User { id_str: {id_str} })<-[r]-(t:USER_INFO_HARVESTER_TASK {id: 1}) DELETE r",
                        {'id_str': user_object['id_str']})
                    tx.commit()
                else:
                    self.write(bson.json_util.dumps({'status': 'error'}))

            except MissingArgumentError as e:
                # TODO: implement logging.
                raise HTTPError(500, 'You didn''t supply %s as an argument' % e.arg_name)
            pass