使用Wikidata REST接口与PowerShell提交数据无变更问题排查
问题:Wikidata REST接口调用无报错但未生效
尝试通过Wikidata的REST接口和PowerShell向条目Q13835647添加属性「集数(P1113)」,值设为10。代码执行后表面无报错,但Wikidata中的对应记录未变更,贡献日志里也找不到相关编辑记录。
原代码
$AppToken = 'tokengoeshere' $headers = @{ "accept" = "application/json" Authorization = "Bearer $AppToken" #"If-Match" = "`"1276705620`"" #"If-Unmodified-Since" = "Sat, 06 Jun 2020 16:38:47 GMT" #"If-None-Match" = "`"1276705620`"" } $response = Invoke-WebRequest -Uri "https://wikidata.org/w/rest.php/wikibase/v0/entities/items/Q13835647/statements" ` -Method Post ` -Headers $headers ` -ContentType "application/json" ` -Body "{`n `"statement`": {`n `"rank`": `"normal`",`n `"property`": {`n `"id`": `"P1113`"`n },`n `"value`": {`n `"content`": `"10`",`n `"type`": `"value`"`n },`n `"qualifiers`": [],`n `"references`": []`n },`n `"tags`": [`n `"mobile edit`",`n `"external tool edit"`n ],`n `"bot`": true,`n `"comment`": `"API edit adding the mumber of episodes based on its RSS feed"`n}"
排查与修复要点
- 令牌权限与有效性:确认
$AppToken是有效的OAuth2令牌,且拥有Wikidata编辑权限。如果令牌过期、权限不足,接口可能返回成功状态但实际不执行编辑,或者悄悄返回错误但未被捕获。 - 值类型错误:P1113是整数类型属性,原代码中
"content": "10"是字符串格式,不符合Wikidata的数据要求,必须改为数值类型的10。 - 未检查响应细节:
Invoke-WebRequest默认不会对非2xx状态码抛出错误,哪怕接口返回400(参数错误)、403(无权限)等问题,你可能误以为执行成功。建议添加-ErrorAction Stop,或者打印$response.Content查看接口实际返回内容。 - 缺失If-Match头部:Wikidata编辑需要该头部做冲突检测,确保编辑的是条目的最新版本。需先通过GET请求获取条目的最新ETag,再将其填入If-Match头部。
- 拼写小问题:请求体中的
mumber of episodes拼写错误(应为number),虽不影响功能,但建议修正。
修正后的代码示例
# 1. 先获取条目的最新ETag $getHeaders = @{ "accept" = "application/json" Authorization = "Bearer $AppToken" } $itemResponse = Invoke-WebRequest -Uri "https://wikidata.org/w/rest.php/wikibase/v0/entities/items/Q13835647" -Headers $getHeaders -ErrorAction Stop $etag = $itemResponse.Headers["ETag"] # 2. 构造正确的请求体 $headers = @{ "accept" = "application/json" Authorization = "Bearer $AppToken" "If-Match" = $etag } $body = @{ statement = @{ rank = "normal" property = @{ id = "P1113" } value = @{ content = 10 # 改为整数类型 type = "value" } qualifiers = @() references = @() } tags = @("mobile edit", "external tool edit") bot = $true comment = "API edit adding the number of episodes based on its RSS feed" } | ConvertTo-Json -Depth 3 # 3. 发送请求并检查响应 try { $response = Invoke-WebRequest -Uri "https://wikidata.org/w/rest.php/wikibase/v0/entities/items/Q13835647/statements" ` -Method Post ` -Headers $headers ` -ContentType "application/json" ` -Body $body ` -ErrorAction Stop Write-Host "编辑成功,响应内容:" $response.Content } catch { Write-Host "请求失败,状态码:" $_.Exception.Response.StatusCode.value__ Write-Host "错误详情:" $_.ErrorDetails.Message }
内容的提问来源于stack exchange,提问作者back_ache
相关产品推荐
相关产品推荐

