Production-minded Chrome Extension that pulls clean app URLs from Google Play and Apple App Store search pages with dedupe and noise filtering built in.
Note
This repo currently ships as an unpacked extension workflow (Developer Mode) and is not published to the Chrome Web Store.
- Features
- Technology Stack
- Technical Block
- Getting Started
- Testing
- Deployment
- Usage
- Configuration
- License
- Contacts
- Dual-store extraction pipeline: supports
play.google.comandapps.apple.comin one popup flow. - Runtime store detection: auto-detects active tab domain and wires the right extraction strategy.
- Visible-only scraping: ignores hidden nodes via
offsetParent !== nullchecks. - DOM noise suppression: excludes footer/global navigation blocks to avoid junk URLs.
- Deterministic deduplication: normalizes entities by app identifier using
Setsemantics. - Canonical URL generation:
- Google Play links normalize to
https://play.google.com/store/apps/details?id=<APP_ID>. - Apple links normalize to
https://apps.apple.com/app/id<APP_ID>(without locale segment noise).
- Google Play links normalize to
- Clipboard-ready output: extracted links are shown in a textarea, line-by-line, for instant export.
- Real-time counter: popup shows number of extracted records.
Tip
Scroll the search results page before running extraction so lazy-loaded cards are present in the DOM and can be collected.
- Language: JavaScript (ES6+)
- Platform: Chrome Extension, Manifest V3
- Chrome APIs:
chrome.tabs.querychrome.scripting.executeScript
- Permissions:
activeTabscripting
- Host permissions:
https://play.google.com/*https://apps.apple.com/*
- UI layer: lightweight popup (
popup.html+ inline styles)
.
βββ icons/
β βββ icon128.png # Extension icon
βββ CONTRIBUTING.md # Contribution guide
βββ LICENSE # GPL-3.0 license
βββ manifest.json # MV3 metadata, permissions, action config
βββ popup.html # Popup UI shell
βββ src/
β βββ extractors/ # Store-specific extraction functions
β βββ popup/ # Popup UI controller and modules
βββ README.md # Project docs
-
Zero backend by design
Extraction runs directly in the active tab context. No server, no external API, no telemetry. -
Function injection strategy
The popup dynamically injects the extraction function for the detected store (extractGooglePlayLinksorextractAppleStoreLinks) to keep logic isolated and explicit. -
ID-first canonicalization
Instead of trusting raw anchors, the code extracts stable app identifiers and reconstructs canonical URLs. This lowers duplicate and region-specific URL variance. -
Defensive parsing
URL parsing operations are protected from malformed links to avoid hard failures during scraping sessions.
Important
This extension depends on current store DOM patterns. If Google/Apple rework their markup, selectors may need a hotfix.
Make sure you have:
- Google Chrome (recent stable build)
- Git (for cloning/updating the repository)
- Optional: a GitHub account if you want to fork and contribute
# 1) Clone the repo
git clone https://github.com/OstinUA/Game-Play-Search-Extractor.git
# 2) Enter project directory
cd Game-Play-Search-Extractor
# 3) Open Chrome extension management page
# chrome://extensions/
# 4) Enable Developer mode (top-right toggle)
# 5) Load unpacked extension
# Click "Load unpacked" and select this project directoryWarning
If you move or rename the local folder after loading unpacked, Chrome will lose track of the extension path. Reload from chrome://extensions/.
There is no heavyweight automated test suite yet, so validation is currently manual + behavior-driven.
Recommended smoke-check routine:
# Optional sanity check: verify extension metadata is valid JSON
python -m json.tool manifest.json > /dev/nullManual verification checklist:
- Open a Google Play search page, scroll, run extraction, verify non-zero result count.
- Confirm all Play links match canonical
details?id=format. - Open an Apple App Store listing/search page, scroll, run extraction.
- Confirm generated Apple links follow
https://apps.apple.com/app/id...format. - Confirm duplicates are removed across repeated cards/blocks.
- Confirm unsupported domains show disabled button + error state.
This project is currently deployed as a source-distributed Chrome extension.
Typical production-ish distribution paths:
- Unpacked internal distribution (fastest for teams and ASO operators)
- Private release bundles via Git tags/releases
- Chrome Web Store packaging (future-ready option if publishing is needed)
Build notes:
- There is no bundler/minifier stage required for runtime.
- Release discipline can be handled with semantic version bumps in
manifest.json. - CI can be added later for linting, metadata validation, and release packaging.
1) Open https://play.google.com/store/search
2) Run your query and scroll to hydrate more result cards
3) Click extension icon
4) Verify status shows "Google Play Store"
5) Click "Extract Links"
6) Copy normalized links from textarea output
1) Open an apps.apple.com app listing or search-related page
2) Ensure app cards are visible in viewport/result blocks
3) Click extension icon
4) Verify status shows "Apple App Store"
5) Click "Extract Links"
6) Copy normalized links from textarea output
Tip
The popup UI is fully in English and now includes a dark/light theme switch in the top-right corner.
This extension does not require .env files or runtime secrets.
Configuration surface is defined in manifest.json:
version: release/version trackingpermissions:activeTab,scriptinghost_permissions: allowed target domains for script injectionaction.default_popup: popup entrypointicons: extension assets
If you add a new supported store domain, you need to update both:
host_permissionsinmanifest.json- Domain routing + extraction logic in
popup.js
Distributed under the GPL-3.0 license. See LICENSE for legal details.
If you find this tool useful, consider leaving a β on GitHub or supporting the author directly: