review_utils.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. if created:
  65. print(f'New Facebook review has been created at {page_id}!')
  66. # store the review reply that is done by signature care
  67. store_review_reply(review_id=review_id, page_id=page_id)
  68. def populate_facebook_reviews():
  69. page_ids = FacebookPage.objects.values('id')
  70. for page_id in page_ids:
  71. store_reviews_into_db(page_id=page_id.get('id'))
  72. def reply2facebook_review(review_id, reply, like=False, love=False):
  73. # switch to mobile view which not support any JavaScript
  74. base_url = 'https://m.facebook.com/'
  75. url = base_url + str(review_id)
  76. browser.get(url)
  77. # like the review if needed
  78. if like:
  79. like_btn = browser.find_element_by_xpath(
  80. '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[1]/a')
  81. like_btn.click()
  82. # love the review if needed
  83. if love:
  84. react_btn = browser.find_element_by_xpath(
  85. '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[2]/a')
  86. react_btn.click()
  87. love_btn = browser.find_element_by_xpath(
  88. '/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]')
  89. love_btn.click()
  90. # reply the review
  91. reply_field = browser.find_element_by_xpath('//*[@id="composerInput"]')
  92. reply_field.send_keys(reply)
  93. ins = browser.find_elements_by_tag_name('input')
  94. for x in ins:
  95. if 'omment' in x.get_attribute('value'):
  96. x.click()
  97. break