{"componentChunkName":"component---src-templates-best-practice-detail-tsx","path":"/best-practice/2020-05-10-enterprise-wechat","result":{"data":{"currentBlog":{"id":"e1770fad-8a66-5619-88f6-ef5e50448400","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020511/1589207417699-ZalNtxgQAC_small.jpg","authors":["Anycodes"],"categories":["best-practice"],"date":"2020-05-10T00:00:00.000Z","title":"从企业微信机器人到小爱同学，用 Serverless 实现生活智能化！","description":"通过定时触发器，可以非常简单快速地建立一个企业微信机器人。我们可以用它来实现喝水、吃饭提醒等小功能，还能实现定时推送新闻、天气，甚至是监控告警的小功能","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Serverless","企业微信"],"keywords":"Serverless 多环境配置,Serverless 管理环境,Serverless配置方案","outdated":null},"wordCount":{"words":219,"sentences":54,"paragraphs":54},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-05-10-enterprise-wechat.md","fields":{"slug":"/best-practice/2020-05-10-enterprise-wechat/","keywords":["go","python","serverless","云函数","request","urllib","attr","json"]},"html":"<p>通过定时触发器，可以简单快速地定制一个企业微信机器人。我们可以用它来实现喝水、吃饭提醒等小功能，还能实现定时推送新闻、天气，甚至是监控告警的小功能。</p>\n<h2 id=\"使用企业微信机器人\"><a href=\"#%E4%BD%BF%E7%94%A8%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%9C%BA%E5%99%A8%E4%BA%BA\" aria-label=\"使用企业微信机器人 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>使用企业微信机器人</h2>\n<p>在企业微信中，选择添加机器人：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-1.png\" alt=\"添加机器人\"></p>\n<p>之后，我们可以根据文档进行企业微信机器人的基础功能定制：</p>\n<p>以下是用 curl 工具往群组推送文本消息的示例（注意要将 url 替换成机器人的 webhook 地址，content 必须是 utf8 编码）：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"32418022065465070000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`curl '企业微信机器人地址' \\\n   -H 'Content-Type: application/json' \\\n   -d '\n   {\n        &quot;msgtype&quot;: &quot;text&quot;,\n        &quot;text&quot;: {\n            &quot;content&quot;: &quot;hello world&quot;\n        }\n   }'`, `32418022065465070000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">curl &#39;企业微信机器人地址&#39; \\\n   -H &#39;Content-Type: application/json&#39; \\\n   -d &#39;\n   {\n        &quot;msgtype&quot;: &quot;text&quot;,\n        &quot;text&quot;: {\n            &quot;content&quot;: &quot;hello world&quot;\n        }\n   }&#39;</code></pre></div>\n<p>通过 Python 语言实现：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"77179119789076660000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`url = &quot;&quot;\ndata = {\n    &quot;msgtype&quot;: &quot;markdown&quot;,\n    &quot;markdown&quot;: {\n        &quot;content&quot;: &quot;hello world&quot;,\n    }\n}\ndata = json.dumps(data).encode(&quot;utf-8&quot;)\nreq_attr = urllib.request.Request(url, data)\nresp_attr = urllib.request.urlopen(req_attr)\nreturn_msg = resp_attr.read().decode(&quot;utf-8&quot;)`, `77179119789076660000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\">url <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\ndata <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"msgtype\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"hello world\"</span><span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\ndata <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\nreq_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span>\nresp_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>req_attr<span class=\"token punctuation\">)</span>\nreturn_msg <span class=\"token operator\">=</span> resp_attr<span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>此时，我们可以通过 Serverless Framework 部署一个机器人的基本功能，并且设置好 API 网关触发器：</p>\n<p><code class=\"language-text\">index.py</code> 文件如下：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"58018056738510010000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import os\nimport json\nimport urllib.request\n\ndef main_handler(event, context):\n    url = os.environ.get(&quot;url&quot;)\n    data = {\n        &quot;msgtype&quot;: &quot;markdown&quot;,\n        &quot;markdown&quot;: {\n            &quot;content&quot;: &quot;hello world&quot;,\n        }\n    }\n    data = json.dumps(data).encode(&quot;utf-8&quot;)\n    req_attr = urllib.request.Request(url, data)\n    resp_attr = urllib.request.urlopen(req_attr)\n    return resp_attr.read().decode(&quot;utf-8&quot;)`, `58018056738510010000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> os\n<span class=\"token keyword\">import</span> json\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>request\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    url <span class=\"token operator\">=</span> os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"url\"</span><span class=\"token punctuation\">)</span>\n    data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"msgtype\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"hello world\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    req_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span>\n    resp_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>req_attr<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> resp_attr<span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><code class=\"language-text\">serverless.yaml</code> 文件如下：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"25425880203615450000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`MyRobot_Base:\n  component: '@serverless/tencent-scf'\n  inputs:\n    name: MyRobot_Base\n    runtime: Python3.6\n    timeout: 3\n    codeUri: ./base_robot\n    description: 机器人推送接口\n    region: ap-guangzhou\n    environment:\n      variables:\n        url: webhook地址\n    handler: index.main_handler\n    memorySize: 64\n    tags:\n      app: myrobot\n    events:\n      - apigw:\n          name: MyRobot\n          parameters:\n            protocols:\n              - http\n              - https\n            description: 机器人推送接口\n            environment: release\n            endpoints:\n              - path: /push\n                method: ANY`, `25425880203615450000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">MyRobot_Base</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'@serverless/tencent-scf'</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> MyRobot_Base\n    <span class=\"token key atrule\">runtime</span><span class=\"token punctuation\">:</span> Python3.6\n    <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n    <span class=\"token key atrule\">codeUri</span><span class=\"token punctuation\">:</span> ./base_robot\n    <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> 机器人推送接口\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>guangzhou\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> webhook地址\n    <span class=\"token key atrule\">handler</span><span class=\"token punctuation\">:</span> index.main_handler\n    <span class=\"token key atrule\">memorySize</span><span class=\"token punctuation\">:</span> <span class=\"token number\">64</span>\n    <span class=\"token key atrule\">tags</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> myrobot\n    <span class=\"token key atrule\">events</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">apigw</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> MyRobot\n          <span class=\"token key atrule\">parameters</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">protocols</span><span class=\"token punctuation\">:</span>\n              <span class=\"token punctuation\">-</span> http\n              <span class=\"token punctuation\">-</span> https\n            <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> 机器人推送接口\n            <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span> release\n            <span class=\"token key atrule\">endpoints</span><span class=\"token punctuation\">:</span>\n              <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">path</span><span class=\"token punctuation\">:</span> /push\n                <span class=\"token key atrule\">method</span><span class=\"token punctuation\">:</span> ANY</code></pre></div>\n<p>部署成功之后，可以看到命令行中输出的地址：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-2.png\"></p>\n<p>在浏览器中打开，可以看到企业微信机器人已经被触发了：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-3.png\"></p>\n<p>以上就是一个简单的 <code class=\"language-text\">hello world</code> 功能。接下来，好戏开始！</p>\n<p>我们对这个基础函数进行进一步的改造：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"42966755697772950000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import os\nimport json\nimport urllib.request\n\ndef main_handler(event, context):\n    url = os.environ.get(&quot;url&quot;)\n    data = {\n        &quot;msgtype&quot;: &quot;markdown&quot;,\n        &quot;markdown&quot;: {\n            &quot;content&quot;: event['body'],\n        }\n    }\n    data = json.dumps(data).encode(&quot;utf-8&quot;)\n    req_attr = urllib.request.Request(url, data)\n    resp_attr = urllib.request.urlopen(req_attr)\n    return resp_attr.read().decode(&quot;utf-8&quot;)`, `42966755697772950000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> os\n<span class=\"token keyword\">import</span> json\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>request\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    url <span class=\"token operator\">=</span> os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"url\"</span><span class=\"token punctuation\">)</span>\n    data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"msgtype\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"markdown\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> event<span class=\"token punctuation\">[</span><span class=\"token string\">'body'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    req_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span>\n    resp_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>req_attr<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> resp_attr<span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>通过将 <code class=\"language-text\">data</code> 中的 <code class=\"language-text\">content</code> 字段更改为 <code class=\"language-text\">event[&#39;body&#39;]</code> 可以让其他模块请求该接口，实现机器人推送功能，当然这个基础函数我们还可以进行完善，不仅仅是 <code class=\"language-text\">markdown</code> 格式，封装更多支持的格式：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-4.png\"></p>\n<h2 id=\"机器人功能拓展\"><a href=\"#%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%8A%9F%E8%83%BD%E6%8B%93%E5%B1%95\" aria-label=\"机器人功能拓展 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>机器人功能拓展</h2>\n<h3 id=\"提醒喝水吃饭功能\"><a href=\"#%E6%8F%90%E9%86%92%E5%96%9D%E6%B0%B4%E5%90%83%E9%A5%AD%E5%8A%9F%E8%83%BD\" aria-label=\"提醒喝水吃饭功能 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>提醒喝水/吃饭功能</h3>\n<p>通过定时触发器，访问云函数，可以实现该功能。</p>\n<p>例如 <code class=\"language-text\">index.py</code> 代码：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"49426928881929585000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import os\nimport json\nimport urllib.request\n\ndef main_handler(event, context):\n    url = os.environ.get(&quot;url&quot;)\n    data = &quot;每天都要多喝水哦，不要忘记补充水分&quot;.encode(&quot;utf-8&quot;)\n    req_attr = urllib.request.Request(url, data)\n    resp_attr = urllib.request.urlopen(req_attr)\n    return resp_attr.read().decode(&quot;utf-8&quot;)`, `49426928881929585000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> os\n<span class=\"token keyword\">import</span> json\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>request\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    url <span class=\"token operator\">=</span> os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"url\"</span><span class=\"token punctuation\">)</span>\n    data <span class=\"token operator\">=</span> <span class=\"token string\">\"每天都要多喝水哦，不要忘记补充水分\"</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    req_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span>\n    resp_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>req_attr<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> resp_attr<span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><code class=\"language-text\">serverless.yaml</code>文件：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"18542765198475043000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`MyRobot_Water:\n  component: '@serverless/tencent-scf'\n  inputs:\n    name: MyRobot_Water\n    runtime: Python3.6\n    timeout: 3\n    codeUri: ./water\n    description: 提醒喝水的机器人\n    region: ap-guangzhou\n    environment:\n      variables:\n        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push\n    handler: index.main_handler\n    memorySize: 64\n    tags:\n      app: myrobot\n    events:\n      - timer:\n          name: timer\n          parameters:\n            cronExpression: '0 */30 9-17 * * * *'\n            enable: true`, `18542765198475043000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">MyRobot_Water</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'@serverless/tencent-scf'</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> MyRobot_Water\n    <span class=\"token key atrule\">runtime</span><span class=\"token punctuation\">:</span> Python3.6\n    <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n    <span class=\"token key atrule\">codeUri</span><span class=\"token punctuation\">:</span> ./water\n    <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> 提醒喝水的机器人\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>guangzhou\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//service<span class=\"token punctuation\">-</span>lf3ug84s<span class=\"token punctuation\">-</span>1256773370.gz.apigw.tencentcs.com/release/push\n    <span class=\"token key atrule\">handler</span><span class=\"token punctuation\">:</span> index.main_handler\n    <span class=\"token key atrule\">memorySize</span><span class=\"token punctuation\">:</span> <span class=\"token number\">64</span>\n    <span class=\"token key atrule\">tags</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> myrobot\n    <span class=\"token key atrule\">events</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">timer</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> timer\n          <span class=\"token key atrule\">parameters</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">cronExpression</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'0 */30 9-17 * * * *'</span>\n            <span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></code></pre></div>\n<p>这个函数就是每天上午 9 点到下午 5 点，每 30 分钟提醒喝一次水。</p>\n<h3 id=\"天气预报当地新闻功能\"><a href=\"#%E5%A4%A9%E6%B0%94%E9%A2%84%E6%8A%A5%E5%BD%93%E5%9C%B0%E6%96%B0%E9%97%BB%E5%8A%9F%E8%83%BD\" aria-label=\"天气预报当地新闻功能 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>天气预报/当地新闻功能</h3>\n<p>想要实现天气预报/新闻播报的功能，我们可以通过已有的新闻接口来实现，以腾讯云的云市场为例，寻找一个新闻类 API 接口：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-6.png\"></p>\n<p>根据 API 文档，可以看到请求地址是：<a href=\"https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search\">https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search</a></p>\n<p>Get 方法可以携带一个参数：<code class=\"language-text\">keyword</code>，作为目标的关键词，编写代码：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"7267631394161555000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import ssl, hmac, base64, hashlib, os, json\nfrom datetime import datetime as pydatetime\nfrom urllib.parse import urlencode\nfrom urllib.request import Request, urlopen\n\n\ndef main_handler(event, context):\n    source = &quot;market&quot;\n\n    datetime = pydatetime.utcnow().strftime('%a, %d %b %Y %H:%M:%S GMT')\n    signStr = &quot;x-date: %s\\nx-source: %s&quot; % (datetime, source)\n    sign = base64.b64encode(hmac.new(os.environ.get('secretKey').encode('utf-8'), signStr.encode('utf-8'), hashlib.sha1).digest())\n    auth = 'hmac id=&quot;%s&quot;, algorithm=&quot;hmac-sha1&quot;, headers=&quot;x-date x-source&quot;, signature=&quot;%s&quot;' % (os.environ.get(&quot;secretId&quot;), sign.decode('utf-8'))\n\n    headers = {\n        'X-Source': source,\n        'X-Date': datetime,\n        'Authorization': auth,\n    }\n    queryParams = {'keyword': '科技新闻'}\n    url = 'https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search'\n    if len(queryParams.keys()) > 0:\n        url = url + '?' + urlencode(queryParams)\n\n    content = &quot;&quot;\n    for eve in json.loads(urlopen(Request(url, headers=headers)).read().decode(&quot;utf-8&quot;))[&quot;result&quot;][&quot;list&quot;][0:5]:\n        content = content + &quot;* [%s](%s) \\n&quot;%(eve['title'], eve['url'])\n\n    if content:\n        urlopen(Request(os.environ.get('url'), content.encode(&quot;utf-8&quot;)))`, `7267631394161555000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> ssl<span class=\"token punctuation\">,</span> hmac<span class=\"token punctuation\">,</span> base64<span class=\"token punctuation\">,</span> hashlib<span class=\"token punctuation\">,</span> os<span class=\"token punctuation\">,</span> json\n<span class=\"token keyword\">from</span> datetime <span class=\"token keyword\">import</span> datetime <span class=\"token keyword\">as</span> pydatetime\n<span class=\"token keyword\">from</span> urllib<span class=\"token punctuation\">.</span>parse <span class=\"token keyword\">import</span> urlencode\n<span class=\"token keyword\">from</span> urllib<span class=\"token punctuation\">.</span>request <span class=\"token keyword\">import</span> Request<span class=\"token punctuation\">,</span> urlopen\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    source <span class=\"token operator\">=</span> <span class=\"token string\">\"market\"</span>\n\n    datetime <span class=\"token operator\">=</span> pydatetime<span class=\"token punctuation\">.</span>utcnow<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>strftime<span class=\"token punctuation\">(</span><span class=\"token string\">'%a, %d %b %Y %H:%M:%S GMT'</span><span class=\"token punctuation\">)</span>\n    signStr <span class=\"token operator\">=</span> <span class=\"token string\">\"x-date: %s\\nx-source: %s\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>datetime<span class=\"token punctuation\">,</span> source<span class=\"token punctuation\">)</span>\n    sign <span class=\"token operator\">=</span> base64<span class=\"token punctuation\">.</span>b64encode<span class=\"token punctuation\">(</span>hmac<span class=\"token punctuation\">.</span>new<span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'secretKey'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> signStr<span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> hashlib<span class=\"token punctuation\">.</span>sha1<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>digest<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    auth <span class=\"token operator\">=</span> <span class=\"token string\">'hmac id=\"%s\", algorithm=\"hmac-sha1\", headers=\"x-date x-source\", signature=\"%s\"'</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">\"secretId\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> sign<span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">'utf-8'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n\n    headers <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">'X-Source'</span><span class=\"token punctuation\">:</span> source<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">'X-Date'</span><span class=\"token punctuation\">:</span> datetime<span class=\"token punctuation\">,</span>\n        <span class=\"token string\">'Authorization'</span><span class=\"token punctuation\">:</span> auth<span class=\"token punctuation\">,</span>\n    <span class=\"token punctuation\">}</span>\n    queryParams <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token string\">'keyword'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'科技新闻'</span><span class=\"token punctuation\">}</span>\n    url <span class=\"token operator\">=</span> <span class=\"token string\">'https://service-aqvnjmiq-1257101137.gz.apigw.tencentcs.com/release/news/search'</span>\n    <span class=\"token keyword\">if</span> <span class=\"token builtin\">len</span><span class=\"token punctuation\">(</span>queryParams<span class=\"token punctuation\">.</span>keys<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">></span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        url <span class=\"token operator\">=</span> url <span class=\"token operator\">+</span> <span class=\"token string\">'?'</span> <span class=\"token operator\">+</span> urlencode<span class=\"token punctuation\">(</span>queryParams<span class=\"token punctuation\">)</span>\n\n    content <span class=\"token operator\">=</span> <span class=\"token string\">\"\"</span>\n    <span class=\"token keyword\">for</span> eve <span class=\"token keyword\">in</span> json<span class=\"token punctuation\">.</span>loads<span class=\"token punctuation\">(</span>urlopen<span class=\"token punctuation\">(</span>Request<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">,</span> headers<span class=\"token operator\">=</span>headers<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"result\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"list\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">:</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">:</span>\n        content <span class=\"token operator\">=</span> content <span class=\"token operator\">+</span> <span class=\"token string\">\"* [%s](%s) \\n\"</span><span class=\"token operator\">%</span><span class=\"token punctuation\">(</span>eve<span class=\"token punctuation\">[</span><span class=\"token string\">'title'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> eve<span class=\"token punctuation\">[</span><span class=\"token string\">'url'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span>\n\n    <span class=\"token keyword\">if</span> content<span class=\"token punctuation\">:</span>\n        urlopen<span class=\"token punctuation\">(</span>Request<span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'url'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p><code class=\"language-text\">serverless.yaml</code> 文件：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"97189361596474230000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`MyRobot_News:\n  component: '@serverless/tencent-scf'\n  inputs:\n    name: MyRobot_News\n    runtime: Python3.6\n    timeout: 3\n    codeUri: ./news\n    description: 新闻推送\n    region: ap-guangzhou\n    environment:\n      variables:\n        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push\n        secretId: 云市场密钥信息\n        secretKey: 云市场密钥信息\n    handler: index.main_handler\n    memorySize: 64\n    tags:\n      app: myrobot\n    events:\n      - timer:\n          name: timer\n          parameters:\n            cronExpression: '0 0 */8 * * * *'\n            enable: true`, `97189361596474230000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">MyRobot_News</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'@serverless/tencent-scf'</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> MyRobot_News\n    <span class=\"token key atrule\">runtime</span><span class=\"token punctuation\">:</span> Python3.6\n    <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n    <span class=\"token key atrule\">codeUri</span><span class=\"token punctuation\">:</span> ./news\n    <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> 新闻推送\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>guangzhou\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//service<span class=\"token punctuation\">-</span>lf3ug84s<span class=\"token punctuation\">-</span>1256773370.gz.apigw.tencentcs.com/release/push\n        <span class=\"token key atrule\">secretId</span><span class=\"token punctuation\">:</span> 云市场密钥信息\n        <span class=\"token key atrule\">secretKey</span><span class=\"token punctuation\">:</span> 云市场密钥信息\n    <span class=\"token key atrule\">handler</span><span class=\"token punctuation\">:</span> index.main_handler\n    <span class=\"token key atrule\">memorySize</span><span class=\"token punctuation\">:</span> <span class=\"token number\">64</span>\n    <span class=\"token key atrule\">tags</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> myrobot\n    <span class=\"token key atrule\">events</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">timer</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> timer\n          <span class=\"token key atrule\">parameters</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">cronExpression</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'0 0 */8 * * * *'</span>\n            <span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></code></pre></div>\n<p>运行效果如下，每天早晨 8 点为我们推送当日科技新闻：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-7.png\"></p>\n<h3 id=\"监控告警功能\"><a href=\"#%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6%E5%8A%9F%E8%83%BD\" aria-label=\"监控告警功能 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>监控告警功能</h3>\n<p>我们还可以赋予企业微信机器人监控告警的能力：</p>\n<p><code class=\"language-text\">index.py</code> 文件：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"62484207426701780000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`import os\nimport urllib.request\n\ndef getStatusCode(url):\n    return urllib.request.urlopen(url).getcode()\n\ndef main_handler(event, context):\n    url = &quot;http://www.anycodes.cn&quot;\n    if getStatusCode(url) == 200:\n        print(&quot;您的网站%s可以访问！&quot; % (url))\n    else:\n        urllib.request.urlopen(urllib.request.Request(os.environ.get('url'), (&quot;您的网站%s 不可以访问！&quot; % (url)).encode(&quot;utf-8&quot;)))\n    return None`, `62484207426701780000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token keyword\">import</span> os\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>request\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">getStatusCode</span><span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    <span class=\"token keyword\">return</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>getcode<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span>\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    url <span class=\"token operator\">=</span> <span class=\"token string\">\"http://www.anycodes.cn\"</span>\n    <span class=\"token keyword\">if</span> getStatusCode<span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span> <span class=\"token operator\">==</span> <span class=\"token number\">200</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">print</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"您的网站%s可以访问！\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">else</span><span class=\"token punctuation\">:</span>\n        urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">(</span>os<span class=\"token punctuation\">.</span>environ<span class=\"token punctuation\">.</span>get<span class=\"token punctuation\">(</span><span class=\"token string\">'url'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"您的网站%s 不可以访问！\"</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>url<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">return</span> <span class=\"token boolean\">None</span></code></pre></div>\n<p><code class=\"language-text\">serverless.yaml</code> 文件：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"68476080256729050000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`MyRobot_Monitor:\n  component: '@serverless/tencent-scf'\n  inputs:\n    name: MyRobot_Monitor\n    runtime: Python3.6\n    timeout: 3\n    codeUri: ./monitor\n    description: 网站监控\n    region: ap-guangzhou\n    environment:\n      variables:\n        url: https://service-lf3ug84s-1256773370.gz.apigw.tencentcs.com/release/push\n    handler: index.main_handler\n    memorySize: 64\n    tags:\n      app: myrobot\n    events:\n      - timer:\n          name: timer\n          parameters:\n            cronExpression: '0 */30 * * * * *'\n            enable: true`, `68476080256729050000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"yaml\"><pre class=\"language-yaml\"><code class=\"language-yaml\"><span class=\"token key atrule\">MyRobot_Monitor</span><span class=\"token punctuation\">:</span>\n  <span class=\"token key atrule\">component</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'@serverless/tencent-scf'</span>\n  <span class=\"token key atrule\">inputs</span><span class=\"token punctuation\">:</span>\n    <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> MyRobot_Monitor\n    <span class=\"token key atrule\">runtime</span><span class=\"token punctuation\">:</span> Python3.6\n    <span class=\"token key atrule\">timeout</span><span class=\"token punctuation\">:</span> <span class=\"token number\">3</span>\n    <span class=\"token key atrule\">codeUri</span><span class=\"token punctuation\">:</span> ./monitor\n    <span class=\"token key atrule\">description</span><span class=\"token punctuation\">:</span> 网站监控\n    <span class=\"token key atrule\">region</span><span class=\"token punctuation\">:</span> ap<span class=\"token punctuation\">-</span>guangzhou\n    <span class=\"token key atrule\">environment</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">variables</span><span class=\"token punctuation\">:</span>\n        <span class=\"token key atrule\">url</span><span class=\"token punctuation\">:</span> https<span class=\"token punctuation\">:</span>//service<span class=\"token punctuation\">-</span>lf3ug84s<span class=\"token punctuation\">-</span>1256773370.gz.apigw.tencentcs.com/release/push\n    <span class=\"token key atrule\">handler</span><span class=\"token punctuation\">:</span> index.main_handler\n    <span class=\"token key atrule\">memorySize</span><span class=\"token punctuation\">:</span> <span class=\"token number\">64</span>\n    <span class=\"token key atrule\">tags</span><span class=\"token punctuation\">:</span>\n      <span class=\"token key atrule\">app</span><span class=\"token punctuation\">:</span> myrobot\n    <span class=\"token key atrule\">events</span><span class=\"token punctuation\">:</span>\n      <span class=\"token punctuation\">-</span> <span class=\"token key atrule\">timer</span><span class=\"token punctuation\">:</span>\n          <span class=\"token key atrule\">name</span><span class=\"token punctuation\">:</span> timer\n          <span class=\"token key atrule\">parameters</span><span class=\"token punctuation\">:</span>\n            <span class=\"token key atrule\">cronExpression</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'0 */30 * * * * *'</span>\n            <span class=\"token key atrule\">enable</span><span class=\"token punctuation\">:</span> <span class=\"token boolean important\">true</span></code></pre></div>\n<p>部署完成后，网站的监控脚本就已经启动，每 30 分钟检查一次网站是否可用。如果不可用，则会发送告警：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-8.png\"></p>\n<h2 id=\"思路发散\"><a href=\"#%E6%80%9D%E8%B7%AF%E5%8F%91%E6%95%A3\" aria-label=\"思路发散 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>思路发散</h2>\n<p>企业微信机器人可以通过 Serverless 架构被赋予更多更有趣的功能，那么还有哪些产品可以和 Serverless 架构相结合，变得更有趣呢？</p>\n<p>随着网络技术的不断发展，IoT 技术也逐渐走进了千家万户，无论是扫地机器人、智能窗帘等智能家居，还是智能音箱等娱乐设施，IoT 技术都变得可见可及。</p>\n<p>小爱同学，也能通过 Serverless 架构，快速开发出专属新功能。</p>\n<p>首先我们去「小爱同学」的开放平台注册账号，并且提交认证：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-9.png\"></p>\n<p>接下来对小爱同学的定制化功能进行研究。如图所示，在开发文档中，我们可以看到小爱同学开发者平台为我们提供的能力信息，同样我们也可以查看到 request 以及 response 的详细信息：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-10.png\"></p>\n<p>继续进行项目设计。本文的目标是通过对小爱同学说出「进入云+社区」等关键词，为用户返回腾讯云+社区的最新热门文章的题目和简介。</p>\n<p>整个流程如图所示：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-11.png\" alt=\"系统流程图\"></p>\n<p>函数代码编写：</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"60445623927135640000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"代码复制成功\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`# -*- coding: utf8 -*-\nimport json\nimport logging\nimport urllib.request\nimport urllib.parse\n\nlogging.basicConfig(level=logging.NOTSET)\n\n\ndef main_handler(event, context):\n    host = &quot;https://cloud.tencent.com/&quot;\n    path = &quot;developer/services/ajax/column/article?action=FetchColumnHomeArticleList&quot;\n    json_data = {\n        &quot;action&quot;: &quot;FetchColumnHomeArticleList&quot;,\n        &quot;payload&quot;: {\n            &quot;pageNumber&quot;: 1,\n            &quot;pageSize&quot;: 20,\n            &quot;version&quot;: 1\n        }\n    }\n    data = json.dumps(json_data).encode(&quot;utf-8&quot;)\n    request_attr = urllib.request.Request(url=host + path, data=data)\n    response_attr = urllib.request.urlopen(request_attr).read().decode(&quot;utf-8&quot;)\n    json_resp = json.loads(response_attr)\n    logging.debug(json_resp)\n    temp_str = &quot;文章题目为%s,主要内容是%s&quot;\n    list_data = json_resp[&quot;data&quot;][&quot;list&quot;][0:5]\n    art_list = [temp_str % (eve[&quot;title&quot;], eve[&quot;abstract&quot;]) for eve in list_data]\n    news_str = '''今日腾讯云加社区热门文章如下：%s''' % (&quot;、&quot;.join(art_list))\n    logging.debug(news_str)\n\n    xiaoai_response = {&quot;version&quot;: &quot;1.0&quot;,\n                       &quot;response&quot;: {\n                           &quot;open_mic&quot;: False,\n                           &quot;to_speak&quot;: {\n                               &quot;type&quot;: 0,\n                               &quot;text&quot;: news_str\n                           }\n                       },\n                       &quot;is_session_end&quot;: False\n                       }\n    return xiaoai_response`, `60445623927135640000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                复制代码<svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"python\"><pre class=\"language-python\"><code class=\"language-python\"><span class=\"token comment\"># -*- coding: utf8 -*-</span>\n<span class=\"token keyword\">import</span> json\n<span class=\"token keyword\">import</span> logging\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>request\n<span class=\"token keyword\">import</span> urllib<span class=\"token punctuation\">.</span>parse\n\nlogging<span class=\"token punctuation\">.</span>basicConfig<span class=\"token punctuation\">(</span>level<span class=\"token operator\">=</span>logging<span class=\"token punctuation\">.</span>NOTSET<span class=\"token punctuation\">)</span>\n\n\n<span class=\"token keyword\">def</span> <span class=\"token function\">main_handler</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">,</span> context<span class=\"token punctuation\">)</span><span class=\"token punctuation\">:</span>\n    host <span class=\"token operator\">=</span> <span class=\"token string\">\"https://cloud.tencent.com/\"</span>\n    path <span class=\"token operator\">=</span> <span class=\"token string\">\"developer/services/ajax/column/article?action=FetchColumnHomeArticleList\"</span>\n    json_data <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"action\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"FetchColumnHomeArticleList\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"payload\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"pageNumber\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">1</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"pageSize\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">20</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"version\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">1</span>\n        <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">}</span>\n    data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>dumps<span class=\"token punctuation\">(</span>json_data<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>encode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    request_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>Request<span class=\"token punctuation\">(</span>url<span class=\"token operator\">=</span>host <span class=\"token operator\">+</span> path<span class=\"token punctuation\">,</span> data<span class=\"token operator\">=</span>data<span class=\"token punctuation\">)</span>\n    response_attr <span class=\"token operator\">=</span> urllib<span class=\"token punctuation\">.</span>request<span class=\"token punctuation\">.</span>urlopen<span class=\"token punctuation\">(</span>request_attr<span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>read<span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>decode<span class=\"token punctuation\">(</span><span class=\"token string\">\"utf-8\"</span><span class=\"token punctuation\">)</span>\n    json_resp <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span>loads<span class=\"token punctuation\">(</span>response_attr<span class=\"token punctuation\">)</span>\n    logging<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span>json_resp<span class=\"token punctuation\">)</span>\n    temp_str <span class=\"token operator\">=</span> <span class=\"token string\">\"文章题目为%s,主要内容是%s\"</span>\n    list_data <span class=\"token operator\">=</span> json_resp<span class=\"token punctuation\">[</span><span class=\"token string\">\"data\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">\"list\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">:</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span>\n    art_list <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span>temp_str <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>eve<span class=\"token punctuation\">[</span><span class=\"token string\">\"title\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span> eve<span class=\"token punctuation\">[</span><span class=\"token string\">\"abstract\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span> <span class=\"token keyword\">for</span> eve <span class=\"token keyword\">in</span> list_data<span class=\"token punctuation\">]</span>\n    news_str <span class=\"token operator\">=</span> <span class=\"token triple-quoted-string string\">'''今日腾讯云加社区热门文章如下：%s'''</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span><span class=\"token string\">\"、\"</span><span class=\"token punctuation\">.</span>join<span class=\"token punctuation\">(</span>art_list<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n    logging<span class=\"token punctuation\">.</span>debug<span class=\"token punctuation\">(</span>news_str<span class=\"token punctuation\">)</span>\n\n    xiaoai_response <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"version\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"1.0\"</span><span class=\"token punctuation\">,</span>\n                       <span class=\"token string\">\"response\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n                           <span class=\"token string\">\"open_mic\"</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">False</span><span class=\"token punctuation\">,</span>\n                           <span class=\"token string\">\"to_speak\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n                               <span class=\"token string\">\"type\"</span><span class=\"token punctuation\">:</span> <span class=\"token number\">0</span><span class=\"token punctuation\">,</span>\n                               <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">:</span> news_str\n                           <span class=\"token punctuation\">}</span>\n                       <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n                       <span class=\"token string\">\"is_session_end\"</span><span class=\"token punctuation\">:</span> <span class=\"token boolean\">False</span>\n                       <span class=\"token punctuation\">}</span>\n    <span class=\"token keyword\">return</span> xiaoai_response</code></pre></div>\n<p>完成之后，使用 Serverless Framework 进行部署，绑定 API 网关触发器，通过请求地址可以看到测试结果：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-12.png\"></p>\n<p>可以看到，我们已经获得到目标数据。此时，我们在小爱同学官网，创建技能开发，在填写好和保存好基本信息之后，选择配置服务，填写 HTTPS 中的测试化地址：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-13.png\"></p>\n<p>配置完成之后，开始测试，如下图所示，可以看到，当我们输入预定的命令「打开云加社区」，系统会正确回取到结果信息，并且给我们返回：</p>\n<p><img src=\"https://img.serverlesscloud.cn/202058/2-9-14.png\"></p>\n<p>至此，我们通过 Serverless 架构，成功地为「小爱同学」开发了一项新功能，我们还可以将这个新功能就拿去发布和上线！</p>\n<h2 id=\"总结\"><a href=\"#%E6%80%BB%E7%BB%93\" aria-label=\"总结 permalink\" class=\"anchor\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>总结</h2>\n<p>本文仅仅是一次简单的示范，通过企业微信机器人与 Serverless 架构的结合，用若干代码实现提醒功能、新闻推送功能以及业务监控告警功能。同时我们还发散思维，让小爱同学也拥有了新的能力。</p>\n<p>不难看出，通过 Serverless 架构，我们可以快速为产品增加一些新的功能，赋予新的生机！</p>\n<hr>\n<div id='scf-deploy-iframe-or-md'></div>\n<hr>\n<blockquote>\n<p><strong>传送门：</strong></p>\n<ul>\n<li>GitHub: <a href=\"https://github.com/serverless/serverless/blob/master/README_CN.md\">github.com/serverless</a></li>\n<li>官网：<a href=\"https://serverless.com/\">serverless.com</a></li>\n</ul>\n</blockquote>\n<p>欢迎访问：<a href=\"https://serverlesscloud.cn/\">Serverless 中文网</a>，您可以在 <a href=\"https://serverlesscloud.cn/best-practice\">最佳实践</a> 里体验更多关于 Serverless 应用的开发！</p>","tableOfContents":"<ul>\n<li><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E4%BD%BF%E7%94%A8%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%9C%BA%E5%99%A8%E4%BA%BA\">使用企业微信机器人</a></li>\n<li>\n<p><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E6%9C%BA%E5%99%A8%E4%BA%BA%E5%8A%9F%E8%83%BD%E6%8B%93%E5%B1%95\">机器人功能拓展</a></p>\n<ul>\n<li><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E6%8F%90%E9%86%92%E5%96%9D%E6%B0%B4%E5%90%83%E9%A5%AD%E5%8A%9F%E8%83%BD\">提醒喝水/吃饭功能</a></li>\n<li><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E5%A4%A9%E6%B0%94%E9%A2%84%E6%8A%A5%E5%BD%93%E5%9C%B0%E6%96%B0%E9%97%BB%E5%8A%9F%E8%83%BD\">天气预报/当地新闻功能</a></li>\n<li><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E7%9B%91%E6%8E%A7%E5%91%8A%E8%AD%A6%E5%8A%9F%E8%83%BD\">监控告警功能</a></li>\n</ul>\n</li>\n<li><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E6%80%9D%E8%B7%AF%E5%8F%91%E6%95%A3\">思路发散</a></li>\n<li><a href=\"/best-practice/2020-05-10-enterprise-wechat/#%E6%80%BB%E7%BB%93\">总结</a></li>\n</ul>"},"previousBlog":{"id":"13c6d4ce-80d3-50b2-8670-125074e036ee","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020514/1589461771804-layer.jpg","authors":["Alfred"],"categories":["guides-and-tutorials"],"date":"2020-05-11T00:00:00.000Z","title":"如何借助 Layer 实现云函数快速打包轻松部署","description":"层的功能为依赖库和不经常修改的静态文件提供了新的存储方案，与函数的剥离使得这类文件能够多函数复用，版本化管理；随着层功能的发展，腾讯云 Serverless team 也将进一步拓展层功能的使用","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Serverless","layer"],"keywords":"Serverless 全局变量组件,Serverless 单独部署组件,Serverless Component","outdated":null},"wordCount":{"words":286,"sentences":34,"paragraphs":34},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-05-11-scf-layer-practice.md","fields":{"slug":"/blog/2020-05-11-scf-layer-practice/","keywords":["python","serverless","云函数","函数","绑定","cmq","requests","依赖","代码"]}},"nextBlog":{"id":"2ed40490-e6db-51f2-a0a0-8fa52c3488d7","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020511/1589207418781-ZalNtxgQAC_small.jpg","authors":["Anycodes"],"categories":["best-practice"],"date":"2020-05-09T00:00:00.000Z","title":"Serverless 与 Websocket 的聊天工具","description":"传统业务实现 Websocket 并不难，然而函数计算基本上都是事件驱动，不支持长链接操作。如果将函数计算与 API 网关结合，是否可以有 Websocket 的实现方案呢？","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["Serverless","Websocket"],"keywords":"Serverless 多环境配置,Serverless 管理环境,Serverless配置方案","outdated":true},"wordCount":{"words":263,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/best-practice/2020-05-09-serverless-websocket.md","fields":{"slug":"/best-practice/2020-05-09-serverless-websocket/","keywords":["java","python","serverless","函数计算","云函数","secret","网关","item","客户端","Conf","bucket","retmsg","os"]}}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"e1770fad-8a66-5619-88f6-ef5e50448400","previousBlogId":"13c6d4ce-80d3-50b2-8670-125074e036ee","nextBlogId":"2ed40490-e6db-51f2-a0a0-8fa52c3488d7"}}}