ios11如何开启定位服务
2026-08-22
2026-08-23 0
Google Slides 技能通过托管 OAuth 网关提供了一个与 Google Slides API 交互的强大接口。这允许开发人员和 AI 智能体以编程方式处理演示文稿任务,而无需手动管理复杂的身份验证流程。通过在 Openclaw Skills 中利用此集成,您可以轻松生成动态幻灯片组、更新现有幻灯片并操作页面元素。
该技能充当原生 Google Slides 服务的代理,自动注入必要的授权令牌。它专为高可靠性自动化而设计,支持从简单的标题更改到涉及形状、图像和文本格式的复杂批量更新的所有功能。对于任何构建自动化报告或演示密集型工作流的开发人员来说,这都是一个必不可少的工具。
下载入口:https://github.com/openclaw/skills/tree/main/skills/byungkyu/google-slides
从源直接安装技能的最快方式。
npx clawhub@latest install google-slides
将技能文件夹复制到以下位置之一
全局模式~/.openclaw/skills/
工作区
/skills/
优先级:工作区 > 本地 > 内置
将此提示词复制到 OpenClaw 即可自动安装。
请帮我使用 Clawhub 安装 google-slides。如果尚未安装 Clawhub,请先安装(npm i -g clawhub)。
要开始使用此技能,请确保您已从 Maton 控制面板获取 API 密钥,并按照以下步骤操作:
# 1. 设置环境变量
export MATON_API_KEY="YOUR_API_KEY"
# 2. 创建新的 Google Slides 连接
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-slides'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
在浏览器中打开 JSON 响应中提供的 URL,以完成 Google OAuth 授权过程。
该技能使用以下主要结构与 Google Slides 数据进行交互:
| 对象 | 描述 |
|---|---|
presentationId |
Google Slides 文件的唯一 ID。 |
pageId |
特定幻灯片或页面的唯一标识符。 |
objectId |
标识形状、图像或文本框等元素的唯一字符串。 |
requests |
发送到 batchUpdate 端点的操作对象数组。 |
predefinedLayout |
布局模板,如 TITLE_AND_BODY、BLANK 或 BIG_NUMBER。 |
所有坐标和尺寸均以点 (PT) 为单位,其中 72 点等于 1 英寸。
name: google-slides
description: |
Google Slides API integration with managed OAuth. Create presentations, add slides, insert content, and manage slide formatting. Use this skill when users want to interact with Google Slides. For other third party apps, use the api-gateway skill (https://clawhub.ai/byungkyu/api-gateway).
compatibility: Requires network access and valid Maton API key
metadata:
author: maton
version: "1.0"
clawdbot:
emoji: ??
requires:
env:
- MATON_API_KEY
Access the Google Slides API with managed OAuth authentication. Create and manage presentations, add slides, insert text and images, and control formatting.
# Create a new presentation
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'title': 'My Presentation'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/google-slides/v1/presentations', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
https://gateway.maton.ai/google-slides/{native-api-path}
Replace {native-api-path} with the actual Google Slides API endpoint path. The gateway proxies requests to slides.googleapis.com and automatically injects your OAuth token.
All requests require the Maton API key in the Authorization header:
Authorization: Bearer $MATON_API_KEY
Environment Variable: Set your API key as MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
Manage your Google OAuth connections at https://ctrl.maton.ai.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=google-slides&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'google-slides'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
Response:
{
"connection": {
"connection_id": "21fd90f9-5935-43cd-b6c8-bde9d915ca80",
"status": "ACTIVE",
"creation_time": "2025-12-08T07:20:53.488460Z",
"last_updated_time": "2026-01-31T20:03:32.593153Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "google-slides",
"metadata": {}
}
}
Open the returned url in a browser to complete OAuth authorization.
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If you have multiple Google Slides connections, specify which one to use with the Maton-Connection header:
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'title': 'My Presentation'}).encode()
req = urllib.request.Request('https://gateway.maton.ai/google-slides/v1/presentations', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
req.add_header('Maton-Connection', '21fd90f9-5935-43cd-b6c8-bde9d915ca80')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
If omitted, the gateway uses the default (oldest) active connection.
POST /google-slides/v1/presentations
Content-Type: application/json
{
"title": "My Presentation"
}
GET /google-slides/v1/presentations/{presentationId}
GET /google-slides/v1/presentations/{presentationId}/pages/{pageId}
GET /google-slides/v1/presentations/{presentationId}/pages/{pageId}/thumbnail
With custom size:
GET /google-slides/v1/presentations/{presentationId}/pages/{pageId}/thumbnail?thumbnailProperties.mimeType=PNG&thumbnailProperties.thumbnailSize=LARGE
The batchUpdate endpoint is used for most modifications. It accepts an array of requests that are applied atomically.
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [...]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createSlide": {
"objectId": "slide_001",
"slideLayoutReference": {
"predefinedLayout": "TITLE_AND_BODY"
}
}
}
]
}
Available predefined layouts:
BLANKTITLETITLE_AND_BODYTITLE_AND_TWO_COLUMNSTITLE_ONLYSECTION_HEADERONE_COLUMN_TEXTMAIN_POINTBIG_NUMBERPOST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"insertText": {
"objectId": "{shapeId}",
"text": "Hello, World!",
"insertionIndex": 0
}
}
]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"deleteText": {
"objectId": "{shapeId}",
"textRange": {
"type": "ALL"
}
}
}
]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createShape": {
"objectId": "shape_001",
"shapeType": "TEXT_BOX",
"elementProperties": {
"pageObjectId": "{slideId}",
"size": {
"width": {"magnitude": 300, "unit": "PT"},
"height": {"magnitude": 100, "unit": "PT"}
},
"transform": {
"scaleX": 1,
"scaleY": 1,
"translateX": 100,
"translateY": 100,
"unit": "PT"
}
}
}
}
]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"createImage": {
"objectId": "image_001",
"url": "https://example.com/image.png",
"elementProperties": {
"pageObjectId": "{slideId}",
"size": {
"width": {"magnitude": 200, "unit": "PT"},
"height": {"magnitude": 200, "unit": "PT"}
},
"transform": {
"scaleX": 1,
"scaleY": 1,
"translateX": 200,
"translateY": 200,
"unit": "PT"
}
}
}
}
]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"deleteObject": {
"objectId": "{objectId}"
}
}
]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"updateTextStyle": {
"objectId": "{shapeId}",
"textRange": {
"type": "ALL"
},
"style": {
"bold": true,
"fontSize": {"magnitude": 24, "unit": "PT"},
"foregroundColor": {
"opaqueColor": {
"rgbColor": {"red": 0.2, "green": 0.4, "blue": 0.8}
}
}
},
"fields": "bold,fontSize,foregroundColor"
}
}
]
}
POST /google-slides/v1/presentations/{presentationId}:batchUpdate
Content-Type: application/json
{
"requests": [
{
"replaceAllText": {
"containsText": {
"text": "{{placeholder}}",
"matchCase": true
},
"replaceText": "Actual Value"
}
}
]
}
// Create a presentation
const response = await fetch(
'https://gateway.maton.ai/google-slides/v1/presentations',
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({ title: 'My Presentation' })
}
);
const presentation = await response.json();
const presentationId = presentation.presentationId;
// Add a slide
await fetch(
`https://gateway.maton.ai/google-slides/v1/presentations/${presentationId}:batchUpdate`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${process.env.MATON_API_KEY}`
},
body: JSON.stringify({
requests: [
{
createSlide: {
slideLayoutReference: { predefinedLayout: 'TITLE_AND_BODY' }
}
}
]
})
}
);
import os
import requests
headers = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'
}
# Create a presentation
response = requests.post(
'https://gateway.maton.ai/google-slides/v1/presentations',
headers=headers,
json={'title': 'My Presentation'}
)
presentation = response.json()
presentation_id = presentation['presentationId']
# Add a slide
requests.post(
f'https://gateway.maton.ai/google-slides/v1/presentations/{presentation_id}:batchUpdate',
headers=headers,
json={
'requests': [
{
'createSlide': {
'slideLayoutReference': {'predefinedLayout': 'TITLE_AND_BODY'}
}
}
]
}
)
replaceAllText for template-based presentation generationcurl -g when URLs contain brackets to disable glob parsingjq or other commands, environment variables like $MATON_API_KEY may not expand correctly in some shell environments. You may get "Invalid API key" errors when piping.| Status | Meaning |
|---|---|
| 400 | Missing Google Slides connection |
| 401 | Invalid or missing Maton API key |
| 404 | Presentation not found |
| 429 | Rate limited (10 req/sec per account) |
| 4xx/5xx | Passthrough error from Google Slides API |
MATON_API_KEY environment variable is set:echo $MATON_API_KEY
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
google-slides. For example:https://gateway.maton.ai/google-slides/v1/presentationshttps://gateway.maton.ai/slides/v1/presentations