Вход в Facebook с Python - PullRequest
       13

Вход в Facebook с Python

4 голосов
/ 08 января 2010

Если я выполню следующий код 10 раз подряд, он будет работать примерно половину времени, а остальное не получится. Кто-нибудь знает почему?

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()

Ответы [ 5 ]

16 голосов
/ 14 июня 2012

Итак, я попробовал ваш код и заставил его один раз войти в систему, а затем, как и вы, у меня возникли проблемы при повторном входе. В строке перед оператором «если» я добавил распечатать usock.read () и в итоге получил кучу HTML-кода. Затем я поместил этот код в блокнот, сохранил его в виде HTML-файла и вытащил. Это то, что происходит: Facebook подозревает, что мы выполняем вход из компьютерной программы, и ждет, когда мы подтвердим, что мы действительны, показав слово-капчу. Программа не учитывает это и выводит «Failed login», когда это действительно больше ожидающего входа в систему.

5 голосов
/ 02 октября 2010

Я столкнулся с той же проблемой. Единственное решение, которое я нашел, состояло в том, что ... 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 не заполнен ajax, поэтому выяснить, какие запросы делать, гораздо проще.

1 голос
/ 10 марта 2011

Исправление работало для меня каждый раз. Затем я захотел прочитать содержимое страницы после входа в систему. Для этого я добавил «print usock.read ()» сразу после «print» Logged in », но это вернуло пустую строку. Я догадался, что это потому, что usock вызывается дважды, поэтому я просто изменил первый вызов usock:

    a = usock.read()
    if "logout" in a:
        print "Logged in."
        return a

Таким образом, в первый раз происходит только один вызов usock, и он работает. Вместо печати a я затем использовал return a, потому что тогда я мог напрямую использовать login () для возврата источника страницы. Но, пожалуйста, оденьте себя.

0 голосов
/ 09 января 2010

Хорошо, я думаю, что нашел ответ, в основном, посмотрев на данные ответа.

«Выход из системы» не существует - по крайней мере, для меня - тем не менее, «Выход из системы» и «Выход из системы» существуют (позднее появляется как logout.php, что, вероятно, не изменится в разных локалях) Итак, для вашей конкретной проблемы, просто замените "Log out" на "logout" и все готово.

Теперь, что касается того, почему это работало после первой попытки, я не стал проверять

Кроме того, я бы предложил использовать urlencode urllib для отправки ваших данных, чтобы избежать неприятных ошибок при отправке сообщений с "&", ";" и другие символы, используемые для контроля. («@» Из электронных писем также должно быть закодировано, но это, похоже, не нарушает этот конкретный случай)

Примечание : Мой тест в основном менял строку и выполнял ее в течение некоторого времени, проблем не было обнаружено. Если это сломается для вас, возможно Андрей прав.

0 голосов
/ 09 января 2010

Возможно, Facebook ограничивает максимальное количество попыток входа в минуту. Это всего лишь предположение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...