Войти на сайт используя urllib2 - Python 2.7

Итак, я использую это для Reddit бота, но я хочу быть в состоянии выяснить, КАК войти на любой сайт. Если это имеет смысл....

Я понимаю, что разные веб-сайты используют разные формы входа и т. Д. Так как мне выяснить, как оптимизировать его для каждого веб-сайта? Я предполагаю, что мне нужно что-то искать в файле HTML, но понятия не имею, что.

Я НЕ хочу использовать Mechanize или какую-либо другую библиотеку (именно об этом все остальные ответы здесь и на самом деле не помогают мне узнать, что происходит), так как я хочу узнать, как именно все это работает.

Документация urllib2 действительно не помогает мне.

Благодарю.

1 ответ

Решение

Я предвосхищу это, сказав, что некоторое время не входил в систему таким образом, поэтому я мог бы пропустить некоторые из более "принятых" способов сделать это.

Я не уверен, что это то, что вам нужно, но без такой библиотеки, как mechanize или более надежные рамки, такие как seleniumв основном случае вы просто смотрите на саму форму и ищите inputs, Например, глядя на www.reddit.com, а затем, просматривая источник отрендеренной страницы, вы найдете эту форму:

<form method="post" action="https://ssl.reddit.com/post/login" id="login_login-main"
  class="login-form login-form-side">
    <input type="hidden" name="op" value="login-main" />
    <input name="user" placeholder="username" type="text" maxlength="20" tabindex="1" />
    <input name="passwd" placeholder="password" type="password" tabindex="1" />

    <div class="status"></div>

    <div id="remember-me">
      <input type="checkbox" name="rem" id="rem-login-main" tabindex="1" />
      <label for="rem-login-main">remember me</label>
      <a class="recover-password" href="/password">reset password</a>
    </div>

    <div class="submit">
      <button class="btn" type="submit" tabindex="1">login</button>
    </div>

    <div class="clear"></div>
</form>

Здесь мы видим несколько inputх - op, user, passwd а также rem, Также обратите внимание на action Параметр - это URL, по которому будет размещена форма, и, следовательно, будет нашей целью. Итак, теперь последний шаг - упаковка параметров в полезную нагрузку и отправка их в виде POST запрос к action URL. Также ниже мы создаем новый openerдобавьте возможность обрабатывать куки и добавлять заголовки, что дает нам немного более надежный инструмент для выполнения запросов):

import cookielib
import urllib
import urllib2


# Store the cookies and create an opener that will hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

# Add our headers
opener.addheaders = [('User-agent', 'RedditTesting')]

# Install our opener (note that this changes the global opener to the one
# we just made, but you can also just call opener.open() if you want)
urllib2.install_opener(opener)

# The action/ target from the form
authentication_url = 'https://ssl.reddit.com/post/login'

# Input parameters we are going to send
payload = {
  'op': 'login-main',
  'user': '<username>',
  'passwd': '<password>'
  }

# Use urllib to encode the payload
data = urllib.urlencode(payload)

# Build our Request object (supplying 'data' makes it a POST)
req = urllib2.Request(authentication_url, data)

# Make the request and read the response
resp = urllib2.urlopen(req)
contents = resp.read()

Обратите внимание, что это может быть намного сложнее - вы также можете сделать это с GMail, например, но вам нужно выбрать параметры, которые будут меняться каждый раз (например, GALX параметр). Опять же, не уверен, что это то, что вы хотели, но надеюсь, что это поможет.

Другие вопросы по тегам