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('')
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('')