review_utils.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import requests
  2. import json
  3. from .models import FacebookPage, FacebookReview, FacebookReviewReply
  4. from django.conf import settings
  5. # browser instance
  6. browser_uri = getattr(settings, 'BROWSER_URI', None)
  7. BASE_URL = 'https://graph.facebook.com'
  8. RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True}
  9. def get_page_reviews(page_id, n_reviews):
  10. token = FacebookPage.objects.get(id=page_id).token
  11. url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit={n_reviews}&access_token={token}'
  12. response = requests.get(url).json()
  13. # ratings has one field ['data'] which contain all reviews
  14. data = response.get('data')
  15. return data
  16. def store_review_reply(review_id, page_id):
  17. token = FacebookPage.objects.get(id=page_id).token
  18. url = f'{BASE_URL}/{review_id}/comments?access_token={token}'
  19. response = requests.get(url).json()
  20. replies = response.get('data')
  21. # if review has no reply it will return data=[]
  22. # if it has reply it it data will return list of reply
  23. if not replies:
  24. return
  25. # we are not interested in all replies.
  26. # We need the only reply that we did
  27. for reply in replies:
  28. from_ = reply.get('from')
  29. replier_id = from_.get('id') if from_ else None
  30. if replier_id and replier_id == page_id:
  31. reply_id = reply.get('id')
  32. create_time = reply.get('created_time')
  33. replied_text = reply.get('message')
  34. # create the review if not exists else update it
  35. rep = FacebookReviewReply.objects.filter(review_id=review_id).first()
  36. if rep:
  37. print('already has an object')
  38. if not rep:
  39. FacebookReviewReply.objects.update_or_create(
  40. review_id=review_id,
  41. reply_id=reply_id,
  42. create_time=create_time,
  43. replied_text=replied_text
  44. )
  45. print('Adding a reply to review....')
  46. def store_reviews_into_db(page_id, n_reviews=25):
  47. reviews = get_page_reviews(page_id=page_id, n_reviews=n_reviews)
  48. for review in reviews:
  49. graph_story = review.get('open_graph_story')
  50. '''
  51. >>> graph_story.keys()
  52. dict_keys(['id', 'message', 'start_time', 'type', 'data'])
  53. '''
  54. review_id = graph_story.get('id')
  55. message = graph_story.get('message')
  56. start_time = graph_story.get('start_time')
  57. recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']]
  58. try:
  59. review = FacebookReview.objects.get(id=review_id)
  60. review.recommendation_type = recommendation_type
  61. review.review_text = message
  62. review.create_time = start_time
  63. review.page_id = page_id
  64. review.save()
  65. except FacebookReview.DoesNotExist:
  66. review = FacebookReview.objects.create(
  67. id=review_id,
  68. recommendation_type=recommendation_type,
  69. review_text=message,
  70. create_time=start_time,
  71. page_id=page_id
  72. )
  73. print(f'New Facebook review has been created at {review.page_id}!')
  74. # store the review reply that is done by signature care
  75. store_review_reply(review_id=review_id, page_id=page_id)
  76. def populate_facebook_reviews():
  77. page_ids = FacebookPage.objects.values('id')
  78. for page_id in page_ids:
  79. store_reviews_into_db(page_id=page_id.get('id'), n_reviews=20)
  80. def reply2facebook_review(review_id, reply):
  81. url = browser_uri + f'/facebook/reply'
  82. payload = {
  83. 'id': review_id,
  84. 'reply': reply
  85. }
  86. headers = {'content-type': 'application/json'}
  87. response = requests.post(url, data=json.dumps(payload), headers=headers)
  88. return response.status_code
  89. def reply2facebook_review_using_api(review_id, reply):
  90. token = FacebookReview.objects.filter(pk=review_id).first().page.token
  91. url = f'{BASE_URL}/{review_id}/comments?message={reply}&access_token={token}'
  92. response = requests.post(url)
  93. return response.status_code