<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:DeadLinkScanner?action=history&amp;feed=atom</id>
	<title>微件:DeadLinkScanner - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:DeadLinkScanner?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:DeadLinkScanner?action=history"/>
	<updated>2026-07-26T19:29:16Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:DeadLinkScanner&amp;diff=6836&amp;oldid=prev</id>
		<title>2026年6月25日 (四) 11:18 愤怒的郎朗</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:DeadLinkScanner&amp;diff=6836&amp;oldid=prev"/>
		<updated>2026-06-25T11:18:36Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:DeadLinkScanner&amp;amp;diff=6836&amp;amp;oldid=6833&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:DeadLinkScanner&amp;diff=6833&amp;oldid=prev</id>
		<title>愤怒的郎朗：​创建页面，内容为“&lt;includeonly&gt; &lt;style&gt; .deadlink-scanner {     margin: 20px 0;     padding: 20px;     background: #fafafa;     border-radius: 12px;     border: 1px solid #e0e0e0; } .deadlink-scanner h3 {     margin-bottom: 10px; } .deadlink-scanner .scan-btn {     padding: 10px 24px;     background: #f44336;     color: #fff;     border: none;     border-radius: 8px;     font-size: 15px;     cursor: pointer; } .deadlink-scanner .scan-btn:hover { background: #d32f2f; } .deadlink-…”</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:DeadLinkScanner&amp;diff=6833&amp;oldid=prev"/>
		<updated>2026-06-25T11:11:21Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;includeonly&amp;gt; &amp;lt;style&amp;gt; .deadlink-scanner {     margin: 20px 0;     padding: 20px;     background: #fafafa;     border-radius: 12px;     border: 1px solid #e0e0e0; } .deadlink-scanner h3 {     margin-bottom: 10px; } .deadlink-scanner .scan-btn {     padding: 10px 24px;     background: #f44336;     color: #fff;     border: none;     border-radius: 8px;     font-size: 15px;     cursor: pointer; } .deadlink-scanner .scan-btn:hover { background: #d32f2f; } .deadlink-…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.deadlink-scanner {&lt;br /&gt;
    margin: 20px 0;&lt;br /&gt;
    padding: 20px;&lt;br /&gt;
    background: #fafafa;&lt;br /&gt;
    border-radius: 12px;&lt;br /&gt;
    border: 1px solid #e0e0e0;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-scanner h3 {&lt;br /&gt;
    margin-bottom: 10px;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-scanner .scan-btn {&lt;br /&gt;
    padding: 10px 24px;&lt;br /&gt;
    background: #f44336;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    font-size: 15px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-scanner .scan-btn:hover { background: #d32f2f; }&lt;br /&gt;
.deadlink-scanner .scan-btn:disabled { background: #ccc; cursor: not-allowed; }&lt;br /&gt;
.deadlink-progress {&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    height: 6px;&lt;br /&gt;
    background: #e0e0e0;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    margin: 15px 0;&lt;br /&gt;
    overflow: hidden;&lt;br /&gt;
    display: none;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-progress-bar {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
    background: #f44336;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    transition: width 0.3s;&lt;br /&gt;
    width: 0%;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-result {&lt;br /&gt;
    margin-top: 10px;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-item {&lt;br /&gt;
    padding: 6px 0;&lt;br /&gt;
    border-bottom: 1px solid #eee;&lt;br /&gt;
}&lt;br /&gt;
.deadlink-item a { color: #f44336; }&lt;br /&gt;
.deadlink-item .from-page { font-size: 12px; color: #888; }&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;deadlink-scanner&amp;quot; id=&amp;quot;deadlink-scanner&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;h3&amp;gt;🔍 死链全站扫描&amp;lt;/h3&amp;gt;&lt;br /&gt;
    &amp;lt;p style=&amp;quot;color:#888;font-size:13px;&amp;quot;&amp;gt;扫描所有页面的内部链接，找出指向不存在页面的死链。&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;button class=&amp;quot;scan-btn&amp;quot; id=&amp;quot;scan-start&amp;quot;&amp;gt;开始扫描&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;deadlink-progress&amp;quot; id=&amp;quot;scan-progress&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;deadlink-progress-bar&amp;quot; id=&amp;quot;scan-progress-bar&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;deadlink-result&amp;quot; id=&amp;quot;scan-result&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var $startBtn = document.getElementById(&amp;#039;scan-start&amp;#039;);&lt;br /&gt;
    var $progress = document.getElementById(&amp;#039;scan-progress&amp;#039;);&lt;br /&gt;
    var $progressBar = document.getElementById(&amp;#039;scan-progress-bar&amp;#039;);&lt;br /&gt;
    var $result = document.getElementById(&amp;#039;scan-result&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
    var allPages = [];&lt;br /&gt;
    var deadLinks = [];&lt;br /&gt;
    var checkedCount = 0;&lt;br /&gt;
&lt;br /&gt;
    $startBtn.addEventListener(&amp;#039;click&amp;#039;, function() {&lt;br /&gt;
        $startBtn.disabled = true;&lt;br /&gt;
        $startBtn.textContent = &amp;#039;扫描中...&amp;#039;;&lt;br /&gt;
        $progress.style.display = &amp;#039;block&amp;#039;;&lt;br /&gt;
        $progressBar.style.width = &amp;#039;0%&amp;#039;;&lt;br /&gt;
        $result.innerHTML = &amp;#039;&amp;#039;;&lt;br /&gt;
        deadLinks = [];&lt;br /&gt;
        checkedCount = 0;&lt;br /&gt;
&lt;br /&gt;
        // 第一步：获取所有页面&lt;br /&gt;
        fetchAllPages();&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function fetchAllPages(apcontinue) {&lt;br /&gt;
        var url = mw.util.wikiScript(&amp;#039;api&amp;#039;) + &amp;#039;?action=query&amp;amp;list=allpages&amp;amp;aplimit=500&amp;amp;format=json&amp;amp;origin=*&amp;#039;;&lt;br /&gt;
        if (apcontinue) url += &amp;#039;&amp;amp;apcontinue=&amp;#039; + encodeURIComponent(apcontinue);&lt;br /&gt;
&lt;br /&gt;
        fetch(url)&lt;br /&gt;
            .then(function(res) { return res.json(); })&lt;br /&gt;
            .then(function(data) {&lt;br /&gt;
                if (data.query &amp;amp;&amp;amp; data.query.allpages) {&lt;br /&gt;
                    data.query.allpages.forEach(function(page) {&lt;br /&gt;
                        allPages.push(page.title);&lt;br /&gt;
                    });&lt;br /&gt;
                    if (data.continue &amp;amp;&amp;amp; data.continue.apcontinue) {&lt;br /&gt;
                        fetchAllPages(data.continue.apcontinue);&lt;br /&gt;
                    } else {&lt;br /&gt;
                        // 全部页面获取完毕，开始检查死链&lt;br /&gt;
                        checkDeadLinks();&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function checkDeadLinks() {&lt;br /&gt;
        if (allPages.length === 0) {&lt;br /&gt;
            $result.innerHTML = &amp;#039;&amp;lt;p style=&amp;quot;color:#999;&amp;quot;&amp;gt;未找到任何页面。&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
            $startBtn.disabled = false;&lt;br /&gt;
            $startBtn.textContent = &amp;#039;开始扫描&amp;#039;;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 分批检查&lt;br /&gt;
        var batchSize = 10;&lt;br /&gt;
        var batchIndex = 0;&lt;br /&gt;
&lt;br /&gt;
        function processBatch() {&lt;br /&gt;
            var batch = allPages.slice(batchIndex, batchIndex + batchSize);&lt;br /&gt;
            if (batch.length === 0) {&lt;br /&gt;
                // 全部完成&lt;br /&gt;
                showResults();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var promises = batch.map(function(page) {&lt;br /&gt;
                return checkPageLinks(page);&lt;br /&gt;
            });&lt;br /&gt;
&lt;br /&gt;
            Promise.all(promises).then(function() {&lt;br /&gt;
                batchIndex += batchSize;&lt;br /&gt;
                checkedCount += batch.length;&lt;br /&gt;
                var progress = Math.round((checkedCount / allPages.length) * 100);&lt;br /&gt;
                $progressBar.style.width = progress + &amp;#039;%&amp;#039;;&lt;br /&gt;
                $startBtn.textContent = &amp;#039;扫描中... (&amp;#039; + checkedCount + &amp;#039;/&amp;#039; + allPages.length + &amp;#039;)&amp;#039;;&lt;br /&gt;
                setTimeout(processBatch, 200);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        processBatch();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function checkPageLinks(page) {&lt;br /&gt;
        return new Promise(function(resolve) {&lt;br /&gt;
            var url = mw.util.wikiScript(&amp;#039;api&amp;#039;) + &amp;#039;?action=parse&amp;amp;page=&amp;#039; + encodeURIComponent(page) + &amp;#039;&amp;amp;prop=links&amp;amp;format=json&amp;amp;origin=*&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
            fetch(url)&lt;br /&gt;
                .then(function(res) { return res.json(); })&lt;br /&gt;
                .then(function(data) {&lt;br /&gt;
                    if (data.parse &amp;amp;&amp;amp; data.parse.links) {&lt;br /&gt;
                        var links = data.parse.links;&lt;br /&gt;
                        var internalLinks = links.filter(function(l) {&lt;br /&gt;
                            return l.ns === 0 &amp;amp;&amp;amp; !l.title.match(/^文件:|^MediaWiki:|^模板:|^Widget:|^分类:|^Module:|^用户:|^Project:|^Special:|^Media:|^Topic:/);&lt;br /&gt;
                        });&lt;br /&gt;
&lt;br /&gt;
                        if (internalLinks.length === 0) {&lt;br /&gt;
                            resolve();&lt;br /&gt;
                            return;&lt;br /&gt;
                        }&lt;br /&gt;
&lt;br /&gt;
                        // 批量检查这些内部链接是否存在&lt;br /&gt;
                        var titles = internalLinks.map(function(l) { return l.title; }).join(&amp;#039;|&amp;#039;);&lt;br /&gt;
                        var checkUrl = mw.util.wikiScript(&amp;#039;api&amp;#039;) + &amp;#039;?action=query&amp;amp;titles=&amp;#039; + encodeURIComponent(titles) + &amp;#039;&amp;amp;format=json&amp;amp;origin=*&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
                        fetch(checkUrl)&lt;br /&gt;
                            .then(function(res) { return res.json(); })&lt;br /&gt;
                            .then(function(checkData) {&lt;br /&gt;
                                if (checkData.query &amp;amp;&amp;amp; checkData.query.pages) {&lt;br /&gt;
                                    var pages = checkData.query.pages;&lt;br /&gt;
                                    for (var id in pages) {&lt;br /&gt;
                                        if (parseInt(id) &amp;lt; 0) {&lt;br /&gt;
                                            deadLinks.push({&lt;br /&gt;
                                                from: page,&lt;br /&gt;
                                                to: pages[id].title&lt;br /&gt;
                                            });&lt;br /&gt;
                                        }&lt;br /&gt;
                                    }&lt;br /&gt;
                                }&lt;br /&gt;
                                resolve();&lt;br /&gt;
                            })&lt;br /&gt;
                            .catch(function() { resolve(); });&lt;br /&gt;
                    } else {&lt;br /&gt;
                        resolve();&lt;br /&gt;
                    }&lt;br /&gt;
                })&lt;br /&gt;
                .catch(function() { resolve(); });&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showResults() {&lt;br /&gt;
        $startBtn.disabled = false;&lt;br /&gt;
        $startBtn.textContent = &amp;#039;开始扫描&amp;#039;;&lt;br /&gt;
        $progress.style.display = &amp;#039;none&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        if (deadLinks.length === 0) {&lt;br /&gt;
            $result.innerHTML = &amp;#039;&amp;lt;p style=&amp;quot;color:#4CAF50;&amp;quot;&amp;gt;✅ 未发现死链，所有链接正常！&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // 按来源页面分组&lt;br /&gt;
        var grouped = {};&lt;br /&gt;
        deadLinks.forEach(function(item) {&lt;br /&gt;
            if (!grouped[item.from]) grouped[item.from] = [];&lt;br /&gt;
            grouped[item.from].push(item.to);&lt;br /&gt;
        });&lt;br /&gt;
&lt;br /&gt;
        var html = &amp;#039;&amp;lt;p style=&amp;quot;color:#f44336;&amp;quot;&amp;gt;⚠️ 发现 &amp;lt;b&amp;gt;&amp;#039; + deadLinks.length + &amp;#039;&amp;lt;/b&amp;gt; 条死链，分布在 &amp;lt;b&amp;gt;&amp;#039; + Object.keys(grouped).length + &amp;#039;&amp;lt;/b&amp;gt; 个页面：&amp;lt;/p&amp;gt;&amp;#039;;&lt;br /&gt;
        for (var from in grouped) {&lt;br /&gt;
            html += &amp;#039;&amp;lt;div class=&amp;quot;deadlink-item&amp;quot;&amp;gt;&amp;#039;;&lt;br /&gt;
            html += &amp;#039;&amp;lt;b&amp;gt;&amp;lt;a href=&amp;quot;/w/&amp;#039; + encodeURIComponent(from) + &amp;#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&amp;#039; + from + &amp;#039;&amp;lt;/a&amp;gt;&amp;lt;/b&amp;gt;&amp;#039;;&lt;br /&gt;
            html += &amp;#039; 中引用了不存在的：&amp;#039;;&lt;br /&gt;
            grouped[from].forEach(function(to) {&lt;br /&gt;
                html += &amp;#039;&amp;lt;a href=&amp;quot;/w/&amp;#039; + encodeURIComponent(to) + &amp;#039;?action=edit&amp;quot; target=&amp;quot;_blank&amp;quot; style=&amp;quot;margin-right:8px;&amp;quot;&amp;gt;&amp;#039; + to + &amp;#039;&amp;lt;/a&amp;gt;&amp;#039;;&lt;br /&gt;
            });&lt;br /&gt;
            html += &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
        $result.innerHTML = html;&lt;br /&gt;
    }&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
</feed>