{"skill":{"slug":"dmm-ranking-lite","displayName":"DMM Ranking Lite","summary":"Fetch DMM/FANZA public rankings (daily/weekly/monthly) without API keys and output top 10 in numbered text format with Japanese title, Chinese translation, a...","description":"---\nname: dmm-ranking-lite\ndescription: Fetch DMM/FANZA public rankings (daily/weekly/monthly) without API keys and output top 10 in numbered text format with Japanese title, Chinese translation, and cover image URL. Use when user asks for DMM/FANZA 日榜/周榜/月榜 scraping, top10 extraction, or no-key ranking collection.\n---\n\n# DMM Ranking Lite\n\n抓取 DMM/FANZA 公共排行榜并输出 Top10，默认中文说明 + 日文原片名。\n\n## When To Use\n\n- 用户要 DMM/FANZA `日榜`、`周榜`、`月榜`\n- 用户明确要 `Top10`（或可改为 TopN）\n- 用户要求无 API Key 的公开页面抓取\n\n## Inputs\n\n- `term`: `daily` | `weekly` | `monthly`\n- `count`: 默认 `10`\n- `output_lang`: `zh-CN`（保留日文原片名）\n\n## Output Format\n\n必须使用编号块，不要表格：\n\n```text\n1.\n- 片名（日文）：...\n- 中文：...\n- 封面：...\n\n2.\n- 片名（日文）：...\n- 中文：...\n- 封面：...\n```\n\n## Workflow\n\n1. 打开榜单页面：\n   - `https://video.dmm.co.jp/av/ranking/?term=<term>`\n2. 如果出现年龄确认，点击 `はい`\n3. 使用 `browser(action=\"act\", request.kind=\"evaluate\")` 执行提取脚本\n4. 按 rank 升序取前 `count` 条\n5. 输出为编号列表，字段固定为：\n   - `片名（日文）`\n   - `中文`\n   - `封面`\n6. 结束后关闭标签页：`browser(action=\"close\")`\n\n## Extraction Snippet\n\n```javascript\n() => {\n  const items = Array.from(document.querySelectorAll('main ul > li'));\n  const rows = [];\n\n  for (const li of items) {\n    const rankMatch = (li.textContent || '').match(/(\\d+)位/);\n    if (!rankMatch) continue;\n\n    const rank = Number(rankMatch[1]);\n    const link =\n      li.querySelector('h2 a[href*=\"/av/content/?id=\"]') ||\n      li.querySelector('a[href*=\"/av/content/?id=\"]');\n    if (!link) continue;\n\n    const href = link.getAttribute('href') || '';\n    const idMatch = href.match(/[?&]id=([^&]+)/);\n    const title = (link.textContent || '').replace(/\\s+/g, ' ').trim();\n\n    const cover = Array.from(li.querySelectorAll('img'))\n      .map((img) => img.getAttribute('src') || img.getAttribute('data-src') || img.currentSrc || '')\n      .find((src) => /pics_dig|digital\\/video|awsimgsrc\\.dmm\\.co\\.jp/.test(src));\n\n    rows.push({\n      rank,\n      id: idMatch ? idMatch[1] : null,\n      title,\n      content_url: new URL(href, location.origin).href,\n      cover_url: cover ? new URL(cover, location.origin).href : null,\n    });\n  }\n\n  rows.sort((a, b) => a.rank - b.rank);\n  return rows;\n}\n```\n\n## Translation Rules\n\n- `片名（日文）` 必须保留原文，不可改写\n- `中文` 采用简洁自然中文，避免机翻腔\n- 标题过长时可适度压缩，不改变核心含义\n- 明显敏感措辞可中性化，但不要错译\n\n## Error Handling\n\n- 页面结构变更：先 `snapshot` 检查节点，再调整 selector\n- 未拿到 `cover_url`：输出 `封面：无`\n- 抓取不足 10 条：按实际条数输出，并说明“本次仅抓取到 N 条”\n- 无法通过年龄确认：重试一次后返回失败原因\n\n## Notes\n\n- 仅抓取公开页面，不需要 DMM API 凭据\n- 默认 Top10，如需 TopN 请在结果截取阶段改为 `rows.slice(0, N)`\n- 若页面改版频繁，优先保持输出格式稳定，必要时更新提取脚本\n","tags":{"latest":"0.1.0"},"stats":{"comments":0,"downloads":578,"installsAllTime":0,"installsCurrent":0,"stars":0,"versions":1},"createdAt":1772458553490,"updatedAt":1778491691403},"latestVersion":{"version":"0.1.0","createdAt":1772458553490,"changelog":"Initial release","license":null},"metadata":null,"owner":{"handle":"leeeroyjoy-pixel","userId":"s17aabs0pp4g52q3pagbhjedn183h1tj","displayName":"leeeroyjoy-pixel","image":"https://avatars.githubusercontent.com/u/250311898?v=4"},"moderation":null}