欢迎光临
我们一直在努力

Linux部署workbuddy+自动签到

我用workbuddy连接我的Linux 腾讯云服务器安装了workbuddy,编写了自动签到脚本,然后让它输出了部署脚本

WorkBuddy 服务器部署教程(通用版 · 从零开始)

适用对象:任何人拿到一台已装 Docker 的 Linux 服务器,照本教程即可部署 WorkBuddy 桌面端,并通过浏览器远程登录使用;可选再加"每日自动签到"。
本教程不依赖任何已有环境,所有脚本均内嵌,复制即可用。
测试基线:WorkBuddy 5.5.6,容器基于 ubuntu:22.04(glibc 2.35,规避老系统 glibc 过低问题)。


⚠️ 先读:本文含两部分,可独立使用

  • 【核心 · 必装】第 1~5 节:在服务器用 Docker 跑起 WorkBuddy 桌面,并通过浏览器 noVNC 登录使用。全程不需要任何 token,用你自己的 WorkBuddy 账号正常登录即可。
  • 【可选 · 附加】第 6 节(附录):若想再加"每天 00:05 自动签到",脚本直接读取已登录容器里的 token,你无需手动导出/粘贴任何明文 token。

一句话:装来用 = 不用 token;要自动签到 = 也不用手动给 token(容器登录后自动就有,脚本自己去拿)。


第一部分:核心部署

0. 前置条件

  • 一台已安装 Docker 的 Linux 服务器(CentOS 7 / Ubuntu 等均可;WorkBuddy 跑在容器内,不受宿主机 glibc 限制)。
  • 在云厂商防火墙/安全组放行 8000/TCP(noVNC 网页用)。
  • 你自己的 WorkBuddy 账号(登录用,无需导出 token)。
  • 文档中 <你的服务器公网IP> / <VNC密码> 为占位符,请替换为实际值。

1. 建工作目录并下载官方 deb

mkdir -p /opt/wb-build && cd /opt/wb-build

# 动态获取最新 deb 下载地址
DEB_URL=$(curl -s "https://copilot.tencent.com/v2/update?platform=workbuddy-linux-x64-deb" \\
| grep -o '"url":"[^"]*"' | head -1 | sed 's/"url":"//; s/"$//')
echo "deb url: $DEB_URL"
curl -L -o WorkBuddy.deb "$DEB_URL"
ls -lh WorkBuddy.deb # 约 400MB+ 属正常

若 curl -o 被环境限制,改用:python3 -c "import urllib.request;urllib.request.urlretrieve('$DEB_URL','WorkBuddy.deb')"

2. Dockerfile(依赖一次装全)

cat > Dockerfile <<'DOCKERFILE'
FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive

