войти на сайт (в частности, Netflix) с Python - PullRequest
1 голос
/ 07 марта 2011

Я пытаюсь войти в netflix с помощью Python, будет работать отлично, но я не могу определить, была ли погода, или не удалось войти, код выглядит так:

#this is not purely my code! Thanks to Ori for the code
import urllib
username = raw_input('Enter your email: ')
password = raw_input('Enter your password: ')
params = urllib.urlencode(
{'email': username,
'password': password })
f = urllib.urlopen("https://signup.netflix.com/Login", params)
if "The login information you entered does not match an account in our records.       Remember, your email address is not case-sensitive, but passwords are." in f.read():
    success = False
    print "Either your username or password was incorrect."
else:
    success = True
    print "You are now logged into netflix as", username
    raw_input('Press enter to exit the program')

Как всегда, большое спасибо !!

1 Ответ

4 голосов
/ 28 марта 2011

Во-первых, я просто поделюсь некоторыми словами, которые я заметил на сайте Netflix в разделе Ограничения на использование :

Любое несанкционированное использование службы Netflix или ее содержимого приведет к аннулированию предоставленной нами ограниченной лицензии и приведет к аннулированию вашего членства.

Короче говоря, я не уверен, что ваш сценарий делает после этого, но некоторые действия могут поставить под угрозу ваши отношения с Netflix. Я не читал весь ToS, но вы должны.

Тем не менее, существует множество законных причин для очистки html-информации, и я делаю это постоянно. Итак, моя первая ставка с этой конкретной проблемой - вы используете неверную строку обнаружения ... Просто отправьте поддельное электронное письмо / пароль и распечатайте ответ ... Возможно, вы сделали предположение о том, как это выглядит, когда вы входите с браузер, но браузер отправляет информацию, которая получает дальнейшее развитие.

Хотелось бы предложить конкретную информацию о том, что делать дальше, но я бы предпочел не рисковать своими отношениями с 'flix, чтобы дать лучший ответ на вопрос ... поэтому я просто поделюсь несколькими наблюдениями, которые я почерпнул из скребков множество других сайтов, которые затрудняли использование веб-роботов ...

Сначала войдите в свою учетную запись с помощью Firefox и убедитесь, что надстройка Live HTTP Headers включена и находится в режиме захвата ... то, что вы увидите при входе в систему, это неоценимо для ваших усилий по написанию сценариев ... например, это было из сеанса, когда я вошел в систему ...

    POST /Login HTTP/1.1
    Host: signup.netflix.com
    User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.16) Gecko/20110319 Firefox/3.6.16
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    Accept-Language: en-us,en;q=0.5
    Accept-Encoding: gzip,deflate
    Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
    Keep-Alive: 115
    Connection: keep-alive
    Referer: https://signup.netflix.com/Login?country=1&rdirfdc=true
    --->Insert lots of private stuff here
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 168
    authURL=sOmELoNgTeXtStRiNg&nextpage=&SubmitButton=true&country=1&email=EmAiLAdDrEsS%40sOmEMaIlProvider.com&password=UnEnCoDeDpAsSwOrD

Обратите особое внимание на материал под полем «Длина содержимого» и все параметры, следующие за ним.

Теперь выйдите из системы и снова откройте страницу входа в систему ... есть вероятность, что некоторые из этих полей будут скрыты как информация о состоянии в тегах <input type="hidden"> ... некоторые веб-приложения сохраняют состояние, заполняя ваши поля и затем они используют javascript для повторной отправки той же информации в POST вашего логина. Я обычно использую lxml для разбора получаемых страниц ... если вы попробуете это, имейте в виду, что lxml предпочитает utf-8, поэтому я включаю код, который автоматически конвертирует, когда видит другие кодировки ...

            response = urlopen(req,data)
            # info is from the HTTP headers... like server version
            info = response.info().dict
            # page is the HTML response
            page = response.read()
            encoding = chardet.detect(page)['encoding']
            if encoding != 'utf-8':
                page = page.decode(encoding, 'replace').encode('utf-8')

Кстати, Майкл Фурд имеет очень хороший справочник по urllib2 и многим другим проблемам.

Итак, в итоге :

  1. Используя ваш существующий скрипт, выведите результаты из известного поддельного логина, чтобы убедиться, что вы анализируете нужную информацию ... Я почти уверен вы ошиблись в предположении выше
  2. Также похоже, что вы не отправляете достаточно параметров в POST. Опыт подсказывает, что вам нужно установить authURL в дополнение к email и password ... если возможно, я пытаюсь имитировать то, что посылает браузер ...
  3. Время от времени имеет значение, установили ли вы строку user-agent и ссылающуюся веб-страницу. Я всегда устанавливаю их, когда очищаю, чтобы не тратить время на отладку.
  4. Когда ничего не помогает, посмотрите информацию, сохраненную в куки, которые они отправляют
  5. Иногда сайты base64 кодируют данные отправки формы. Я не знаю, делает ли Netflix
  6. Некоторые веб-сайты очень защищают свою интеллектуальную собственность, и программное чтение / архивирование информации считается кражей их IP. Снова, прочитайте ToS ... Я не знаю, как Netflix просматривает то, что вы хотите сделать.
  7. Я предоставляю это в информационных целях и ни при каких обстоятельствах не одобряю и не оправдываю нарушение условий обслуживания Netflix ... и я не могу подтвердить, будет ли предложенная вами деятельность ... Я просто говорю, что она может :-) , Поговорите с адвокатом, который специализируется на электронном обнаружении, если вам нужно официальное решение. Ноги первые. Не ешьте желтый снег ... и т.д ...
...