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

树莓派Pico用MicroPython调用Google Tasks API遇认证问题求助

解决Google Tasks API认证失败问题(树莓派Pico + MicroPython)

问题根源

  1. URL格式错误:你第一个请求的URL用了&key=,正确的参数分隔符应该是?,因此返回404。
  2. API Key权限不足:Google Tasks API属于用户私有数据接口,仅用API Key无法访问私人任务列表,必须使用OAuth 2.0访问令牌完成身份验证。

分步解决方法

1. 修正URL格式(仅作测试用,实际仍需OAuth)

正确的带API Key的URL写法:

url = f"https://tasks.googleapis.com/tasks/v1/lists/{tasklist}/tasks?key={API_KEY}"

注意:即使URL正确,API Key也只能访问公开任务列表,你的私人列表仍会返回401,因此必须使用OAuth2方案。

2. 正确使用OAuth 2.0访问令牌

步骤1:获取有效访问令牌

你已创建OAuth2客户端凭证,接下来需获取访问令牌和刷新令牌:

  • 通过浏览器访问Google OAuth2授权端点,携带客户端ID、重定向URI、权限范围(https://www.googleapis.com/auth/tasks)完成授权,得到授权码。
  • 用授权码调用令牌端点,交换得到有效期约1小时的访问令牌,以及长期有效的刷新令牌。

步骤2:在请求中添加授权头

将访问令牌放入请求的Authorization头中,示例代码:

from WiFiNetwork import WiFi
import urequests as requests

# 初始化网络连接
network = WiFi()
ip = network.ConnectWiFi()

tasklist = "My_Tasklist_ID"
ACCESS_TOKEN = "你的OAuth2访问令牌"

# 获取任务列表的请求
url = f"https://tasks.googleapis.com/tasks/v1/lists/{tasklist}/tasks"
headers = {"Authorization": f"Bearer {ACCESS_TOKEN}"}

res = requests.get(url, headers=headers)
print(res.status_code)
print(res.text)

# 添加补水提醒任务的请求示例
new_task = {
    "title": "水箱水位过低,需补水",
    "notes": "树莓派Pico监控触发"
}
add_task_url = f"https://tasks.googleapis.com/tasks/v1/lists/{tasklist}/tasks"
add_res = requests.post(add_task_url, json=new_task, headers=headers)
print(add_res.status_code)
print(add_res.text)

3. 简化长期授权(避免频繁手动更新令牌)

由于访问令牌有效期短,适合MicroPython的方案是用刷新令牌自动获取新的访问令牌:

def refresh_access_token(client_id, client_secret, refresh_token):
    token_url = "https://oauth2.googleapis.com/token"
    payload = {
        "client_id": client_id,
        "client_secret": client_secret,
        "refresh_token": refresh_token,
        "grant_type": "refresh_token"
    }
    res = requests.post(token_url, data=payload)
    if res.status_code == 200:
        return res.json()["access_token"]
    else:
        raise Exception(f"刷新令牌失败: {res.text}")

# 使用示例
CLIENT_ID = "你的客户端ID"
CLIENT_SECRET = "你的客户端密钥"
REFRESH_TOKEN = "你的刷新令牌"

# 先刷新获取最新访问令牌
access_token = refresh_access_token(CLIENT_ID, CLIENT_SECRET, REFRESH_TOKEN)
headers = {"Authorization": f"Bearer {access_token}"}

# 后续请求直接使用该headers即可

关键注意事项

  • 确保OAuth2客户端凭证类型为桌面应用(适配树莓派Pico这类无UI设备)。
  • 权限范围需包含https://www.googleapis.com/auth/tasks(读写权限)或https://www.googleapis.com/auth/tasks.readonly(只读权限),按需选择。
  • 确认MicroPython的urequests库支持json参数和headers参数,建议使用最新版本。

内容的提问来源于stack exchange,提问作者edwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:12:32