# WorkBuddy 运行依赖 + 桌面/VNC 桥接组件(官方 .deb 漏了 libasound2/libpulse0,必须补)
RUN apt-get update && apt-get install -y \\
libgtk-3-0 libnotify4 libnss3 libxss1 libxtst6 xdg-utils \\
libatspi2.0-0 libuuid1 libsecret-1-0 libappindicator3-1 \\
libgbm1 libdrm2 libxkbcommon0 libxshmfence1 \\
libasound2 libpulse0 ca-certificates \\
xvfb x11vnc novnc websockify \\
&& rm -rf /var/lib/apt/lists/*

COPY WorkBuddy.deb /tmp/wb.deb
RUN dpkg -i /tmp/wb.deb || apt-get install -f -y
RUN rm -f /tmp/wb.deb

COPY start.sh /start.sh
RUN chmod +x /start.sh

CMD ["/start.sh"]
DOCKERFILE

3. 启动脚本 start.sh

cat > start.sh <<'SCRIPT'
#!/bin/bash
set -e
VNC_PASS="${VNC_PASS:-wbvnc2026}"

# 关键:清掉上一次残留的 X 锁/socket,否则 docker restart 后 Xvfb 会拒启动
rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock

# 首次运行生成 VNC 密码文件(可用 -e VNC_PASS=xxx 覆盖)
if [ ! -f /root/.x11vnc.pass ]; then
x11vnc -storepasswd "$VNC_PASS" /root/.x11vnc.pass
fi

# 起虚拟显示器
Xvfb :99 -screen 0 1280x800x24 >/dev/null 2>&1 &

# 等 X socket 真正就绪
for i in $(seq 1 30); do
[ -e /tmp/.X11-unix/X99 ] && break
sleep 0.5
done
sleep 1

# 起 WorkBuddy 桌面 + VNC 桥接
/opt/WorkBuddy/workbuddy –no-sandbox >/wb.log 2>&1 &
x11vnc -display :99 -forever -rfbport 5900 -rfbauth /root/.x11vnc.pass -shared >/x11vnc.log 2>&1 &
websockify –web /usr/share/novnc 8000 localhost:5900 >/websockify.log 2>&1 &

wait
SCRIPT
chmod +x start.sh

4. 构建并启动容器

docker build -t workbuddy:latest .
docker run –rm workbuddy:latest /opt/WorkBuddy/workbuddy –no-sandbox –version # 退出码 0 即通过

docker run -d \\
–name workbuddy \\
–restart unless-stopped \\
-p 8000:8000 \\
-e DISPLAY=:99 \\
-e VNC_PASS=<你的VNC密码> \\
workbuddy:latest

sleep 5
docker ps –filter name=workbuddy
docker exec workbuddy bash -c "(ss -ltnp || netstat -ltnp) | grep -E '5900|8000'"
docker exec workbuddy bash -c "ps aux | grep -E 'Xvfb|x11vnc|websockify|WorkBuddy' | grep -v grep"

  • -p 8000:8000:把容器 8000(websockify/noVNC) 发布到宿主机。
  • –restart unless-stopped:服务器/容器重启后自动拉起(配合 start.sh 清锁,VNC 也会恢复)。
  • VNC_PASS:换成你自己的强密码。

5. 浏览器登录 WorkBuddy(无头环境)

  • 本地浏览器打开 http://<你的服务器公网IP>:8000/vnc.html
  • 点 Connect,输入 VNC 密码(上面设的)。
  • 看到 WorkBuddy 桌面登录页 —— 直接点登录/扫码,用你自己的 WorkBuddy 账号正常授权即可(这一步是 WorkBuddy 自带的登录流程)。
  • 若登录卡在 Signing In…(容器里没浏览器,xdg-open 失败),用无头登录兜底法:
    在 noVNC 里点登录后,App 会把登录链接打印到 /wb.log,回到服务器终端抓最新一条:

    把输出的 URL 复制到你本地电脑的浏览器打开 → 登录/扫码授权 → noVNC 里的 WorkBuddy 自动完成登录。链接过期就点 Retry Sign In 再抓一次。

    docker exec workbuddy grep -oE 'https://www.workbuddy.cn/login[^ ]+' /wb.log | tail -1

    6. 日常运维

    docker restart workbuddy # 重启,~6s 后 VNC 自动恢复
    docker logs -f workbuddy # 看容器日志
    docker stop workbuddy / docker start workbuddy
    # 重新抓登录链接(兜底登录用)
    docker exec workbuddy grep -oE 'https://www.workbuddy.cn/login[^ ]+' /wb.log | tail -1


    第二部分:可选附加 —— 每日 00:05 自动签到(直接读容器里的 token)

    仅当你想要"无人值守自动签到"时才做本节。 仅为了用 WorkBuddy 桌面,跳过本节即可。
    核心改进:容器里 WorkBuddy 登录成功后,token 已经是明文 JWT 存在容器内
    /root/.local/share/CodeBuddyExtension/Data/Public/auth/workbuddy-desktop.info。
    自动签到脚本直接用 docker exec 从容器读这个文件即可,无需你手动导出/粘贴任何明文 token。

    A. 前提

    • 第一部分已完成,且你已在 noVNC 里登录过 WorkBuddy 桌面(容器里已有有效 token)。
    • 宿主机上 docker 命令可用(cron 脚本会调用 docker exec)。

    B. 部署签到脚本(读容器 token,无需 cred.json)

    mkdir -p /opt/workbuddy-signin
    cat > /opt/workbuddy-signin/signin_server.py <<'PYEOF'
    #!/usr/bin/env python3
    # 从已登录的 WorkBuddy 容器内直接读取 token 并签到(无需手动导出明文 token)
    import json, subprocess, urllib.request, urllib.error, sys

    CONTAINER = "workbuddy"
    AUTH_FILE = "/root/.local/share/CodeBuddyExtension/Data/Public/auth/workbuddy-desktop.info"
    BASE = "https://copilot.tencent.com/v2/billing/meter"
    UA = "WorkBuddy"

    def load_token():
    out = subprocess.check_output(["docker", "exec", CONTAINER, "cat", AUTH_FILE], text=True)
    d = json.loads(out)
    auth = d.get("auth", {})
    token = auth.get("accessToken")
    if not token or token.startswith("$wbEncrypted"):
    sys.exit("NOT_LOGGED_IN: 容器内 WorkBuddy 尚未登录,请先在 noVNC 登录")
    return {"token": token,
    "uid": d.get("account", {}).get("uid", ""),
    "domain": auth.get("domain", "www.codebuddy.cn")}

    def post(path, cred):
    req = urllib.request.Request(
    BASE + path, data=b"{}",
    headers={
    "Authorization": "Bearer " + cred["token"],
    "X-User-Id": cred.get("uid", ""),
    "User-Agent": UA,
    "Content-Type": "application/json",
    },
    method="POST")
    try:
    with urllib.request.urlopen(req, timeout=20) as r:
    return json.loads(r.read().decode())
    except urllib.error.HTTPError as e:
    try:
    return json.loads(e.read().decode())
    except Exception:
    return {"_error": e.reason}

    def dig(o, k):
    if isinstance(o, dict):
    if k in o:
    return o[k]
    for v in o.values():
    r = dig(v, k)
    if r is not None:
    return r
    elif isinstance(o, list):
    for v in o:
    r = dig(v, k)
    if r is not None:
    return r
    return None

    def main():
    cred = load_token()
    st = post("/checkin-activity-status", cred)
    if dig(st, "today_checked_in") is True:
    print("ALREADY_CHECKED_IN")
    return
    r = post("/daily-checkin", cred)
    if dig(r, "today_checked_in") is True or dig(r, "code") == 10001:
    print("CHECKIN_OK credit=%s" % dig(r, "credit"))
    else:
    print("CHECKIN_FAILED", json.dumps(r, ensure_ascii=False))
    sys.exit(1)

    if __name__ == "__main__":
    main()
    PYEOF
    chmod +x /opt/workbuddy-signin/signin_server.py

    # 写入 cron:每天 00:05
    (crontab -l 2>/dev/null | grep -v workbuddy-signin; \\
    echo "5 0 * * * /usr/bin/python3 /opt/workbuddy-signin/signin_server.py >> /opt/workbuddy-signin/cron.log 2>&1") | crontab –

    C. 验证

    python3 /opt/workbuddy-signin/signin_server.py
    # 期望输出 ALREADY_CHECKED_IN 或 CHECKIN_OK credit=…

    若输出 NOT_LOGGED_IN:说明容器里 WorkBuddy 还没登录,先去 noVNC 登录一次即可。token 随登录自动刷新,脚本每次实时读取,无需任何手动维护。


    常见问题(FAQ)

    Q1:docker restart 后 noVNC 打不开/黑屏?
    A:几乎都是 Xvfb 没起来。确认 start.sh 开头有 rm -f /tmp/.X11-unix/X99 /tmp/.X99-lock(清残留锁)。这是 docker restart 复用容器文件系统层导致的经典坑,脚本已处理。

    Q2:点登录卡在 Signing In…?
    A:容器无浏览器,xdg-open 失败。按第 5 节"无头登录兜底法"从 /wb.log 抓链接到本地浏览器授权即可(核心使用无需 token,这只是登录通道问题)。

    Q3:只装 WorkBuddy 桌面、不要自动签到,可以吗?
    A:完全可以。只做第一部分(第 1~6 节),跳过第二部分的自动签到即可,两者无关。

    Q4:自动签到输出 NOT_LOGGED_IN / CHECKIN_FAILED?
    A:NOT_LOGGED_IN = 容器里 WorkBuddy 还没登录,先去 noVNC 登录一次;CHECKIN_FAILED 多半是接口返回字段名变了,按完整响应微调脚本里 dig() 的取值键。脚本每次实时读容器 token,不需要你手动维护 token。

    Q5:升级 WorkBuddy 版本?
    A:重新执行第 1 节下载新 deb → docker build -t workbuddy:latest . → docker rm -f workbuddy && docker run …(命令同第 4 节)。

    Q6:安全加固?
    A:8000 默认公网开放 + 仅 VNC 密码。长期暴露建议:① 改强 VNC_PASS;② 改用 SSH 隧道 ssh -L 8000:localhost:8000 root@<服务器IP>(不开公网端口);③ 或在防火墙关掉 8000 公网暴露。


    一句话流程

    用 WorkBuddy:下载 deb → Dockerfile 装全依赖+Xvfb/VNC 构建镜像 → docker run -p 8000:8000 –restart unless-stopped → 浏览器开 noVNC → 用自己的账号直接登录(无 token)。
    要自动签到(可选):登录后容器里已有明文 token → 部署读容器 token 的 signin_server.py + cron,脚本自己 docker exec 去拿,无需手动给 token。
    两个坑:/tmp/.X99-lock 残留锁导致 restart 后 Xvfb 起不来(start.sh 已清)、无头环境 xdg-open 无浏览器(从 /wb.log 抓登录链接本地授权)。

    赞(0)
    未经允许不得转载:171主机测评 » Linux部署workbuddy+自动签到
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址