Механизация для Python и авторизация без предварительного получения ошибки 401 - PullRequest
3 голосов
/ 08 декабря 2011

Я пытаюсь использовать Mechanize для автоматизации взаимодействий с очень требовательной унаследованной системой. В частности, после первой страницы входа авторизация должна отправляться при каждом запросе, который выводит вас из системы. К сожалению, Mechanize, кажется, довольствуется только отправкой авторизации после первого получения 401 несанкционированной ошибки. Есть ли способ заставить его отправлять авторизацию каждый раз?

Вот пример кода:

br.add_password("http://example.com/securepage", "USERNAME", "PASSWORD", "/MYREALM")
br.follow_link(link_to_secure_page) # where the url is the previous URL

Вот ответ, который я получаю от отладки Mechanize:

send: 'GET /securepage HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: example.com\r\nReferer: http://example.com/home\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\n'
reply: 'HTTP/1.1 401 Unauthorized\r\n'
header: Server: Tandy1000Web
header: Date: Thu, 08 Dec 2011 03:08:04 GMT
header: Connection: close
header: Expires: Tue, 01 Jan 1980 06:00:00 GMT
header: Content-Type: text/html; charset=US-ASCII
header: Content-Length: 210
header: WWW-Authenticate: Basic realm="/MYREALM"
header: Cache-control: no-cache
send: 'GET /securepage HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: example.com\r\nReferer: http://example.com/home\r\nConnection: close\r\nAuthorization: Basic VVNFUk5BTUU6UEFTU1dPUkQ=\r\nUser-Agent: Python-urllib/2.7\r\n\r\n'
reply: 'HTTP/1.1 200 OK\r\n'
header: Server: Tandy1000Web
header: Date: Thu, 08 Dec 2011 03:08:07 GMT
header: Connection: close
header: Last-Modified: Thu, 08 Dec 2011 03:08:06 GMT
header: Expires: Tue, 01 Jan 1980 06:00:00 GMT
header: Content-Type: text/html; charset=UTF-8
header: Content-Length: 33333
header: Cache-control: no-cache

Проблема заключается в том, что вопреки тому, что должно происходить в современном веб-приложении с запросом GET, при первой ошибке 401 я получаю не ту страницу. С помощью CURL и urllib2 я подтвердил, что если я нажму URL-адрес напрямую, передав заголовок auth при первом запросе, я получу правильную страницу.

Есть ли какие-либо советы о том, как заставить механизм механизировать всегда отправлять заголовки аутентификации и избегать первой ошибки 401? Это должно быть исправлено на стороне клиента. Я не могу изменить сервер.

1 Ответ

2 голосов
/ 27 июля 2013
from base64 import b64encode
import mechanize

url = 'http://192.168.3.5/table.js'
username = 'admin'
password = 'password'

# I have had to add a carriage return ('%s:%s\n'), but
# you may not have to.
b64login = b64encode('%s:%s' % (username, password))

br = mechanize.Browser()

# # I needed to change to Mozilla for mine, but most do not
# br.addheaders= [('User-agent', 'Mozilla/5.0')]

br.addheaders.append( 
  ('Authorization', 'Basic %s' % b64login )
)

br.open(url)
r = br.response()
data = r.read()

print data
...