我正在尝试使用维基媒体 API 将相应的维基共享资源类别获取到特定的维基百科页面。我认为这是可能的,因为大多数维基百科页面在侧边栏中都包含“在其他项目中”部分,其中有一个重定向到共享类别的链接(例如:https://de.wikipedia.org/wiki/Albert_Einstein )
提前致谢。
您可以通过两次 API 调用来完成此操作,第一次调用德语维基百科即可获取维基数据 Qid:
返回:
{
"batchcomplete": "",
"query": {
"pages": {
"1278360": {
"pageid": 1278360,
"ns": 0,
"title": "Albert Einstein",
"wbentityusage": {
"Q937": {
"aspects": [
"S",
"T",
"C.P227",
"C.P214",
"C.P244"
]
}
}
}
}
}
}
然后您可以使用Wikidata API获取Commons类别的名称:https://www.wikidata.org/w/api.php?action=wbgetclaims&format=json&entity=Q937&property=P373
返回:
{
"claims": {
"P373": [
{
"mainsnak": {
"snaktype": "value",
"property": "P373",
"hash": "be154a8a3dfc826844ceb5a62389857a65ff1e4e",
"datavalue": {
"value": "Albert Einstein",
"type": "string"
},
"datatype": "string"
},
"type": "statement",
"id": "q937$2F332903-133D-4CA0-AD24-8B4292C2BF89",
"rank": "normal"
}
]
}
}
datavalue 中的值是类别的名称。只需在前面加上
https://commons.wikimedia.org/wiki/Category:
即可获得完整的 URL
如果您的类别有多个 API 查询响应限制 500,则需要使用
cmcontinue
递归查询 API(如果您使用 categorymembers
)。
我编写了一个代码,在一个大类别和多个目标类别中进行递归:https://jsfiddle.net/dekz6Lbu/5/使用JS承诺。