review_utils.py 4.8 KB

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