113 lines
3.1 KiB
Python
113 lines
3.1 KiB
Python
#!/usr/bin/python3
|
|
|
|
import urllib.parse
|
|
import urllib.request
|
|
import urllib.response
|
|
import logging
|
|
import re
|
|
|
|
|
|
logger = logging.getLogger('bistu-wifi')
|
|
|
|
|
|
def generate_post_data(username: str, password: str):
|
|
'''
|
|
Generate bytes to send to through HTTP POST, an example from browser:
|
|
|
|
DDDDD=2021020000&upass=Bistu000000&R1=0&R2=&R3=0&R6=0¶=00&0MKKey=123456&buttonClicked=&redirect_url=&err_flag=&username=&password=&user=&cmd=&Login=
|
|
'''
|
|
|
|
data_template = {
|
|
'DDDDD': None,
|
|
'upass': None,
|
|
'R1': 0,
|
|
'R2': '',
|
|
'R3': 0,
|
|
'R6': 0,
|
|
'para': 00,
|
|
'0MKKey': 123456,
|
|
'buttonClicked': '',
|
|
'redirect_url': '',
|
|
'err_flag': '',
|
|
'username': '',
|
|
'password': '',
|
|
'user': '',
|
|
'cmd': '',
|
|
'Login': ''
|
|
}
|
|
|
|
data_template['DDDDD'] = username
|
|
data_template['upass'] = password
|
|
|
|
# login_manager.generate_post_data_hook(data_template)
|
|
|
|
for k, v in data_template.items():
|
|
logger.debug('the generated post data: %s: %s', k, v)
|
|
|
|
return bytes(urllib.parse.urlencode(data_template), 'utf-8')
|
|
|
|
|
|
def login(username: str, password: str, host: str):
|
|
'''
|
|
There are some other host, the known are:
|
|
|
|
- 10.1.206.3 (default)
|
|
- 192.168.211.3
|
|
'''
|
|
|
|
login_url = f'http://{host}/a70.htm'
|
|
|
|
headers = {
|
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
|
|
'Accept-Language': 'en-US,zh-CN;q=0.5',
|
|
'Accept-Encoding': 'gzip, deflate'
|
|
}
|
|
|
|
post_data = generate_post_data(username, password)
|
|
|
|
logger.debug('the dest url is: %s', login_url)
|
|
for k, v in headers.items():
|
|
logger.debug('the headers: %s: %s', k, v)
|
|
logger.debug('the encoded post data: %s', str(post_data))
|
|
|
|
req = urllib.request.Request(url=login_url, data=post_data, headers=headers, method='POST')
|
|
|
|
logger.info('sending the login request...')
|
|
|
|
with urllib.request.urlopen(req) as response:
|
|
response_body = response.read().decode('gbk')
|
|
|
|
html_title = re.search('<title>(.*)</title>', response_body)[1]
|
|
|
|
logger.info('http_status: %d', response.status)
|
|
logger.info('title_of_response_html: %s', html_title)
|
|
logger.info('login_state: %s', 'success' if html_title == '认证成功页' else 'fail')
|
|
|
|
|
|
def logout(host: str):
|
|
'''
|
|
param host: see login host
|
|
'''
|
|
|
|
logout_url = f'http://{host}/F.htm'
|
|
req = urllib.request.Request(url=logout_url)
|
|
|
|
logger.info('sending the logout request...')
|
|
|
|
with urllib.request.urlopen(req) as response:
|
|
response_body = response.read().decode('gbk')
|
|
|
|
html_title = re.search('<title>(.*)</title>', response_body)[1]
|
|
|
|
logger.info('http_status: %d', response.status)
|
|
logger.info('title_of_response_html: %s', html_title)
|
|
logger.info('logout_state: %s', 'success' if html_title == '信息页' else 'fail')
|
|
|
|
#@staticmethod
|
|
#def generate_post_data_hook(post_data: dict) -> None:
|
|
# username = post_data['DDDDD']
|
|
# username += '@bistu'
|
|
# post_data['DDDDD'] = username
|
|
|