非API方式用Python处理YouTube垃圾评论时POST请求遇400错误求助
解决YouTube举报评论POST请求400错误的问题
你的400错误是因为请求缺少必要的参数、请求体和正确的请求头,YouTube的内部youtubei接口对请求格式有严格要求,以下是具体解决步骤:
1. 捕获完整的请求参数(关键步骤)
手动在浏览器完成一次举报操作,打开开发者工具(F12)→ Network标签,筛选XHR请求,找到flag/get_form和flag/flag这两个POST请求,查看它们的:
- Request Headers:复制所有带
X-Youtube-前缀的头、Content-Type、X-CSRFToken等字段。 - Payload(请求体):查看JSON格式的请求内容,里面包含
videoId(视频ID)、commentId(评论ID,即URL里的lc参数)、reasonId(举报原因ID,比如垃圾评论对应特定ID)等核心字段。
2. 补充请求体和请求头
你的代码里只发送了空的POST请求,必须构造符合要求的JSON请求体,并带上正确的请求头。以下是修改后的示例代码:
from seleniumrequests import Chrome from selenium.webdriver.support.ui import WebDriverWait import pathlib import json from selenium import webdriver # 目标视频和评论URL URL = "https://www.youtube.com/watch?v=dvecqwfU6xw&lc=Ugxw_nsUNUor9AUEBGp4AaABAg.9fDfvkgiqtW9fDkE2r6Blm" # 提取视频ID和评论ID video_id = "dvecqwfU6xw" comment_id = "Ugxw_nsUNUor9AUEBGp4AaABAg.9fDfvkgiqtW9fDkE2r6Blm" options = webdriver.ChromeOptions() user = pathlib.Path().home() options.add_argument(f"user-data-dir={user}/AppData/Local/Google/Chrome/User Data/") driver = Chrome('chromedriver.exe', chrome_options=options) driver.get(URL) wait = WebDriverWait(driver, 10) # 获取CSRF Token(从Cookie中提取,名称可能是__Secure-3PAPISID,以实际捕获的为准) csrf_token = None for cookie in driver.get_cookies(): if cookie['name'] == '__Secure-3PAPISID': csrf_token = cookie['value'] break # 构造请求头(值从浏览器实际请求头复制) headers = { 'Content-Type': 'application/json', 'X-Youtube-Client-Name': '1', 'X-Youtube-Client-Version': '2.20240520.01.00', 'X-CSRFToken': csrf_token, 'Origin': 'https://www.youtube.com', 'Referer': URL } # 构造get_form的请求体(从浏览器Payload复制并调整参数) get_form_payload = { "videoId": video_id, "commentId": comment_id, "context": { "client": { "clientName": "WEB", "clientVersion": "2.20240520.01.00" } } } # 先调用get_form获取必要的表单信息 resp = driver.request( 'POST', 'https://www.youtube.com/youtubei/v1/flag/get_form?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false', headers=headers, data=json.dumps(get_form_payload) ) print("get_form响应:", resp.status_code, resp.json()) # 构造flag的请求体(包含举报原因ID,从浏览器捕获的Payload复制) flag_payload = { "videoId": video_id, "commentId": comment_id, "reasonId": "SPAM", # 替换为实际的举报原因ID "context": { "client": { "clientName": "WEB", "clientVersion": "2.20240520.01.00" } } } # 发送举报请求 flag_resp = driver.request( 'POST', 'https://www.youtube.com/youtubei/v1/flag/flag?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8&prettyPrint=false', headers=headers, data=json.dumps(flag_payload) ) print("flag响应:", flag_resp.status_code, flag_resp.json())
3. 注意事项
- YouTube的内部API没有公开文档,参数和格式随时可能变更,必须以你实际捕获的请求信息为准。
- 频繁自动化举报可能触发YouTube的反机制,导致账号封禁,请谨慎操作。
- 这种方式本质是模拟浏览器请求,违反YouTube的服务条款,风险自行承担。
内容的提问来源于stack exchange,提问作者Nakel
相关产品推荐
相关产品推荐

