review_utils.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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, n_reviews):
  9. token = FacebookPage.objects.get(id=page_id).token
  10. url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit={n_reviews}&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, n_reviews=25):
  46. reviews = get_page_reviews(page_id=page_id, n_reviews=n_reviews)
  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. try:
  58. review = FacebookReview.objects.get(id=review_id)
  59. review.recommendation_type = recommendation_type
  60. review.review_text = message
  61. review.create_time = start_time
  62. review.page_id = page_id
  63. review.save()
  64. except FacebookReview.DoesNotExist:
  65. review = FacebookReview.objects.create(
  66. id=review_id,
  67. recommendation_type=recommendation_type,
  68. review_text=message,
  69. create_time=start_time,
  70. page_id=page_id
  71. )
  72. print(f'New Facebook review has been created at {review.page_id}!')
  73. # store the review reply that is done by signature care
  74. store_review_reply(review_id=review_id, page_id=page_id)
  75. def populate_facebook_reviews():
  76. page_ids = FacebookPage.objects.values('id')
  77. for page_id in page_ids:
  78. store_reviews_into_db(page_id=page_id.get('id'), n_reviews=15)
  79. def reply2facebook_review(review_id, reply, like=False, love=False):
  80. # switch to mobile view which not support any JavaScript
  81. base_url = 'https://mbasic.facebook.com/'
  82. url = base_url + str(review_id)
  83. browser.get(url)
  84. # like the review if needed
  85. if like:
  86. like_btn = browser.find_element_by_xpath(
  87. '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[1]/a')
  88. assert like_btn.text == 'Like'
  89. like_btn.click()
  90. # love the review if needed
  91. if love:
  92. react_btn = browser.find_element_by_xpath(
  93. '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[2]/a')
  94. assert react_btn.text == 'React'
  95. react_btn.click()
  96. love_btn = browser.find_element_by_xpath(
  97. '/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]')
  98. assert love_btn.text == 'Love'
  99. love_btn.click()
  100. # reply the review
  101. reply_field = browser.find_element_by_id('composerInput')
  102. assert reply_field.get_attribute('name') == 'comment_text'
  103. reply_field.send_keys(reply)
  104. ins = browser.find_elements_by_tag_name('input')
  105. for x in ins:
  106. if 'omment' in x.get_attribute('value'):
  107. x.click()
  108. break