<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://wiki.2b2t.xin/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-OneClickPatrol.js</id>
	<title>MediaWiki:Gadget-OneClickPatrol.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.2b2t.xin/w/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-OneClickPatrol.js"/>
	<link rel="alternate" type="text/html" href="https://wiki.2b2t.xin/w/index.php?title=MediaWiki:Gadget-OneClickPatrol.js&amp;action=history"/>
	<updated>2026-11-07T01:51:39Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://wiki.2b2t.xin/w/index.php?title=MediaWiki:Gadget-OneClickPatrol.js&amp;diff=55&amp;oldid=prev</id>
		<title>Admin：​已保护“MediaWiki:Gadget-OneClickPatrol.js”​（[编辑=仅允许管理员]（无限期）​[移动=仅允许管理员]（无限期））</title>
		<link rel="alternate" type="text/html" href="https://wiki.2b2t.xin/w/index.php?title=MediaWiki:Gadget-OneClickPatrol.js&amp;diff=55&amp;oldid=prev"/>
		<updated>2026-09-15T14:48:44Z</updated>

		<summary type="html">&lt;p&gt;已保护“&lt;a href=&quot;/w/MediaWiki:Gadget-OneClickPatrol.js&quot; title=&quot;MediaWiki:Gadget-OneClickPatrol.js&quot;&gt;MediaWiki:Gadget-OneClickPatrol.js&lt;/a&gt;”​（[编辑=仅允许管理员]（无限期）​[移动=仅允许管理员]（无限期））&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;zh&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;←上一版本&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;2026年9月15日 (二) 22:48的版本&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key wiki:diff::1.12:old-53:rev-55 --&gt;
&lt;/table&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
	<entry>
		<id>https://wiki.2b2t.xin/w/index.php?title=MediaWiki:Gadget-OneClickPatrol.js&amp;diff=53&amp;oldid=prev</id>
		<title>Admin：​一键巡查脚本</title>
		<link rel="alternate" type="text/html" href="https://wiki.2b2t.xin/w/index.php?title=MediaWiki:Gadget-OneClickPatrol.js&amp;diff=53&amp;oldid=prev"/>
		<updated>2026-09-15T14:07:37Z</updated>

		<summary type="html">&lt;p&gt;一键巡查脚本&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* OneClickPatrol — 最近更改 / 监视列表一键巡查 (MediaWiki 1.39)&lt;br /&gt;
 * 仅对拥有 patrol 权限的用户（sysop / patroller）生效。&lt;br /&gt;
 * 作用：在每条「未巡查」变更右侧加一个「✓ 巡查」按钮，&lt;br /&gt;
 *      覆盖核心本不显示按钮的日志/上传类条目；&lt;br /&gt;
 *      页面顶部另提供「✓ 巡查本页全部未巡查」一键处理整页。&lt;br /&gt;
 */&lt;br /&gt;
