SoraNoNeko / cpu_net

Help to connect to the network in CPU, and othe schools in similar situation can modify the code to get it work
GNU General Public License v3.0
12 stars 1 forks source link

[Bug]: 执行登录操作时有时会提示json解析失败 #7

Closed lucienshawls closed 12 months ago

lucienshawls commented 12 months ago

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字符串。注意匹配时不应从头匹配。

SoraNoNeko commented 12 months ago

有没有连cpu时候返回的JSON的案例助我研究一下,我这边一直在宿舍没这种案例

lucienshawls commented 12 months ago

随附一次登录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"})
备注:

  1. 你可以查看我对CPU网络登录这一模块的python实现:https://github.com/lucienshawls/CPU_Network_Auth/blob/dev/src/cpu_network.py
  2. 将curl命令转换为cs代码可以参考这个自动转换网站(github仓库托管):https://curlconverter.com/csharp/
SoraNoNeko commented 12 months ago

C#里json解析失败其实并不只是格式问题,解析的时候需要预设获取哪几个值,如果数值的类型出错或者缺失都会报json解析错误,不过我现在应该是有想法了

lucienshawls commented 12 months ago

我知道了,宽带登录的时候,result格式为整数,CPU登录的时候,result格式为字符串

lucienshawls commented 12 months ago

对了,如果当前设备已经是登录状态了,再发起登录请求的话,result也会是0,提示是终端IP已经在线。CPU校园网会有这样的提示,不知宽带登录是否会有这样的提示,可以考虑仔细处理一下。

补充:当CPU网络登录的时候,如果ip地址已经在线,返回值是这样的: dr1004({"result":"0","msg":"","ret_code":2})

SoraNoNeko commented 12 months ago

宽带不会,宽带会直接更新登录状态,这也是为什么这个软件能做到无感更新的原因

lucienshawls commented 12 months ago

此issue中提到的问题已经在v1.3.0修复