使用python登录facebook
如果我连续运行下面的代码10次,它将运行大约一半的时间,其余时间将失败。有人知道为什么吗使用python登录facebook,python,Python,如果我连续运行下面的代码10次,它将运行大约一半的时间,其余时间将失败。有人知道为什么吗 import urllib2, cookielib, re, os, sys class Facebook(): def __init__(self, email, password): self.email = email self.password = password cj = cookielib.CookieJar() op
import urllib2, cookielib, re, os, sys
class Facebook():
def __init__(self, email, password):
self.email = email
self.password = password
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
opener.addheaders = [('Referer', 'http://login.facebook.com/login.php'),
('Content-Type', 'application/x-www-form-urlencoded'),
('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.1.7) Gecko/20091221 Firefox/3.5.7 (.NET CLR 3.5.30729)')]
self.opener = opener
def login(self):
url = 'https://login.facebook.com/login.php?login_attempt=1'
data = "locale=en_US&non_com_login=&email="+self.email+"&pass="+self.password+"&lsd=20TOl"
usock = self.opener.open('http://www.facebook.com')
usock = self.opener.open(url, data)
if "Logout" in usock.read():
print "Logged in."
else:
print "failed login"
print usock.read()
sys.exit()
f = Facebook("test@gmail.com", "asdfasdf")
f.login()
也许Facebook限制了每分钟登录尝试的最大次数。这只是猜测 好吧,我想我基本上是通过查看响应数据找到答案的 “Logout”不存在,至少对我来说是这样,但“Logout”和“Logout”都存在(后者显示为
Logout.php
,在不同的地区可能不会改变)。因此,对于您的特定问题,只需将的“注销”替换为的“注销”
,就可以完成所有设置
现在,至于为什么它在第一次尝试后仍然有效,我没有费心去检查
此外,我建议使用urllib发送数据,以避免在发送带有“&”、“;”和其他用于控制的字符的内容时出现讨厌的错误。(电子邮件中的“@”也应该进行编码,但它似乎并没有打破这种特殊情况)
注意:我的测试基本上是更改字符串并在循环上运行一段时间,没有检测到任何问题。如果它真的对你不利,也许是对的。我也遇到了同样的问题。我找到的唯一解决办法是。。。facebook手机更稳定
class Acc:
jar = cookielib.CookieJar()
cookie = urllib2.HTTPCookieProcessor(jar)
opener = urllib2.build_opener(cookie)
headers = {
"User-Agent" : "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.8.1.14) Gecko/20080609 Firefox/2.0.0.14",
"Accept" : "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,text/png,*/*;q=0.5",
"Accept-Language" : "en-us,en;q=0.5",
"Accept-Charset" : "ISO-8859-1",
"Content-type": "application/x-www-form-urlencoded",
"Host": "m.facebook.com"
}
def login(self):
try:
params = urllib.urlencode({'email':'test@test.test','pass':'dempassword','login':'Log+In'})
req = urllib2.Request('http://m.facebook.com/login.php?m=m&refsrc=m.facebook.com%2F', params, self.headers)
res = self.opener.open(req)
html = res.read()
#print res.getheader('location').split('/')[3]
except urllib2.HTTPError, e:
print e.msg
except urllib2.URLError, e:
print e.reason[1]
return False
def fetch(self,url):
req = urllib2.Request(url,None,self.headers)
res = self.opener.open(req)
return res.read()
bla = Acc()
bla.login()
另外,facebook mobile没有使用ajax,所以弄清楚要发出什么请求要容易得多。每次修复都对我有效。
然后我想在登录后实际阅读页面内容。为此,我在“print”登录“”之后添加了一个“print usock.read()”,但返回了一个空字符串。我猜这是因为usock被调用了两次,所以我修改了对usock的第一次调用:
a = usock.read()
if "logout" in a:
print "Logged in."
return a
这样一来,第一次只需调用一次usock,它就能正常工作。然后我使用了return a,而不是print a,因为这样我就可以直接使用login()返回页面源代码。但是请随你的便。所以我尝试了你的代码,并让它登录了一次,然后像你一样,我再次登录时遇到了麻烦。在“if”语句之前的一行,我添加了
打印usock.read()
最终得到了一堆html代码。然后,我将代码放入记事本,将其保存为html文件,然后将其调出。
事情就是这样:Facebook怀疑我们是从计算机程序登录的,并等待我们通过显示验证码来验证我们的真实性。该程序没有考虑到这一点,并打印“登录失败”,当它实际上是一个挂起的登录更多 失败时有什么错误?没有错误。登录失败。输出为“登录失败”,我不能说明失败的原因,但这里的错误消息是“必须启用cookies”。顺便说一句,您在“登录失败”后看不到任何内容,因为usock
已被读取。保存self.opener.open中的结果,打开
并在出错时打印,您将看到准确的错误(尽管是html)。编辑:还有,你为什么要打开url两次?我第一次打开它是为了设置cookie。如果你尝试在没有cookie设置的情况下提交文章,你会得到“必须启用cookies”错误。我最初认为这是错误的,但我怀疑的原因是模式。它不工作几次,然后连续失败。它在工作和不工作时都是完全随机的。Protip:Facebook确实会在x次尝试后进行拦截。我也遇到了同样的问题。另外,如果你的账号不见了,你也可以使用这种屏幕抓取功能。Caio Romao如何删除好友列表,以及如何在成功登录后在fb墙上发布帖子