summaryrefslogtreecommitdiffstats
path: root/tasks.py
blob: cb0c3aa4d96b7260f78d9122fcb8c7d4990fd446 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
from xvfbwrapper import Xvfb
from selenium import webdriver
from selenium.common.exceptions import ElementNotVisibleException,\
    NoSuchElementException, StaleElementReferenceException
from time import sleep
from bs4 import BeautifulSoup
from celery import Celery, Task
from urllib2 import urlopen

app = Celery('tasks', broker='amqp://guest@horel.org//')
app.conf.CELERY_RESULT_BACKEND = 'rpc'
app.conf.CELERY_ENABLE_UTC = True
drivers = [None]


def normalize(url):
    if "profile.php" in url:
        basename = url.split("&")[0]
        fname = basename.split("=")[-1]
        getname = basename + "&sk=friends"
    else:
        basename = url.split("?")[0]
        fname = basename.split("/")[-1]
        getname = basename + "/friends"
    return basename, fname, getname


class ListFollowers(Task):

    @property
    def driver(self):
        if drivers[0] is None:
            uname, passwd = urlopen("http://horel.org:8080/").readline().strip().split()
            vdisplay = Xvfb()
            vdisplay.start()
            driver = webdriver.Chrome()
            driver.get("https://facebook.com")
            driver.find_element_by_id("email").send_keys(uname)
            elem = driver.find_element_by_id("pass")
            elem.send_keys(passwd)
            elem.submit()
            drivers[0] = driver
        return drivers[0]

    def run(self, url):
        self.driver.get(url)
        while True:
            for i in xrange(5):
                try:
                    footer = self.driver.find_element_by_class_name("_359")
                except (NoSuchElementException, ElementNotVisibleException):
                    sleep(0.1)
                else:
                    break
            else:
                break

            try:
                footer.click()
            except StaleElementReferenceException:
                sleep(0.1)

        for i in xrange(5):
            try:
                div = self.driver.find_element_by_class_name("_30f")
            except NoSuchElementException:
                sleep(0.1)
            else:
                break
        else:
            return {"friends": [], "for": url}

        soup = BeautifulSoup(div.get_attribute("outerHTML"))
        return {"friends": [li.a["href"]
                            for li in soup.findAll("li", class_="_698")],
                "for": url}


class NumFollowers(Task):

    @property
    def driver(self):
        if drivers[0] is None:
            uname, passwd = urlopen("http://horel.org:8080/").readline().strip().split()
            vdisplay = Xvfb()
            vdisplay.start()
            driver = webdriver.Chrome()
            driver.get("https://facebook.com")
            driver.find_element_by_id("email").send_keys(uname)
            elem = driver.find_element_by_id("pass")
            elem.send_keys(passwd)
            elem.submit()
            drivers[0] = driver
        return drivers[0]

    def run(self, url):
        self.driver.get(url)
        for i in xrange(5):
            try:
                box = self.driver.find_element_by_class_name("_1f8g")
            except (NoSuchElementException, ElementNotVisibleException):
                sleep(0.1)
            else:
                break
        else:
            return {"nfriends": 0, "for": url}

        soup = BeautifulSoup(box.get_attribute("outerHTML"))
        a = soup.find("a", class_="uiLinkSubtle")
        return {"nfriends": int(a.string.replace(",", "")),
                "for": url}