(function () {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    var page = mw.config.get(&amp;#039;wgCanonicalSpecialPageName&amp;#039;);&lt;br /&gt;
    if (page !== &amp;#039;Recentchanges&amp;#039; &amp;amp;&amp;amp; page !== &amp;#039;Watchlist&amp;#039;) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    mw.loader.using([&amp;#039;mediawiki.api&amp;#039;, &amp;#039;mediawiki.util&amp;#039;]).done(function () {&lt;br /&gt;
        var api = new mw.Api();&lt;br /&gt;
&lt;br /&gt;
        mw.util.addCSS(&lt;br /&gt;
            &amp;#039;.mw-ocp-btn{margin-left:6px;padding:0 6px;border:1px solid #a2a9b1;&amp;#039; +&lt;br /&gt;
            &amp;#039;background:#f8f9fa;color:#202122;border-radius:2px;cursor:pointer;font-size:11px;}&amp;#039; +&lt;br /&gt;
            &amp;#039;.mw-ocp-btn:hover{background:#eaecf0;}&amp;#039; +&lt;br /&gt;
            &amp;#039;.mw-ocp-btn:disabled{opacity:.6;cursor:default;}&amp;#039; +&lt;br /&gt;
            &amp;#039;.mw-ocp-all{margin:6px 0;padding:3px 10px;border:1px solid #14866d;&amp;#039; +&lt;br /&gt;
            &amp;#039;background:#eaf3ff;color:#14866d;border-radius:2px;cursor:pointer;}&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
        // 从一行的标题链接 + 用户链接构造与 API 一致的 key&lt;br /&gt;
        function rowKey($li) {&lt;br /&gt;
            var $title = $li.find(&amp;#039;.mw-changeslist-title&amp;#039;).first();&lt;br /&gt;
            var title = &amp;#039;&amp;#039;;&lt;br /&gt;
            if ($title.length) {&lt;br /&gt;
                var href = $title.attr(&amp;#039;href&amp;#039;) || &amp;#039;&amp;#039;;&lt;br /&gt;
                var m = href.match(/[?&amp;amp;]title=([^&amp;amp;]+)/) || href.match(/\/([^?]+)$/);&lt;br /&gt;
                if (m) { title = decodeURIComponent(m[1].replace(/\+/g, &amp;#039; &amp;#039;)); }&lt;br /&gt;
            }&lt;br /&gt;
            var $user = $li.find(&amp;#039;.mw-userlink&amp;#039;).first();&lt;br /&gt;
            var user = &amp;#039;&amp;#039;;&lt;br /&gt;
            if ($user.length) {&lt;br /&gt;
                var uh = $user.attr(&amp;#039;href&amp;#039;) || &amp;#039;&amp;#039;;&lt;br /&gt;
                var um = uh.match(/User:([^?&amp;amp;]+)/);&lt;br /&gt;
                if (um) { user = decodeURIComponent(um[1].replace(/_/g, &amp;#039; &amp;#039;)); }&lt;br /&gt;
            }&lt;br /&gt;
            return title + &amp;#039;|&amp;#039; + user;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function patrol(rcid, $btn, $li) {&lt;br /&gt;
            $btn.prop(&amp;#039;disabled&amp;#039;, true).text(&amp;#039;巡查中…&amp;#039;);&lt;br /&gt;
            api.postWithToken(&amp;#039;patrol&amp;#039;, {&lt;br /&gt;
                action: &amp;#039;patrol&amp;#039;,&lt;br /&gt;
                rcid: String(rcid),&lt;br /&gt;
                formatversion: 2&lt;br /&gt;
            }).done(function () {&lt;br /&gt;
                $li.removeClass(&amp;#039;unpatrolled&amp;#039;).addClass(&amp;#039;mw-patrolled-ok&amp;#039;);&lt;br /&gt;
                $btn.text(&amp;#039;✓ 已巡查&amp;#039;).css({ color: &amp;#039;#14866d&amp;#039;, borderColor: &amp;#039;#14866d&amp;#039; });&lt;br /&gt;
            }).fail(function (code, data) {&lt;br /&gt;
                var msg = (data &amp;amp;&amp;amp; data.error &amp;amp;&amp;amp; data.error.info) ? data.error.info : (code || &amp;#039;失败&amp;#039;);&lt;br /&gt;
                $btn.prop(&amp;#039;disabled&amp;#039;, false).text(&amp;#039;✗ 失败&amp;#039;).attr(&amp;#039;title&amp;#039;, msg);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function addButtons(map) {&lt;br /&gt;
            $(&amp;#039;#mw-content-text .mw-changeslist&amp;#039;).find(&amp;#039;li&amp;#039;).each(function () {&lt;br /&gt;
                var $li = $(this);&lt;br /&gt;
                if ($li.data(&amp;#039;ocp-done&amp;#039;)) { return; }&lt;br /&gt;
                var key = rowKey($li);&lt;br /&gt;
                var rcid = null;&lt;br /&gt;
                // 1) 核心已渲染的巡逻链接（他人普通编辑/新建）&lt;br /&gt;
                var $patrol = $li.find(&amp;#039;a[href*=&amp;quot;action=patrol&amp;quot;]&amp;#039;).first();&lt;br /&gt;
                if ($patrol.length) {&lt;br /&gt;
                    var pm = $patrol.attr(&amp;#039;href&amp;#039;).match(/rcid=(\d+)/);&lt;br /&gt;
                    if (pm) { rcid = pm[1]; }&lt;br /&gt;
                }&lt;br /&gt;
                // 2) 通过 API 未巡查列表匹配（覆盖日志/上传等核心不给按钮的条目）&lt;br /&gt;
                if (!rcid &amp;amp;&amp;amp; map[key]) { rcid = map[key]; }&lt;br /&gt;
                if (!rcid) { return; }&lt;br /&gt;
                $li.data(&amp;#039;ocp-done&amp;#039;, true);&lt;br /&gt;
&lt;br /&gt;
                var $btn = $(&amp;#039;&amp;lt;button&amp;gt;&amp;#039;)&lt;br /&gt;
                    .addClass(&amp;#039;mw-ocp-btn&amp;#039;)&lt;br /&gt;
                    .attr(&amp;#039;type&amp;#039;, &amp;#039;button&amp;#039;)&lt;br /&gt;
                    .text(&amp;#039;✓ 巡查&amp;#039;)&lt;br /&gt;
                    .on(&amp;#039;click&amp;#039;, function (e) {&lt;br /&gt;
                        e.preventDefault();&lt;br /&gt;
                        patrol(rcid, $btn, $li);&lt;br /&gt;
                        return false;&lt;br /&gt;
                    });&lt;br /&gt;
&lt;br /&gt;
                var $box = $li.find(&amp;#039;.mw-changeslist-buttons, .mw-changeslist-links&amp;#039;).first();&lt;br /&gt;
                if ($box.length) {&lt;br /&gt;
                    $box.append($(&amp;#039;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;&amp;#039;).append($btn));&lt;br /&gt;
                } else {&lt;br /&gt;
                    $li.append($(&amp;#039;&amp;lt;span&amp;gt; &amp;lt;/span&amp;gt;&amp;#039;).append($btn));&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        function buildMap() {&lt;br /&gt;
            return api.get({&lt;br /&gt;
                action: &amp;#039;query&amp;#039;,&lt;br /&gt;
                list: &amp;#039;recentchanges&amp;#039;,&lt;br /&gt;
                rcprop: &amp;#039;ids|title|user&amp;#039;,&lt;br /&gt;
                rcshow: &amp;#039;!patrolled&amp;#039;,&lt;br /&gt;
                rclimit: 100,&lt;br /&gt;
                formatversion: 2&lt;br /&gt;
            }).then(function (data) {&lt;br /&gt;
                var map = {};&lt;br /&gt;
                var list = (data &amp;amp;&amp;amp; data.query &amp;amp;&amp;amp; data.query.recentchanges) || [];&lt;br /&gt;
                list.forEach(function (rc) {&lt;br /&gt;
                    map[rc.title + &amp;#039;|&amp;#039; + rc.user] = rc.rcid;&lt;br /&gt;
                });&lt;br /&gt;
                return map;&lt;br /&gt;
            }, function () { return {}; });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $(function () {&lt;br /&gt;
            buildMap().then(function (map) {&lt;br /&gt;
                addButtons(map);&lt;br /&gt;
                mw.hook(&amp;#039;wikipage.content&amp;#039;).add(function () { addButtons(map); });&lt;br /&gt;
&lt;br /&gt;
                var $all = $(&amp;#039;&amp;lt;button&amp;gt;&amp;#039;)&lt;br /&gt;
                    .addClass(&amp;#039;mw-ocp-all&amp;#039;)&lt;br /&gt;
                    .attr(&amp;#039;type&amp;#039;, &amp;#039;button&amp;#039;)&lt;br /&gt;
                    .text(&amp;#039;✓ 巡查本页全部未巡查&amp;#039;)&lt;br /&gt;
                    .on(&amp;#039;click&amp;#039;, function () {&lt;br /&gt;
                        $(&amp;#039;#mw-content-text .mw-changeslist&amp;#039;).find(&amp;#039;button.mw-ocp-btn&amp;#039;).each(function () {&lt;br /&gt;
                            var $b = $(this);&lt;br /&gt;
                            if ($b.text() === &amp;#039;✓ 巡查&amp;#039;) { $b.click(); }&lt;br /&gt;
                        });&lt;br /&gt;
                    });&lt;br /&gt;
                $(&amp;#039;#firstHeading&amp;#039;).after($all);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>Admin</name></author>
	</entry>
</feed>