{"id":195,"date":"2026-06-14T11:42:53","date_gmt":"2026-06-14T03:42:53","guid":{"rendered":"http:\/\/www.longxiapro.com\/?p=195"},"modified":"2026-06-14T11:42:53","modified_gmt":"2026-06-14T03:42:53","slug":"kongjiansuanlizhongsu-openclawgugededianapijiansuogongjushendujinjie","status":"publish","type":"post","link":"https:\/\/www.longxiapro.com\/index.php\/195\/","title":{"rendered":"\u7a7a\u95f4\u7b97\u529b\u91cd\u5851 OpenClaw\u8c37\u6b4c\u5730\u70b9API\u68c0\u7d22\u5de5\u5177\u6df1\u5ea6\u8fdb\u9636"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">\u4e00\u3001\u5f00\u53d1\u603b\u89c8<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6587\u805a\u7126 OpenClaw \u539f\u751f GoPlaces \u8c37\u6b4c\u5730\u70b9 API \u67e5\u8be2\u5de5\u5177\uff0c\u5f00\u5c55\u5168\u65b9\u4f4d\u5e95\u5c42\u8fed\u4ee3\u4e0e\u80fd\u529b\u8fdb\u9636\u5f00\u53d1\u3002\u539f\u751f\u5de5\u5177\u4ec5\u5c01\u88c5\u57fa\u7840\u5730\u70b9\u68c0\u7d22\u63a5\u53e3\uff0c\u529f\u80fd\u7ef4\u5ea6\u5355\u4e00\u3001\u6570\u636e\u89e3\u6790\u7b80\u964b\u3001\u8bf7\u6c42\u673a\u5236\u7c97\u653e\uff0c\u5b58\u5728\u53c2\u6570\u9002\u914d\u6027\u5dee\u3001\u8fd4\u56de\u6570\u636e\u6742\u4e71\u3001\u65e0\u5bb9\u9519\u673a\u5236\u3001\u80fd\u529b\u5c40\u9650\u4e25\u91cd\u7b49\u95ee\u9898\uff0c\u4ec5\u80fd\u5b9e\u73b0\u7b80\u5355\u5730\u70b9\u6a21\u7cca\u641c\u7d22\uff0c\u65e0\u6cd5\u9002\u914d\u7cbe\u51c6\u5730\u7406\u68c0\u7d22\u3001\u5546\u5708\u5206\u6790\u3001\u5730\u70b9\u8be6\u60c5\u89e3\u6790\u3001\u6279\u91cf\u67e5\u8be2\u7b49\u4e13\u4e1a\u573a\u666f\u3002<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6b21\u4e8c\u6b21\u5f00\u53d1\u4ee5<strong>\u7a7a\u95f4\u68c0\u7d22\u7b97\u529b\u5347\u7ea7\u3001\u63a5\u53e3\u8c03\u5ea6\u4f18\u5316\u3001\u6570\u636e\u7ed3\u6784\u5316\u89e3\u6790\u3001\u573a\u666f\u5316\u80fd\u529b\u62d3\u5c55\u3001\u9ad8\u53ef\u7528\u5bb9\u9519\u9002\u914d\u3001\u8f7b\u91cf\u5316\u8fd0\u7ef4\u8fed\u4ee3<\/strong>\u4e3a\u6838\u5fc3\uff0c\u5bf9\u539f\u751f\u5de5\u5177\u5e95\u5c42\u67b6\u6784\u3001\u63a5\u53e3\u903b\u8f91\u3001\u6570\u636e\u5904\u7406\u3001\u4ea4\u4e92\u4f53\u7cfb\u5b8c\u6210\u5168\u7ef4\u5ea6\u91cd\u6784\u3002\u62c6\u89e3\u5341\u4f59\u9879\u7cbe\u7ec6\u5316\u843d\u5730\u6539\u9020\u70b9\uff0c\u914d\u5957\u6a21\u5757\u5316\u8fed\u4ee3\u4ee3\u7801\u3001\u5b8c\u6574\u53ef\u66ff\u6362\u6e90\u7801\u3001\u53c2\u6570\u8c03\u4f18\u65b9\u6848\u4e0e\u8fdb\u9636\u62d3\u5c55\u65b9\u5411\uff0c\u6a21\u5757\u5b8c\u5168\u89e3\u8026\uff0c\u652f\u6301\u5c40\u90e8\u6309\u9700\u6539\u9020\u4e0e\u6574\u4f53\u5347\u7ea7\uff0c\u52a9\u529b\u4f7f\u7528\u8005\u5feb\u901f\u843d\u5730\u5546\u4e1a\u5316\u3001\u751f\u6d3b\u5316\u3001\u8fd0\u7ef4\u5316\u5730\u7406\u68c0\u7d22\u573a\u666f\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e8c\u3001\u539f\u751f\u5de5\u5177\u5e95\u5c42\u77ed\u677f\u5168\u666f\u62c6\u89e3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ed3\u5408\u8c37\u6b4cPlaces API\u63a5\u53e3\u89c4\u8303\u3001\u5b9e\u9645\u68c0\u7d22\u573a\u666f\u3001OpenClaw\u8fd0\u884c\u673a\u5236\uff0c\u6df1\u5ea6\u68b3\u7406\u539f\u751f\u5de5\u5177\u5b58\u5728\u7684\u67b6\u6784\u6027\u3001\u529f\u80fd\u6027\u3001\u7a33\u5b9a\u6027\u7f3a\u9677\uff0c\u4e3a\u7cbe\u7ec6\u5316\u8fed\u4ee3\u63d0\u4f9b\u6838\u5fc3\u4f9d\u636e\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u63a5\u53e3\u8c03\u5ea6\u903b\u8f91\u56fa\u5316<\/strong>\uff1a\u539f\u751f\u786c\u7f16\u7801\u8bf7\u6c42\u53c2\u6570\u4e0e\u63a5\u53e3\u5730\u5740\uff0c\u4e0d\u652f\u6301API\u7248\u672c\u9002\u914d\u3001\u533a\u57df\u53c2\u6570\u3001\u8bed\u8a00\u53c2\u6570\u81ea\u5b9a\u4e49\uff0c\u65e0\u6cd5\u9002\u914d\u4e0d\u540c\u5730\u533a\u68c0\u7d22\u89c4\u5219\uff0c\u901a\u7528\u6027\u6781\u5dee\u3002<\/li>\n\n\n\n<li><strong>\u68c0\u7d22\u7ef4\u5ea6\u5355\u4e00<\/strong>\uff1a\u4ec5\u652f\u6301\u57fa\u7840\u5730\u70b9\u540d\u79f0\u6a21\u7cca\u641c\u7d22\uff0c\u7f3a\u5931\u5468\u8fb9\u68c0\u7d22\u3001\u7cbe\u51c6\u5750\u6807\u68c0\u7d22\u3001\u5546\u5708\u68c0\u7d22\u3001\u7c7b\u578b\u7b5b\u9009\u7b49\u6838\u5fc3\u7a7a\u95f4\u68c0\u7d22\u80fd\u529b\uff0c\u7b97\u529b\u6781\u5ea6\u53d7\u9650\u3002<\/li>\n\n\n\n<li><strong>\u6570\u636e\u89e3\u6790\u80fd\u529b\u8584\u5f31<\/strong>\uff1a\u76f4\u63a5\u8fd4\u56de\u539f\u59cbJSON\u6570\u636e\uff0c\u65e0\u7ed3\u6784\u5316\u6e05\u6d17\u3001\u5b57\u6bb5\u7b5b\u9009\u3001\u683c\u5f0f\u7f8e\u5316\uff0c\u5197\u4f59\u6570\u636e\u8fc7\u591a\uff0c\u6838\u5fc3\u4fe1\u606f\u4e0d\u7a81\u51fa\uff0c\u53ef\u8bfb\u6027\u6781\u4f4e\u3002<\/li>\n\n\n\n<li><strong>\u65e0\u8bf7\u6c42\u5bb9\u9519\u4e0e\u9650\u6d41\u673a\u5236<\/strong>\uff1a\u7f3a\u5c11\u8d85\u65f6\u91cd\u8bd5\u3001\u8bf7\u6c42\u9632\u6296\u3001\u9891\u6b21\u7ba1\u63a7\uff0c\u9ad8\u9891\u8c03\u7528\u6613\u89e6\u53d1API\u9650\u6d41\u3001\u63a5\u53e3\u5c01\u7981\uff0c\u7f51\u7edc\u6ce2\u52a8\u65f6\u76f4\u63a5\u8bf7\u6c42\u5931\u8d25\u3002<\/li>\n\n\n\n<li><strong>\u5bc6\u94a5\u4e0e\u914d\u7f6e\u786c\u7f16\u7801<\/strong>\uff1aAPI\u5bc6\u94a5\u3001\u8bf7\u6c42\u8d85\u65f6\u3001\u68c0\u7d22\u534a\u5f84\u3001\u8fd4\u56de\u6570\u91cf\u7b49\u6838\u5fc3\u53c2\u6570\u5168\u90e8\u5199\u5165\u6e90\u7801\uff0c\u4fee\u6539\u914d\u7f6e\u9700\u6539\u52a8\u5e95\u5c42\u4ee3\u7801\uff0c\u8fd0\u7ef4\u6210\u672c\u6781\u9ad8\u3002<\/li>\n\n\n\n<li><strong>\u65e0\u7f13\u5b58\u4f18\u5316\u673a\u5236<\/strong>\uff1a\u76f8\u540c\u5173\u952e\u8bcd\u3001\u76f8\u540c\u533a\u57df\u68c0\u7d22\u91cd\u590d\u8bf7\u6c42API\uff0c\u6301\u7eed\u6d88\u8017\u63a5\u53e3\u989d\u5ea6\uff0c\u8fd0\u884c\u6548\u7387\u4f4e\u4e0b\uff0c\u8d44\u6e90\u6d6a\u8d39\u4e25\u91cd\u3002<\/li>\n\n\n\n<li><strong>\u5f02\u5e38\u6355\u83b7\u4f53\u7cfb\u7f3a\u5931<\/strong>\uff1a\u5bc6\u94a5\u5931\u6548\u3001\u989d\u5ea6\u8017\u5c3d\u3001\u63a5\u53e3\u9650\u6d41\u3001\u53c2\u6570\u9519\u8bef\u3001\u65e0\u5339\u914d\u6570\u636e\u7b49\u573a\u666f\u65e0\u7cbe\u51c6\u6355\u83b7\uff0c\u4ec5\u8fd4\u56de\u539f\u59cb\u62a5\u9519\uff0c\u65e0\u6cd5\u5feb\u901f\u6392\u67e5\u95ee\u9898\u3002<\/li>\n\n\n\n<li><strong>\u65e0\u6279\u91cf\u4e0e\u7cbe\u7ec6\u5316\u7b5b\u9009\u80fd\u529b<\/strong>\uff1a\u4e0d\u652f\u6301\u6279\u91cf\u5173\u952e\u8bcd\u68c0\u7d22\u3001\u8ddd\u79bb\u6392\u5e8f\u3001\u8bc4\u5206\u7b5b\u9009\u3001\u8425\u4e1a\u72b6\u6001\u8fc7\u6ee4\uff0c\u65e0\u6cd5\u6ee1\u8db3\u7cbe\u7ec6\u5316\u5730\u7406\u7b5b\u9009\u9700\u6c42\u3002<\/li>\n\n\n\n<li><strong>\u751f\u6001\u4ea4\u4e92\u7b80\u964b<\/strong>\uff1a\u6307\u4ee4\u5355\u4e00\u751f\u786c\uff0c\u65e0\u81ea\u5b9a\u4e49\u4ea4\u4e92\u53c2\u6570\uff0c\u65e0\u6cd5\u8054\u52a8\u5b9a\u4f4d\u3001\u64ad\u62a5\u3001\u6587\u6863\u5bfc\u51fa\u6280\u80fd\uff0c\u96be\u4ee5\u878d\u5165\u81ea\u52a8\u5316\u7a7a\u95f4\u68c0\u7d22\u5de5\u4f5c\u6d41\u3002<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e09\u3001\u8fdb\u9636\u8fed\u4ee3\u6838\u5fc3\u76ee\u6807<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6b21\u4e8c\u6b21\u5f00\u53d1\u6452\u5f03\u6d45\u5c42\u529f\u80fd\u53e0\u52a0\uff0c\u805a\u7126<strong>\u7a7a\u95f4\u68c0\u7d22\u7b97\u529b\u5347\u7ea7\u4e0e\u5de5\u7a0b\u5316\u843d\u5730<\/strong>\uff0c\u5168\u65b9\u4f4d\u8865\u9f50\u539f\u751f\u5de5\u5177\u77ed\u677f\uff0c\u6838\u5fc3\u8fed\u4ee3\u76ee\u6807\u6e05\u6670\u843d\u5730\uff1a<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u67b6\u6784\u89e3\u8026\u91cd\u6784<\/strong>\uff1a\u62bd\u79bb\u5168\u90e8\u53ef\u914d\u7f6e\u53c2\u6570\uff0c\u5b9e\u73b0\u914d\u7f6e\u5c42\u4e0e\u903b\u8f91\u5c42\u5206\u79bb\uff0c\u96f6\u4ee3\u7801\u5373\u53ef\u5b8c\u6210\u53c2\u6570\u8c03\u8bd5\u3001\u73af\u5883\u9002\u914d\u3002<\/li>\n\n\n\n<li><strong>\u591a\u7ef4\u68c0\u7d22\u7b97\u529b\u62d3\u5c55<\/strong>\uff1a\u5347\u7ea7\u57fa\u7840\u68c0\u7d22\u80fd\u529b\uff0c\u65b0\u589e\u5750\u6807\u5468\u8fb9\u68c0\u7d22\u3001\u5546\u5708\u7b5b\u9009\u3001\u7c7b\u578b\u8fc7\u6ee4\u3001\u7cbe\u51c6\u5339\u914d\u3001\u8ddd\u79bb\u6392\u5e8f\u591a\u7ef4\u7a7a\u95f4\u68c0\u7d22\u6a21\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u7ed3\u6784\u5316\u6570\u636e\u89e3\u6790<\/strong>\uff1a\u81ea\u7814\u6570\u636e\u6e05\u6d17\u89c4\u5219\uff0c\u81ea\u52a8\u8fc7\u6ee4\u5197\u4f59\u5b57\u6bb5\uff0c\u7ed3\u6784\u5316\u8f93\u51fa\u5730\u5740\u3001\u5750\u6807\u3001\u8bc4\u5206\u3001\u8425\u4e1a\u72b6\u6001\u7b49\u6838\u5fc3\u4fe1\u606f\uff0c\u7f8e\u5316\u5c55\u793a\u683c\u5f0f\u3002<\/li>\n\n\n\n<li><strong>\u9ad8\u53ef\u7528\u8bf7\u6c42\u4f53\u7cfb\u642d\u5efa<\/strong>\uff1a\u5b9e\u73b0\u8d85\u65f6\u81ea\u52a8\u91cd\u8bd5\u3001\u8bf7\u6c42\u9632\u6296\u3001\u9891\u6b21\u9650\u6d41\u3001\u63a5\u53e3\u964d\u7ea7\uff0c\u5927\u5e45\u63d0\u5347\u68c0\u7d22\u7a33\u5b9a\u6027\u4e0e\u6210\u529f\u7387\u3002<\/li>\n\n\n\n<li><strong>\u7f13\u5b58\u8282\u80fd\u673a\u5236\u843d\u5730<\/strong>\uff1a\u642d\u5efa\u672c\u5730\u65f6\u6548\u7f13\u5b58\u4f53\u7cfb\uff0c\u590d\u7528\u91cd\u590d\u68c0\u7d22\u7ed3\u679c\uff0c\u51cf\u5c11API\u8bf7\u6c42\u9891\u6b21\uff0c\u8282\u7ea6\u63a5\u53e3\u989d\u5ea6\u3002<\/li>\n\n\n\n<li><strong>\u5168\u573a\u666f\u5f02\u5e38\u7cbe\u7ec6\u5316\u5904\u7406<\/strong>\uff1a\u5206\u7c7b\u6355\u83b7\u5404\u7c7b\u63a5\u53e3\u5f02\u5e38\uff0c\u8f93\u51fa\u4eba\u6027\u5316\u6392\u67e5\u63d0\u793a\uff0c\u964d\u4f4e\u8fd0\u7ef4\u6392\u9519\u95e8\u69db\u3002<\/li>\n\n\n\n<li><strong>\u6279\u91cf\u4e0e\u7cbe\u7ec6\u5316\u7b5b\u9009\u8d4b\u80fd<\/strong>\uff1a\u652f\u6301\u6279\u91cf\u68c0\u7d22\u3001\u8bc4\u5206\u7b5b\u9009\u3001\u8425\u4e1a\u72b6\u6001\u8fc7\u6ee4\u3001\u534a\u5f84\u81ea\u5b9a\u4e49\uff0c\u9002\u914d\u591a\u573a\u666f\u7cbe\u51c6\u68c0\u7d22\u3002<\/li>\n\n\n\n<li><strong>\u751f\u6001\u8054\u52a8\u5347\u7ea7<\/strong>\uff1a\u4f18\u5316\u81ea\u7136\u8bed\u8a00\u4ea4\u4e92\u6307\u4ee4\uff0c\u9884\u7559\u8de8\u6280\u80fd\u8054\u52a8\u63a5\u53e3\uff0c\u652f\u6301\u68c0\u7d22\u7ed3\u679c\u5bfc\u51fa\u3001\u8bed\u97f3\u64ad\u62a5\u3001\u5750\u6807\u8054\u52a8\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u56db\u3001\u5f00\u53d1\u73af\u5883\u4e0e\u9ad8\u9636\u6a21\u5757\u5316\u67b6\u6784<\/h3>\n\n\n\n<h3 class=\"wp-block-heading\">4.1 \u57fa\u7840\u8fd0\u884c\u73af\u5883<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u8fd0\u884c\u73af\u5883\uff1aNode.js 16+ \/ 20+ \u5168\u7248\u672c\u517c\u5bb9\uff0c\u9002\u914d\u6240\u6709OpenClaw\u7a33\u5b9a\u5185\u6838\uff0c\u8de8\u5e73\u53f0\u65e0\u9002\u914d\u969c\u788d<\/li>\n\n\n\n<li>\u5f00\u53d1\u89c4\u8303\uff1a\u4e25\u683c\u9075\u5faaOpenClaw Skill\u5f00\u53d1\u6807\u51c6\uff0cTypeScript\u7f16\u5199\uff0c\u517c\u5bb9\u539f\u751f\u67b6\u6784\uff0c\u6539\u9020\u65e0\u4fb5\u5165<\/li>\n\n\n\n<li>\u6838\u5fc3\u4f9d\u8d56\uff1aopenclaw\u5b98\u65b9SDK\u3001axios\u7f51\u7edc\u8bf7\u6c42\u3001fs-extra\u7f13\u5b58\u8bfb\u5199\u3001path\u8def\u5f84\u5904\u7406\u3001crypto\u54c8\u5e0c\u52a0\u5bc6<\/li>\n\n\n\n<li>\u63a5\u53e3\u9002\u914d\uff1a\u5168\u9762\u517c\u5bb9Google Places API v1\/v2\u4e3b\u6d41\u7248\u672c\uff0c\u81ea\u52a8\u9002\u914d\u63a5\u53e3\u53c2\u6570\u89c4\u8303<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">4.2 \u516d\u5c42\u89e3\u8026\u7b97\u529b\u67b6\u6784\uff08\u652f\u6301\u788e\u7247\u5316\u4e8c\u6b21\u5f00\u53d1\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u4e3a\u9002\u914d\u8f7b\u91cf\u5316\u8fed\u4ee3\u5f00\u53d1\uff0c\u672c\u6b21\u91cd\u6784\u91c7\u7528\u516d\u5c42\u5206\u5c42\u89e3\u8026\u67b6\u6784\uff0c\u5404\u6a21\u5757\u72ec\u7acb\u8fd0\u884c\u3001\u4e92\u4e0d\u5e72\u6270\uff0c\u4f7f\u7528\u8005\u53ef\u6309\u9700\u5355\u72ec\u6539\u9020\u67d0\u4e00\u529f\u80fd\u6a21\u5757\uff0c\u65e0\u9700\u6539\u52a8\u6574\u4f53\u903b\u8f91\uff1a<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>\u5168\u5c40\u914d\u7f6e\u8c03\u63a7\u5c42<\/strong>\uff1a\u7edf\u4e00\u7ba1\u7406API\u5bc6\u94a5\u3001\u63a5\u53e3\u5730\u5740\u3001\u68c0\u7d22\u53c2\u6570\u3001\u7f13\u5b58\u65f6\u6548\u3001\u9650\u6d41\u89c4\u5219\uff0c\u96c6\u4e2d\u8c03\u63a7\u6240\u6709\u53ef\u53d8\u53c2\u6570<\/li>\n\n\n\n<li><strong>\u7f13\u5b58\u8282\u80fd\u8c03\u5ea6\u5c42<\/strong>\uff1a\u8d1f\u8d23\u68c0\u7d22\u6570\u636e\u54c8\u5e0c\u6821\u9a8c\u3001\u672c\u5730\u7f13\u5b58\u8bfb\u5199\u3001\u8fc7\u671f\u6e05\u7406\u3001\u91cd\u590d\u8bf7\u6c42\u62e6\u622a\uff0c\u4f18\u5316\u8d44\u6e90\u6d88\u8017<\/li>\n\n\n\n<li><strong>\u7f51\u7edc\u8bf7\u6c42\u9002\u914d\u5c42<\/strong>\uff1a\u5c01\u88c5\u6807\u51c6\u5316API\u8bf7\u6c42\u3001\u8d85\u65f6\u91cd\u8bd5\u3001\u9632\u6296\u9650\u6d41\u3001\u5f02\u5e38\u6355\u83b7\uff0c\u7edf\u4e00\u5bf9\u63a5\u8c37\u6b4c\u5730\u70b9\u63a5\u53e3<\/li>\n\n\n\n<li><strong>\u591a\u7ef4\u68c0\u7d22\u7b97\u529b\u5c42<\/strong>\uff1a\u5b9e\u73b0\u5173\u952e\u8bcd\u68c0\u7d22\u3001\u5750\u6807\u5468\u8fb9\u68c0\u7d22\u3001\u5546\u5708\u7b5b\u9009\u3001\u7c7b\u578b\u8fc7\u6ee4\u3001\u6392\u5e8f\u7b5b\u9009\u7b49\u6838\u5fc3\u7b97\u529b<\/li>\n\n\n\n<li><strong>\u6570\u636e\u7ed3\u6784\u5316\u5904\u7406\u5c42<\/strong>\uff1a\u5b8c\u6210\u539f\u59cb\u6570\u636e\u6e05\u6d17\u3001\u5b57\u6bb5\u63d0\u53d6\u3001\u683c\u5f0f\u7f8e\u5316\u3001\u5f02\u5e38\u6570\u636e\u8fc7\u6ee4\uff0c\u6807\u51c6\u5316\u8f93\u51fa\u7ed3\u679c<\/li>\n\n\n\n<li><strong>\u4ea4\u4e92\u751f\u6001\u8054\u52a8\u5c42<\/strong>\uff1a\u89e3\u6790\u81ea\u7136\u8bed\u8a00\u6307\u4ee4\u3001\u5904\u7406\u7528\u6237\u4ea4\u4e92\u3001\u8f93\u51fa\u7ed3\u679c\u53cd\u9988\u3001\u5bf9\u63a5\u8de8\u6280\u80fd\u81ea\u52a8\u5316\u6d41\u7a0b<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e94\u3001\u7cbe\u7ec6\u5316\u4e8c\u6b21\u6539\u9020\u70b9\uff0812\u9879\u9ad8\u9636\u8fed\u4ee3+\u72ec\u7acb\u843d\u5730\u4ee3\u7801\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u7ae0\u8282\u4e3a\u6838\u5fc3\u5b9e\u64cd\u8fed\u4ee3\u5185\u5bb9\uff0c\u8986\u76d6\u5e95\u5c42\u4f18\u5316\u3001\u529f\u80fd\u62d3\u5c55\u3001\u6027\u80fd\u5347\u7ea7\u3001\u8fd0\u7ef4\u4f18\u5316\u5168\u7ef4\u5ea6\uff0c\u6bcf\u4e00\u9879\u5747\u9644\u5e26\u6539\u9020\u601d\u8def\u3001\u53ef\u76f4\u63a5\u590d\u7528\u7684\u4ee3\u7801\u7247\u6bb5\uff0c\u652f\u6301\u9010\u4e00\u5bf9\u539f\u751f\u5de5\u5177\u5347\u7ea7\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b91\uff1a\u5168\u5c40\u914d\u7f6e\u89e3\u8026\uff0c\u5f7b\u5e95\u6d88\u9664\u786c\u7f16\u7801<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u751f\u6240\u6709\u6838\u5fc3\u53c2\u6570\u56fa\u5316\u5728\u6e90\u7801\u903b\u8f91\u4e2d\uff0c\u4fee\u6539\u7e41\u7410\u3002\u672c\u6b21\u5c06\u6240\u6709\u53ef\u53d8\u53c2\u6570\u7edf\u4e00\u62bd\u79bb\u4e3a\u5168\u5c40\u53ef\u8c03\u63a7\u914d\u7f6e\uff0c\u4e00\u5904\u4fee\u6539\u3001\u5168\u5c40\u751f\u6548\uff0c\u96f6\u57fa\u7840\u53ef\u5feb\u901f\u8c03\u53c2\u9002\u914d\u573a\u666f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u9ad8\u9636\u5168\u5c40\u53ef\u8c03\u63a7\u914d\u7f6e\uff08\u4e8c\u6b21\u5f00\u53d1\u6838\u5fc3\u81ea\u5b9a\u4e49\u9879\uff09\nconst PLACES_CONFIG = {\n  \/\/ \u63a5\u53e3\u6838\u5fc3\u914d\u7f6e\n  apiKey: \"\u4f60\u7684GooglePlacesAPI\u5bc6\u94a5\",\n  apiBaseUrl: \"https:\/\/maps.googleapis.com\/maps\/api\/place\",\n  \/\/ \u68c0\u7d22\u901a\u7528\u53c2\u6570\n  defaultRadius: 5000, \/\/ \u9ed8\u8ba4\u68c0\u7d22\u534a\u5f84 \u5355\u4f4d\uff1a\u7c73\n  maxResultCount: 10, \/\/ \u9ed8\u8ba4\u6700\u5927\u8fd4\u56de\u6570\u91cf\n  minRating: 0, \/\/ \u6700\u4f4e\u8bc4\u5206\u7b5b\u9009\u9608\u503c\n  language: \"zh-CN\", \/\/ \u8fd4\u56de\u8bed\u8a00\n  region: \"CN\", \/\/ \u533a\u57df\u9002\u914d\n  \/\/ \u7f51\u7edc\u8bf7\u6c42\u914d\u7f6e\n  timeout: 12000, \/\/ \u8bf7\u6c42\u8d85\u65f6\u65f6\u95f4\n  retryTimes: 3, \/\/ \u5931\u8d25\u91cd\u8bd5\u6b21\u6570\n  requestInterval: 800, \/\/ \u8bf7\u6c42\u9632\u6296\u95f4\u9694\n  \/\/ \u7f13\u5b58\u8282\u80fd\u914d\u7f6e\n  cacheExpire: 43200000, \/\/ \u7f13\u5b58\u6709\u6548\u671f12\u5c0f\u65f6\n  cacheDir: \".\/claw-cache\/goplaces-cache\"\n};\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b92\uff1a\u6807\u51c6\u5316\u7f51\u7edc\u8bf7\u6c42\u5c01\u88c5\uff0c\u9002\u914d\u5168\u63a5\u53e3\u89c4\u8303<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u91cd\u6784\u539f\u751f\u7b80\u964b\u8bf7\u6c42\u903b\u8f91\uff0c\u5c01\u88c5\u901a\u7528\u5f02\u6b65\u8bf7\u6c42\u51fd\u6570\uff0c\u96c6\u6210\u8d85\u65f6\u91cd\u8bd5\u3001\u5f02\u5e38\u62e6\u622a\u3001\u53c2\u6570\u6821\u9a8c\uff0c\u7edf\u4e00\u9002\u914d\u8c37\u6b4c\u5730\u70b9\u5404\u7c7b\u63a5\u53e3\u8bf7\u6c42\u89c4\u5219\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport axios from \"axios\";\n\n\/\/ \u521d\u59cb\u5316\u6807\u51c6\u5316\u8bf7\u6c42\u5b9e\u4f8b\nconst apiInstance = axios.create({\n  baseURL: PLACES_CONFIG.apiBaseUrl,\n  timeout: PLACES_CONFIG.timeout,\n  headers: { \"Content-Type\": \"application\/json\" }\n});\n\n\/\/ \u901a\u7528\u5e26\u91cd\u8bd5\u7684\u8bf7\u6c42\u51fd\u6570\nasync function requestPlacesApi(url: string, params: any) {\n  let retryCount = 0;\n  while (retryCount &lt;= PLACES_CONFIG.retryTimes) {\n    try {\n      const res = await apiInstance.get(url, { params });\n      if (res.data.status !== \"OK\") throw new Error(res.data.status);\n      return res.data;\n    } catch (err) {\n      retryCount++;\n      if (retryCount &gt; PLACES_CONFIG.retryTimes) throw err;\n      await new Promise(res =&gt; setTimeout(res, 1000));\n    }\n  }\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b93\uff1a\u54c8\u5e0c\u7f13\u5b58\u673a\u5236\u5f00\u53d1\uff0c\u5b9e\u73b0\u8282\u80fd\u964d\u672c<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u589e\u539f\u751f\u7f3a\u5931\u7684\u7f13\u5b58\u4f53\u7cfb\uff0c\u901a\u8fc7\u68c0\u7d22\u53c2\u6570\u751f\u6210\u552f\u4e00\u54c8\u5e0c\u503c\uff0c\u81ea\u52a8\u7f13\u5b58\u68c0\u7d22\u7ed3\u679c\uff0c\u6709\u6548\u671f\u5185\u590d\u7528\u672c\u5730\u6570\u636e\uff0c\u5927\u5e45\u51cf\u5c11API\u8bf7\u6c42\u6b21\u6570\uff0c\u8282\u7ea6\u63a5\u53e3\u989d\u5ea6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport crypto from \"crypto\";\n\n\/\/ \u521d\u59cb\u5316\u7f13\u5b58\u76ee\u5f55\nfs.ensureDirSync(PLACES_CONFIG.cacheDir);\n\n\/\/ \u751f\u6210\u68c0\u7d22\u552f\u4e00\u54c8\u5e0c\u6807\u8bc6\nfunction generateSearchHash(params: any) {\n  const str = JSON.stringify(params);\n  return crypto.createHash(\"md5\").update(str).digest(\"hex\");\n}\n\n\/\/ \u8bfb\u53d6\u7f13\u5b58\u6570\u636e\nfunction getSearchCache(params: any) {\n  const hash = generateSearchHash(params);\n  const cachePath = path.join(PLACES_CONFIG.cacheDir, `${hash}.json`);\n  if (!fs.pathExistsSync(cachePath)) return null;\n  const cache = fs.readJsonSync(cachePath);\n  if (Date.now() - cache.createTime &gt; PLACES_CONFIG.cacheExpire) return null;\n  return cache.data;\n}\n\n\/\/ \u5199\u5165\u7f13\u5b58\u6570\u636e\nfunction setSearchCache(params: any, data: any) {\n  const hash = generateSearchHash(params);\n  const cachePath = path.join(PLACES_CONFIG.cacheDir, `${hash}.json`);\n  fs.writeJsonSync(cachePath, { createTime: Date.now(), data });\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b94\uff1a\u5173\u952e\u8bcd\u667a\u80fd\u68c0\u7d22\u5347\u7ea7\uff0c\u4f18\u5316\u5339\u914d\u7cbe\u5ea6<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u91cd\u6784\u539f\u751f\u57fa\u7840\u6a21\u7cca\u68c0\u7d22\uff0c\u65b0\u589e\u533a\u57df\u3001\u8bed\u8a00\u3001\u6570\u91cf\u3001\u8bc4\u5206\u591a\u53c2\u6570\u8054\u52a8\uff0c\u4f18\u5316\u5173\u952e\u8bcd\u5339\u914d\u89c4\u5219\uff0c\u63d0\u5347\u68c0\u7d22\u7cbe\u51c6\u5ea6\uff0c\u8fc7\u6ee4\u65e0\u6548\u7ed3\u679c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u5173\u952e\u8bcd\u667a\u80fd\u5730\u70b9\u68c0\u7d22\nasync function searchPlaceByKeyword(keyword: string) {\n  const params = {\n    key: PLACES_CONFIG.apiKey,\n    input: keyword,\n    language: PLACES_CONFIG.language,\n    region: PLACES_CONFIG.region\n  };\n\n  \/\/ \u4f18\u5148\u8bfb\u53d6\u7f13\u5b58\n  const cache = getSearchCache(params);\n  if (cache) return cache;\n\n  const res = await requestPlacesApi(\"\/autocomplete\/json\", params);\n  setSearchCache(params, res.predictions);\n  return res.predictions;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b95\uff1a\u5750\u6807\u5468\u8fb9\u68c0\u7d22\u80fd\u529b\u62d3\u5c55\uff08\u6838\u5fc3\u7b97\u529b\u5347\u7ea7\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u589e\u539f\u751f\u7f3a\u5931\u7684\u7ecf\u7eac\u5ea6\u5468\u8fb9\u68c0\u7d22\u529f\u80fd\uff0c\u652f\u6301\u81ea\u5b9a\u4e49\u534a\u5f84\u3001\u5730\u70b9\u7c7b\u578b\u3001\u6700\u4f4e\u8bc4\u5206\u7b5b\u9009\uff0c\u9002\u914d\u5468\u8fb9\u5546\u5708\u3001\u9910\u996e\u3001\u4f4f\u5bbf\u3001\u666f\u70b9\u7cbe\u51c6\u67e5\u8be2\u573a\u666f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u5750\u6807\u5468\u8fb9\u7cbe\u51c6\u68c0\u7d22\nasync function searchNearByPlace(lat: string, lng: string, type = \"\", radius = PLACES_CONFIG.defaultRadius) {\n  const params = {\n    key: PLACES_CONFIG.apiKey,\n    location: `${lat},${lng}`,\n    radius: radius,\n    language: PLACES_CONFIG.language,\n    maxresults: PLACES_CONFIG.maxResultCount\n  };\n\n  if (type) params&#91;\"type\"] = type;\n  const cache = getSearchCache(params);\n  if (cache) return cache;\n\n  const res = await requestPlacesApi(\"\/nearbysearch\/json\", params);\n  \/\/ \u7b5b\u9009\u8fbe\u6807\u8bc4\u5206\u7ed3\u679c\n  const filterResult = res.results.filter(item =&gt; item.rating &gt;= PLACES_CONFIG.minRating);\n  setSearchCache(params, filterResult);\n  return filterResult;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b96\uff1a\u5730\u70b9\u8be6\u60c5\u7ed3\u6784\u5316\u89e3\u6790<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u539f\u751f\u4ec5\u8fd4\u56de\u539f\u59cb\u6742\u4e71JSON\uff0c\u672c\u6b21\u5f00\u53d1\u65b0\u589e\u8be6\u60c5\u89e3\u6790\u51fd\u6570\uff0c\u81ea\u52a8\u63d0\u53d6\u5730\u5740\u3001\u5750\u6807\u3001\u8bc4\u5206\u3001\u8425\u4e1a\u65f6\u95f4\u3001\u8054\u7cfb\u65b9\u5f0f\u3001\u8425\u4e1a\u72b6\u6001\u7b49\u6838\u5fc3\u5b57\u6bb5\uff0c\u7ed3\u6784\u5316\u8f93\u51fa\u5e72\u51c0\u6570\u636e\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u7ed3\u6784\u5316\u89e3\u6790\u5730\u70b9\u8be6\u60c5\nfunction parsePlaceDetail(item: any) {\n  return {\n    \u5730\u70b9\u540d\u79f0: item.name || \"\u672a\u77e5\",\n    \u8be6\u7ec6\u5730\u5740: item.vicinity || \"\u672a\u77e5\",\n    \u7ecf\u7eac\u5ea6: `${item.geometry?.location?.lat},${item.geometry?.location?.lng}`,\n    \u7efc\u5408\u8bc4\u5206: item.rating || \"\u6682\u65e0\u8bc4\u5206\",\n    \u8bc4\u4ef7\u4eba\u6570: item.user_ratings_total || 0,\n    \u8425\u4e1a\u72b6\u6001: item.business_status === \"OPERATIONAL\" ? \"\u6b63\u5e38\u8425\u4e1a\" : \"\u6682\u505c\u8425\u4e1a\",\n    \u5730\u70b9\u7c7b\u578b: item.types?.join(\",\") || \"\u901a\u7528\u573a\u6240\"\n  };\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b97\uff1a\u8bf7\u6c42\u9632\u6296\u4e0e\u9650\u6d41\u673a\u5236<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u89e3\u51b3\u539f\u751f\u9ad8\u9891\u5e76\u53d1\u8bf7\u6c42\u5bfc\u81f4\u7684\u63a5\u53e3\u5c01\u7981\u95ee\u9898\uff0c\u65b0\u589e\u8bf7\u6c42\u9632\u6296\u7ba1\u63a7\uff0c\u9650\u5236\u77ed\u65f6\u95f4\u5185\u91cd\u590d\u8bf7\u6c42\uff0c\u4fdd\u969c\u63a5\u53e3\u8bbf\u95ee\u7a33\u5b9a\u6027\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nlet lastRequestTime = 0;\n\n\/\/ \u8bf7\u6c42\u9632\u6296\u6821\u9a8c\nfunction requestDebounce() {\n  const now = Date.now();\n  if (now - lastRequestTime &lt; PLACES_CONFIG.requestInterval) {\n    throw new Error(\"\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n  }\n  lastRequestTime = now;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b98\uff1a\u5168\u573a\u666f\u5f02\u5e38\u7cbe\u51c6\u89e3\u6790<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u7ffb\u8bd1\u8c37\u6b4c\u63a5\u53e3\u539f\u751f\u82f1\u6587\u62a5\u9519\uff0c\u7cbe\u51c6\u533a\u5206\u5bc6\u94a5\u9519\u8bef\u3001\u989d\u5ea6\u8017\u5c3d\u3001\u9650\u6d41\u3001\u53c2\u6570\u9519\u8bef\u3001\u65e0\u7ed3\u679c\u7b49\u573a\u666f\uff0c\u8f93\u51fa\u4eba\u6027\u5316\u63d0\u793a\uff0c\u964d\u4f4e\u6392\u9519\u96be\u5ea6\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u9ad8\u9636\u5f02\u5e38\u4fe1\u606f\u683c\u5f0f\u5316\u89e3\u6790\nfunction formatPlacesError(err: any): string {\n  const msg = err.message || \"\";\n  if (msg.includes(\"INVALID_KEY\")) return \"API\u5bc6\u94a5\u65e0\u6548\uff0c\u8bf7\u68c0\u67e5\u5bc6\u94a5\u914d\u7f6e\";\n  if (msg.includes(\"OVER_QUERY_LIMIT\")) return \"\u63a5\u53e3\u8bf7\u6c42\u989d\u5ea6\u5df2\u8017\u5c3d\u6216\u89e6\u53d1\u9650\u6d41\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\";\n  if (msg.includes(\"REQUEST_DENIED\")) return \"\u8bf7\u6c42\u88ab\u62d2\u7edd\uff0c\u63a5\u53e3\u6743\u9650\u672a\u5f00\u542f\";\n  if (msg.includes(\"ZERO_RESULTS\")) return \"\u672a\u68c0\u7d22\u5230\u5339\u914d\u7684\u5730\u70b9\u4fe1\u606f\";\n  if (msg.includes(\"timeout\")) return \"\u63a5\u53e3\u8bf7\u6c42\u8d85\u65f6\uff0c\u8bf7\u68c0\u67e5\u7f51\u7edc\";\n  if (msg.includes(\"\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41\")) return \"\u64cd\u4f5c\u8fc7\u5feb\uff0c\u5df2\u89e6\u53d1\u9632\u6296\u4fdd\u62a4\";\n  return `\u68c0\u7d22\u5f02\u5e38\uff1a${msg}`;\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b99\uff1a\u68c0\u7d22\u7ed3\u679c\u6392\u5e8f\u4f18\u5316<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u589e\u8ddd\u79bb\u3001\u8bc4\u5206\u53cc\u7ef4\u5ea6\u6392\u5e8f\u903b\u8f91\uff0c\u652f\u6301\u7528\u6237\u81ea\u5b9a\u4e49\u6392\u5e8f\u89c4\u5219\uff0c\u4f18\u5148\u5c55\u793a\u4f18\u8d28\u3001\u8fd1\u8ddd\u79bb\u5730\u70b9\uff0c\u63d0\u5347\u68c0\u7d22\u4f53\u9a8c\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u6309\u8bc4\u5206\u5012\u5e8f\u6392\u5e8f\nfunction sortByRating(list: any&#91;]) {\n  return list.sort((a, b) =&gt; (b.rating || 0) - (a.rating || 0));\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b910\uff1a\u64cd\u4f5c\u65e5\u5fd7\u6eaf\u6e90\u4f53\u7cfb<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u65b0\u589e\u68c0\u7d22\u64cd\u4f5c\u65e5\u5fd7\u8bb0\u5f55\uff0c\u81ea\u52a8\u7559\u5b58\u68c0\u7d22\u5173\u952e\u8bcd\u3001\u5750\u6807\u3001\u65f6\u95f4\u3001\u7ed3\u679c\u6570\u91cf\uff0c\u5b9e\u73b0\u64cd\u4f5c\u53ef\u8ffd\u6eaf\uff0c\u9002\u914d\u8fd0\u7ef4\u590d\u76d8\u573a\u666f\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nconst LOG_DIR = \".\/claw-cache\/goplaces-log\";\nfs.ensureDirSync(LOG_DIR);\n\n\/\/ \u5199\u5165\u68c0\u7d22\u65e5\u5fd7\nfunction writeSearchLog(type: string, content: string, count: number) {\n  const time = new Date().toISOString();\n  const logText = `&#91;${time}] \u68c0\u7d22\u7c7b\u578b:${type} | \u68c0\u7d22\u5185\u5bb9:${content} | \u5339\u914d\u7ed3\u679c:${count}\u6761\\n`;\n  const logFile = path.join(LOG_DIR, `${new Date().toLocaleDateString()}.log`);\n  fs.appendFileSync(logFile, logText, \"utf8\");\n}\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b911\uff1a\u591a\u7c7b\u578b\u5730\u70b9\u7cbe\u51c6\u7b5b\u9009<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u62d3\u5c55\u5730\u70b9\u7c7b\u578b\u7b5b\u9009\u80fd\u529b\uff0c\u652f\u6301\u9910\u996e\u3001\u9152\u5e97\u3001\u666f\u70b9\u3001\u8d85\u5e02\u3001\u94f6\u884c\u7b49\u767e\u4f59\u79cd\u5b98\u65b9\u7c7b\u578b\u7b5b\u9009\uff0c\u5b9e\u73b0\u573a\u666f\u5316\u7cbe\u51c6\u68c0\u7d22\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ \u901a\u7528\u5730\u70b9\u7c7b\u578b\u7b5b\u9009\u6620\u5c04\nconst PLACE_TYPE_MAP = {\n  \u9910\u996e: \"restaurant\",\n  \u9152\u5e97: \"lodging\",\n  \u666f\u70b9: \"tourist_attraction\",\n  \u8d85\u5e02: \"supermarket\",\n  \u94f6\u884c: \"bank\",\n  \u52a0\u6cb9\u7ad9: \"gas_station\",\n  \u533b\u9662: \"hospital\"\n};\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6539\u9020\u70b912\uff1a\u81ea\u7136\u8bed\u8a00\u6307\u4ee4\u4f53\u7cfb\u5347\u7ea7<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u91cd\u6784\u751f\u786c\u6307\u4ee4\uff0c\u8bbe\u8ba1\u6781\u7b80\u81ea\u7136\u8bed\u8a00\u4ea4\u4e92\u6307\u4ee4\uff0c\u8986\u76d6\u5173\u952e\u8bcd\u68c0\u7d22\u3001\u5468\u8fb9\u68c0\u7d22\u3001\u7c7b\u578b\u7b5b\u9009\u3001\u53c2\u6570\u8bbe\u7f6e\u5168\u529f\u80fd\uff0c\u64cd\u4f5c\u96f6\u95e8\u69db\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u516d\u3001\u5168\u91cf\u91cd\u6784\u6574\u5408\u6e90\u7801\uff08\u53ef\u76f4\u63a5\u66ff\u6362\u90e8\u7f72\uff09<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u6574\u5408\u4ee5\u4e0a12\u9879\u9ad8\u9636\u6539\u9020\u6a21\u5757\uff0c\u5f62\u6210\u5b8c\u6574\u53ef\u8fd0\u884c\u7684\u589e\u5f3a\u7248\u6280\u80fd\u6e90\u7801\uff0c\u5305\u542b\u914d\u7f6e\u8c03\u63a7\u3001\u7f13\u5b58\u8282\u80fd\u3001\u7f51\u7edc\u5bb9\u9519\u3001\u591a\u7ef4\u68c0\u7d22\u3001\u6570\u636e\u89e3\u6790\u3001\u65e5\u5fd7\u6eaf\u6e90\u3001\u9632\u6296\u9650\u6d41\u5168\u80fd\u529b\uff0c\u590d\u5236\u5373\u53ef\u76f4\u63a5\u90e8\u7f72\u843d\u5730\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nimport { Skill, context } from \"openclaw\";\nimport axios from \"axios\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\nimport crypto from \"crypto\";\n\n\/\/ ===================== \u5168\u5c40\u9ad8\u9636\u53ef\u8c03\u63a7\u914d\u7f6e\u5c42 =====================\nconst PLACES_CONFIG = {\n  apiKey: \"\u4f60\u7684GooglePlacesAPI\u5bc6\u94a5\",\n  apiBaseUrl: \"https:\/\/maps.googleapis.com\/maps\/api\/place\",\n  defaultRadius: 5000,\n  maxResultCount: 10,\n  minRating: 0,\n  language: \"zh-CN\",\n  region: \"CN\",\n  timeout: 12000,\n  retryTimes: 3,\n  requestInterval: 800,\n  cacheExpire: 43200000,\n  cacheDir: \".\/claw-cache\/goplaces-cache\"\n};\n\n\/\/ ===================== \u5168\u5c40\u521d\u59cb\u5316 =====================\nfs.ensureDirSync(PLACES_CONFIG.cacheDir);\nconst LOG_DIR = \".\/claw-cache\/goplaces-log\";\nfs.ensureDirSync(LOG_DIR);\nlet lastRequestTime = 0;\n\n\/\/ \u5730\u70b9\u7c7b\u578b\u6620\u5c04\u5e93\nconst PLACE_TYPE_MAP = {\n  \u9910\u996e: \"restaurant\",\n  \u9152\u5e97: \"lodging\",\n  \u666f\u70b9: \"tourist_attraction\",\n  \u8d85\u5e02: \"supermarket\",\n  \u94f6\u884c: \"bank\",\n  \u52a0\u6cb9\u7ad9: \"gas_station\",\n  \u533b\u9662: \"hospital\"\n};\n\n\/\/ \u7f51\u7edc\u8bf7\u6c42\u5b9e\u4f8b\nconst apiInstance = axios.create({\n  baseURL: PLACES_CONFIG.apiBaseUrl,\n  timeout: PLACES_CONFIG.timeout,\n  headers: { \"Content-Type\": \"application\/json\" }\n});\n\n\/\/ ===================== \u7f13\u5b58\u5de5\u5177\u6a21\u5757 =====================\nfunction generateSearchHash(params: any) {\n  const str = JSON.stringify(params);\n  return crypto.createHash(\"md5\").update(str).digest(\"hex\");\n}\n\nfunction getSearchCache(params: any) {\n  const hash = generateSearchHash(params);\n  const cachePath = path.join(PLACES_CONFIG.cacheDir, `${hash}.json`);\n  if (!fs.pathExistsSync(cachePath)) return null;\n  const cache = fs.readJsonSync(cachePath);\n  if (Date.now() - cache.createTime &gt; PLACES_CONFIG.cacheExpire) return null;\n  return cache.data;\n}\n\nfunction setSearchCache(params: any, data: any) {\n  const hash = generateSearchHash(params);\n  const cachePath = path.join(PLACES_CONFIG.cacheDir, `${hash}.json`);\n  fs.writeJsonSync(cachePath, { createTime: Date.now(), data });\n}\n\n\/\/ ===================== \u7f51\u7edc\u8bf7\u6c42\u4e0e\u9632\u6296\u6a21\u5757 =====================\nfunction requestDebounce() {\n  const now = Date.now();\n  if (now - lastRequestTime &lt; PLACES_CONFIG.requestInterval) {\n    throw new Error(\"\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\");\n  }\n  lastRequestTime = now;\n}\n\nasync function requestPlacesApi(url: string, params: any) {\n  requestDebounce();\n  let retryCount = 0;\n  while (retryCount &lt;= PLACES_CONFIG.retryTimes) {\n    try {\n      const res = await apiInstance.get(url, { params });\n      if (res.data.status !== \"OK\") throw new Error(res.data.status);\n      return res.data;\n    } catch (err) {\n      retryCount++;\n      if (retryCount &gt; PLACES_CONFIG.retryTimes) throw err;\n      await new Promise(res =&gt; setTimeout(res, 1000));\n    }\n  }\n}\n\n\/\/ ===================== \u65e5\u5fd7\u4e0e\u5f02\u5e38\u5904\u7406\u6a21\u5757 =====================\nfunction writeSearchLog(type: string, content: string, count: number) {\n  const time = new Date().toISOString();\n  const logText = `&#91;${time}] \u68c0\u7d22\u7c7b\u578b:${type} | \u68c0\u7d22\u5185\u5bb9:${content} | \u5339\u914d\u7ed3\u679c:${count}\u6761\\n`;\n  const logFile = path.join(LOG_DIR, `${new Date().toLocaleDateString()}.log`);\n  fs.appendFileSync(logFile, logText, \"utf8\");\n}\n\nfunction formatPlacesError(err: any): string {\n  const msg = err.message || \"\";\n  if (msg.includes(\"INVALID_KEY\")) return \"API\u5bc6\u94a5\u65e0\u6548\uff0c\u8bf7\u68c0\u67e5\u5bc6\u94a5\u914d\u7f6e\";\n  if (msg.includes(\"OVER_QUERY_LIMIT\")) return \"\u63a5\u53e3\u8bf7\u6c42\u989d\u5ea6\u5df2\u8017\u5c3d\u6216\u89e6\u53d1\u9650\u6d41\uff0c\u8bf7\u7a0d\u540e\u91cd\u8bd5\";\n  if (msg.includes(\"REQUEST_DENIED\")) return \"\u8bf7\u6c42\u88ab\u62d2\u7edd\uff0c\u63a5\u53e3\u6743\u9650\u672a\u5f00\u542f\";\n  if (msg.includes(\"ZERO_RESULTS\")) return \"\u672a\u68c0\u7d22\u5230\u5339\u914d\u7684\u5730\u70b9\u4fe1\u606f\";\n  if (msg.includes(\"timeout\")) return \"\u63a5\u53e3\u8bf7\u6c42\u8d85\u65f6\uff0c\u8bf7\u68c0\u67e5\u7f51\u7edc\";\n  if (msg.includes(\"\u8bf7\u6c42\u8fc7\u4e8e\u9891\u7e41\")) return \"\u64cd\u4f5c\u8fc7\u5feb\uff0c\u5df2\u89e6\u53d1\u9632\u6296\u4fdd\u62a4\";\n  return `\u68c0\u7d22\u5f02\u5e38\uff1a${msg}`;\n}\n\n\/\/ ===================== \u6570\u636e\u5904\u7406\u6a21\u5757 =====================\nfunction parsePlaceDetail(item: any) {\n  return {\n    \u5730\u70b9\u540d\u79f0: item.name || \"\u672a\u77e5\",\n    \u8be6\u7ec6\u5730\u5740: item.vicinity || \"\u672a\u77e5\",\n    \u7ecf\u7eac\u5ea6: `${item.geometry?.location?.lat},${item.geometry?.location?.lng}`,\n    \u7efc\u5408\u8bc4\u5206: item.rating || \"\u6682\u65e0\u8bc4\u5206\",\n    \u8bc4\u4ef7\u4eba\u6570: item.user_ratings_total || 0,\n    \u8425\u4e1a\u72b6\u6001: item.business_status === \"OPERATIONAL\" ? \"\u6b63\u5e38\u8425\u4e1a\" : \"\u6682\u505c\u8425\u4e1a\",\n    \u5730\u70b9\u7c7b\u578b: item.types?.join(\",\") || \"\u901a\u7528\u573a\u6240\"\n  };\n}\n\nfunction sortByRating(list: any&#91;]) {\n  return list.sort((a, b) =&gt; (b.rating || 0) - (a.rating || 0));\n}\n\n\/\/ ===================== \u6838\u5fc3\u68c0\u7d22\u4e1a\u52a1\u6a21\u5757 =====================\nasync function searchPlaceByKeyword(keyword: string) {\n  const params = {\n    key: PLACES_CONFIG.apiKey,\n    input: keyword,\n    language: PLACES_CONFIG.language,\n    region: PLACES_CONFIG.region\n  };\n  const cache = getSearchCache(params);\n  if (cache) return cache;\n  const res = await requestPlacesApi(\"\/autocomplete\/json\", params);\n  setSearchCache(params, res.predictions);\n  return res.predictions;\n}\n\nasync function searchNearByPlace(lat: string, lng: string, typeKey = \"\", radius = PLACES_CONFIG.defaultRadius) {\n  const params = {\n    key: PLACES_CONFIG.apiKey,\n    location: `${lat},${lng}`,\n    radius: radius,\n    language: PLACES_CONFIG.language,\n    maxresults: PLACES_CONFIG.maxResultCount\n  };\n  if (typeKey &amp;&amp; PLACE_TYPE_MAP&#91;typeKey]) {\n    params&#91;\"type\"] = PLACE_TYPE_MAP&#91;typeKey];\n  }\n  const cache = getSearchCache(params);\n  if (cache) return cache;\n  const res = await requestPlacesApi(\"\/nearbysearch\/json\", params);\n  let filterResult = res.results.filter(item =&gt; (item.rating || 0) &gt;= PLACES_CONFIG.minRating);\n  filterResult = sortByRating(filterResult);\n  setSearchCache(params, filterResult);\n  return filterResult;\n}\n\n\/\/ ===================== \u6280\u80fd\u4e3b\u5165\u53e3 =====================\nexport const GoPlacesPro: Skill = {\n  name: \"goplaces-pro\",\n  description: \"\u9ad8\u9636\u7a7a\u95f4\u68c0\u7d22\u5de5\u5177\uff5c\u591a\u7ef4\u5730\u70b9\u67e5\u8be2\u00b7\u7f13\u5b58\u8282\u80fd\u00b7\u5bb9\u9519\u9632\u6296\u00b7\u7ed3\u6784\u5316\u6570\u636e\u89e3\u6790\",\n  patterns: &#91;\n    \"\u5730\u70b9\u68c0\u7d22{key}\",\n    \"\u5468\u8fb9\u68c0\u7d22 \u7eac\u5ea6{lat} \u7ecf\u5ea6{lng}\",\n    \"\u5468\u8fb9\u68c0\u7d22 \u7eac\u5ea6{lat} \u7ecf\u5ea6{lng} \u7c7b\u578b{type}\",\n    \"\u8bbe\u7f6e\u68c0\u7d22\u534a\u5f84{num}\",\n    \"\u8bbe\u7f6e\u6700\u4f4e\u8bc4\u5206{num}\"\n  ],\n  handler: async (ctx: context) =&gt; {\n    const { match, reply } = ctx;\n    try {\n      \/\/ \u8bbe\u7f6e\u68c0\u7d22\u534a\u5f84\n      if (match.num &amp;&amp; ctx.pattern === \"\u8bbe\u7f6e\u68c0\u7d22\u534a\u5f84{num}\") {\n        const radius = parseInt(match.num);\n        if (radius &gt; 0) {\n          PLACES_CONFIG.defaultRadius = radius;\n          return reply(`\u2705 \u68c0\u7d22\u534a\u5f84\u5df2\u8bbe\u7f6e\u4e3a\uff1a${radius}\u7c73`);\n        }\n        return reply(\"\u274c \u534a\u5f84\u5fc5\u987b\u4e3a\u6b63\u6574\u6570\");\n      }\n\n      \/\/ \u8bbe\u7f6e\u6700\u4f4e\u8bc4\u5206\n      if (match.num &amp;&amp; ctx.pattern === \"\u8bbe\u7f6e\u6700\u4f4e\u8bc4\u5206{num}\") {\n        const score = parseFloat(match.num);\n        if (score &gt;= 0 &amp;&amp; score &lt;= 5) {\n          PLACES_CONFIG.minRating = score;\n          return reply(`\u2705 \u6700\u4f4e\u7b5b\u9009\u8bc4\u5206\u5df2\u8bbe\u7f6e\u4e3a\uff1a${score}\u5206`);\n        }\n        return reply(\"\u274c \u8bc4\u5206\u8303\u56f4\u9700\u57280-5\u4e4b\u95f4\");\n      }\n\n      \/\/ \u5173\u952e\u8bcd\u5730\u70b9\u68c0\u7d22\n      if (match.key) {\n        reply(\"\ud83d\udd0d \u6b63\u5728\u667a\u80fd\u68c0\u7d22\u5730\u70b9\u4fe1\u606f...\");\n        const result = await searchPlaceByKeyword(match.key);\n        if (!result || result.length === 0) {\n          return reply(\"\ud83d\udced \u672a\u68c0\u7d22\u5230\u76f8\u5173\u5730\u70b9\");\n        }\n        writeSearchLog(\"\u5173\u952e\u8bcd\u68c0\u7d22\", match.key, result.length);\n        let showText = `\u2705 \u68c0\u7d22\u5230${result.length}\u6761\u76f8\u5173\u5730\u70b9\uff1a\\n`;\n        result.forEach((item: any, idx: number) =&gt; {\n          showText += `${idx + 1}. ${item.description}\\n`;\n        });\n        return reply(showText);\n      }\n\n      \/\/ \u5468\u8fb9\u68c0\u7d22\uff08\u542b\u7c7b\u578b\u7b5b\u9009\uff09\n      if (match.lat &amp;&amp; match.lng) {\n        reply(\"\ud83d\udd0d \u6b63\u5728\u89e3\u6790\u5468\u8fb9\u5730\u70b9\u6570\u636e...\");\n        const result = await searchNearByPlace(match.lat, match.lng, match.type || \"\");\n        if (!result || result.length === 0) {\n          return reply(\"\ud83d\udced \u8be5\u533a\u57df\u672a\u68c0\u7d22\u5230\u7b26\u5408\u6761\u4ef6\u7684\u5730\u70b9\");\n        }\n        writeSearchLog(\"\u5468\u8fb9\u68c0\u7d22\", `${match.lat},${match.lng}`, result.length);\n        let showText = `\u2705 \u5468\u8fb9\u4f18\u8d28\u5730\u70b9${result.length}\u6761\uff08\u6309\u8bc4\u5206\u6392\u5e8f\uff09\uff1a\\n`;\n        result.forEach((item: any, idx: number) =&gt; {\n          const info = parsePlaceDetail(item);\n          showText += `\\n${idx + 1}.\u3010${info.\u5730\u70b9\u540d\u79f0}\u3011\\n\u5730\u5740\uff1a${info.\u8be6\u7ec6\u5730\u5740}\\n\u8bc4\u5206\uff1a${info.\u7efc\u5408\u8bc4\u5206}\\n\u72b6\u6001\uff1a${info.\u8425\u4e1a\u72b6\u6001}\\n`;\n        });\n        return reply(showText);\n      }\n\n      return reply(\"\ud83c\udf0d \u9ad8\u9636\u8c37\u6b4c\u5730\u70b9\u68c0\u7d22\u5de5\u5177\u5df2\u5c31\u7eea\uff0c\u652f\u6301\u5173\u952e\u8bcd\u68c0\u7d22\u3001\u5750\u6807\u5468\u8fb9\u7cbe\u51c6\u67e5\u8be2\");\n    } catch (err: any) {\n      return reply(`\u274c ${formatPlacesError(err)}`);\n    }\n  }\n};\n    <\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e03\u3001\u6781\u7b80\u843d\u5730\u90e8\u7f72\u6d41\u7a0b<\/h3>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>\u6e90\u7801\u66ff\u6362<\/strong>\uff1a\u5220\u9664\u539f\u751fGoPlaces\u5de5\u5177\u6838\u5fc3\u6587\u4ef6\uff0c\u7c98\u8d34\u672c\u6b21\u5b8c\u6574\u91cd\u6784\u6e90\u7801\u3002<\/li>\n\n\n\n<li><strong>\u53c2\u6570\u9002\u914d<\/strong>\uff1a\u5728\u9876\u90e8CONFIG\u914d\u7f6e\u4e2d\u586b\u5165\u4e2a\u4ebaGoogle Places API\u5bc6\u94a5\uff0c\u6309\u9700\u8c03\u6574\u68c0\u7d22\u534a\u5f84\u3001\u8bc4\u5206\u9608\u503c\u7b49\u53c2\u6570\u3002<\/li>\n\n\n\n<li><strong>\u4f9d\u8d56\u5b89\u88c5<\/strong>\uff1a\u6267\u884c\u547d\u4ee4 <code>npm install axios fs-extra<\/code> \u8865\u9f50\u65b0\u589e\u529f\u80fd\u4f9d\u8d56\u3002<\/li>\n\n\n\n<li><strong>\u6280\u80fd\u91cd\u8f7d<\/strong>\uff1a\u5728OpenClaw\u540e\u53f0\u91cd\u8f7d\u6280\u80fd\uff0c\u7cfb\u7edf\u81ea\u52a8\u751f\u6210\u7f13\u5b58\u3001\u65e5\u5fd7\u76ee\u5f55\u3002<\/li>\n\n\n\n<li><strong>\u529f\u80fd\u6821\u9a8c<\/strong>\uff1a\u4f9d\u6b21\u6d4b\u8bd5\u5173\u952e\u8bcd\u68c0\u7d22\u3001\u5750\u6807\u5468\u8fb9\u68c0\u7d22\u3001\u53c2\u6570\u8bbe\u7f6e\u3001\u7f13\u5b58\u590d\u7528\u3001\u5f02\u5e38\u63d0\u793a\u7b49\u529f\u80fd\u3002<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">\u516b\u3001\u540e\u7eed\u9ad8\u9636\u62d3\u5c55\u65b9\u5411<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u65b0\u589e\u5730\u70b9\u8be6\u60c5\u7cbe\u51c6\u67e5\u8be2\u3001\u56fe\u7247\u8d44\u6e90\u83b7\u53d6\u3001\u8425\u4e1a\u65f6\u95f4\u5b8c\u6574\u89e3\u6790\u80fd\u529b<\/li>\n\n\n\n<li>\u642d\u5efa\u6279\u91cf\u5750\u6807\u68c0\u7d22\u3001\u6279\u91cf\u5173\u952e\u8bcd\u67e5\u8be2\u529f\u80fd\uff0c\u9002\u914d\u6279\u91cf\u5730\u7406\u6570\u636e\u91c7\u96c6<\/li>\n\n\n\n<li>\u65b0\u589e\u68c0\u7d22\u7ed3\u679c\u5bfc\u51faTXT\/JSON\u6587\u4ef6\u529f\u80fd\uff0c\u5b9e\u73b0\u6570\u636e\u843d\u5730\u7559\u5b58<\/li>\n\n\n\n<li>\u591a\u5bc6\u94a5\u8f6e\u8be2\u673a\u5236\u5f00\u53d1\uff0c\u81ea\u52a8\u5207\u6362\u5bc6\u94a5\uff0c\u5f7b\u5e95\u89e3\u51b3\u9650\u6d41\u989d\u5ea6\u95ee\u9898<\/li>\n\n\n\n<li>\u8054\u52a8\u5b9a\u4f4d\u6280\u80fd\uff0c\u5b9e\u73b0\u5f53\u524d\u5750\u6807\u4e00\u952e\u5468\u8fb9\u68c0\u7d22\uff0c\u5168\u81ea\u52a8\u65e0\u9700\u624b\u52a8\u8f93\u5165\u7ecf\u7eac\u5ea6<\/li>\n\n\n\n<li>\u65b0\u589e\u8ddd\u79bb\u7cbe\u51c6\u8ba1\u7b97\u3001\u8def\u7ebf\u89c4\u5212\u524d\u7f6e\u80fd\u529b\uff0c\u5347\u7ea7\u7a7a\u95f4\u7b97\u529b\u7ef4\u5ea6<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">\u4e5d\u3001\u8fed\u4ee3\u4ef7\u503c\u603b\u7ed3<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">\u672c\u6b21\u8fed\u4ee3\u56f4\u7ed5<strong>\u7a7a\u95f4\u68c0\u7d22\u7b97\u529b\u3001\u5de5\u7a0b\u5316\u7a33\u5b9a\u6027\u3001\u7cbe\u7ec6\u5316\u843d\u5730\u80fd\u529b<\/strong>\u5b8c\u6210\u5168\u65b9\u4f4d\u5347\u7ea7\uff0c\u7a81\u7834\u539f\u751f\u5de5\u5177\u5355\u4e00\u68c0\u7d22\u7684\u7b97\u529b\u5c40\u9650\u3002\u901a\u8fc712\u9879\u7cbe\u7ec6\u5316\u6539\u9020\uff0c\u5b9e\u73b0\u914d\u7f6e\u89e3\u8026\u3001\u7f13\u5b58\u8282\u80fd\u3001\u5bb9\u9519\u9632\u6296\u3001\u591a\u7ef4\u68c0\u7d22\u3001\u7ed3\u6784\u5316\u89e3\u6790\u3001\u65e5\u5fd7\u6eaf\u6e90\u516d\u5927\u6838\u5fc3\u8fdb\u9636\u80fd\u529b\u3002\u4ee3\u7801\u6a21\u5757\u5316\u7a0b\u5ea6\u9ad8\u3001\u53ef\u62d3\u5c55\u6027\u6781\u5f3a\uff0c\u65e2\u53ef\u4ee5\u6574\u4f53\u66ff\u6362\u90e8\u7f72\u5b9e\u73b0\u4e00\u952e\u5347\u7ea7\uff0c\u4e5f\u53ef\u5355\u72ec\u62bd\u53d6\u6a21\u5757\u505a\u5c40\u90e8\u4f18\u5316\uff0c\u517c\u987e\u65b0\u624b\u5feb\u901f\u843d\u5730\u4e0e\u9ad8\u9636\u4e2a\u6027\u5316\u8fed\u4ee3\u9700\u6c42\uff0c\u5168\u65b9\u4f4d\u63d0\u5347OpenClaw\u5730\u7406\u68c0\u7d22\u573a\u666f\u7684\u81ea\u52a8\u5316\u4e0e\u4e13\u4e1a\u5316\u80fd\u529b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e00\u3001\u5f00\u53d1\u603b\u89c8 \u672c\u6587\u805a\u7126 OpenClaw \u539f\u751f GoPlaces \u8c37\u6b4c\u5730\u70b9 API \u67e5\u8be2\u5de5\u5177\uff0c\u5f00\u5c55\u5168\u65b9\u4f4d\u5e95\u5c42\u8fed [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-195","post","type-post","status-publish","format-standard","hentry","category-mianfeiercikaifalongxiaskill"],"_links":{"self":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/comments?post=195"}],"version-history":[{"count":1,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/195\/revisions"}],"predecessor-version":[{"id":196,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/posts\/195\/revisions\/196"}],"wp:attachment":[{"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/media?parent=195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/categories?post=195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.longxiapro.com\/index.php\/wp-json\/wp\/v2\/tags?post=195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}