瀏覽代碼

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()
         now = timezone.now()
         form = ReplyForm()
         form = ReplyForm()
         date = now - timezone.timedelta(days=30)
         date = now - timezone.timedelta(days=30)
-        hours = now - timezone.timedelta(hours=6)
         reviews = Review.objects.filter(reply=None, update_time__gte=date)\
         reviews = Review.objects.filter(reply=None, update_time__gte=date)\
             .exclude(comment=None, star_rating=5)\
             .exclude(comment=None, star_rating=5)\
-            .exclude(star_rating__lte=3, update_time__gte=hours)\
             .order_by('update_time')
             .order_by('update_time')
 
 
         page = request.GET.get('page', 1)
         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):
 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)
     review = models.OneToOneField(FacebookReview, on_delete=models.CASCADE)
     replied_text = models.TextField(blank=True, null=True)
     replied_text = models.TextField(blank=True, null=True)
     create_time = models.DateTimeField()
     create_time = models.DateTimeField()

+ 37 - 0
facebook_app/review_utils.py

@@ -1,6 +1,11 @@
 import requests
 import requests
 from .models import FacebookPage, FacebookReview, FacebookReviewReply
 from .models import FacebookPage, FacebookReview, FacebookReviewReply
 
 
+from django.conf import settings
+
+# browser instance
+browser = getattr(settings, 'BROWSER', None)
+
 BASE_URL = 'https://graph.facebook.com'
 BASE_URL = 'https://graph.facebook.com'
 
 
 
 
@@ -82,3 +87,35 @@ def populate_facebook_reviews():
     page_ids = FacebookPage.objects.values('id')
     page_ids = FacebookPage.objects.values('id')
     for page_id in page_ids:
     for page_id in page_ids:
         store_reviews_into_db(page_id=page_id.get('id'))
         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 %}
         {% if review.review_text %}
           <p class="article-content">{{ review.review_text }}</p>
           <p class="article-content">{{ review.review_text }}</p>
         {% endif %}
         {% endif %}
-        <form method="post" class="form" action="{% url 'un-replied-review' %}">
+        <form method="post" class="form" action="{% url 'facebook-reviews' %}">
             {% csrf_token %}
             {% csrf_token %}
                 {{ form|crispy }}
                 {{ 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"/>
             <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>
         </form>
         </div>
         </div>
 
 

+ 24 - 7
facebook_app/views.py

@@ -1,13 +1,16 @@
 from django.shortcuts import render
 from django.shortcuts import render
 from django.shortcuts import redirect
 from django.shortcuts import redirect
 from django.views.generic import View
 from django.views.generic import View
+from django.contrib import messages
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
 from django.contrib.auth.mixins import LoginRequiredMixin
 from django.contrib.auth.mixins import LoginRequiredMixin
 from django.utils import timezone
 from django.utils import timezone
 
 
-from .models import FacebookReview
+from .models import FacebookReview, FacebookReviewReply
 from .forms import ReplyForm
 from .forms import ReplyForm
 
 
+from .review_utils import reply2facebook_review
+
 
 
 class FacebookReviews(LoginRequiredMixin, View):
 class FacebookReviews(LoginRequiredMixin, View):
 
 
@@ -16,18 +19,32 @@ class FacebookReviews(LoginRequiredMixin, View):
         if form.is_valid():
         if form.is_valid():
             replied_text = form.cleaned_data.get('reply')
             replied_text = form.cleaned_data.get('reply')
         review_id = self.request.POST['review_id']
         review_id = self.request.POST['review_id']
+        print('review-id', review_id)
         # TODO: Reply this review using selenium...
         # 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):
     def get(self, request, *args, **kwargs):
         now = timezone.now()
         now = timezone.now()
         form = ReplyForm()
         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)
         page = request.GET.get('page', 1)
         paginator = Paginator(reviews, 10)
         paginator = Paginator(reviews, 10)

+ 1 - 0
requirements.txt

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

+ 6 - 0
review_automation/settings/base.py

@@ -1,6 +1,7 @@
 import os
 import os
 from .config import *
 from .config import *
 from .facebook_conf import *
 from .facebook_conf import *
+from .selenium_conf import *
 
 
 BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 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_URL = '/admin/login'
 LOGIN_REDIRECT_URL = '/'
 LOGIN_REDIRECT_URL = '/'
 CRISPY_TEMPLATE_PACK = 'bootstrap4'
 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