- 你需要一台运行OpenWRT的设备(仅在OpenWRT 21上测试过),这台机器需要连接上BBGU内网。
- 安装curl(
opkg install curl
)。 - 确保你有libubox这个包,
bbgu_netlogin
需要这个包里的jshn来解析JSON。
- 把下文两个文件复制到相应路径:
bbgu_netlogin
复制为/usr/bin/bbgu_netlogin
、50-bbgu-netlogin
复制为/etc/hotplug.d/iface/50-bbgu-netlogin
。 - 修改
/usr/bin/bbgu_netlogin
,填写ACCOUNT
、PASS
、ISP
等信息。给/usr/bin/bbgu_netlogin
可执行属性(chmod +x /usr/bin/bbgu_netlogin
)。 - 修改
/etc/hotplug.d/iface/50-bbgu-netlogin
,把WAN_IF
修改为你的WAN接口名。 - 要手动测试自动登录,重启你的虚拟wan接口。
- 主要负担登录工作的是
/usr/bin/bbgu_netlogin
。虽然也是用了DrCom的服务,但是BBGU的验证比较宽松,直接访问抓出来的API即可。 /etc/hotplug.d/iface/50-bbgu-netlogin
负责在指定物理接口对应的虚拟接口上线后调用/usr/bin/bbgu_netlogin
登录。
基于hotplug.d的自动登录脚本只在接口上线时生效。要按照BBGU的断网时间自动连接有不同的方法,除了本节要介绍的使用Watchcat监视网络连接状态,你还可以用cron之类的功能实现。要使用Watchcat自动重启接口,你需要:
- 安装watchcat(
opkg install watchcat
) - (可选)安装luci-app-watchcat,watchcat的Web界面(
opkg install luci-app-watchcat
)
你可以自行配置你想要的参数,以下是我的配置:
config watchcat
option mode 'restart_iface'
option period '7h'
option pinghosts 'connect.rom.miui.com'
option pingsize 'small'
option interface '@wan'
option pingperiod '2m'
最简单的方法是直接用cron在7点(网络能用之后)自动执行登录。在你的crontab中写入下面这一行(你可以在LuCI中的系统>计划任务里编辑它):
1 7 * * * /usr/bin/bbgu_netlogin login
意思是在每天的7点01分时运行/usr/bin/bbgu_netlogin login
。
BBGU应该是使用了大康的网络管理软件,涉及到两个不同的服务:
http://10.0.9.35
提供前端页面和检查网络状态APIhttp://10.0.9.35:801
提供登入登出API
所有API都以jsonp的形式返回数据,不知道是否支持返回json。Cookie对登录似乎有影响,最好提供Cookie。
GET http://10.0.9.35/drcom/chkstatus
查询参数:
callback
:jsonp函数名v
:暂时不知道是什么意思,使用4-5位随机十进制整数即可。
返回主体:JSONP,里面的result
代表登录状态。
例子:
curl -XGET http://10.0.9.35/drcom/chkstatus?callback=dr1002&v=2938 -c /tmp/bbgu-cookie.jar
GET http://10.0.9.35/eportal/
查询参数:
c
:似乎是组件的意思。必须使用Portal
。a
:应该是Action
的简写,必须使用login
。login_method
:必须为1
。user_account
:以,0,<account>@<isp>
形式组成。如账户为1910000000,运营商为联通,就为,0,1910000000@unicom
。unicom
=联通,telecom
=电信,mobile
=移动。user_password
:密码。wlan_user_ip
:不知道是否有影响,目前脚本里用的是相应接口的IP地址。wlan_user_ipv6
:似乎BBGU不给IPv6,空值就行。wlan_user_mac
:BBGU不需要,全零就可以,比如000000000000
。wlan_ac_ip
:空值就行。wlan_ac_name
:空值就行。jsVersion
:3.3.3
v
:不知道有什么影响,4-5位随机十进制整数即可。
返回主体:JSONP,里面的result
代表是否成功,1
代表成功。如果失败,可以读取ret_code
,2
代表已经登入过了。
例子:
curl -XGET http://10.0.9.35:801/eportal/?c=Portal&a=login&callback=dr1004&login_method=1&user_account=,0,1910000000@$telecom&user_password=123456&wlan_user_ip=10.0.32.44&wlan_user_ipv6=&wlan_user_mac=000000000000&wlan_ac_ip=&wlan_ac_name=&jsVersion=3.3.3&v=33242 -c /tmp/bbgu-cookie.jar
- 增加
EPORTAL_APIBASE
变量 - hotplug脚本现在识别接口而不是物理设备
- 文档增加了API端点的简单说明
- 支持使用特定接口登录
- 自动生成我还不知道有什么用的
v
参数,不用再手动填写了。 - 解析JSONP(2022年了兄弟们)获取更详细的操作结果(这就导致
bbgu_netlogin
现在开始需要libubox
这个包,这个包在OpenWRT 21上是内置的)。 - 给
bbgu_netlogin
增加了子命令loginp
检查登录状态。这个子命令跟之前的实现不一样,之前的实现错了:原来用来检查是否登录的那句话是用JS插入的(这个网站实现真的令人窒息),永远都会返回1。现在已经换成一个API,应该能用了。 - 把hotplug.d脚本的前缀改成了50。应该会有人需要在联网之后执行一些脚本吧。