99 lines
3.6 KiB
Python
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()
|