是否想加入“自助服务平台”(10.0.0.54)功能?
YDX-2147483647 opened this issue · 1 comments
YDX-2147483647 commented
自助服务平台(10.0.0.54)显示了在线信息(登录的所有设备的 IP)、上网明细(上下线时刻和每次流量)等。这部分网页在后端渲染,没有 API,只能从 HTML 提取信息,登录只有简单验证。
需求背景:我最近感觉账号有异常流量,想探查原因。
Relates-to: #24
在线信息
Note
现在设计得比较潦草,如果想加入这个功能,我可以整理一下。
给bitsrun.user.User
加个方法:
def get_all_ips(self) -> list[str]:
"""获取所有终端的 IP"""
# Raise exception if device is not logged in
# 可能还支持`f"zh-CN:{username}:{md5(password)}"`,但未验证
if self.logged_in_user is None:
raise Exception("you should log in to see all IP addresses")
response = self.client.get(
"http://10.0.0.54:8800/site/sso",
params={
"data": b64encode(
f"zh-CN:{self.username}:{self.username}".encode("ascii")
).decode("ascii")
},
follow_redirects=True,
)
# 捕获 IP 地址
# 为轻便,不解析 HTML,也不验证 IP 地址合法性
# 另外,校园网似乎只显示 IPv4,但这里也兼容 IPv6
addresses = re.findall(
R'<td class="w1" data-col-seq="1">([.\d:]+)</td>', response.text
)
return addresses
main...YDX-2147483647:bitsrun:all-ips 或 4631afa
引到 CLI 大概可以这样:
$ bitsrun all-ips
10.50.0.13
10.60.0.14
…
除了 CLI,还可作编程接口。例如下面这段上下线提醒脚本,登录设备改变时会往钉钉发消息。
from datetime import datetime
from time import sleep
from dingding import DingDing # dingding==0.6.2 https://pypi.org/project/dingding/
from humanize import naturalsize
from bitsrun.user import User, get_login_status
bot = DingDing("https://oapi.dingtalk.com/robot/send?access_token=…")
bot.set_secret("SEC…")
user = User("1120…", "…")
current = None
while True:
last = current
ips = user.get_all_ips()
current = "/".join(ips)
if current != last:
sum_bytes = naturalsize(get_login_status().get("sum_bytes", 0), binary=True)
now = datetime.now().isoformat()
print(now, sum_bytes, current, sep=", ")
bot.send_text("\n".join([now, sum_bytes, *ips]))
sleep(60)
上网明细
可以做导出功能。
-
网页上除了 32.58 MB 这样人类可读的数据,也有具体字节数,只是隐藏了。在浏览器控制台运行下面这行可显示。
$$('th[style="display: none;"], td[style="display: none;"]').forEach(e => e.style.display = '')
-
网页上能导出 CSV,不过它是在前端导出,发到后端,后端再原样返回。
spencerwooo commented
bitsrun
是为了在 SSH 远程服务器时能够提供一个可以登录校园网的方法,而不是设计一个完整的“深澜“客户端。这部分功能本项目可能暂时不会考虑。:heart: