Education
#ai
cnki-paper-detail
Extract full paper details from a CNKI paper page including title, authors, affiliations, abstract, keywords, fund, classification. Use when the user needs detailed information about a specific paper.
DeepseekModel
Curated skill
Quality Excellent · 90
v1.0.0
Get
https://deepseekmodel.com/api/download.php?id=cookjohn-cnki-skills-skills-cnki-paper-detail-skill-md&format=skill
Download .skill
Standard format with system_prompt and model_config, ready for any agent framework
The actual content of the system_prompt field in the .skill file.
name cnki-paper-detail description Extract full paper details from a CNKI paper page including title, authors, affiliations, abstract, keywords, fund, classification. Use when the user needs detailed information about a specific paper. argument-hint [paper URL or blank if already on detail page] CNKI Paper Detail Extraction Extract complete metadata from a CNKI paper detail page. Arguments $ARGUMENTS is optionally a CNKI paper detail URL (containing kcms2/article/abstract ). If not provided, assumes the current page is already a paper detail page. Steps 1. Navigate to the paper page (if URL provided) If $ARGUMENTS contains a URL: Use mcp__chrome-devtools__navigate_page with the URL. Use mcp__chrome-devtools__wait_for with text ["摘要"] and timeout 15000. 2. Check for captcha Use mcp__chrome-devtools__take_snapshot . If "拖动下方拼图完成验证" found, notify user: CNKI 正在显示滑块验证码。请在 Chrome 浏览器中手动完成拼图验证,完成后告诉我继续。 3. Extract paper metadata via JavaScript Use mcp__chrome-devtools__evaluate_script with this function: () => { const brief = document . querySelector ( '.brief' ); if (!brief) return { error : 'Paper detail section (.brief) not found' }; // Title const title = brief. querySelector ( 'h1' )?. innerText ?. trim () ?. replace ( /\s*附视频\s*$/ , '' ) // remove "附视频" suffix ?. replace ( /\s*网络首发\s*$/ , '' ); // remove "网络首发" suffix // Authors - first h3.author contains author links with sup tags const authorH3s = brief. querySelectorAll ( 'h3.author' ); const authorSection = authorH3s[ 0 ]; const authors = []; if (authorSection) { const authorLinks = authorSection. querySelectorAll ( 'a' ); authorLinks. forEach ( a => { const name = a. innerText ?. replace ( /\d+$/ , '' ). trim (); const supMatch = a. innerText ?. match ( /(\d+)$/ ); const affiliationNum = supMatch ? supMatch[ 1 ] : '' ; authors. push ({ name, affiliationNum }); }); } // Affiliations - second h3.author contains org links const affiliations = []; if (authorH3s. length > 1 ) { const orgLinks = authorH3s[ 1 ]. querySelectorAll ( 'a' ); orgLinks. forEach ( a => { affiliations. push (a. innerText ?. trim ()); }); } // Abstract const abstractEl = document . querySelector ( '.abstract-text' ); const abstract = abstractEl?. innerText ?. trim () || '' ; // Keywords const keywordsP = document . querySelector ( 'p.keywords' ); const keywords = keywordsP ? Array . from (keywordsP. querySelectorAll ( 'a' )). map ( a => a. innerText ?. replace ( /;$/ , '' ). trim ()) : []; // Fund const fundsP = document . querySelector ( 'p.funds' ); const fund = fundsP?. innerText ?. trim () || '' ; // Classification code const clcCode = document . querySelector ( '.clc-code' ); const classification = clcCode?. innerText ?. trim () || '' ; // Journal/source const docTop = document . querySelector ( '.doc-top' ); const journal = docTop?. querySelector ( 'a' )?. innerText ?. trim () || '' ; // Online first / publication info const headTime = document . querySelector ( '.head-time' ); const pubInfo = headTime?. innerText ?. trim () || '' ; // Is online first? const isOnlineFirst = !!brief. querySelector ( '.icon-shoufa' ); // Article outline/TOC const catalogList = document . querySelector ( '.catalog-list, .catalog-listDiv' ); const toc = catalogList?. innerText ?. trim () || '' ; // Citation network counts const citationTabs = document . querySelectorAll ( 'ul.module-tab.tpl_lieteratures li' ); const citationInfo = {}; citationTabs. forEach ( li => { const id = li. getAttribute ( 'data-id' ); const text = li. innerText ?. trim (); const countMatch = text. match ( /(\d+)/ ); if (id) { citationInfo[id] = { label : text. replace ( /\d+/ , '' ). trim (), count : countMatch ? parseInt (countMatch[ 1 ]) : 0 }; } }); return { title, authors, affiliations, abstract, keywords, fund, classification, journal, pubInfo, isOnlineFirst, toc, citationInfo }; } 4. Format and present the output ## {title} {isOnlineFirst ? "[网络首发]" : ""} **Authors:** {For each author: "- {name} ({affiliation})"} **Affiliations:** {For each affiliation: "- {affiliation}"} **Journal:** {journal} **Publication Info:** {pubInfo} **Abstract:** {abstract} **Keywords:** {keywords joined by ", "} **Fund:** {fund} **Classification:** {classification} **Citation Network:** {For each citation type: "- {label}: {count}"} 5. Fallback: snapshot-based parsing If JS extraction fails, use mcp__chrome-devtools__take_snapshot and parse the accessibility tree: Title : heading level 1 element Authors : link elements whose URLs contain kcms2/author/detail Affiliations : link elements whose URLs contain kcms2/organ/detail Abstract : StaticText following "摘要:" Keywords : link elements whose URLs contain kcms2/keyword/detail Fund : link elements following "基金资助:" Classification : StaticText following "分类号:" Verified DOM Selectors Data Selector Notes Paper section .brief Main paper info container Title .brief h1 May contain icons, clean text needed Authors .brief h3.author:first-of-type a Text has superscript numbers (e.g., "张三1") Affiliations .brief h3.author:nth-of-type(2) a Text starts with "N." (e.g., "1.北京大学") Abstract .abstract-text Full abstract text Keywords p.keywords a Semicolon-separated keyword links Fund p.funds Fund information text Classification .clc-code CLC classification codes Journal .doc-top a Source journal link Online first .brief .icon-shoufa Present if paper is online first Citation tabs ul.module-tab.tpl_lieteratures li data-id attr identifies type
Keywords that activate this skill. Click one to copy it.
This skill does not provide trigger words.
The downloaded .skill package contains the following fields.
| Field | Description |
|---|---|
| format | Format tag (skill/v1) |
| skill_id | Unique skill ID |
| name | Skill name |
| version | Version |
| description | Description |
| category | Categories (array) |
| trigger_words | Trigger words |
| tags | Tags |
| source | Source |
| source_url | Source URL (this page) |
| exported_at | Exported at (set per download) |
| system_prompt | System prompt body |
| model_config | Model config: provider / model / temperature / max_tokens / top_p |
| examples | Examples |
| install_guide | Import guide for Coze / Dify / Claude / custom frameworks |
The same skill can be exported in different platform formats.