Skip to content

Add Zoom Web co-host automation: auto-grant Multi-Pin on raised hand#2

Draft
Copilot wants to merge 2 commits intomainfrom
copilot/zoom-cohost-multipin-automation
Draft

Add Zoom Web co-host automation: auto-grant Multi-Pin on raised hand#2
Copilot wants to merge 2 commits intomainfrom
copilot/zoom-cohost-multipin-automation

Conversation

Copy link

Copilot AI commented Mar 15, 2026

Tampermonkey userscript that runs under a Zoom Host/Co-Host session and automatically grants Multi-Pin permission to participants who raise their hand — no backend, no Zoom API, DOM-only.

Files

  • scripts/zoom-host-tools.user.js — Main userscript. Matches *.zoom.us/wc/* and *.zoom.us/j/*.
  • selectors/zoom-dom-selectors.json — Canonical selector map; update here when Zoom changes its UI, then mirror into the SELECTORS constant in the script.
  • docs/automation-design.md — Architecture, DOM strategy, assumptions, extension points.
  • docs/testing-checklist.md — Manual test plan across all three phases.

Phase 1 — Implemented (MVP)

Polls participant rows every CONFIG.SCAN_INTERVAL_MS (2.5 s):

  1. Detects raised-hand indicator via layered fallback: data-testidaria-label → class → text/emoji content
  2. Derives stable participant ID (data-participant-id → display name → DOM fingerprint); deduplicates via Set
  3. Hovers row to reveal hidden "More" button → opens menu → retries up to MENU_CLICK_RETRIES times for the Multi-Pin item
  4. Guards against re-granting by checking for "Remove Multi-Pin" text in the open menu
// Selector resolution — iterates candidates, logs every match/miss
function resolveElement(candidates, root = document) {
  for (const selector of candidates) {
    const el = root.querySelector(selector);
    if (el) return el;
  }
  return null; // caller handles null safely
}

Phases 2 & 3 — Scaffolded

  • Phase 2: checkCameraStatus() fires after every grant; reads video icon aria-label/class to infer on/off state. TODO (Phase 2) marks where to wire in the camera-off chat reminder.
  • Phase 3: MutationObserver on the chat container flags messages matching http(s)://, t.me/, bit.ly/, discord.gg/. TODO (Phase 3) marks the moderation hook.

Selector strategy

All selectors live in selectors/zoom-dom-selectors.json with ordered candidates arrays and fallbackStrategy prose per element. Priority: data-testidaria-label → class name → text match → structural traversal. Selector mismatches emit [WARN] logs; successful matches emit [DEBUG] logs — keeping breakage easy to diagnose.

Debug panel

When CONFIG.DEBUG = true, a floating overlay shows live scan/grant counters and last action taken.

Original prompt

Here’s the Copilot Super-Agent Query version — stronger, more explicit, and designed so the agent builds a more reliable Zoom automation foundation while still keeping the first delivery small.

COPILOT SUPER-AGENT QUERY — ZOOM CO-HOST MULTIPIN AUTOMATION

You are a coding agent working inside this repository.

Your task is to build a lightweight Zoom Web automation tool that runs under a Zoom Host or Co-Host account and automates Multi-Pin granting for participants who raise their hand.

The main goal is to create a simple first working version quickly, but structure it so it can later support camera checks, chat moderation, and other host/co-host workflows.

Do not overengineer.
Do not build a backend.
Do not require external services.
Prefer plain JavaScript and a Tampermonkey userscript that interacts directly with the Zoom Web DOM.

Assume the automation user already has the required co-host or host permissions to perform these actions.

PRIMARY OBJECTIVE

Implement this core behavior:

When a participant raises their hand, automatically:
1. detect the participant row
2. determine whether that participant already has Multi-Pin permission
3. if not, open the participant menu
4. click Allow to Multi-Pin
5. store internal state so the same participant is not processed repeatedly

This is the most important feature.
Everything else is secondary.

PERMISSION MODEL

Assume the script runs in a Zoom session where the user has:
• Host permissions, or
• Co-Host permissions

So the script may safely attempt actions such as:
• opening participant action menus
• granting Multi-Pin
• sending chat messages
• performing moderation actions later

Do not implement authentication logic.
Do not use Zoom APIs unless absolutely necessary.
The tool should work through the existing Zoom Web interface.

BUILD STRATEGY

Implement the project in phases, but code the repository so Phase 1 works immediately.

Phase 1 — Required

Auto-grant Multi-Pin when a participant raises their hand.

Phase 2 — Scaffold only

After granting Multi-Pin, detect whether the participant’s camera is on.
If the camera is off, prepare logic to send a one-time chat message:

Please turn your camera on to use Multi-Pin.

This phase can be partially scaffolded if camera detection is uncertain.

Phase 3 — Scaffold only

Monitor chat for likely spam links:
• http://
• https://
• t.me
• bit.ly
• discord.gg

For now, just log detections and structure future moderation hooks.

CRITICAL REQUIREMENT: DOM MAPPING LAYER

Because Zoom Web UI may change, you must create a DOM selector mapping layer.

Do not hardcode selectors everywhere.

Create a centralized selector/config system that contains entries for:
• participant list container
• participant row
• raised hand indicator
• participant name
• participant menu button
• Multi-Pin menu item
• camera status indicator
• chat container
• chat message rows
• chat input

The code should use helper functions to resolve selectors from this config.

If the exact selector is uncertain, implement a fallback strategy:
• first try stable attributes
• then aria-labels
• then text matching
• then defensive DOM traversal

Comment all assumptions clearly.

RELIABILITY REQUIREMENT

The agent must make the automation as reliable as possible without making it heavy.

Implement:
• a lightweight polling loop or MutationObserver
• max scan interval of about 2–3 seconds
• deduplication of already-processed participants
• guard clauses to prevent repeated clicks
• safe retry behavior when menus fail to open
• console logging for every important decision

Examples of logs:
• detected raised hand
• participant already has multipin
• granting multipin
• failed to find menu item
• selector mismatch warning

IMPLEMENTATION REQUIREMENTS

Use:
• plain JavaScript
• Tampermonkey userscript format
• no backend
• no external libraries
• no framework unless absolutely necessary

Keep code modular with functions or modules for:
• selector resolution
• participant scanning
• raised-hand detection
• multipin status detection
• multipin granting
• camera status checks
• chat monitoring
• moderation hooks
• debug logging

FILES TO CREATE

Create this structure:

/scripts/zoom-host-tools.user.js
Main Tampermonkey userscript

/selectors/zoom-dom-selectors.json
Central selector map and fallback notes

/docs/automation-design.md
Explain architecture, assumptions, Zoom DOM strategy, and extension points

/docs/testing-checklist.md
Manual test plan for Zoom Web behavior

REQUIRED BEHAVIOR DETAILS

Raised Hand Detection

Detect participants who currently show the raised-hand state.

Multi-Pin Detection

Before clicking anything, try to determine whether the participant already has Multi-Pin enabled.

If direct status detection is not available, use one of these strategies:
1. infer from menu text
2. inspect whether the action says “Allow to Multi-Pin” vs some granted state
3....


📍 Connect Copilot coding agent with Jira, Azure Boards or Linear to delegate work to Copilot in one click without leaving your project management tool.

@cr-gpt
Copy link

cr-gpt bot commented Mar 15, 2026

Seems you are using me but didn't get OPENAI_API_KEY seted in Variables/Secrets for this repo. you could follow readme for more information

Co-authored-by: FriskyDevelopments <220081212+FriskyDevelopments@users.noreply.github.com>
@cr-gpt
Copy link

cr-gpt bot commented Mar 15, 2026

Seems you are using me but didn't get OPENAI_API_KEY seted in Variables/Secrets for this repo. you could follow readme for more information

Copilot AI changed the title [WIP] Add Zoom co-host multipin automation tool Add Zoom Web co-host automation: auto-grant Multi-Pin on raised hand Mar 15, 2026
@FriskyDevelopments
Copy link
Owner

Tampermonkey userscript that runs under a Zoom Host/Co-Host session and automatically grants Multi-Pin permission to participants who raise their hand — no backend, no Zoom API, DOM-only.

Files

scripts/zoom-host-tools.user.js — Main userscript. Matches .zoom.us/wc/ and .zoom.us/j/.
selectors/zoom-dom-selectors.json — Canonical selector map; update here when Zoom changes its UI, then mirror into the SELECTORS constant in the script.
docs/automation-design.md — Architecture, DOM strategy, assumptions, extension points.
docs/testing-checklist.md — Manual test plan across all three phases.
Phase 1 — Implemented (MVP)

Polls participant rows every CONFIG.SCAN_INTERVAL_MS (2.5 s):

Detects raised-hand indicator via layered fallback: data-testid → aria-label → class → text/emoji content
Derives stable participant ID (data-participant-id → display name → DOM fingerprint); deduplicates via Set
Hovers row to reveal hidden "More" button → opens menu → retries up to MENU_CLICK_RETRIES times for the Multi-Pin item
Guards against re-granting by checking for "Remove Multi-Pin" text in the open menu
// Selector resolution — iterates candidates, logs every match/miss
function resolveElement(candidates, root = document) {
for (const selector of candidates) {
const el = root.querySelector(selector);
if (el) return el;
}
return null; // caller handles null safely
}
Phases 2 & 3 — Scaffolded

Phase 2: checkCameraStatus() fires after every grant; reads video icon aria-label/class to infer on/off state. TODO (Phase 2) marks where to wire in the camera-off chat reminder.
Phase 3: MutationObserver on the chat container flags messages matching http(s)://, t.me/, bit.ly/, discord.gg/. TODO (Phase 3) marks the moderation hook.
Selector strategy

All selectors live in selectors/zoom-dom-selectors.json with ordered candidates arrays and fallbackStrategy prose per element. Priority: data-testid → aria-label → class name → text match → structural traversal. Selector mismatches emit [WARN] logs; successful matches emit [DEBUG] logs — keeping breakage easy to diagnose.

Debug panel

When CONFIG.DEBUG = true, a floating overlay shows live scan/grant counters and last action taken.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants