review_utils.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import requests
  2. from .models import FacebookPage, FacebookReview, FacebookReviewReply
  3. BASE_URL = 'https://graph.facebook.com'
  4. RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True}
  5. def get_page_reviews(page_id):
  6. token = FacebookPage.objects.get(id=page_id).token
  7. url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit=25&access_token={token}'
  8. response = requests.get(url).json()
  9. # ratings has one field ['data'] which contain all reviews
  10. data = response.get('data')
  11. return data
  12. def store_review_reply(review_id, page_id):
  13. token = FacebookPage.objects.get(id=page_id).token
  14. url = f'{BASE_URL}/{review_id}/comments?access_token={token}'
  15. response = requests.get(url).json()
  16. replies = response.get('data')
  17. # if review has no reply it will return data=[]
  18. # if it has reply it it data will return list of reply
  19. if not replies:
  20. return
  21. # we are not interested in all replies.
  22. # We need the only reply that we did
  23. for reply in replies:
  24. from_ = reply.get('from')
  25. replier_id = from_.get('id') if from_ else None
  26. if replier_id and replier_id == page_id:
  27. reply_id = reply.get('id')
  28. print(reply_id)
  29. create_time = reply.get('created_time')
  30. print(create_time)
  31. replied_text = reply.get('message')
  32. print(replied_text)
  33. # create the review if not exists else update it
  34. rep = FacebookReviewReply.objects.filter(review_id=review_id).first()
  35. if not rep:
  36. FacebookReviewReply.objects.update_or_create(
  37. review_id=review_id,
  38. reply_id=reply_id,
  39. create_time=create_time,
  40. replied_text=replied_text
  41. )
  42. def store_reviews_into_db(page_id):
  43. reviews = get_page_reviews(page_id=page_id)
  44. for review in reviews:
  45. graph_story = review.get('open_graph_story')
  46. '''
  47. >>> graph_story.keys()
  48. dict_keys(['id', 'message', 'start_time', 'type', 'data'])
  49. '''
  50. review_id = graph_story.get('id')
  51. message = graph_story.get('message')
  52. start_time = graph_story.get('start_time')
  53. recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']]
  54. review, created = FacebookReview.objects.update_or_create(
  55. id=review_id,
  56. recommendation_type=recommendation_type,
  57. review_text=message,
  58. create_time=start_time,
  59. page_id=page_id
  60. )
  61. if created:
  62. print(f'New Facebook review has been created at {page_id}!')
  63. # store the review reply that is done by signature care
  64. store_review_reply(review_id=review_id, page_id=page_id)
  65. def populate_facebook_reviews():
  66. page_ids = FacebookPage.objects.values('id')
  67. for page_id in page_ids:
  68. store_reviews_into_db(page_id=page_id.get('id'))