不包括单个用户的维基百科站点摘要提要

Site summary feed of Wikipedia excluding a single user

维基百科主页上有一个“最近更改”提要。

同样可以作为 ATOM 提要使用。也可以通过转到 user_account 并选择提要来观看单个用户。 但是除了一个(或两个)用户之外,有什么方法可以访问提要吗?


更新:使用 xmllint 我可以提取作者姓名。

wget https://hunspell.s3.amazonaws.com/temp/out.txt

xmllint --xpath "//*[name() = 'feed']/*[name() = 'entry']/*[name() = 'author']/*[name() = 'name']" out.txt

但我想从该 Feed 中排除一两个作者。例如,Clarityfiend 和 Shortride。


更新:

当我尝试 xpath 命令时,它在一个参数(英文)下运行良好。但它因 Unicode 参数而失败:

wget https://hunspell.s3.amazonaws.com/todel/out.txt

工作:

xpath -e "/feed/entry[author/name!='Aditya tamhankar' and author/name!='Sushant Madhale']" out.txt > a.txt

无效:

xpath -e "/feed/entry[author/name!='Aditya tamhankar' and author/name!='संतोष गोरे']"  out.txt > filtered.txt

第二作者的条目仍然存在于过滤后的输出中。

grep 'संतोष गोरे' filtered.txt

第二个命令可以使用 Unicode,但它没有正确显示一条记录...

# (t1='Aditya tamhankar' ; t2='संतोष गोरे'; echo 'setns x=http://www.w3.org/2005/Atom'; echo "cat /x:feed/x:entry[not(x:author/x:name[.='$t1'] | x:author/x:name[.='$t2'])]/descendant::*[self::x:updated or self::x:title or descendant-or-self::x:name]/text()") | xmllint --shell out.txt  | tail -n +4 | gawk '{ if(NR % 6 == 0){ print [=15=] "¬"} else { print [=15=] }}' |gawk 'BEGIN{FS="\n -------\n" ; RS="\n -------¬\n"; OFS="||"} { print ,, }END{ print FNR}'

除了这条以外的所有记录都是正确的:

152.238.27.63
/ >
||2021-07-15T20:14:03Z||
19

您可以安装 AbuseFilter and define a rule that will tag 所有人所做的编辑,但一两个用户除外(在过滤器中使用变量 user_name

然后您可以使用该标签过滤最近的更改。 Atom 提要的 URL 最近更改标记,例如“Android app edit”,将如下所示:https://en.wikipedia.org/w/api.php?tagfilter=android+app+edit&urlversion=1&action=feedrecentchanges&feedformat=atom.

当然,如果您的意思不是 Wikipedia 而是您控制的 wiki,这当然成立。

您可以提供所有最近的更改(例如 https://en.wikipedia.org/w/api.php?urlversion=1&action=feedrecentchanges&feedformat=atom) and filter them with an XPath like /feed/entry[author/name[text()!='Linason Blessing']] to exclude changes by Linason Blessing. See the saved XPath

我建议您从终端使用 xpath 工具(Ubuntu 软件包 libxml-xpath-perl)。它支持 XPath 2:

wget -O - https://hunspell.s3.amazonaws.com/temp/out.txt | xpath -e "/feed/entry[author/name!='Clarityfiend' and author/name!='Shortride']" > filtered.txt

UPD:如果输入缓冲区出现内存不足错误,请将提要下载到文件而不是标准输出中:

wget https://hunspell.s3.amazonaws.com/temp/out.txt
xpath -e "/feed/entry[author/name!='Clarityfiend' and author/name!='Shortride']" out.txt > filtered.txt

XPath 查询将列出作者姓名不等于 ClarityfiendShortride 的所有条目。条目将保存在 filtered.txt.

这个使用 xmllint 的 Bash 单行代码将按 author/name 过滤,其中包含 t1t2 变量中定义的 2 个字符串,并输出 update||title||author

(t1='संतोष गोरे' ; t2='ñandú'; echo 'setns x=http://www.w3.org/2005/Atom'; echo "cat /x:feed/x:entry[not(x:author/x:name[contains(text(),'$t1')] | x:author/x:name[contains(text(),'$t2')])]/descendant::*[self::x:updated or self::x:title or descendant-or-self::x:name]/text()") | xmllint --shell wiki.xml  | tail -n +3 | gawk '!/ -------/ { if(NR % 3 == 0){ [=10=]=[=10=] "\n"}else{[=10=]=[=10=]} { print }}' | gawk 'BEGIN{FS="\n";RS="\n\n"; OFS="||"} { print ,, }END{ print FNR}'

过滤表达式类型:x:author/x:name[not(contains(text(),'$t1'))]

结果:

2021-07-15T22:34:54Z||Fabiano Leismann||Simione001
2021-07-15T22:34:53Z||Arnold Henry Mason||4meter4
2021-07-15T22:34:53Z||User talk:MrOllie||152.168.57.106
...
...

这将执行相同的操作,但在 author

上进行完全匹配
(t1='संतोष गोरे' ; t2='ñandú'; echo 'setns x=http://www.w3.org/2005/Atom'; echo "cat /x:feed/x:entry[not(x:author/x:name[.='$t1'] | x:author/x:name[.='$t2'])]/descendant::*[self::x:updated or self::x:title or descendant-or-self::x:name]/text()") | xmllint --shell wiki.xml  | tail -n +3 | gawk '!/ -------/ { if(NR % 3 == 0){ [=12=]=[=12=] "\n"}else{[=12=]=[=12=]} { print }}' | gawk 'BEGIN{FS="\n"; RS="\n\n"; OFS="||"} { print ,, }END{ print FNR}'

过滤表达式类型:x:author/x:name[not(.='$t1')]

仅过滤一位作者:

(t1='संतोष गोरे'; echo 'setns x=http://www.w3.org/2005/Atom'; echo "cat /x:feed/x:entry[not(x:author/x:name[.='$t1'])]/descendant::*[self::x:updated or self::x:title or descendant-or-self::x:name]/text()") | xmllint --shell wiki.xml  | tail -n +3 | gawk '!/ -------/ { if(NR % 3 == 0){ [=13=]=[=13=] "\n"}else{[=13=]=[=13=]} { print }}' | gawk 'BEGIN{FS="\n"; RS="\n\n"; OFS="||"} { print ,, }END{ print FNR}'

或者生成一个UUID并分配给t2 ;-)