Skip to content

Instantly share code, notes, and snippets.

@journey-ad
Last active September 1, 2021 12:32
Show Gist options
  • Save journey-ad/73d900a675b090b9f2c94a1945e6ec19 to your computer and use it in GitHub Desktop.
Save journey-ad/73d900a675b090b9f2c94a1945e6ec19 to your computer and use it in GitHub Desktop.
GiWiFi认证登录脚本
import os
import re
import time
import json
import argparse
import requests
import netifaces
from getpass import getpass
from urllib.parse import urlparse, parse_qs
SCRIPT_VERSION = "1.0.3.2"
HEADERS = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.25 Safari/537.36',
'accept-encoding': 'gzip, deflate, br',
'accept-language': 'zh-CN,zh-TW;q=0.8,zh;q=0.6,en;q=0.4,ja;q=0.2',
'cache-control': 'max-age=0'
}
PARSER = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
description='GiWiFi认证登录脚本',
epilog='(c) 2018 journey.ad')
PARSER.add_argument('-g', '--gateway', type=str, help='网关IP')
PARSER.add_argument('-u', '--username', type=str, help='用户名')
PARSER.add_argument('-p', '--password', type=str, help='密码')
PARSER.add_argument('-q', '--quit', action='store_true', help='登出')
PARSER.add_argument('-d', '--daemon', action='store_true', help='在后台守护运行')
PARSER.add_argument('-v', '--verbose', action='store_true', help='额外输出一些技术性信息')
PARSER.add_argument('-V', '--version', action='version',
version='giwifi-auth-helper {}'.format(SCRIPT_VERSION))
CONFIG = PARSER.parse_args()
if not CONFIG.quit:
if not CONFIG.gateway:
CONFIG.gateway = netifaces.gateways()['default'][netifaces.AF_INET][0]
if not CONFIG.password:
CONFIG.gateway = input('请输入网关地址(%s):' % (CONFIG.gateway)) or CONFIG.gateway
if not CONFIG.username:
CONFIG.username = input('请输入上网账号:')
if not CONFIG.password:
CONFIG.password = getpass('请输入账号密码:')
else:
if not CONFIG.gateway:
CONFIG.gateway = netifaces.gateways()['default'][netifaces.AF_INET][0]
CONFIG.gateway = input('请输入网关地址(%s):' % (CONFIG.gateway)) or CONFIG.gateway
def main():
logcat('正在获取网关信息…')
try:
authUrl = requests.get('http://%s:8062/redirect' % (CONFIG.gateway), timeout=5).url
authParmas = {k: v[0] for k, v in parse_qs(urlparse(authUrl).query).items()}
loginPage = requests.get('http://login.gwifi.com.cn/cmps/admin.php/api/login/?' + urlparse(authUrl).query, headers=HEADERS, timeout=5).text
pagetime = re.search(r'name="page_time" value="(.*?)"', loginPage).group(1)
sign = re.search(r'name="sign" value="(.*?)"', loginPage).group(1)
except requests.exceptions.ConnectionError:
logcat('连接失败,请检查网关地址是否正确')
return
except requests.exceptions.Timeout:
logcat('连接超时,可能已超出上网区间')
return
except AttributeError:
logcat('解析失败,可能网关设备重启或系统已更新')
return
authState = getAuthState(authParmas, sign)
if CONFIG.quit:
logout(authParmas)
if not authState:
return
else:
if authState['auth_state'] == 2:
printStatus(authParmas, authState)
logcat('你已登录,无需再次登录')
else:
data = {
'access_type': authState['access_type'],
'acsign': authState['sign'],
'btype': 'pc',
'client_mac': authState['client_mac'],
'contact_phone': '400-038-5858',
'devicemode': '',
'gw_address': authParmas['gw_address'],
'gw_id': authParmas['gw_id'],
'gw_port': authParmas['gw_port'],
'lastaccessurl': '',
'logout_reason': authState['logout_reason'],
'mac': authParmas['mac'],
'name': CONFIG.username,
'online_time': authState['online_time'],
'page_time': pagetime,
'password': CONFIG.password,
'sign': sign,
'station_cloud': 'login.gwifi.com.cn',
'station_sn': authState['station_sn'],
'suggest_phone': '400-038-5858',
'url': 'http://www.baidu.com',
'user_agent': '',
}
if CONFIG.verbose:
logcat(data)
result = login(data)
if result['status']:
authState = getAuthState(authParmas, sign)
printStatus(authParmas, authState)
if authState['auth_state'] == 2:
logcat('认证成功')
else:
logcat('认证失败')
else:
logcat('认证失败,提示信息:%s' % (result['info']))
def login(data):
logcat('正在尝试认证…')
try:
resp = json.loads(requests.post('http://login.gwifi.com.cn/cmps/admin.php/api/loginaction', data=data, timeout=5).text)
result = {
'status': False,
'info': None
}
if CONFIG.verbose:
logcat(resp)
if 'wifidog/auth' in resp['info']:
requests.get(resp['info'])
result['status'] = True
else:
result['info'] = resp['info']
except requests.exceptions.Timeout:
logcat('连接超时,可能已超出上网区间')
finally:
return result
def logout(authParmas):
try:
resp = json.loads(requests.get('http://%s/getApp.htm?action=logout' % (authParmas['gw_address'])).text)
except requests.exceptions.Timeout:
logcat('连接超时,可能已超出上网区间')
return
if resp['resultCode'] == 0:
logcat('下线成功')
else:
logcat('下线失败')
def getAuthState(authParmas, sign):
try:
params = {
'ip': authParmas['ip'],
'mac': authParmas['mac'],
'sign': sign,
'callback': ''
}
resp = json.loads(requests.get('http://%s:%s/wifidog/get_auth_state' % (authParmas['gw_address'], authParmas['gw_port']), params=params, timeout=5).text[1:-1])
except KeyError:
logcat('所需参数不存在')
return False
except requests.exceptions.Timeout:
logcat('连接超时,可能已超出上网区间')
return False
if CONFIG.verbose:
logcat(resp)
if resp['resultCode'] == 0:
return json.loads(resp['data'])
else:
return False
def printStatus(authParmas, authState):
if not CONFIG.verbose:
clear()
print(
'''--------------------------------------------
SSID: %s
AP MAC: %s
GateWay: %s
IP: %s
MAC: %s
Station SN: %s
Logged: %s
--------------------------------------------'''
% (
authParmas['gw_id'],
authParmas['apmac'],
authParmas['gw_address'],
authParmas['ip'],
authParmas['mac'],
authState['station_sn'],
'yes' if(authState['auth_state'] == 2) else 'no'
)
)
def clear():
os.system('cls' if os.name == 'nt' else 'clear')
def logcat(msg, level='I'):
print('%s %s: %s' % (time.ctime().split(' ')[-2], level, msg))
if __name__ == '__main__':
if CONFIG.daemon:
while True:
main()
time.sleep(30)
else:
main()
input()
@Warm-rain
Copy link

大佬,看下 吧,我把 150行 return result改为return False后 报错变成
01:11:28 I: 正在尝试认证…
Traceback (most recent call last):
File "C:/Users/Administrator/PycharmProjects/untitled/giwifi.py", line 208, in
main()
File "C:/Users/Administrator/PycharmProjects/untitled/giwifi.py", line 105, in main
if result['status']:
TypeError: 'bool' object is not subscriptable

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment