teampulse/scripts/discover_dom.py

99 lines
3.6 KiB
Python

"""DOM discovery for Teams Web — meeting chat and channel posts.
Usage:
.venv/bin/python scripts/discover_dom.py
"""
from pathlib import Path
from playwright.sync_api import sync_playwright
SESSION_DIR = str(Path.home() / ".teampulse" / "session")
def main():
with sync_playwright() as p:
browser = p.chromium.launch_persistent_context(
SESSION_DIR,
headless=False,
args=["--no-sandbox"],
)
page = browser.pages[0] if browser.pages else browser.new_page()
page.goto("https://teams.microsoft.com")
print("Navigiere im Browser zum Channel/Chat mit sichtbaren Nachrichten, dann Enter...")
input()
results = page.evaluate("""() => {
const out = {};
// 1. All unique data-tid values on the page
const tids = new Set();
document.querySelectorAll('[data-tid]').forEach(el => tids.add(el.getAttribute('data-tid')));
out.allDataTids = [...tids].sort();
// 2. Try common message selectors
const msgSelectors = [
"[data-tid='chat-pane-message']",
"[data-tid='channel-message-content']",
"[data-tid='message-body']",
"[data-tid='messageBody']",
"[class*='fui-ChatMessage']:not([class*='Control'])",
"[class*='message-body']",
"[class*='messageBody']",
"[class*='chatMessage']",
"[class*='ChatMessage']",
];
out.msgSelectorHits = {};
msgSelectors.forEach(sel => {
try {
out.msgSelectorHits[sel] = document.querySelectorAll(sel).length;
} catch(e) {}
});
// 3. Find elements whose text contains known message content
const knownTexts = ['Oliver Hofmann', '!stop', 'test', '!start'];
out.knownTextMatches = [];
document.querySelectorAll('*').forEach(el => {
if (el.children.length > 0) return;
const t = el.textContent.trim();
if (knownTexts.some(kt => t === kt || t.startsWith(kt))) {
let p = el;
const ancestors = [];
for (let i = 0; i < 5 && p; i++) {
ancestors.push({
tag: p.tagName,
dataTid: p.getAttribute('data-tid'),
cls: (p.className || '').substring(0, 80)
});
p = p.parentElement;
}
out.knownTextMatches.push({ text: t.substring(0, 40), ancestors });
}
});
out.knownTextMatches = out.knownTextMatches.slice(0, 10);
return out;
}""")
print("\n--- Alle data-tid Werte auf der Seite ---")
print(", ".join(results["allDataTids"]))
print("\n--- Nachrichten-Selektoren ---")
for sel, count in results["msgSelectorHits"].items():
if count > 0:
print(f"{sel}: {count} Treffer")
else:
print(f" {sel}: 0")
print("\n--- Elemente mit bekanntem Text ---")
for match in results["knownTextMatches"]:
print(f"\n Text: \"{match['text']}\"")
for anc in match["ancestors"]:
print(f" {anc['tag']} data-tid='{anc['dataTid']}' class='{anc['cls'][:60]}'")
print("\nEnter zum Schließen...")
input()
browser.close()
if __name__ == "__main__":
main()