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}
|