diff --git a/login_manager.py b/login_manager.py
deleted file mode 100644
index be15142..0000000
--- a/login_manager.py
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/usr/bin/python3
-
-import urllib.parse
-import urllib.request
-import urllib.response
-import logging
-import re
-import argparse
-
-
-class login_manager:
- logger = logging.getLogger('login_manager')
-
- login_url = 'http://10.1.206.13/a70.htm'
- logout_url = 'http://10.1.206.13/F.htm'
-
- def __init__(self, username: str = '', password: str = ''):
- self.username = username
- self.password = password
-
- @staticmethod
- def generate_post_data(username: str, password: str):
- 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)
-
- login_manager.logger.debug('the generated post data is %s', str(data_template))
-
- return bytes(urllib.parse.urlencode(data_template), 'utf-8')
-
- @staticmethod
- def generate_post_data_hook(post_data: dict) -> None:
- username = post_data['DDDDD']
- username += '@bistu'
- post_data['DDDDD'] = username
-
- def login(self):
- 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 = self.generate_post_data(self.username, self.password)
-
- self.logger.debug('the dest url is: %s', self.login_url)
- self.logger.debug('the headers is: %s', str(headers))
- self.logger.debug('the encoded post data is %s', str(post_data))
-
- req = urllib.request.Request(url=self.login_url, data=post_data, headers=headers, method='POST')
-
- self.logger.info('sending the login request...')
-
- with urllib.request.urlopen(req) as response:
- response_body = response.read().decode('gbk')
-
- html_title = re.search('
(.*)', response_body)[1]
-
- self.logger.info('http_status: %d', response.status)
- self.logger.info('title_of_response_html: %s', html_title)
- self.logger.info('login_state: %s', 'success' if html_title == '认证成功页' else 'fail')
-
- @staticmethod
- def logout():
- req = urllib.request.Request(url=login_manager.logout_url)
-
- login_manager.logger.info('sending the logout request...')
-
- with urllib.request.urlopen(req) as response:
- response_body = response.read().decode('gbk')
-
- html_title = re.search('(.*)', response_body)[1]
-
- login_manager.logger.info('http_status: %d', response.status)
- login_manager.logger.info('title_of_response_html: %s', html_title)
- login_manager.logger.info('logout_state: %s', 'success' if html_title == '信息页' else 'fail')
-
-
-def load_auth_info(path: str):
- with open(path, 'r', encoding='utf-8') as file:
- username = file.readline().strip()
- password = file.readline().strip()
- return username, password
-
-def main():
- logging.basicConfig(level=logging.INFO)
- logger = logging.getLogger('main')
-
- parser = argparse.ArgumentParser()
- parser.description = 'login or logout bistu wifi'
- parser.epilog = 'the config file format(without quote): "{username}\\n{password}". The "\\n" is a newline charactor'
-
- parser.add_argument('username', nargs='?',
- type=str, help='username you use to login bistu wifi, logout if not provided')
- parser.add_argument('password', nargs='?',
- type=str, help='password you use to login bistu wifi, logout if not provided')
- parser.add_argument('-o', '--logout', nargs='?', type=bool,
- help='logout bistu wifi')
- parser.add_argument('-c', '--config', nargs='?', type=str,
- help='load username and password from config file')
-
- args = parser.parse_args()
-
- logger.debug('parse argument: username= %s', args.username)
- logger.debug('parse argument: password= %s', args.password)
- logger.debug('parse argument: logout= %s', args.logout)
-
- if args.config is not None:
- username, password = load_auth_info(args.config)
- manager = login_manager(username, password)
- manager.login()
- elif args.username is not None and args.password is not None:
- manager = login_manager(args.username, args.password)
- manager.login()
- elif args.logout:
- login_manager.logout()
- else:
- parser.print_help()
-
-
-if __name__ == '__main__':
- main()
diff --git a/main.py b/main.py
new file mode 100644
index 0000000..e9b8c45
--- /dev/null
+++ b/main.py
@@ -0,0 +1,167 @@
+#!/usr/bin/python3
+
+import urllib.parse
+import urllib.request
+import urllib.response
+import logging
+import re
+import argparse
+
+logger = logging.getLogger('login_manager')
+
+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)
+
+ logger.debug('the generated post data is %s', str(data_template))
+
+ return bytes(urllib.parse.urlencode(data_template), 'utf-8')
+
+def login(username: str, password: str, host: str = '10.1.206.13'):
+ '''
+ There are some other host, the known are:
+
+ - 10.1.206.3 (default)
+ - 192.168.211.3
+ '''
+ 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)
+
+ login_url = f'http://{host}/a70.htm'
+ logger.debug('the dest url is: %s', login_url)
+ logger.debug('the headers is: %s', str(headers))
+ logger.debug('the encoded post data is %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('(.*)', 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 = '10.1.206.13'):
+ '''
+ 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('(.*)', 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
+
+
+def load_auth_info(path: str):
+ with open(path, 'r', encoding='utf-8') as file:
+ username = file.readline().strip()
+ password = file.readline().strip()
+
+ host = file.readline().strip()
+ if host == '':
+ host = None
+
+ return username, password, host
+
+def main():
+ logging.basicConfig(level=logging.DEBUG)
+ logger = logging.getLogger('main')
+
+ parser = argparse.ArgumentParser()
+ parser.description = 'login or logout bistu wifi'
+ parser.epilog = 'the config file format(without quote): "{username}\\n{password}". The "\\n" is a newline charactor'
+
+ parser.add_argument('-u', '--username', nargs='?',
+ type=str, help='username you use to login bistu wifi, logout if not provided')
+ parser.add_argument('-p', '--password', nargs='?',
+ type=str, help='password you use to login bistu wifi, logout if not provided')
+ parser.add_argument('--host', nargs='?', default=None,
+ type=str, help='host to send login/logout request to, default use 10.1.206.13')
+ parser.add_argument('-o', '--logout', nargs='?', type=bool, default=False,
+ help='logout bistu wifi')
+ parser.add_argument('-c', '--config', nargs='?', type=str,
+ help='load info(username, password, host) from config file')
+
+ args = parser.parse_args()
+
+ logger.debug('parse argument: username= %s', args.username)
+ logger.debug('parse argument: password= %s', args.password)
+ logger.debug('parse argument: host= %s', args.host)
+ logger.debug('parse argument: logout= %s', args.logout)
+
+ if args.config is not None:
+ username, password, host = load_auth_info(args.config)
+
+ if host is None:
+ login(username, password)
+ else:
+ login(username, password, host)
+
+ elif args.username is not None and args.password is not None:
+ if args.host is None:
+ login(args.username, args.password)
+ else:
+ login(args.username, args.password, args.host)
+
+ elif args.logout:
+ if args.host is None:
+ logout()
+ else:
+ logout(args.host)
+ else:
+ parser.print_help()
+
+
+if __name__ == '__main__':
+ main()