文件历史

提交图

36 次代码提交

作者 SHA1 备注 提交日期
Magnus Müller e405d8da2d domain-skills: linkedin — invitation-manager.md (#149)
Captures the durable shape of LinkedIn's received-invitations page:

- URL filter slugs (PEOPLE_WITH_MUTUAL_CONNECTION, PEOPLE_WITH_MUTUAL_SCHOOL)
  and the chip counter as authoritative remaining-count.
- Accept/Ignore aria-label formats — they differ from each other, so you
  cannot derive one from the other.
- The "follows you" trap: Accept renders as <a href=current-URL>, not
  <button>; .click() follows href and no click path (MouseEvent, CDP
  Input.dispatchMouseEvent) triggers the accept handler. Route these to
  Ignore or skip.
- Pagination: list renders ~10 rows, replaced by "is now a connection"
  acknowledgments after accepts; reload the URL to fetch the next slice,
  scrolling does nothing.
- "Take care when connecting" safety modal appears intermittently.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-22 10:19:43 -07:00
songty1 5517717a51 fix(youtube/scraping): update stale age-restricted video docs
After the previous commit added early raises for LOGIN_REQUIRED and
ERROR in scrape_video(), two doc entries still described the old
behavior ("will succeed but status is LOGIN_REQUIRED"). Updated both
the Gotchas section and the 'What Requires a Browser' list to reflect
that scrape_video() now raises ValueError on age-restricted videos.
2026-04-21 15:58:57 +08:00
songty1 77a0f46854 fix(youtube/scraping): address code review findings
Two issues raised by automated review on PR #137:

1. max_results limit could be exceeded
   The `break` in youtube_search() only exits the inner loop over
   itemSectionRenderer contents. If YouTube returns multiple sections,
   the outer loop would continue appending results beyond max_results.
   Fixed by replacing `break` with `return results` to exit both loops
   immediately once the limit is reached.

2. Regex match not null-checked before .group(1)
   scrape_video() called m.group(1) directly after re.search(), which
   raises AttributeError if the pattern is not found (e.g. private video,
   deleted video, region-blocked content, or YouTube HTML structure change).
   Fixed by adding an explicit None check with a descriptive ValueError,
   and an early playabilityStatus check that surfaces LOGIN_REQUIRED and
   ERROR states with clear messages before attempting to parse videoDetails.
2026-04-21 15:48:29 +08:00
songty1 8ae50e76fd feat(domain-skills): add YouTube scraping skill
Adds domain-skills/youtube/scraping.md with four verified approaches
for extracting YouTube data without a browser or API key.

## What's included

**Approach 1 — oEmbed API (fastest)**
- Single HTTP call, ~0.3s per video
- Returns title, author, channel URL, thumbnail, embed HTML
- Bulk fetching via ThreadPoolExecutor with real timing data
- Verified on multiple video IDs

**Approach 2 — Watch page ytInitialPlayerResponse**
- Full video metadata: title, author, channel_id, duration, view_count,
  publish_date, upload_date, category, like_count, keywords, is_live,
  is_private, is_unlisted, available_countries (249 codes), embed_url
- Correct regex pattern (non-greedy with lookahead) to parse the JSON blob
- Real output values verified and included as comments
- Accurate gotchas: viewCount/lengthSeconds are strings not ints,
  likeCount lives in microformat not videoDetails

**Approach 3 — Search results (no API key)**
- Parses ytInitialData from /results?search_query= (server-side rendered)
- Returns up to ~14-20 results with videoId, title, channel, duration,
  views, published, description snippet, thumbnail URL
- Verified: 15 results returned for "python tutorial"

**Approach 4 — Channel metadata**
- Handles both @handle and channel ID (UC...) URL formats
- Extracts channel_id, title, description, subscriber count, avatar,
  banner from pageHeaderViewModel + channelMetadataRenderer
- Verified on @RickAstleyYT: "4.48m subscribers"

**Utilities**
- thumbnail_urls(): all 5 sizes with availability notes (maxres may 404)
- extract_video_id(): handles watch, youtu.be, /shorts/, /embed/ formats

**What requires a browser**
- Clear list of what http_get cannot access: trending, playlists,
  comments, caption text, age-restricted videos

**URL patterns reference table**

**Gotchas (all verified)**
- ytInitialPlayerResponse regex non-greedy requirement
- viewCount/lengthSeconds are string types, not int
- likeCount location (microformat, not videoDetails)
- oEmbed 404 on private/deleted videos
- Caption baseUrl returns empty in all tested conditions
  (plain http_get, XHR, and fetch with cookies) — not a session issue
- Search result count varies (~14-20), never assume fixed count
- Subscriber count is a rounded string, not an integer
2026-04-21 15:37:39 +08:00
Robert Guss a603b7e997 domain-skills/medium: article body via DOM (logged-in fallback) 2026-04-20 15:23:36 -04:00
Robert Guss 06fd196941 domain-skills: reddit — shreddit-* DOM extraction and JSON API 2026-04-20 15:23:31 -04:00
JohnMark Taylor 1aff1e14de docs(skill): centilebrain -- generate normative z-scores
Captures the site shape for centilebrain.org 'Generate Estimates' flow:
- Six Shiny iframes (modality x sex) at centilebrain-app.shinyapps.io
- Selectors for email, file input, compute, download
- Wait markers and three non-obvious traps (iframe target_id staleness,
  MUI switch checkboxes, coordinate-vs-JS button click after scroll)
- End-to-end example using upload_file(..., target_id=...) with
  iframe_target()
- Output zip schema

Requires the iframe target_id support added to upload_file().
2026-04-19 17:21:05 -04:00
Saurav Panda 84935b3738 Merge pull request #103 from forrest-motz/docs/github-form-actions
domain-skills/github: repo actions (star, watch) via form.submit()
2026-04-19 10:40:49 -07:00
Saurav Panda f3bfd9425d Merge pull request #101 from harrisboatworks/feat/facebook-domain-skill
domain-skills: add facebook/ (groups + pages)
2026-04-19 10:39:41 -07:00
Saurav Panda 859e1645b1 Merge pull request #99 from trwpang/narrow/trello-boards-and-lists-589ffe
trello: boards-and-lists
2026-04-19 10:38:48 -07:00
Forrest Motz f6a4724186 domain-skills/github: repo actions (star, watch) via form.submit()
Synthetic .click() on the visible Star button does not persist the
star — there's a hidden 0x0 fallback button that querySelector finds
first, and the visible React button swallows synthetic events. Submit
the form directly; CSRF is already embedded.

Field-tested while completing the install.md verification step.
2026-04-19 13:24:32 +01:00
Jay Harris a66a92f3c4 feat(domain-skills): add facebook/ with groups and pages playbooks
Both skills share the post-article DOM surface (div[role="article"]
and the data-ad-*-preview message selectors), but differ in URL shape,
sort options, and rate-limit ceilings. Pages are public and tolerate a
higher rate; Groups gate content behind membership and are stricter.

Each file covers: URL patterns, DOM anchors with verification notes,
a collect-as-you-go scroll pattern (FB virtualizes the feed so
scroll-then-collect misses posts), the l.facebook.com/l.php redirector
decoder, a Firecrawl handoff example, rate-limit discipline, a
self-inspection JS block for detecting selector drift, and a full
end-to-end example that emits JSON on stdout for downstream tools.

The groups.md anchors were verified against a logged-in account on
2026-04-18. pages.md inherits the post-article anchors from groups.md
(shared React component) and adds Page-specific header/metadata
selectors; a gotchas log section invites confirmation on first live use.
2026-04-19 06:15:36 -04:00
trwpang b87d6436c2 trello: boards-and-lists (via narrow) 2026-04-19 10:43:29 +01:00
sergeclaesen 4ec625595a domain-skills: framer — web editor (#98)
Documents the Monaco + React-canvas seam that causes most 'automation
silently did nothing' failures in Framer:

- Double-click requires the full pointer+mouse event chain (detail:2 matters)
- Monaco paste must be clipboard + OS-level Cmd+A/Cmd+V, then wait before save
- Publish button only mounts when a page is selected in the Pages tab; it
  rejects synthetic clicks and must be driven by screen-coord input
- Framer autolayout preempts programmatic Header position/left/right writes,
  forcing nodes offscreen; delete-and-copy is the working workaround

Plus the list of canvas-level interactions that consistently reject
automation (drag-drop, variant switching, property binding, Page Settings)
so agents know to escalate to the human instead of retrying.

Stable data-testid selectors table for Pages/Layers/Assets tabs, and the
edge-cache + sitemap quirks on framer-hosted live domains.
2026-04-19 02:15:53 -07:00
sergeclaesen 93c630f5ae domain-skills: atlas — my.recruitwithatlas.com (#94)
Add routes, filter URL format, GraphQL bootstrap, and the 'credentials: include'
pattern for reusing the tab's NextAuth session cookie without JWE juggling.

Auth quirk documented: injecting only the JWE into a fresh Chrome profile
triggers a login loop; UI needs the full cookie set (persistent profile),
while backend GraphQL works with the JWE alone.
2026-04-18 23:45:55 -07:00
Saurav Panda 1973fc78be Merge pull request #86 from browser-use/feat/domain-skills-batch18
Add domain skills: World Bank, REST Countries, NASA, Wayback Machine, arXiv bulk
2026-04-18 18:48:10 -07:00
sauravpanda 57ad39b709 Add batch 18 domain skills: World Bank, REST Countries, NASA, Wayback Machine, arXiv bulk 2026-04-18 18:38:30 -07:00
sauravpanda f7d045caaf Add browser-harness validated domain skills for batch 11
PubMed/NCBI (ESearch→ESummary/EFetch pipeline; count is string; ELink broken 2026; CollectiveName branch),
CrossRef (title/container-title always lists; abstract has JATS XML tags; type=proceedings-article not conference-paper),
OpenAlex (abstract_inverted_index reconstruction; cursor >10K pages; group_by not group-by; concepts deprecated use topics),
FRED (fredgraph.csv timeouts headlessly; API needs free key; BLS/WorldBank/AlphaVantage as keyless alternatives),
MusicBrainz (Mozilla/5.0 gets 403; recording length in ms; CAA front flag vs types array differ).
2026-04-18 17:37:35 -07:00
Saurav Panda 99b3037fa8 Merge pull request #47 from browser-use/feat/domain-skills-batch3
Add domain skills: ArXiv, Craigslist, Stack Overflow, npm/PyPI, Zillow
2026-04-18 16:40:52 -07:00
Saurav Panda 48773aa9f4 Merge pull request #49 from browser-use/feat/domain-skills-batch4
Add domain skills: Booking.com, Eventbrite, Etsy, eBay, CoinGecko
2026-04-18 16:12:32 -07:00
Saurav Panda 67228da9a8 Merge pull request #50 from browser-use/feat/domain-skills-batch5
Add domain skills: SEC EDGAR, Coursera, Goodreads, DuckDuckGo, TrustPilot
2026-04-18 13:35:13 -07:00
sauravpanda 993323457d Add browser-harness validated domain skills for batch 10
Wellfound (DataDome + Cloudflare dual stack; browser CDP resolves silently; Rails not Next.js),
G2 (DataDome blocks all http_get; browser CDP; schema.org microdata stable; data.g2.com API needs vendor key),
Capterra (ClaudeBot UA returns Markdown not HTML; Chrome UA gets Cloudflare 403),
TradingView (scanner.tradingview.com POST open; symbol-search needs Origin header; data.tradingview.com dead),
Macrotrends (iframe PHP endpoints bypass main page; stock OHLCV direct; Referer required for economic API).
2026-04-18 05:18:38 -07:00
sauravpanda 33dcd86207 Add browser-harness validated domain skills for batch 9
CoinMarketCap (internal data-api/v3 fully open, no auth; 25 calls no rate limit),
Quora (full Chrome UA required; push() payloads double-encoded JSON; 3 SSR answers only),
Itch.io (http_get works; game cards via CSS selectors; RSS feeds exist),
Steam (appdetails single appid only; price in cents; ISteamApps/GetAppList dead in 2026),
HowLongToBeat (two-step token flow /api/find/init then POST; comp_* in seconds not hours).
2026-04-18 04:59:15 -07:00
sauravpanda cfa55ed15e Add browser-harness validated domain skills for batch 8
Letterboxd (http_get works on film pages; JSON-LD CDATA gotcha; API needs OAuth),
Gutenberg (Gutendex REST API; text via /cache/epub/; .opf is 404, use .rdf),
Metacritic (internal backend API key in HTML; Nuxt __NUXT_DATA__ not __NEXT_DATA__),
RAWG (API needs key; window.CLIENT_PARAMS in HTML has full game data without key),
OpenLibrary (full free API; missing cover = 43-byte GIF not 404; description dual type).
2026-04-18 04:46:39 -07:00
sauravpanda c2167e544e Add browser-harness validated domain skills for batch 7
Glassdoor (Cloudflare managed challenge; browser only; __NEXT_DATA__ + DOM fallbacks),
Medium (?format=json strips XSSI prefix; GraphQL /_/graphql no auth; RSS 10-item cap),
SoundCloud (oEmbed no-auth; __sc_hydration apiClient.id as client_id; API v2 with pagination),
Genius (OS token in UA bypasses 403; internal /api/songs no auth; strip first lyrics div header),
Dev.to (public REST API; burst limit 6 req then 429/1s; listings empty without auth).
2026-04-18 04:31:04 -07:00
sauravpanda f897a29d17 Add browser-harness validated domain skills for batch 6
Walmart (http_get works; bare Mozilla/5.0 UA bypasses PerimeterX; __NEXT_DATA__ via id= regex not type=),
Spotify (oEmbed no-auth; embed __NEXT_DATA__ has full trackList; anonymous token burns 22h Retry-After),
Weather (wttr.in format=j1; Open-Meteo current+hourly+daily; NWS two-call flow),
OpenStreetMap (Nominatim lat/lon are strings; Overpass bbox order differs from Nominatim; POST required),
Archive.org (Wayback availability API degraded; CDX sort=closest reliable; /search?output=json returns HTML).
2026-04-18 04:16:54 -07:00
sauravpanda 40291337ce Add Goodreads domain skill (http_get works; __NEXT_DATA__ Apollo state + JSON-LD) 2026-04-18 03:52:34 -07:00
sauravpanda a034cd0021 Add browser-harness validated domain skills for batch 5 (partial)
Coursera (public API no auth, q=search is POST-only/405 on GET),
DuckDuckGo (Instant Answer API, skip_disambig=1 essential, widget answers unusable),
SEC EDGAR (company UA required for www.sec.gov; 10 req/s; XBRL frames for cross-company),
TrustPilot (http_get works; __NEXT_DATA__ has reviews; 10-page cap per filter).
2026-04-18 03:50:39 -07:00
sauravpanda ac15bc0321 Add Booking.com domain skill (AWS WAF; sitemap + GraphQL schema + browser CDP) 2026-04-18 03:48:26 -07:00
sauravpanda 7feb67a8df Add browser-harness validated domain skills for batch 4 (partial)
Eventbrite (JSON-LD ItemList, __NEXT_DATA__ for detail; public API needs auth),
Etsy (DataDome blocks http_get; browser CDP + official API v3 with free key),
CoinGecko (free API, sleep 5s between calls; /coins/list for IDs not symbols),
eBay (http_get works until rate limit; JSON-LD Product schema on detail pages).
2026-04-18 03:46:25 -07:00
sauravpanda bbef605d50 Add browser-harness validated domain skills for batch 3
ArXiv (comma-separated id_list), Craigslist (cl-static-search-result),
Stack Overflow API (filter=withbody), npm/PyPI registries, Zillow
(NEXT_DATA extraction + Redfin fallback).
2026-04-18 03:36:56 -07:00
sauravpanda 4f05481d2a Replace drafted skills with browser-harness validated versions
Ran actual browser-harness sessions against each site and rewrote
the skill files from live test findings. Key corrections:

GitHub: wait(2) after wait_for_load() for React hydration; search API
  separate 10 req/min limit; search/code needs auth (401 unauthed)

HackerNews: athing also matches comment rows (use 'athing submission');
  job posts break naive score-zip; html.unescape() required for titles

Amazon: .zg-item-immersion gone from Best Sellers; #priceblock_ourprice
  returns null (legacy); review count selector collides with cross-sell
  widget — use [aria-label*='ratings'] instead

News: The Verge is Atom not RSS (namespace dict required); Reuters
  hard-blocks http_get with 403 even with User-Agent; BBC shows no
  consent banner from US IP; parallel fetch is 4.3x faster (0.16s vs 0.70s)

ProductHunt: goto() ERR_ABORTED — always use new_tab(); /posts/ URLs
  don't exist (it's /products/); homepage has 30 fixed items no lazy load;
  [data-test^='post-item-'] is the correct card selector
2026-04-18 01:22:30 -07:00
sauravpanda f0f70e7362 Add domain skills for 6 public, no-login-required sites
- github/scraping.md: GitHub API + trending page patterns, rate limiting
- hackernews/scraping.md: http_get + Algolia API for search/filtering
- producthunt/scraping.md: React SPA browser scraping + GraphQL token approach
- amazon/product-search.md: ASIN extraction, price parsing, CAPTCHA handling
- news-aggregation/multi-source.md: RSS-first approach, parallel fetch, consent banners
- job-boards/indeed-glassdoor.md: URL construction, job key extraction, salary normalization

All skills derived from real user task patterns. No credentials or sensitive data included.
2026-04-18 00:16:18 -07:00
Magnus Müller a1c35ba384 Add thetechgeeks domain-skill for Ubiquiti AU pricing (#40)
Captures three learnings from a real run that mis-reported $3,080 AUD for
a UACC-Rack-12U-Wall (real AU street ~$420-630): Tech Geeks is Shopify so
use /products/<handle>.js for canonical price and SKU; its .js `available`
flag is unreliable so cross-check the DOM for sold-out markers; and
sold-out pages there carry stale/junk prices that must never enter a
final table without a second-source sanity check.

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-17 23:17:52 -07:00
Gregor Žunič 29c4dfa8e7 changed name 2026-04-17 20:50:33 -07:00
MagMueller d6942b61fe add interaction-skills and domain-skills structure
Two skill categories, pure markdown, no Python files:

- interaction-skills/ — generic browser patterns (dialogs, inputs, etc.)
  Flat .md files. Agent reads the relevant one before a task.

- domain-skills/ — per-site playbooks (tiktok/, linkedin/, etc.)
  Flat .md files per action (upload, schedule, post).
  Subfolders for large domains when needed.

Starting with:
- interaction-skills/dialogs.md — CDP vs JS dialog handling
- domain-skills/tiktok/upload.md — full upload flow with gotchas
- Placeholder folders for linkedin, spreadshirt, salesforce

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-17 13:46:37 -07:00