gogcli Maps Places 命令详解:Places API 文本搜索与 Place 详情查询的终端实现与实践 gogcli Maps Places 命令详解Places API 文本搜索与 Place 详情查询的终端实现与实践【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli本篇基于 gogcli 仓库中的命令参考文档 gog maps places完整讲解gog maps places命令族的用法search按文本查询地点、details按 Place ID 获取详情。读完后你将掌握该命令的参数与输出格式、Places API Key 的三种配置方式并理解其底层 HTTP 请求places:searchText、GET /places/{id}、字段掩码与错误解析在源码中的真实实现。命令总览gog maps places是 gogcli 中封装 Google Maps Places API 的命令组其文档页头部注明该页面由gog schema --json生成make docs-commands因此命令结构与 源码中的命令定义 严格一致。gog maps (map) places (place) command从源码结构看(map)与(place)是括号中定义的命令别名MapsCmd注册了别名mapMapsPlacesCmd注册了别名place两者出现在 internal/cmd/maps.gotype MapsCmd struct { Places MapsPlacesCmd cmd: name:places aliases:place help:Google Maps Places API Directions MapsDirectionsCmd cmd: name:directions aliases:route help:Get directions between two locations Distance MapsDistanceCmd cmd: name:distance aliases:distance-matrix,matrix help:Get travel distance and duration matrix Geocode MapsGeocodeCmd cmd: name:geocode help:Convert an address to coordinates ReverseGeocode MapsReverseGeocodeCmd cmd: name:reverse-geocode aliases:reverse help:Convert coordinates to an address } type MapsPlacesCmd struct { Search MapsPlacesSearchCmd cmd: name:search aliases:find help:Search Places by text Details MapsPlacesDetailsCmd cmd: name:details aliases:get,info,show help:Get Place details }因此以下写法等价gog maps places search coffee shop gog map place find coffee shop gog maps places details ChIJ123 gog map place get ChIJ123子命令子命令别名作用参考文档gog maps places searchfind按文本搜索地点Text Searchgog-maps-places-search.mdgog maps places detailsget、info、show按 Place ID 获取地点详情gog-maps-places-details.md父级命令见 gog maps完整命令索引见 docs/commands/README.md。通用 Flags继承自原命令参考页以下全局 Flag 在places、search、details各级命令上均可用摘自 gog maps places 文档由 schema 生成Flag类型默认值说明--access-tokenstring直接使用提供的 access token绕过已存储的 refresh tokentoken 约 1 小时过期-a/--account/--acctstring账户邮箱、别名或 auto用于已认证的 Google API 命令--clientstringOAuth 客户端名称选择已存储凭据 token 桶--colorstringauto颜色输出auto|always|never--disable-commandsstring禁用命令列表逗号分隔支持点路径-n/--dry-run/--dryrun/--noop/--previewbool不做变更打印预期动作后成功退出--enable-commandsstring启用的命令前缀列表逗号分隔支持点路径限制 CLI--enable-commands-exactstring精确启用的命令列表逗号分隔父命令不会启用子命令-y/--force/--assume-yes/--yesbool跳过破坏性命令的确认--gmail-no-sendboolfalse阻止 Gmail 发送操作agent 安全-h/--helpkong.helpFlag显示上下文相关的帮助--homestring覆盖 gogcli 配置/数据/状态/缓存根目录等价于 GOG_HOME-j/--json/--machineboolfalse向 stdout 输出 JSON最适合脚本--no-input/--non-interactive/--noninteractivebool从不提示失败而不是阻塞适用于 CI-p/--plain/--tsvboolfalse输出稳定的可解析文本TSV无颜色--quota-projectstring用于计费 API 用量的 GCP 项目发送 X-Goog-User-Project 头--readonlyboolfalse运行时阻止变更类 API 请求--results-onlyboolJSON 模式下只输出主结果丢弃 nextPageToken 等包装字段--select/--pick/--projectstringJSON 模式下按逗号分隔选取字段尽力而为支持点路径-v/--verbosebool启用详细日志--versionkong.VersionFlag打印版本并退出--wrap-untrustedboolfalse在 JSON/raw 输出中用外部不可信内容标记包裹抓取到的文本字段对于 Agent 场景特别注意--no-inputCI 中失败而不是阻塞、-j/--json脚本友好、--results-only与--wrap-untrusted处理抓取到的外部文本时的安全边界。前置条件配置 Places API Keyplaces命令组依赖 Google 的 API Key 而非 OAuth 令牌。从源码看Key 的解析集中在 internal/cmd/calendar_places.go 的placesAPIKey函数func placesAPIKey(ctx context.Context) (string, error) { cfg, err : loadConfig(ctx) if err ! nil { return , fmt.Errorf(read config for Places API key: %w, err) } if key : strings.TrimSpace(config.GetValue(cfg, config.KeyPlacesAPIKey)); key ! { return key, nil } return , usage(Google Maps/Places API key required. Set GOG_PLACES_API_KEY, GOOGLE_PLACES_API_KEY, or run gog config set places_api_key key) }三种等价的配置方式按文档给出的顺序# 1. 配置文件持久化推荐 gog config set places_api_key YOUR_KEY # 2. 环境变量优先读取 GOG_PLACES_API_KEY其次 GOOGLE_PLACES_API_KEY export GOG_PLACES_API_KEYYOUR_KEY export GOOGLE_PLACES_API_KEYYOUR_KEY # 3. 以上都未设置时命令会明确报出用法错误并给出上述提示在 internal/config/keys.go 中places_api_key被标记为Sensitive: true敏感配置项其Get逻辑正是先读GOG_PLACES_API_KEY、再读GOOGLE_PLACES_API_KEY最后回落到配置文件中的places_api_key字段见 internal/config/config.go 中的PlacesAPIKey字段。此外环境变量GOG_PLACES_BASE_URL可覆盖 Places API 的基础地址默认https://places.googleapis.com/v1见下文客户端实现也便于在本地用 mock 服务调试。gog maps places search按文本搜索地点用法与参数gog maps (map) places (place) search (find) query ... [flags]query位置参数多个词会自动用空格连接后作为完整查询文本MapsPlacesSearchCmd.Run 中strings.Join(c.Query, )因此无需给每个词加引号例如gog maps places search coffee shop in Tokyo--languageBCP-47 语言代码控制结果展示语言--regionCLDR 区域代码用于结果偏向。# 最简搜索 gog maps places search sushi in Shibuya # 指定语言与区域偏向 gog maps places search museum --language en --region US # 脚本化JSON 输出 只保留主结果 gog maps places search coffee shop -j --results-only底层请求POST /places:searchText从 internal/googleapi/places.go 的TextSearch实现看该命令向POST {baseURL}/places:searchText发送 JSON 请求体{ textQuery: sushi in Shibuya, languageCode: en, regionCode: US }languageCode与regionCode仅在对应 Flag 非空时才写入请求体。请求同时携带两个关键头X-Goog-Api-KeyAPI Key和X-Goog-FieldMask其中搜索的字段掩码固定为places.id,places.displayName,places.formattedAddress,places.googleMapsUri也就是说 gogcli 主动向 Places API 声明只需要这四个字段控制响应体积。需要说明的一个边界行为TextSearch只取响应places数组的第一个结果返回查询无匹配时会返回no places matched: query错误而非返回空列表。这意味着该命令定位是取最相关的一个地点不做结果分页。输出格式writeMapsPlaceinternal/cmd/maps.go定义了两种输出形态JSON 模式-j输出{place: { ... }}包装对象便于jq处理默认文本模式逐行输出存在的字段空字段跳过id\tChIJ123 name\tCafe address\t1 Main St maps_uri\thttps://maps.google.com/?cid1Place结构体internal/googleapi/places.go只有四个字段ID、Name来自响应displayName.text、FormattedAddress、GoogleMapsURI因此 JSON 输出的字段就是这四个空字段被omitempty省略。gog maps places details按 Place ID 获取详情用法与参数gog maps (map) places (place) details (get,info,show) placeId [flags]placeId必填位置参数Place ID。从 normalizePlaceID 看传入places/{id}形式的资源路径也能被接受——函数会先裁剪前缀places/func normalizePlaceID(placeID string) string { placeID strings.TrimSpace(placeID) placeID strings.TrimPrefix(placeID, places/) return strings.TrimSpace(placeID) }--languageBCP-47 语言代码--regionCLDR 区域代码。# 使用裸 Place ID gog maps places details ChIJd8kFbBfHwokRqWV5JgMjBQ0 # 使用 places/{id} 资源形式等价 gog maps places details places/ChIJd8kFbBfHwokRqWV5JgMjBQ0 # 组合使用先搜索拿 ID再取详情 id$(gog maps places search Golden Gate Bridge -j --results-only | jq -r .place.id) gog maps places details $id --language en-US --region US -j底层请求GET /places/{id}Details实现internal/googleapi/places.go构造GET {baseURL}/places/{id}请求Place ID 经url.PathEscape转义而languageCode、regionCode以URL 查询参数形式传递与 search 写入请求体的方式不同字段掩码为id,displayName,formattedAddress,googleMapsUri一个细节如果响应中没有返回id例如部分 API 场景客户端会用本地归一化后的 placeID 回填place.ID保证结果中 ID 字段可用。输出格式与search相同复用writeMapsPlace-j输出{place: {...}}默认模式输出id/name/address/maps_uri行。客户端实现要点PlacesClient 剖析places命令组的所有网络请求都经过 PlacesClient几个值得了解的实现细节默认端点与超时defaultPlacesBaseURL https://places.googleapis.com/v1HTTP 客户端默认 10 秒超时NewPlacesClientBase URL 可覆盖WithPlacesBaseURL选项在 newMapsPlacesClient 中被传入GOG_PLACES_BASE_URL环境变量值空值则保持默认。测试见下正是靠它把请求打到本地 httptest 服务器响应体上限doJSON使用io.LimitReader(resp.Body, 220)限制响应读取为 2 MiBinternal/googleapi/places.go防止异常大响应错误解析非 2xx 状态码走 placesAPIError会解析 Google 标准{error:{code,message,status}}结构把status如PERMISSION_DENIED与message如API disabled拼进错误信息并包装为带状态码的HTTPStatusError。这使排障时能直接看到 Google 返回的具体错误语义例如 403 对应 API 未启用同一客户端的复用从源码结构看日历事件地点解析internal/cmd/calendar_places.go也复用同一个PlacesClient与placesAPIKey即配置一次 Keygog calendar的地点解析与gog maps places共享该凭据。测试用例印证internal/googleapi/places_test.go 用本地 httptest 服务器验证了上述行为TestPlacesTextSearchL11-L44断言请求路径为/places:searchText、X-Goog-Api-Key头正确、字段掩码包含places.id且不含reviews等多余字段并验证返回的 Place 字段映射TestPlacesDetailsL46-L71断言places/ChIJ123输入被归一化为/places/ChIJ123路径且regionCodeUS以查询参数传递TestPlacesAPIErrorL73-L86模拟 403 响应断言错误信息中包含PERMISSION_DENIED。这些测试与 internal/cmd/maps_test.go 一起是验证 Places 命令行为的仓库内依据。与 maps 命令组其他命令的关系从 gog maps 文档看places只是gog maps下的一个子组兄弟命令各自封装不同的 Google Maps API命令别名功能参考文档gog maps directionsroute两点间路线gog-maps-directions.mdgog maps distancedistance-matrix,matrix距离/时长矩阵gog-maps-distance.mdgog maps geocode—地址转坐标gog-maps-geocode.mdgog maps reverse-geocodereverse坐标转地址gog-maps-reverse-geocode.md从 internal/cmd/maps.go 看它们与places共用同一个placesAPIKey解析逻辑因此只需配置一次 Key 即可使用整个 maps 命令组directions/geocode等走GOG_MAPS_BASE_URLplaces走GOG_PLACES_BASE_URL。小结与适用前提gog maps places search/find query做文本搜索gog maps places details/get/info/show placeId做详情查询两者均可加--languageBCP-47与--regionCLDR 代码控制本地化与区域偏向字段掩码限定为id、displayName、formattedAddress、googleMapsUri四个字段search返回最相关的一个结果不分页details接受裸 ID 或places/{id}两种写法前置条件是配置 Places API Keygog config set places_api_key key或GOG_PLACES_API_KEY/GOOGLE_PLACES_API_KEY该 Key 需在 Google Cloud 项目中启用了 Maps Places API否则会收到PERMISSION_DENIED类错误脚本化场景建议-j --results-onlyCI 场景追加--no-input需要本地 mock 调试时可用GOG_PLACES_BASE_URL覆盖端点。【免费下载链接】gogcliGoogle Workspace in your terminal.项目地址: https://gitcode.com/GitHub_Trending/gogcl/gogcli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考