如何使用CURL结合OAuth或API密钥认证Google Search Console API并获取网站月度数据
我之前也踩过这个坑!Search Console API的searchAnalytics.query接口根本不支持用API密钥认证——这是很多新手容易误解的点。API密钥只适用于那些不需要访问用户私有数据的公开API,而这个接口要读取你自己站点的搜索数据,必须用OAuth 2.0来做身份验证。下面我一步步给你讲怎么用curl搞定整个流程:
首先得明确:Google Search Console的searchAnalytics.query属于需要用户授权的私有数据接口,API密钥仅能用于无需用户权限的公开服务(比如部分Google Maps接口)。所以你用API密钥请求必然会收到Request is missing required authentication credential错误,这是接口的设计限制,不是操作问题。
假设你已经在Google Cloud控制台有了项目,并且启用了Search Console API,接下来按下面的步骤操作:
1. 创建OAuth客户端ID
- 打开Google Cloud控制台的「API和服务」→「凭据」页面
- 点击「创建凭据」→「OAuth客户端ID」
- 应用类型选择桌面应用(因为是用curl这类本地工具调用),随便填个名称(比如“CURL-Search-Console”),然后点击创建
- 保存生成的客户端ID和客户端密钥,后面会频繁用到
2. 获取授权码
首先构造授权URL,把你的客户端ID填进去:
https://accounts.google.com/o/oauth2/v2/auth?client_id=YOUR_CLIENT_ID&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=https://www.googleapis.com/auth/webmasters.readonly
- 替换
YOUR_CLIENT_ID为你刚生成的客户端ID - 复制这个URL到浏览器打开,用你验证过域名的Google账号登录,授权这个应用访问你的Search Console数据
- 授权成功后,页面会显示一个授权码,复制它(注意这个码只能用一次)
3. 换取访问令牌和刷新令牌
用curl发送POST请求,把授权码换成可用于调用接口的令牌(访问令牌有效期仅1小时,刷新令牌可以长期用来换新的访问令牌):
curl -X POST "https://oauth2.googleapis.com/token" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" \ -d "code=YOUR_AUTHORIZATION_CODE" \ -d "grant_type=authorization_code" \ -d "redirect_uri=urn:ietf:wg:oauth:2.0:oob"
替换里面的YOUR_CLIENT_ID、YOUR_CLIENT_SECRET、YOUR_AUTHORIZATION_CODE为对应的值。
请求成功后,你会得到类似这样的JSON响应:
{ "access_token": "ya29.a0AfH6SM...", "expires_in": 3599, "refresh_token": "1//0g...", "scope": "https://www.googleapis.com/auth/webmasters.readonly", "token_type": "Bearer" }
务必保存好access_token和refresh_token,尤其是refresh_token,以后可以用它直接换新的访问令牌,不用再走授权流程。
4. 用访问令牌调用Search Analytics接口
现在用curl发送POST请求,带上访问令牌来获取你需要的页面和关键词数据:
curl -X POST "https://www.googleapis.com/webmasters/v3/sites/https%3A%2F%2Fwww.example.com%2F/searchAnalytics/query" \ -H "Authorization: Bearer YOUR_ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d '{ "startDate": "2021-04-01", "endDate": "2021-04-30", "dimensions": ["PAGE","QUERY"] }'
- 替换
YOUR_ACCESS_TOKEN为你刚拿到的访问令牌 - 替换
https%3A%2F%2Fwww.example.com%2F为你自己的站点URL(要和Search Console里的站点地址完全一致,必须是URL编码后的格式)
5. 用刷新令牌获取新的访问令牌(当旧令牌过期时)
访问令牌1小时后就会失效,不用重新走授权流程,直接用刷新令牌换:
curl -X POST "https://oauth2.googleapis.com/token" \ -d "client_id=YOUR_CLIENT_ID" \ -d "client_secret=YOUR_CLIENT_SECRET" \ -d "refresh_token=YOUR_REFRESH_TOKEN" \ -d "grant_type=refresh_token"
替换对应的值,就能得到新的access_token,继续用来调用接口。
- 确保你的Google账号已经验证了目标站点,并且在Search Console里正式添加了该站点
- 权限范围用
webmasters.readonly就足够了,不需要写权限,更安全 - 刷新令牌只要不主动在Google账号的「第三方应用权限」里撤销授权,就可以长期使用,所以要妥善保存,不要泄露
内容的提问来源于stack exchange,提问作者user2470281




