phone-specs-scraper — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited phone-specs-scraper (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Extract detailed smartphone specs from popular phone database websites for comparison and research.
1. GSM Arena (gsmarena.com)
https://www.gsmarena.com/[brand]_[model]-[id].phphttps://www.gsmarena.com/google_pixel_9-13242.php2. PhoneDB (phonedb.net)
https://phonedb.net/index.php?m=device&s=query&d=[device-name]3. PhoneArena (phonearena.com)
https://www.phonearena.com/phones/[brand]-[model]4. MK Mobile Arena (mkmobilearena.com)
https://mkmobilearena.com/phone-compare/[phone1]-vs-[phone2]5. TechRadar (techradar.com)
https://www.techradar.com/phones/[brand]-[model]6. DeviceBeast (devicebeast.com)
https://devicebeast.com/phones/[brand]-[model]7. Comparigon (comparigon.com)
https://comparigon.com/phones/[brand]-[model]8. SpecsBattle (specsbattle.com)
https://specsbattle.com/phones/[brand]-[model]Scrape phone specs from GSM Arena using curl and grep.
# Get phone specs from GSM Arena
PHONE_URL="https://www.gsmarena.com/google_pixel_9-13242.php"
# Download page and extract key specs
curl -s "$PHONE_URL" | grep -oP '(?<=<td class="ttl">)[^<]+' | head -20
# Extract specifications table
curl -s "$PHONE_URL" | grep -A2 'class="specs-cp"' | grep -oP '(?<=<td>)[^<]+'Node.js with cheerio:
const cheerio = require('cheerio');
async function scrapeGSMArenaSpecs(url) {
const response = await fetch(url);
const html = await response.text();
const $ = cheerio.load(html);
const specs = {};
// Extract basic info
specs.name = $('h1.specs-phone-name').text().trim();
specs.released = $('.specs-cp .specs-cp-release').text().trim();
specs.weight = $('.specs-cp .specs-cp-weight').text().trim();
// Extract all specification tables
$('.specs-cp table').each((i, table) => {
const category = $(table).find('th').text().trim();
specs[category] = {};
$(table).find('tr').each((j, row) => {
const key = $(row).find('td.ttl').text().trim();
const value = $(row).find('td.nfo').text().trim();
if (key && value) {
specs[category][key] = value;
}
});
});
return specs;
}
// Usage
// scrapeGSMArenaSpecs('https://www.gsmarena.com/google_pixel_9-13242.php').then(console.log);Search for phone specs across multiple sources.
# Search using SearXNG for phone comparison pages
QUERY="Google Pixel 9 vs Pixel 10 specs comparison"
INSTANCE="https://searx.party"
curl -s "${INSTANCE}/search?q=${QUERY}&format=json" | jq -r '.results[] | select(.url | contains("gsmarena\|phonedb\|mkmobilearena")) | {title, url}'Node.js:
async function searchPhoneSpecs(phone1, phone2) {
const query = `${phone1} vs ${phone2} specs comparison`;
const searxInstances = [
'https://searx.party',
'https://searx.tiekoetter.com',
'https://searx.ninja'
];
for (const instance of searxInstances) {
try {
const params = new URLSearchParams({
q: query,
format: 'json',
language: 'en'
});
const res = await fetch(`${instance}/search?${params}`, { timeout: 10000 });
const data = await res.json();
// Filter for phone spec sites
const specSites = data.results.filter(r =>
r.url.includes('gsmarena.com') ||
r.url.includes('mkmobilearena.com') ||
r.url.includes('techradar.com') ||
r.url.includes('phonedb.net')
);
if (specSites.length > 0) {
return specSites;
}
} catch (err) {
console.warn(`Instance ${instance} failed: ${err.message}`);
}
}
throw new Error('No working search instances found');
}
// Usage
// searchPhoneSpecs('Google Pixel 9', 'Google Pixel 10').then(console.log);Compare specifications between two phones with highlighted differences.
async function comparePhones(phone1Specs, phone2Specs) {
const comparison = {
matches: [],
differences: [],
upgrades: [],
downgrades: []
};
// Compare key specs
const keyFields = [
'chipset', 'display', 'battery', 'mainCamera',
'ram', 'storage', 'weight', 'releaseDate'
];
for (const field of keyFields) {
const val1 = phone1Specs[field];
const val2 = phone2Specs[field];
if (val1 === val2) {
comparison.matches.push({ field, value: val1 });
} else {
comparison.differences.push({
field,
phone1: val1,
phone2: val2
});
// Detect upgrades (simplified logic)
if (field === 'battery' || field === 'ram' || field === 'storage') {
const num1 = parseInt(val1);
const num2 = parseInt(val2);
if (!isNaN(num1) && !isNaN(num2) && num2 > num1) {
comparison.upgrades.push({ field, from: val1, to: val2 });
}
}
}
}
return comparison;
}
// Usage example with formatted output
function formatComparison(comparison) {
let output = '## Phone Comparison\n\n';
output += '### ✅ Same Specs\n';
comparison.matches.forEach(m => {
output += `- ${m.field}: ${m.value}\n`;
});
output += '\n### 🔄 Differences\n';
comparison.differences.forEach(d => {
output += `- **${d.field}**:\n`;
output += ` - Phone 1: ${d.phone1}\n`;
output += ` - Phone 2: ${d.phone2}\n`;
});
output += '\n### ⬆️ Upgrades\n';
comparison.upgrades.forEach(u => {
output += `- ${u.field}: ${u.from} → ${u.to}\n`;
});
return output;
}Scrape pre-formatted comparison from sites like MK Mobile Arena.
# Get comparison from MK Mobile Arena
COMPARISON_URL="https://mkmobilearena.com/phone-compare/google-pixel-9-vs-google-pixel-10"
# Extract comparison table
curl -s "$COMPARISON_URL" | grep -oP '(?<=<td[^>]*>)[^<]+' | head -50Node.js:
async function scrapeComparisonSite(url) {
const response = await fetch(url);
const html = await response.text();
const $ = cheerio.load(html);
const comparison = {
phone1: {},
phone2: {},
differences: []
};
// Extract phone names
comparison.phone1.name = $('table tr:first-child td:nth-child(2) h3').text().trim();
comparison.phone2.name = $('table tr:first-child td:nth-child(3) h3').text().trim();
// Extract specs row by row
$('table tr').each((i, row) => {
const specName = $(row).find('td:first-child').text().trim();
const phone1Value = $(row).find('td:nth-child(2)').text().trim();
const phone2Value = $(row).find('td:nth-child(3)').text().trim();
if (specName && phone1Value && phone2Value) {
comparison.phone1[specName] = phone1Value;
comparison.phone2[specName] = phone2Value;
if (phone1Value !== phone2Value) {
comparison.differences.push({
spec: specName,
phone1: phone1Value,
phone2: phone2Value
});
}
}
});
return comparison;
}/robots.txt before scrapingYou can scrape phone specifications from GSM Arena and other sources. When a user asks to compare phones:
1. First try MK Mobile Arena or similar comparison sites that show side-by-side specs
2. If not available, scrape individual phone pages from GSM Arena
3. Extract key specs: display, chipset, battery, cameras, RAM, storage, release date
4. Highlight differences and upgrades between models
5. Format output with clear sections: Same Specs, Differences, Upgrades
Always cite the source URL and respect site terms of service.Error: "403 Forbidden"
Error: "Empty results"
Error: "JavaScript required"
Rate limited
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.