def post(self):

        # --- Validation
        req = decode_request(self.request)
        if req is None:
            logging.warning('unauthorized query - ignoring')
            return self.response.out.write('ignored')

        if self.request.get('type') == None:
            logging.warning('added task without required params - ignoring')
            return self.response.out.write('ignored')

        # --- Methods
        url = 'https://api.instagram.com/v1'
        method = urlfetch.GET
        params = ''

        if self.request.get('type') == 'like':
            method = urlfetch.POST
            params = 'access_token=%s' % req['user'].access_token
            url += '/media/%s/likes/' % self.request.get('media_id')

        elif self.request.get('type') == 'unlike':
            method = urlfetch.DELETE
            url += '/media/%s/likes/' % self.request.get('media_id')
            url += '?access_token=' + req['user'].access_token

        elif self.request.get('type') == 'add_instadaily_tag':
            method = urlfetch.POST
            params = 'access_token=%s&text=%s' % (req['user'].access_token, INSTADAILY_TAG_MSG)
            url += '/media/%s/comments' % self.request.get('media_id')

        # elif self.request.get('type') == 'recent' and self.request.get('user_id') is not None:
        # 	url += '/users/%s/media/recent' % self.request.get('user_id')
        # 	url += '?access_token=' + req['user'].access_token

        elif self.request.get('type') == 'user' and self.request.get('user_id'):
            url += '/users/%s' % self.request.get('user_id')
            url += '?access_token=' + req['user'].access_token

        try:
            result = urlfetch.fetch(url=url, payload=str(params), method=method)
        except urlfetch.DownloadError:
            return

        if result.status_code == 200:
            if self.request.get('type') == 'like':
                p = Photo().get_by_instagram_id(self.request.get('media_id'))
                p.likes += 1
                p.put()

                req['user'].vote_like += 1
                req['user'].put()

            # elif self.request.get('type') == 'recent' and self.request.get('user_id') is not None:
            # 	try:
            # 		data = json.loads(result.content)['data']
            # 	except KeyError:
            # 		logging.error('DATA not found in recent photos for user %s' % self.request.get('user_id'))
            # 		return
            #
            # 	for photo in data:
            # 		Photo().add_or_update(photo)

            elif self.request.get('type') == 'user' and self.request.get('user_id') is not None:
                try:
                    data = json.loads(result.content)['data']
                except KeyError:
                    logging.error('DATA not found in recent photos for user %s' % self.request.get('user_id'))
                    return

                if User.all().filter('instagram_id =', data['id']).count() == 0:
                    user = User()
                    user.name = data['username']
                    user.instagram_id = data['id']
                    user.full_name = data['full_name']
                    user.pic = data['profile_picture']
                    user.photos = 0
                    user.vote_like = 0
                    user.vote_dislike = 0
                    try:
                        user.last_subject_id = Subject().get_current().key().id()
                    except AttributeError:
                        logging.error('cannot find current subject!!!')
                        user.last_subject_id = 0
                    user.last_subject_points = 0
                    user.put()
                else:
                    user = User.all().filter('instagram_id =', data['id']).get()
                    user.pic = data['profile_picture']
                    user.full_name = data['full_name']
                    user.put()

        else:
            j = json.loads(result.content)
            # only disliking photos that wasn't previously liked
            if j.has_key('meta') and j['meta']['error_message'] == 'the user has not liked this media':
                p = Photo().get_by_instagram_id(self.request.get('media_id'))
                p.dislikes += 1
                p.put()

                req['user'].vote_dislike += 1
                req['user'].put()

                return

            logging.warning('API call failed with %s' % result.content)

        self.response.out.write('')
示例#2
0
def APICallWorker(request):
    if request.method == 'GET': return HttpResponse('Method not supported')

    # --- Validation
    req = decode_request(request)
    if req is None:
        logging.warning('unauthorized query - ignoring')
        return HttpResponse('ignored')

    if request.POST.get('type') == None:
        logging.warning('added task without required params - ignoring')
        return HttpResponse('ignored')

    # --- Methods
    url = 'https://api.instagram.com/v1'
    method = 'GET'
    params = {}

    if request.POST.get('type') == 'like':
        method = 'POST'
        params = {'access_token': req['user'].access_token}
        url += '/media/%s/likes/' % request.POST.get('media_id')

    elif request.POST.get('type') == 'unlike':
        method = 'DELETE'
        url += '/media/%s/likes/' % request.POST.get('media_id')
        url += '?access_token=' + req['user'].access_token

    elif request.POST.get('type') == 'add_instadaily_tag':
        method = 'POST'
        params = 'access_token=%s&text=%s' % (req['user'].access_token, INSTADAILY_TAG_MSG)
        url += '/media/%s/comments' % request.POST.get('media_id')

    elif request.POST.get('type') == 'user' and request.POST.has_key('user_id'):
        url += '/users/%s' % request.POST.get('user_id')
        url += '?access_token=' + req['user'].access_token

    result = rest_request(url, params, method)

    if request.POST.get('type') == 'like':
        p = Photo.objects.get_by_instagram_id(request.POST.get('media_id'))
        p.likes += 1
        p.save()

        req['user'].vote_like += 1
        req['user'].save()

    elif request.POST.get('type') == 'user' and request.POST.get('user_id') is not None:
        try:
            data = json.loads(result)['data']
        except json.JSONDecodeError:
            print 'failed to decode json %s' % result
            print url
            return HttpResponse('')
        except KeyError:
            logging.error('DATA not found in recent photos for user %s' % request.POST.get('user_id'))
            return HttpResponse('')

        try:
            user = User.objects.filter(instagram_id=data['id']).get()
            user.pic = data['profile_picture']
            user.full_name = data['full_name']
            user.save()

        except User.DoesNotExist:
            user = User()
            user.name = data['username']
            user.instagram_id = data['id']
            user.full_name = data['full_name']
            user.pic = data['profile_picture']
            user.photos = 0
            user.vote_like = 0
            user.vote_dislike = 0
            try:
                user.last_subject_id = Subject.objects.get_current().id
            except AttributeError:
                logging.error('cannot find current subject!!!')
                user.last_subject_id = 0
            user.last_subject_points = 0
            user.save()

    else:
        try:
            j = json.loads(result)
        except json.JSONDecodeError:
            print 'failed to decode json %s' % result
            print url
            return HttpResponse('')

        # only disliking photos that wasn't previously liked
        if j.has_key('meta') and j['meta'].has_key('error_message') and j['meta'][
            'error_message'] == 'the user has not liked this media':
            p = Photo.objects.get_by_instagram_id(request.POST.get('media_id'))
            p.dislikes += 1
            p.save()

            req['user'].vote_dislike += 1
            req['user'].save()

            return HttpResponse('')

        # logging.warning('API call failed with %s' % result)

    return HttpResponse('')