Closed lucienshawls closed 12 months ago
有没有连cpu时候返回的JSON的案例助我研究一下,我这边一直在宿舍没这种案例
随附一次登录CPU网络的请求:
curl 'http://192.168.199.21:801/eportal/?c=Portal&a=login&callback=dr1004&login_method=1&user_account=%2C0%2C用户名&user_password=密码&wlan_user_ip=网络IP地址&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=9517' \
-H 'Accept: */*' \
-H 'Accept-Language: en-GB,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7,zh;q=0.6' \
-H 'Connection: keep-alive' \
-H 'Cookie: PHPSESSID=0scpiqjtsg1g0rituhbsc4nk5f' \
-H 'DNT: 1' \
-H 'Referer: http://192.168.199.21/' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0' \
--compressed \
--insecure
对应的返回值是:
dr1004({"result":"1","msg":"\u8ba4\u8bc1\u6210\u529f"})
事实上,最简单的请求(只留下所有必要的参数)应该是:
curl 'http://192.168.199.21:801/eportal/?c=Portal&a=login&login_method=1&user_account=用户名&user_password=密码&wlan_user_ip=网络IP地址'
其中,请求头不需要,其他的参数经过我的测试都无关紧要,用户名部分前面的0或1代表设备类型(PC还是移动端),callback可以省略,但是返回值还是会有最外层的括号;
对应的返回值是:
({"result":"1","msg":"\u8ba4\u8bc1\u6210\u529f"})
备注:
C#里json解析失败其实并不只是格式问题,解析的时候需要预设获取哪几个值,如果数值的类型出错或者缺失都会报json解析错误,不过我现在应该是有想法了
我知道了,宽带登录的时候,result格式为整数,CPU登录的时候,result格式为字符串
对了,如果当前设备已经是登录状态了,再发起登录请求的话,result也会是0,提示是终端IP已经在线。CPU校园网会有这样的提示,不知宽带登录是否会有这样的提示,可以考虑仔细处理一下。
补充:当CPU网络登录的时候,如果ip地址已经在线,返回值是这样的:
dr1004({"result":"0","msg":"","ret_code":2})
宽带不会,宽带会直接更新登录状态,这也是为什么这个软件能做到无感更新的原因
此issue中提到的问题已经在v1.3.0修复
Tag: v1.2.2 尝试连接教学区CPU网络时,请求正常发出但是系统日志提示JSON解析失败。以下提出出现此问题的可能原因。
对于基于drcom架构的登陆系统来说,当请求参数中包含形如
callback=drxxxx
时,GET请求返回值字符串将是一个名为drxxxx
的函数,例如drxxxx({"json_key": "json_value"})
,括号内的内容{"json_key": "json_value"}
才是符合JSON格式的字符串。猜测是程序直接将返回值输入到JSON解析函数中,但是形如drxxxx({"json_key": "json_value"})
的字符串不符合JSON的语法规则,因此报错。如果原因的确如此,那么解决方案也比较简单,使用正则表达式从返回值中提取出括号内的JSON字符串再解析即可。
参考正则pattern:
\((.*)\)
,其中编号1的group即是json字符串。注意匹配时不应从头匹配。