调用Google Safe Browsing API遇403 Forbidden错误,求解决方案
解决Google Safe Browsing API 403 Forbidden错误
下面是针对该问题的具体排查和修复步骤:
1. 修正请求URL的格式
你代码中传入的example1.com这类地址缺少HTTP/HTTPS协议,而Google Safe Browsing API要求完整的带协议URL。格式不规范会导致API无法正常解析请求,进而触发权限验证失败。
修改main函数中的URL列表:
urls = ['https://example1.com', 'https://example2.com']
2. 固定Client ID,避免频繁生成UUID
每次请求都用uuid.uuid4()生成新的clientId,可能会被Google API判定为异常请求。建议固定一个唯一的客户端标识,比如项目名称或自定义字符串:
def check_urls(urls): payload = { "client": { "clientId": "my-url-safety-checker", # 替换为你的固定标识 "clientVersion": "1.1" }, # 其余payload内容保持不变 }
3. 验证API密钥的权限与配额
即使确认启用了API,仍需检查以下细节:
- 密钥是否归属正确的Google Cloud项目,且该项目已启用Safe Browsing API。
- 检查密钥的IP白名单限制:如果设置了IP允许列表,确保运行代码的设备IP在列表内。
- 检查配额使用情况:Safe Browsing API有免费配额(每日最多10000次请求),配额耗尽也会返回403,可在Google Cloud控制台的API配额页面查看。
4. 优化请求参数传递方式
将API Key通过params参数单独传递,避免URL拼接可能出现的编码问题,同时简化代码:
def check_urls(urls): base_url = 'https://safebrowsing.googleapis.com/v4/threatMatches:find' params = {'key': API_KEY} # 直接用json参数传递payload,requests自动处理序列化和Content-Type头 response = requests.post(base_url, json=payload, params=params)
修复后的完整代码示例
import requests API_KEY = 'your-api-key-here' def check_urls(urls): base_url = 'https://safebrowsing.googleapis.com/v4/threatMatches:find' params = {'key': API_KEY} payload = { "client": { "clientId": "my-url-safety-checker", "clientVersion": "1.1" }, "threatInfo": { "threatTypes": ["MALWARE", "SOCIAL_ENGINEERING", "UNWANTED_SOFTWARE"], "platformTypes": ["ANY_PLATFORM"], "threatEntryTypes": ["URL"], "threatEntries": [{"url": url} for url in urls] } } try: response = requests.post(base_url, json=payload, params=params) response.raise_for_status() data = response.json() return [match["threat"]["url"] for match in data.get("matches", [])] except requests.exceptions.RequestException as e: print("Error:", e) return [] def main(): urls = ['https://example1.com', 'https://example2.com'] malicious_urls = check_urls(urls) if malicious_urls: print("Malicious URLs found:") for url in malicious_urls: print(url) else: print("No malicious URLs found.") if __name__ == "__main__": main()
额外排查点
如果以上步骤无效,可尝试:
- 用Postman直接发送请求测试API密钥有效性,排除代码逻辑问题。
- 确认Google Cloud账号未被限制访问该API。
内容的提问来源于stack exchange,提问作者nolan
相关产品推荐
相关产品推荐

