BITNP/bitsrun

是否想加入“自助服务平台”(10.0.0.54)功能?

YDX-2147483647 opened this issue · 1 comments

自助服务平台(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-ips4631afa

引到 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)

钉钉

上网明细

可以做导出功能。

  1. http://10.0.0.54:8800/log/detail?_tog1149016d=all 可以显示全部记录。

  2. 网页上除了 32.58 MB 这样人类可读的数据,也有具体字节数,只是隐藏了。在浏览器控制台运行下面这行可显示。

    $$('th[style="display: none;"], td[style="display: none;"]').forEach(e => e.style.display = '')
  3. 网页上能导出 CSV,不过它是在前端导出,发到后端,后端再原样返回。

bitsrun 是为了在 SSH 远程服务器时能够提供一个可以登录校园网的方法,而不是设计一个完整的“深澜“客户端。这部分功能本项目可能暂时不会考虑。:heart: