#sock #wikipedia #wikimedia #search-engine #puppet #web-server #sockpuppet

bin+lib socksfinder

在维基媒体项目上搜索 sock 假人(sock puppet)的搜索引擎

5 个版本 (破坏性更新)

0.7.0 2022年3月6日
0.6.0 2020年12月27日
0.5.0 2020年5月7日
0.4.0 2020年5月7日
0.0.1 2020年5月3日

#1381 in 命令行工具

ISC 许可证

37KB
711

socksfinder logo

socksfinder Toolforge License 构建状态

socksfinder 是维基媒体项目上搜索 sock 假人的搜索引擎。

用法

Usage: socksfinder build <index>
       socksfinder query [--cooccurrences | --threshold=<threshold>] [--order=<order>] <index> <user>...
       socksfinder serve [--hostname=<hostname>] [--port=<port>] <index>
       socksfinder stats <index>
       socksfinder -h | --help
       socksfinder --version

Commands:
    build                    Build an index from a MediaWiki XML dump (read on the standard input).
    query                    Search pages modified by several users in the index.
    serve                    Start a small HTTP server to serve the index.
    stats                    Display statistics about the index.

Arguments:
    index                    Index built from a MediaWiki dump.
    user                     User which has modified pages to look for.

Options:
    --cooccurrences          Show the co-occurrences matrix instead of the page names.
    -h, --help               Show this screen.
    --hostname=<hostname>    Hostname to resolve to find the network interface to serve the index [default: localhost].
    --order=<order>          Order of results, none can be faster and consume less memory [default: none].
                             Valid orders: none, count_decreasing, count_increasing, alphabetical.
    --port=<port>            Port on which to serve the index [default: 8080].
    --threshold=<threshold>  Number of different editors, 0 for all of them [default: 0].
    --version                Show version.

编译

在您的工作副本中运行 cargo build --release

示例

从法国维基百科的最新备份中构建索引

构建索引可能需要相当长的时间,并且会消耗大量内存(取决于备份的大小)。对于法国维基百科,在快速互联网连接下需要大约 45 分钟,并且消耗近 1.5 GiB 的 RAM。

$ curl -s "https://dumps.wikimedia.org/frwiki/latest/frwiki-latest-stub-meta-history.xml.gz" |
     gunzip |
     socksfinder build frwiki-latest.idx

不过,这只需要做一次,生成的索引可以分发给其他没有足够快速互联网连接或足够强大的计算机的用户。对于法国维基百科,索引大小约为 700 MiB,并且可以非常有效地压缩以进行分发(使用 gzip --best 压缩时小于 400 MiB)。

从列表中搜索被编辑器修改的页面

搜索由一个或多个编辑修改的页面通常只需要非常有限的内存(按照现在的标准,至少),大约20或30 MiB的RAM。它通常也相当快,大约每个用户10到50毫秒,取决于您的CPU和唯一修改的页面数量,尽管在搜索修改了数十万独立页面的编辑的页面时可能需要几秒钟(为了获得更快的性能,请参见下面的服务器模式)。

$ socksfinder query frwiki-latest.idx Arkanosis Arktest Arkbot
Projet:Articles sans portail/1: 3 (Arkanosis, Arktest, Arkbot)
Utilisateur:Arktest/test: 3 (Arkanosis, Arktest, Arkbot)

默认情况下,只返回列表中所有用户修改的页面。如果您想要至少某些阈值修改的页面,请使用--threshold选项。

$ socksfinder query --threshold=2 frwiki-latest.idx Arkanosis Arktest Arkbot
Utilisateur:Arkbot/Ébauches dans le top 1000: 2 (Arkanosis, Arkbot)
Modèle:Infobox Equipe MotoGP/Bac à sable: 2 (Arkanosis, Arktest)
Projet:Articles sans portail/1: 3 (Arkanosis, Arktest, Arkbot)
Aholfing: 2 (Arktest, Arkbot)
[141 more lines]

除了修改的页面列表,您还可以获取共现矩阵,即列表中每对编辑修改的页面数量的矩阵。

