123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- import requests
- from .models import FacebookPage, FacebookReview, FacebookReviewReply
- from django.conf import settings
- # browser instance
- browser = getattr(settings, 'BROWSER', None)
- BASE_URL = 'https://graph.facebook.com'
- RECOMMENDATION_STR2NUM = {'negative': False, 'positive': True}
- def get_page_reviews(page_id):
- token = FacebookPage.objects.get(id=page_id).token
- url = f'{BASE_URL}/{page_id}/ratings?fields=open_graph_story&limit=25&access_token={token}'
- response = requests.get(url).json()
- # ratings has one field ['data'] which contain all reviews
- data = response.get('data')
- return data
- def store_review_reply(review_id, page_id):
- token = FacebookPage.objects.get(id=page_id).token
- url = f'{BASE_URL}/{review_id}/comments?access_token={token}'
- response = requests.get(url).json()
- replies = response.get('data')
- # if review has no reply it will return data=[]
- # if it has reply it it data will return list of reply
- if not replies:
- return
- # we are not interested in all replies.
- # We need the only reply that we did
- for reply in replies:
- from_ = reply.get('from')
- replier_id = from_.get('id') if from_ else None
- if replier_id and replier_id == page_id:
- reply_id = reply.get('id')
- print(reply_id)
- create_time = reply.get('created_time')
- print(create_time)
- replied_text = reply.get('message')
- print(replied_text)
- # create the review if not exists else update it
- rep = FacebookReviewReply.objects.filter(review_id=review_id).first()
- if not rep:
- FacebookReviewReply.objects.update_or_create(
- review_id=review_id,
- reply_id=reply_id,
- create_time=create_time,
- replied_text=replied_text
- )
- def store_reviews_into_db(page_id):
- reviews = get_page_reviews(page_id=page_id)
- for review in reviews:
- graph_story = review.get('open_graph_story')
- '''
- >>> graph_story.keys()
- dict_keys(['id', 'message', 'start_time', 'type', 'data'])
- '''
- review_id = graph_story.get('id')
- message = graph_story.get('message')
- start_time = graph_story.get('start_time')
- recommendation_type = RECOMMENDATION_STR2NUM[graph_story.get('data')['recommendation_type']]
- # review, created = FacebookReview.objects.update_or_create(
- # id=review_id,
- # recommendation_type=recommendation_type,
- # review_text=message,
- # create_time=start_time,
- # page_id=page_id
- # )
- try:
- review = FacebookReview.objects.get(id=review_id)
- review.recommendation_type = recommendation_type
- review.review_text = message
- review.create_time = start_time
- review.page_id = page_id
- review.save()
- except FacebookReview.DoesNotExist:
- review = FacebookReview.objects.create(
- id=review_id,
- recommendation_type=recommendation_type,
- review_text=message,
- create_time=start_time,
- page_id=page_id
- )
- print(f'New Facebook review has been created at {review.page_id}!')
- # store the review reply that is done by signature care
- store_review_reply(review_id=review_id, page_id=page_id)
- def populate_facebook_reviews():
- page_ids = FacebookPage.objects.values('id')
- for page_id in page_ids:
- store_reviews_into_db(page_id=page_id.get('id'))
- def reply2facebook_review(review_id, reply, like=False, love=False):
- # switch to mobile view which not support any JavaScript
- base_url = 'https://mbasic.facebook.com/'
- url = base_url + str(review_id)
- browser.get(url)
- # like the review if needed
- if like:
- like_btn = browser.find_element_by_xpath(
- '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[1]/a')
- assert like_btn.text == 'Like'
- like_btn.click()
- # love the review if needed
- if love:
- react_btn = browser.find_element_by_xpath(
- '/html/body/div/div/div[2]/div/div[1]/div[2]/div/div[1]/table/tbody/tr/td[2]/a')
- assert react_btn.text == 'React'
- react_btn.click()
- love_btn = browser.find_element_by_xpath(
- '/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]')
- assert love_btn.text == 'Love'
- love_btn.click()
- # reply the review
- reply_field = browser.find_element_by_id('composerInput')
- assert reply_field.get_attribute('name') == 'comment_text'
- reply_field.send_keys(reply)
- ins = browser.find_elements_by_tag_name('input')
- for x in ins:
- if 'omment' in x.get_attribute('value'):
- x.click()
- break
|