批量添加 GitHub 仓库协作者

六月 13, 2026 [playwright] #github #playwright #自动化 #browser

概述

使用 Playwright CLI 连接远程浏览器,批量为 peterlishihu 用户下全部 29 个仓库添加 moxuetianya 作为协作者。

环境

# 远程机器启动 Chrome
google-chrome --remote-debugging-port=9222 --remote-debugging-address=0.0.0.0 --user-data-dir=/tmp/chrome-debug

# 本地建立 SSH 隧道
ssh -L 9222:127.0.0.1:9222 user@192.168.2.100

# 连接远程浏览器
playwright-cli attach --cdp=http://127.0.0.1:9222

操作流程

对每个仓库执行以下步骤:

  1. 导航到仓库的 Collaborators 设置页 (/<owner>/<repo>/settings/access)
  2. 检查页面是否已包含 @moxuetianya,若有则跳过
  3. 点击 "Add people" 按钮
  4. 在弹出的对话框中输入 moxuetianya 搜索用户
  5. 检查搜索结果是否已禁用(表示已邀请),若是则关闭对话框跳过
  6. 选中 @moxuetianya 选项
  7. 点击 "Add moxuetianya" 确认添加

Playwright 脚本

async page => {
  const repos = ["proxy-shoes","learn-frontend","learn-architecture","his",/* ... 共29个 */];

  for (const repo of repos) {
    await page.goto(`https://github.com/peterlishihu/${repo}/settings/access`, { waitUntil: 'load' });
    await page.waitForTimeout(2500);

    // 检查是否已存在
    const text = await page.evaluate(() => document.body.innerText);
    if (text.includes('@moxuetianya')) continue;

    // 打开添加对话框
    await page.getByRole('button', { name: 'Add people' }).click();
    await page.waitForTimeout(1000);

    // 搜索用户
    await page.getByRole('combobox', { name: 'Find people' }).fill('moxuetianya');
    await page.waitForTimeout(2000);

    // 检查是否已禁用(已邀请)
    const disabled = await page.evaluate(() => {
      const opt = document.querySelector('[role="option"][aria-disabled="true"]');
      return opt && opt.textContent.includes('moxuetianya');
    });
    if (disabled) { await page.keyboard.press('Escape'); continue; }

    // 选中并确认
    await page.getByRole('option', { name: '@moxuetianya' }).click();
    await page.getByRole('button', { name: /Add moxuetianya/ }).click();
    await page.waitForTimeout(2000);
  }
};

结果统计

状态数量仓库
本次添加15learn-frontend, his, learn-pipewire-bluetooth, mobile-smb, obsidian, trace-learn, learn-langchain, learn-protobuf, learn-tcpip, bt-learn, wifi-learn, zod-learn, p2p-learn, my-skills, Qwen3.5
已存在14proxy-shoes, learn-architecture, learn-tpm-grub, learn-linux, linux-translate, linux-dlna, learn-opencode, juzhong, phone-access-card, claude-config, learn-vless, learn-ssh, learn-tls, learn-socks5

全部 29 个仓库均已完成。