You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 08:29:55