4

У меня есть учетные данные для службы WiFi, которая является «открытой» в том смысле, что для того, чтобы связать с ней, пользователю не требуется предоставлять пароль. Существует второй способ аутентификации требуется, чтобы фактически получить доступ к Интернету, а также для того, чтобы сделать это, я должен ввести свои учетные данные через браузер, как показано на экране грейфера ниже:Программно предоставлять вторичные учетные данные WiFi HotSpot с помощью Python в Linux

enter image description here

Поскольку я на Linux, Я бы хотел, чтобы мои полномочия были доступны программным способом с помощью Python. Большинство примеров, которые я видел (например, How to programmatically log into website in Python), желают «имя формы». Я не вижу эту информацию при просмотре «Источник страницы» в браузере, и я не уверен, как правильно отправлять мои учетные данные автоматически. Я был бы очень признателен за помощь в этом! Заранее спасибо.

UPDATE: Вот пример, который я попробовал -

#!/usr/bin/python 

import cookielib 
import urllib2 
import mechanize 

# Browser 
br = mechanize.Browser() 

# Enable cookie support for urllib2 
cookiejar = cookielib.LWPCookieJar() 
br.set_cookiejar(cookiejar) 

# Broser options 
br.set_handle_equiv(True) 
br.set_handle_gzip(True) 
br.set_handle_redirect(True) 
br.set_handle_referer(True) 
br.set_handle_robots(False) 

# ?? 
br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time = 1) 

br.addheaders = [ ('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1') ] 

# authenticate 
br.open("http://www.google.com") 
br.select_form(name="Authentication Required") 
# these two come from the code you posted 
# where you would normally put in your username and password 
br[ "USERID" ] = my_user 
br[ "PASSWDTXT" ] = my_pass 
res = br.submit() 

print "Success!\n" 

Проблема заключается в том, что я просто получаю эту ошибку:

Traceback (most recent call last): 
    File "./login.py", line 29, in <module> 
    br.open("http://www.google.com") 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open 
    return self._mech_open(url, data, timeout=timeout) 
    File "/usr/local/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open 
    raise response 
mechanize._response.httperror_seek_wrapper: HTTP Error 401: Unauthorized 

UPDATE 2: Я также попытался это:

#!/usr/bin/python 

import urllib2 

username = my_user 
password = my_pass 

proxy = urllib2.ProxyHandler({'http': 'http://%s:%[email protected]'%(username,password)}) 
auth = urllib2.HTTPBasicAuthHandler() 
opener = urllib2.build_opener(proxy, auth, urllib2.HTTPHandler) 
urllib2.install_opener(opener) 

conn = urllib2.urlopen('http://google.com') 
return_str = conn.read() 

Новая ошибка:

Traceback (most recent call last): 
    File "./login.py", line 13, in <module> 
    conn = urllib2.urlopen('http://python.org') 
    File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen 
    return _opener.open(url, data, timeout) 
    File "/usr/lib/python2.7/urllib2.py", line 410, in open 
    response = meth(req, response) 
    File "/usr/lib/python2.7/urllib2.py", line 523, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "/usr/lib/python2.7/urllib2.py", line 448, in error 
    return self._call_chain(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/usr/lib/python2.7/urllib2.py", line 531, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 401: Unauthorized 

ответ

4

Страница, на которую вы запрашиваете ответ с кодом ответа 401 HTTP (доступ запрещен), и ваш веб-браузер показывает диалог базовой проверки подлинности HTTP (RFC 2617), чтобы повторить запрос с учетными данными.

Ваш второй пример - частично, но вы не вводите имя пользователя или пароль менеджеру паролей (auth, созданный HTTPBasicAuthHandler). Вместо этого попробуйте что-то подобное (Python 2.7):

import urllib2 

url = "http://www.example.com" 
username = "bob" 
password = "pass123" 

# Create a password manager with your password(s) 
password_store = urllib2.HTTPPasswordMgrWithDefaultRealm() 
password_store.add_password(None, url, username, password) 
passwords = urllib2.HTTPBasicAuthHandler(password_store) 

# Open the URL with password(s) with `opener` 
opener = urllib2.build_opener(passwords) 
resp = opener.open(url) 
resp.read() 
Смежные вопросы