Skip to content

Commit 5555ebe

Browse files
wbwSoftwareshadoathclaude
authored
fix: Update Chrome Web Store crawler selector for user count (#9)
Co-authored-by: Skylar Bolton <skylar.bolton@gmail.com> Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 53371e3 commit 5555ebe

3 files changed

Lines changed: 267 additions & 3 deletions

File tree

src/services/__tests__/__snapshots__/chrome-crawler.test.ts.snap

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,109 @@ Absolutely! Blync is 100% secure.
223223
"weeklyActiveUsers": 40,
224224
}
225225
`;
226+
227+
exports[`Chrome Web Store Crawler should extract extension details from 2026-04-17-hmdcmlfkchdmnmnmheododdhjedfccka.html 1`] = `
228+
{
229+
"iconUrl": "https://lh3.googleusercontent.com/JHgGb5sWzuZecolMRmsJluBhKZFQ1FrO9YXgcHkqRb9hy-73rOJh-smwk3oHVJDxCf0BdoYFJAPbGd_d-_i3cLugsw=s256",
230+
"id": "hmdcmlfkchdmnmnmheododdhjedfccka",
231+
"lastUpdated": "November 26, 2025",
232+
"longDescription":
233+
"Pick colors from any website and store them in your palettes.
234+
With just two clicks, Eye Dropper allows you to pick colors from any website without hassle. Whether you're a web developer, designer or creative professional, Eye Dropper is a great addition to your toolkit.
235+
Key Features:
236+
👉 Web page Picker: Easily select any color from any web page with just two clicks. Eye Dropper provides a quick and intuitive way to identify and capture colors from your favorite websites.
237+
👉 Color Palettes: Save and organize your favorite colors with a user-friendly interface. Create palettes, organize them and ensure consistency across your projects.
238+
👉 Color Picker: Find that color you are looking for. Adjust hues, saturation, and brightness to find the perfect shade for your needs.
239+
👉 Hex, RGB, and More: Eye Dropper supports various color formats, including HEX, RGB, HSL and HSV.
240+
👉 User-friendly and Lightweight: Designed with a focus on simplicity and performance, Eye Dropper works effortlessly without slowing down your browsing experience.
241+
Why Choose Eye Dropper?
242+
👉 Free software made with ❤️ by single developer.
243+
244+
👉 Eye Dropper is here to stay: In active development since 2010, also first color picking extension for Chrome.
245+
246+
👉 Trusted by more than million users in Chrome Store, with 2,000 positive reviews.
247+
248+
👉 Safe: Doesn't collect your data. Doesn't track you."
249+
,
250+
"name": "Eye Dropper",
251+
"rating": 4.3,
252+
"reviewCount": 3,
253+
"screenshots": [
254+
{
255+
"index": 3,
256+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/3",
257+
"rawUrl": "https://lh3.googleusercontent.com/0YMjrWbn7_iSWpjvF45C2xdswzPDZZ8Qf2cPeM2-VrQF8PNX9F0sWWjr-CBbCOH0kogD0CEW2uewbx5TyvLAf1Ia=s1280",
258+
},
259+
{
260+
"index": 4,
261+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/4",
262+
"rawUrl": "https://lh3.googleusercontent.com/YaXuIdUkKlr7g5tq2mpY8uWvckzknb6xyv9TD6iam0-6ri-7_a1jjntmTv3dz0x0kz38lEUEHW-r9q6zp0eMwPov=s1280",
263+
},
264+
{
265+
"index": 0,
266+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/0",
267+
"rawUrl": "https://lh3.googleusercontent.com/cLm5vTn9bPNn6QvxuJdcqgP3JF47XB4hKm9rP3XibkyT2arxWo_HwCa6c8RwcIV4Et0c1TXfnDie4Xgj24svzbye=s1280",
268+
},
269+
{
270+
"index": 1,
271+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/1",
272+
"rawUrl": "https://lh3.googleusercontent.com/AeVZqwDPLzUMZb3JAV2qsD8KbxRnioA176cE3DYBANpYY3TyCQljLcfTKmlGvV5Xdt52AJkjT65ok8t4d0cYnobvIQ=s1280",
273+
},
274+
{
275+
"index": 2,
276+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/2",
277+
"rawUrl": "https://lh3.googleusercontent.com/Hqn2xlSKEuxQfBe-YHPlhUMjox2G0ZpYd1ouFx9ATfb_YbwtqfVkp9v8AjBI9RzBghbH9yci-cxdoJnwL8VCskRZMQ=s1280",
278+
},
279+
{
280+
"index": 3,
281+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/3",
282+
"rawUrl": "https://lh3.googleusercontent.com/0YMjrWbn7_iSWpjvF45C2xdswzPDZZ8Qf2cPeM2-VrQF8PNX9F0sWWjr-CBbCOH0kogD0CEW2uewbx5TyvLAf1Ia=s1280",
283+
},
284+
{
285+
"index": 4,
286+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/4",
287+
"rawUrl": "https://lh3.googleusercontent.com/YaXuIdUkKlr7g5tq2mpY8uWvckzknb6xyv9TD6iam0-6ri-7_a1jjntmTv3dz0x0kz38lEUEHW-r9q6zp0eMwPov=s1280",
288+
},
289+
{
290+
"index": 0,
291+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/0",
292+
"rawUrl": "https://lh3.googleusercontent.com/cLm5vTn9bPNn6QvxuJdcqgP3JF47XB4hKm9rP3XibkyT2arxWo_HwCa6c8RwcIV4Et0c1TXfnDie4Xgj24svzbye=s1280",
293+
},
294+
{
295+
"index": 1,
296+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/1",
297+
"rawUrl": "https://lh3.googleusercontent.com/AeVZqwDPLzUMZb3JAV2qsD8KbxRnioA176cE3DYBANpYY3TyCQljLcfTKmlGvV5Xdt52AJkjT65ok8t4d0cYnobvIQ=s1280",
298+
},
299+
{
300+
"index": 0,
301+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/0",
302+
"rawUrl": "https://lh3.googleusercontent.com/cLm5vTn9bPNn6QvxuJdcqgP3JF47XB4hKm9rP3XibkyT2arxWo_HwCa6c8RwcIV4Et0c1TXfnDie4Xgj24svzbye=s1280",
303+
},
304+
{
305+
"index": 1,
306+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/1",
307+
"rawUrl": "https://lh3.googleusercontent.com/AeVZqwDPLzUMZb3JAV2qsD8KbxRnioA176cE3DYBANpYY3TyCQljLcfTKmlGvV5Xdt52AJkjT65ok8t4d0cYnobvIQ=s1280",
308+
},
309+
{
310+
"index": 2,
311+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/2",
312+
"rawUrl": "https://lh3.googleusercontent.com/Hqn2xlSKEuxQfBe-YHPlhUMjox2G0ZpYd1ouFx9ATfb_YbwtqfVkp9v8AjBI9RzBghbH9yci-cxdoJnwL8VCskRZMQ=s1280",
313+
},
314+
{
315+
"index": 3,
316+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/3",
317+
"rawUrl": "https://lh3.googleusercontent.com/0YMjrWbn7_iSWpjvF45C2xdswzPDZZ8Qf2cPeM2-VrQF8PNX9F0sWWjr-CBbCOH0kogD0CEW2uewbx5TyvLAf1Ia=s1280",
318+
},
319+
{
320+
"index": 4,
321+
"indexUrl": "http://localhost:3000/api/rest/chrome-web-store/hmdcmlfkchdmnmnmheododdhjedfccka/screenshots/4",
322+
"rawUrl": "https://lh3.googleusercontent.com/YaXuIdUkKlr7g5tq2mpY8uWvckzknb6xyv9TD6iam0-6ri-7_a1jjntmTv3dz0x0kz38lEUEHW-r9q6zp0eMwPov=s1280",
323+
},
324+
],
325+
"shortDescription": "Pick colors from any website.",
326+
"storeUrl": "https://chromewebstore.google.com/detail/eye-dropper/hmdcmlfkchdmnmnmheododdhjedfccka",
327+
"users": 1000000,
328+
"version": "4.10.3.12",
329+
"weeklyActiveUsers": 1000000,
330+
}
331+
`;

src/services/__tests__/fixtures/chrome-web-store/2026-04-17-hmdcmlfkchdmnmnmheododdhjedfccka.html

Lines changed: 150 additions & 0 deletions
Large diffs are not rendered by default.

src/services/chrome-crawler.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,17 @@ export async function crawlExtension(
6262

6363
const weeklyActiveUsersText = tryExtract("weeklyActiveUsers", validateInt, [
6464
() => {
65-
const userCountRow = document.querySelector(
66-
"main > * > section:first-child > section > div > div:last-child",
67-
) as HTMLElement | null;
65+
// Find the header div whose text contains " users" (resilient to DOM reordering)
66+
const headerDivs = document.querySelectorAll(
67+
"main > * > section:first-child > section > div > div",
68+
);
69+
let userCountRow: HTMLElement | null = null;
70+
for (const div of headerDivs) {
71+
if ((div as HTMLElement).textContent?.includes(" users")) {
72+
userCountRow = div as HTMLElement;
73+
break;
74+
}
75+
}
6876
removeAnchorChildren(userCountRow);
6977
return (
7078
userCountRow?.textContent

0 commit comments

Comments
 (0)