review_utils.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. import requests
  2. from .models import FacebookPage, FacebookReview, FacebookReviewReply
  3. from django.conf import settings
  4. # browser instance
  5. browser = getattr(settings, 'BROWSER', None)
  6. BASE_URL = 'https://graph.facebook.com'
  7. RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True}
  8. def get_page_reviews(page_id):
  9. token = FacebookPage.objects.get(id=page_id).token
  10. url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit=25&access_token={token}'
  11. response = requests.get(url).json()
  12. # ratings has one field ['data'] which contain all reviews
  13. data = response.get('data')
  14. return data
  15. def store_review_reply(review_id, page_id):
  16. token = FacebookPage.objects.get(id=page_id).token
  17. url = f'{BASE_URL}/{review_id}/comments?access_token={token}'
  18. response = requests.get(url).json()
  19. replies = response.get('data')
  20. # if review has no reply it will return data=[]
  21. # if it has reply it it data will return list of reply
  22. if not replies:
  23. return
  24. # we are not interested in all replies.
  25. # We need the only reply that we did
  26. for reply in replies:
  27. from_ = reply.get('from')
  28. replier_id = from_.get('id') if from_ else None
  29. if replier_id and replier_id == page_id:
  30. reply_id = reply.get('id')
  31. print(reply_id)
  32. create_time = reply.get('created_time')
  33. print(create_time)
  34. replied_text = reply.get('message')
  35. print(replied_text)
  36. # create the review if not exists else update it
  37. rep = FacebookReviewReply.objects.filter(review_id=review_id).first()
  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. def store_reviews_into_db(page_id):
  46. reviews = get_page_reviews(page_id=page_id)
  47. for review in reviews:
  48. graph_story = review.get('open_graph_story')
  49. '''
  50. >>> graph_story.keys()
  51. dict_keys(['id', 'message', 'start_time', 'type', 'data'])
  52. '''
  53. review_id = graph_story.get('id')
  54. message = graph_story.get('message')
  55. start_time = graph_story.get('start_time')
  56. recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']]
  57. # review, created = FacebookReview.objects.update_or_create(
  58. # id=review_id,
  59. # recommendation_type=recommendation_type,
  60. # review_text=message,
  61. # create_time=start_time,
  62. # page_id=page_id
  63. # )
  64. try:
  65. review = FacebookReview.objects.get(id=review_id)
  66. review.recommendation_type = recommendation_type
  67. review.review_text = message
  68. review.create_time = start_time
  69. review.page_id = page_id
  70. review.save()
  71. except FacebookReview.DoesNotExist:
  72. review = FacebookReview.objects.create(
  73. id=review_id,
  74. recommendation_type=recommendation_type,
  75. review_text=message,
  76. create_time=start_time,
  77. page_id=page_id
  78. )
  79. print(f'New Facebook review has been created at {review.page_id}!')
  80. # store the review reply that is done by signature care
  81. store_review_reply(review_id=review_id, page_id=page_id)
  82. def populate_facebook_reviews():
  83. page_ids = FacebookPage.objects.values('id')
  84. for page_id in page_ids:
  85. store_reviews_into_db(page_id=page_id.get('id'))
  86. def reply2facebook_review(review_id, reply, like=False, love=False):
  87. # switch to mobile view which not support any JavaScript
  88. base_url = 'https://m.facebook.com/'
  89. url = base_url + str(review_id)
  90. browser.get(url)
  91. # like the review if needed
  92. if like:
  93. like_btn = browser.find_element_by_xpath(
  94. '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[1]/a')
  95. like_btn.click()
  96. # love the review if needed
  97. if love:
  98. react_btn = browser.find_element_by_xpath(
  99. '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[2]/a')
  100. react_btn.click()
  101. love_btn = browser.find_element_by_xpath(
  102. '/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]')
  103. love_btn.click()
  104. # reply the review
  105. reply_field = browser.find_element_by_xpath('//*[@id="composerInput"]')
  106. reply_field.send_keys(reply)
  107. ins = browser.find_elements_by_tag_name('input')
  108. for x in ins:
  109. if 'omment' in x.get_attribute('value'):
  110. x.click()
  111. break