import requests from .models import FacebookPage, FacebookReview, FacebookReviewReply from django.conf import settings # browser instance browser = getattr(settings, 'BROWSER', None) BASE_URL = 'https://graph.facebook.com' RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True} def get_page_reviews(page_id): token = FacebookPage.objects.get(id=page_id).token url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit=25&access_token={token}' response = requests.get(url).json() # ratings has one field ['data'] which contain all reviews data = response.get('data') return data def store_review_reply(review_id, page_id): token = FacebookPage.objects.get(id=page_id).token url = f'{BASE_URL}/{review_id}/comments?access_token={token}' response = requests.get(url).json() replies = response.get('data') # if review has no reply it will return data=[] # if it has reply it it data will return list of reply if not replies: return # we are not interested in all replies. # We need the only reply that we did for reply in replies: from_ = reply.get('from') replier_id = from_.get('id') if from_ else None if replier_id and replier_id == page_id: reply_id = reply.get('id') print(reply_id) create_time = reply.get('created_time') print(create_time) replied_text = reply.get('message') print(replied_text) # create the review if not exists else update it rep = FacebookReviewReply.objects.filter(review_id=review_id).first() if not rep: FacebookReviewReply.objects.update_or_create( review_id=review_id, reply_id=reply_id, create_time=create_time, replied_text=replied_text ) def store_reviews_into_db(page_id): reviews = get_page_reviews(page_id=page_id) for review in reviews: graph_story = review.get('open_graph_story') ''' >>> graph_story.keys() dict_keys(['id', 'message', 'start_time', 'type', 'data']) ''' review_id = graph_story.get('id') message = graph_story.get('message') start_time = graph_story.get('start_time') recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']] # review, created = FacebookReview.objects.update_or_create( # id=review_id, # recommendation_type=recommendation_type, # review_text=message, # create_time=start_time, # page_id=page_id # ) try: review = FacebookReview.objects.get(id=review_id) review.recommendation_type = recommendation_type review.review_text = message review.create_time = start_time review.page_id = page_id review.save() except FacebookReview.DoesNotExist: review = FacebookReview.objects.create( id=review_id, recommendation_type=recommendation_type, review_text=message, create_time=start_time, page_id=page_id ) print(f'New Facebook review has been created at {review.page_id}!') # store the review reply that is done by signature care store_review_reply(review_id=review_id, page_id=page_id) def populate_facebook_reviews(): page_ids = FacebookPage.objects.values('id') for page_id in page_ids: store_reviews_into_db(page_id=page_id.get('id')) def reply2facebook_review(review_id, reply, like=False, love=False): # switch to mobile view which not support any JavaScript base_url = 'https://m.facebook.com/' url = base_url + str(review_id) browser.get(url) # like the review if needed if like: like_btn = browser.find_element_by_xpath( '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[1]/a') like_btn.click() # love the review if needed if love: react_btn = browser.find_element_by_xpath( '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[2]/a') react_btn.click() love_btn = browser.find_element_by_xpath( '/html/body/div/div/div[2]/div/table/tbody/tr/td/ul/li[2]/table/tbody/tr/td/a/div/table/tbody/tr/td[2]') love_btn.click() # reply the review reply_field = browser.find_element_by_xpath('//*[@id="composerInput"]') reply_field.send_keys(reply) ins = browser.find_elements_by_tag_name('input') for x in ins: if 'omment' in x.get_attribute('value'): x.click() break