$ socksfinder query --cooccurrences frwiki-latest.idx Arkanosis Arktest Arkbot
+-----------+-----------+---------+--------+
|           | Arkanosis | Arktest | Arkbot |
+-----------+-----------+---------+--------+
| Arkanosis |           | 106     | 40     |
+-----------+-----------+---------+--------+
| Arktest   | 106       |         | 3      |
+-----------+-----------+---------+--------+
| Arkbot    | 40        | 3       |        |
+-----------+-----------+---------+--------+

服务器模式

基础

socksfinder可以以服务器模式运行,这意味着它运行一个小型HTTP服务器,提供与使用命令行时相同的功能的HTML/纯文本界面。

$ socksfinder serve --hostname=localhost --port=8697 frwiki-latest.idx

然后可以通过在网页浏览器中打开HTML界面(例如,上面的示例中的https://127.0.0.1:8697),或者通过使用HTTP客户端查询它来使用它。

$ curl 'https://127.0.0.1:8697/query?users=Arkanosis,Arktest,Arkbot&coocurrences=true'

优势和劣势

服务器模式相对于命令行使用的优势如下

  • 用户不需要下载程序;
  • 用户不需要构建或下载索引;
  • 没有时间、工具或技术技能的用户也可以使用它;
  • 它甚至更快:根据您的CPU,找到数百万次编辑可能不到一秒钟。

然而,它有以下缺点

  • 它需要更多的内存,大约与索引大小相同(对于法语维基百科,它需要大约800 MiB的RAM)。

零停机时间更新索引

在服务器模式下运行时,可以在没有任何停机时间的情况下重新加载索引。这特别有用,当您已经构建了索引的新版本(例如,在新的存档可用后)并希望切换到它而不停止服务时。

要重新加载索引,向/reload发送HTTP GET请求。

$ curl 'https://127.0.0.1:8697/reload'
Index reloaded

只有当索引已更改时才会重新加载。

$ curl 'https://127.0.0.1:8697/reload'
Index already up-to-date, no need to reload

请注意,为了确保没有停机时间,socksfinder需要将旧索引保留在内存中,直到新索引完全加载并且所有正在运行的查询都得到回答。因此,在重新加载索引时,socksfinder可以使用大约两倍于索引大小的内存。

执行索引更新的推荐方法是有一个指向最新索引的符号链接,并以该符号链接在服务器模式下启动socksfinder。当有新版本的索引可用时,更新符号链接并请求索引重新加载。当磁盘空间不足时,可以删除旧索引。

$ curl 'https://127.0.0.1:8697/version'
Running socksfinder v0.7.0 (frwiki-20220220)
$ ls -al
[…]
-rw-r--r--  1 arkanosis arkanosis 763M 22 févr. 02:42 frwiki-20220220.idx
-rw-r--r--  1 arkanosis arkanosis 771M  2 mars  01:41 frwiki-20220301.idx
lrwxrwxrwx  1 arkanosis arkanosis   19 22 févr. 02:45 frwiki-latest.idx -> frwiki-20220220.idx
$ ln -sf frwiki-20220301.idx frwiki-latest.idx
$ ls -al
[…]
-rw-r--r--  1 arkanosis arkanosis 763M 22 févr. 02:42 frwiki-20220220.idx
-rw-r--r--  1 arkanosis arkanosis 771M  2 mars  01:41 frwiki-20220301.idx
lrwxrwxrwx  1 arkanosis arkanosis   19  2 mars  01:47 frwiki-latest.idx -> frwiki-20220301.idx
$ curl 'https://127.0.0.1:8697/reload'
Index reloaded
$ curl 'https://127.0.0.1:8697/version'
Running socksfinder v0.7.0 (frwiki-20220301)

Toolforge上的实例

socksfinder的一个实例在Toolforge上可用。

贡献和报告错误

通过GitHub pull requests欢迎贡献。

请在GitHub issues上报告错误和功能请求。

许可证

socksfinder版权所有(C) 2020-2022 Jérémie Roquet [email protected],并许可在ISC许可下。

依赖项

~23–36MB
~610K SLoC