소스 검색

Added respond to facebook review

Mohidul Islam 4 년 전
부모
커밋
be03999417

+ 0 - 2
dashboard/views.py

@@ -88,10 +88,8 @@ class UnRepliedReviewList(LoginRequiredMixin, View):
         now = timezone.now()
         form = ReplyForm()
         date = now - timezone.timedelta(days=30)
-        hours = now - timezone.timedelta(hours=6)
         reviews = Review.objects.filter(reply=None, update_time__gte=date)\
             .exclude(comment=None, star_rating=5)\
-            .exclude(star_rating__lte=3, update_time__gte=hours)\
             .order_by('update_time')
 
         page = request.GET.get('page', 1)

+ 18 - 0
facebook_app/migrations/0004_auto_20200812_1021.py

@@ -0,0 +1,18 @@
+# Generated by Django 3.0.4 on 2020-08-12 10:21
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('facebook_app', '0003_facebookreviewreply'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='facebookreviewreply',
+            name='reply_id',
+            field=models.CharField(blank=True, max_length=255, null=True),
+        ),
+    ]

+ 1 - 1
facebook_app/models.py

@@ -25,7 +25,7 @@ class FacebookReview(models.Model):
 
 
 class FacebookReviewReply(models.Model):
-    reply_id = models.CharField(max_length=255)
+    reply_id = models.CharField(max_length=255, blank=True, null=True)
     review = models.OneToOneField(FacebookReview, on_delete=models.CASCADE)
     replied_text = models.TextField(blank=True, null=True)
     create_time = models.DateTimeField()

+ 37 - 0
facebook_app/review_utils.py

@@ -1,6 +1,11 @@
 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'
 
 
@@ -82,3 +87,35 @@ 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://m.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')
+        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')
+        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]')
+        love_btn.click()
+
+    # reply the review
+    reply_field = browser.find_element_by_xpath('//*[@id="composerInput"]')
+    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
+

+ 5 - 5
facebook_app/templates/facebook-reviews.html

@@ -18,14 +18,14 @@
         {% if review.review_text %}
           <p class="article-content">{{ review.review_text }}</p>
         {% endif %}
-        <form method="post" class="form" action="{% url 'un-replied-review' %}">
+        <form method="post" class="form" action="{% url 'facebook-reviews' %}">
             {% csrf_token %}
                 {{ form|crispy }}
-            <input type="hidden" value="{{ review.review_id }}" name="review_id">
+            <input type="hidden" value="{{ review.id }}" name="review_id">
             <input class="btn btn-primary ml-2" style="float: right" type="submit", value="Submit"/>
-            {% if review.review_text%}
-                <a href="{% url 'predict' review.id %}" class="btn btn-info">Analyze</a>
-            {% endif %}
+<!--            {% if review.review_text%}-->
+<!--                <a href="{% url 'predict' review.id %}" class="btn btn-info">Analyze</a>-->
+<!--            {% endif %}-->
         </form>
         </div>
 

+ 24 - 7
facebook_app/views.py

@@ -1,13 +1,16 @@
 from django.shortcuts import render
 from django.shortcuts import redirect
 from django.views.generic import View
+from django.contrib import messages
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.contrib.auth.mixins import LoginRequiredMixin
 from django.utils import timezone
 
-from .models import FacebookReview
+from .models import FacebookReview, FacebookReviewReply
 from .forms import ReplyForm
 
+from .review_utils import reply2facebook_review
+
 
 class FacebookReviews(LoginRequiredMixin, View):
 
@@ -16,18 +19,32 @@ class FacebookReviews(LoginRequiredMixin, View):
         if form.is_valid():
             replied_text = form.cleaned_data.get('reply')
         review_id = self.request.POST['review_id']
+        print('review-id', review_id)
         # TODO: Reply this review using selenium...
+        reply2facebook_review(
+            review_id=review_id,
+            reply=replied_text,
+            love=True
+        )
+
+        FacebookReviewReply.objects.create(
+            review_id=review_id,
+            create_time=timezone.now(),
+            replied_text=replied_text
+        )
+        messages.success(request, f'Your reply has been posted!')
 
-        return redirect('un-replied-review')
+        return redirect('facebook-reviews')
 
     def get(self, request, *args, **kwargs):
         now = timezone.now()
         form = ReplyForm()
-        date = now - timezone.timedelta(days=30)
-        # reviews = FacebookReview.objects.filter(reply=None, create_time__gte=date)\
-        #     .order_by('create_time')
-        reviews = FacebookReview.objects.filter(create_time__gte=date)\
-            .order_by('create_time')
+        date = now - timezone.timedelta(days=15)
+
+        reviews = FacebookReview.objects.filter(
+            facebookreviewreply=None,
+            create_time__gte=date
+        ).order_by('create_time')
 
         page = request.GET.get('page', 1)
         paginator = Paginator(reviews, 10)

+ 1 - 0
requirements.txt

@@ -20,6 +20,7 @@ pytz==2019.3
 requests==2.23.0
 requests-oauthlib==1.3.0
 rsa==4.0
+selenium==3.141.0
 six==1.14.0
 soupsieve==2.0.1
 sqlparse==0.3.1

+ 6 - 0
review_automation/settings/base.py

@@ -1,6 +1,7 @@
 import os
 from .config import *
 from .facebook_conf import *
+from .selenium_conf import *
 
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 
@@ -85,3 +86,8 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static_root')
 LOGIN_URL = '/admin/login'
 LOGIN_REDIRECT_URL = '/'
 CRISPY_TEMPLATE_PACK = 'bootstrap4'
+
+
+# selenium-firefox instance
+# BROWSER = get_firefox_browser()
+BROWSER = 'Bangladesh'

+ 16 - 0
review_automation/settings/selenium_conf.py

@@ -0,0 +1,16 @@
+from selenium.webdriver import Firefox
+from selenium.webdriver.firefox.options import Options
+
+
+def get_firefox_browser(headless=True):
+    opts = Options()
+    opts.headless = headless
+    browser = Firefox(options=opts)
+    browser.get('https://www.facebook.com/login.php?login_attempt=1&lwv=110')
+    email_field = browser.find_element_by_xpath("//input[@id='email' or @name='email']")
+    pass_field = browser.find_element_by_xpath("//input[@id='pass']")
+    login_btn = browser.find_element_by_xpath("//button[@id='loginbutton']")
+    email_field.send_keys('bytetrek.ltd.facebook@gmail.com')
+    pass_field.send_keys('sad2002S1')
+    login_btn.click()
+    return browser