【问题标题】:Getting an error when trying to delete YouTube video comments using Python尝试使用 Python 删除 YouTube 视频评论时出错
【发布时间】:2020-11-03 13:18:02
【问题描述】:

尝试使用 Python 删除 YouTube cmets 时出现以下错误。我可以检索和设置 cmets 的审核状态,但不能删除 cmets。想不通。

def deleteComments(service):
    request = service.comments().delete(id="Ugzl8ec3rKxt6ClZlSR4AaABAg, 2CUswqQvx9q8MllybCuBF4AaABAg")
    request.execute()

错误信息:

googleapiclient.errors.HttpError: <HttpError 400 when requesting https://www.googleapis.com/youtube/v3/comments?id=Ugzl8ec3rKxt6ClZlSR4AaABAg%2CUswqQvx9q8MllybCuBF4AaABAg returned "The API server failed to successfully process the request. While this can be a transient error, it usually indicates that the request's input is invalid.">

更新: 以下代码示例批准了一条评论,但在尝试删除另一条评论时生成了一条错误消息。正如@stvar 所建议的,我添加了一个异常来处理错误并在短暂延迟后重试该命令无济于事。不知道还能做什么。

代码示例:

request = service.comments().setModerationStatus(
    id="UgyVOfo6iFZPZ-lye9V4AaABAg",
    moderationStatus=status
)
request.execute()    
print("Approved comment "+"UgyVOfo6iFZPZ-lye9V4AaABAg")

i = 4
while True:
    try:
        request = service.comments().delete(
            id="UgyVOfo6iFZPZ-lye9V4AaABAg"
        )
        request.execute()
        print("Deleted comment "+"UgyVOfo6iFZPZ-lye9V4AaABAg")
        break
    except:
        if (i>8):
            break
        time.sleep(i) 
        i=i+2
        print("retry after 2 seconds")

输出:

Approved comment Ugys7LJAAAqXjruiM0h4AaABAg
retry after 2 seconds
retry after 2 seconds
retry after 2 seconds

【问题讨论】:

  • 尝试了以下方法:

标签: python youtube-api youtube-data-api


【解决方案1】:

我尝试使用 curl,但由于获取访问令牌的问题而没有成功。我最终只是将评论的审核状态设置为拒绝。不幸的是,使用 Python 删除 cmets 对我不起作用。 YouTube 端可能出了点问题。谢谢。

【讨论】:

  • 请注意,您只能删除您自己编写的 cmets;那就是你不能删除其他人的cmets。
  • 对于curl 的问题,只需发出如下命令:curl -X DELETE -H 'Authorization: Bearer access_token' 'https://www.googleapis.com/youtube/v3/comments?id=Ugzl8ec3rKxt6ClZlSR4AaABAg',其中access_token 是有效(即未过期)access token
  • API 也接受访问令牌作为 URI 参数:curl -X DELETE "https://www.googleapis.com/youtube/v3/comments?id=Ugzl8ec3rKxt6ClZlSR4AaABAg&amp;access_token=$ACCESS_TOKEN"
  • 这里是detailed doc,展示了如何从 API 获取新的访问令牌; curl 调用看起来像:curl -o access_token.json "https://oauth2.googleapis.com/token?client_id=$CLIENT_ID&amp;client_secret=$CLIENT_SECRET&amp;refresh_token=$REFRESH_TOKEN&amp;grant_type=refresh_token"
  • @stvar 非常感谢。我查看了文档,但没有提到只能使用 delete 方法删除我的 cmets。我想删除等待审核的 cmets。我可以使用 GUI 来做到这一点,所以我应该能够使用 API 来做到这一点。此外,错误消息将无效输入作为错误的可能原因进行讨论。无论如何,如果我不能删除我频道上其他用户制作的 cmets,至少我可以拒绝 cmets,这意味着被拒绝的 cmets 不会出现在待审核列表中。
【解决方案2】:

可能是你的评论ID

Ugzl8ec3rKxt6ClZlSR4AaABAg, 2CUswqQvx9q8MllybCuBF4AaABAg

由于某种原因无效?我最近看到的 ID 格式如下:

^U[a-zA-Z0-9_-]{25}(?:\.[a-zA-Z0-9_-]{22})?$

如果您尝试一次性删除多个 cmets,请注意,根据 the docs,参数 id 不支持逗号分隔的 ID 列表,就像其他一些 API 端点那样:

id(字符串)
id 参数指定要删除的资源的评论 ID。

在这种情况下,您必须为需要删除的每个 cmets 分别调用 Comments.delete 端点。


另请注意,您传递给 API 的 ID(我在上面引用的那个)与您显示的错误消息中嵌入的 ID 不同:

Ugzl8ec3rKxt6ClZlSR4AaABAg,UswqQvx9q8MllybCuBF4AaABAg

这可能表明您的错误的罪魁祸首不是 API!


请注意,您只能删除自己编写的 cmets;那就是你不能删除其他人的cmets。

确实,API 的这种行为并没有正式记录。但 Google 的工作人员在Dec 6, 2016 00:24 UTC 上提到按预期工作。最近的一次提及来自Jun 15, 2019 22:33 UTC

【讨论】:

  • 谢谢。在发布之前,我尝试通过指定一个 id 来删除一条评论,但奇怪的是,我收到了相同的错误消息。
  • 这是我在尝试删除一条评论时得到的结果: googleapiclient.errors.HttpError: googleapis.com/youtube/v3/comments?id= Ugzl8ec3rKxt6ClZlSR4AaABAg 返回“API 服务器未能成功处理请求。虽然这可以是暂时性错误,通常表示请求的输入无效。">
  • 如果 API 报告暂时性错误,您应该使用指数回退算法重试多次删除相同的评论。比如:尝试删除,如果暂时错误则休眠4 secs,尝试删除,如果暂时错误则休眠16 secs(即4^2 secs),等等。
  • 为了完整起见,here 是描述可能遇到的Comments.delete 错误的官方文档。在您的上述情况下,这是一种processingFailure 的错误。
猜你喜欢
  • 2014-01-21
  • 2013-08-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多