{"componentChunkName":"component---src-templates-blog-detail-tsx","path":"/blog/2020-04-08-Serverless-feishu","result":{"data":{"currentBlog":{"id":"8a1a4c70-1042-5f69-b2dd-6254d859e6a2","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020522/1590171266721-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png","authors":["用户1358150"],"categories":["user-stories"],"date":"2020-04-08T00:00:00.000Z","title":"使用 Serverless + 飞书打造你的个性化消息提醒系统","description":"可以将消息集中起来并且及时推送呢？在这里我想向大家推荐一个解决方案，那就是使用 Serverless + 飞书打造属于自己的个性化消息提醒系统。","authorslink":["https://cloud.tencent.com/developer/article/1610964"],"translators":null,"translatorslink":null,"tags":["Serverless","飞书"],"keywords":"Serverless,飞书,Serverless应用","outdated":true},"wordCount":{"words":208,"sentences":69,"paragraphs":69},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-08-Serverless-feishu.md","fields":{"slug":"/blog/2020-04-08-Serverless-feishu/","keywords":["java","serverless","云函数","serverless","serverlesscloud","点击"]},"html":"<h2 id=\"一、前言\"><a href=\"#%E4%B8%80%E3%80%81%E5%89%8D%E8%A8%80\" 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<ul>\n<li>自己管理的某台服务器宕机了，但是没有得到及时的提醒，导致业务受到损失</li>\n<li>某些自己很想注册的网站悄悄开放注册，但是自己并没有及时得知，于是只能继续漫无目的的等待</li>\n<li>……</li>\n</ul>\n<p>如果每件事都花时间去关注，那我们的时间必然会不够用，那有没有什么办法可以让这些消息<strong>集中</strong>起来并且<strong>及时</strong>推送呢？在这里我想向大家推荐一个解决方案，那就是<strong>使用 Serverless + 飞书打造属于自己的个性化消息提醒系统</strong>。</p>\n<h2 id=\"二、准备工作\"><a href=\"#%E4%BA%8C%E3%80%81%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C\" 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<ol>\n<li>首先注册一个飞书账号，然后在<a href=\"https://www.feishu.cn/\">飞书网页版</a>登录</li>\n<li>打开<a href=\"https://open.feishu.cn/app/\">飞书开放平台</a>，点击<strong>创建企业自建应用</strong>，并输入<strong>应用名称</strong>和<strong>应用副标题</strong>，然后点击<strong>确定创建</strong></li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266341-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"点击创建企业自建应用\"></p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266312-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"输入应用名称和应用副标题，然后点击确定创建\"></p>\n<ol start=\"3\">\n<li>在企业自建应用列表中点击刚刚创建成功的应用，并记录 <strong>App ID</strong> 和 <strong>App Secret</strong></li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266328-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"记录 App ID 和 App Secret\"></p>\n<h2 id=\"二、编写代码\"><a href=\"#%E4%BA%8C%E3%80%81%E7%BC%96%E5%86%99%E4%BB%A3%E7%A0%81\" 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<ol>\n<li>在本地新建一个项目目录，名称随意，这里以 <code class=\"language-text\">feishu-notify</code> 为例</li>\n<li>分别创建 3 个文件：<code class=\"language-text\">.env</code>，<code class=\"language-text\">index.py</code> 和 <code class=\"language-text\">serverless.yml</code></li>\n<li>按如下说明进行编码</li>\n</ol>\n<h3 id=\"env\"><a href=\"#env\" aria-label=\"env 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>.env</h3>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"42274188139465155000\"\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(`TENCENT_SECRET_ID=AKID********************************\nTENCENT_SECRET_KEY=********************************`, `42274188139465155000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token constant\">TENCENT_SECRET_ID</span><span class=\"token operator\">=</span><span class=\"token constant\">AKID</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span>\n<span class=\"token constant\">TENCENT_SECRET_KEY</span><span class=\"token operator\">=</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span><span class=\"token operator\">**</span></code></pre></div>\n<blockquote>\n<p>注：这里的 <code class=\"language-text\">TENCENT_SECRET_ID</code> 和 <code class=\"language-text\">TENCENT_SECRET_KEY</code> 可在腾讯云控制台的<a href=\"https://console.cloud.tencent.com/cam/capi\">访问密钥</a>中获取，如果没有密钥则需要自己新建一个</p>\n</blockquote>\n<h3 id=\"serverlessyml\"><a href=\"#serverlessyml\" aria-label=\"serverlessyml 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>serverless.yml</h3>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"23358226585507170000\"\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(`myFunction:\n  component: &quot;@serverless/tencent-scf&quot;\n  inputs:\n    name: feishu-notify-py\n    codeUri: &quot;./&quot;\n    handler: index.main_handler\n    runtime: Python3.6\n    region: ap-guangzhou\n    description: My Serverless Function Used to Notify Myself\n    memorySize: 128\n    events:\n    - apigw:\n        name: serverless\n        parameters:\n          protocols:\n          - https\n          endpoints:\n          - path: &quot;/&quot;\n            method: POST`, `23358226585507170000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">myFunction<span class=\"token punctuation\">:</span>\n  component<span class=\"token punctuation\">:</span> <span class=\"token string\">\"@serverless/tencent-scf\"</span>\n  inputs<span class=\"token punctuation\">:</span>\n    name<span class=\"token punctuation\">:</span> feishu<span class=\"token operator\">-</span>notify<span class=\"token operator\">-</span>py\n    codeUri<span class=\"token punctuation\">:</span> <span class=\"token string\">\"./\"</span>\n    handler<span class=\"token punctuation\">:</span> index<span class=\"token punctuation\">.</span>main_handler\n    runtime<span class=\"token punctuation\">:</span> Python3<span class=\"token punctuation\">.</span><span class=\"token number\">6</span>\n    region<span class=\"token punctuation\">:</span> ap<span class=\"token operator\">-</span>guangzhou\n    description<span class=\"token punctuation\">:</span> My Serverless Function Used to Notify Myself\n    memorySize<span class=\"token punctuation\">:</span> <span class=\"token number\">128</span>\n    events<span class=\"token punctuation\">:</span>\n    <span class=\"token operator\">-</span> apigw<span class=\"token punctuation\">:</span>\n        name<span class=\"token punctuation\">:</span> serverless\n        parameters<span class=\"token punctuation\">:</span>\n          protocols<span class=\"token punctuation\">:</span>\n          <span class=\"token operator\">-</span> https\n          endpoints<span class=\"token punctuation\">:</span>\n          <span class=\"token operator\">-</span> path<span class=\"token punctuation\">:</span> <span class=\"token string\">\"/\"</span>\n            method<span class=\"token punctuation\">:</span> <span class=\"token constant\">POST</span></code></pre></div>\n<blockquote>\n<p>注：可以点击<a href=\"https://github.com/serverless-components/tencent-scf/blob/master/docs/configure.md\">这里</a>查看<code class=\"language-text\">serverless.yml</code>中所有可用属性的属性列表</p>\n</blockquote>\n<h3 id=\"indexpy\"><a href=\"#indexpy\" aria-label=\"indexpy 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>index.py</h3>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"45485799086813910000\"\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(`def main_handler(event, context):\n    import requests\n    import json\n    print(event)\n    CONFIG = {\n        &quot;app_id&quot;: &quot;********************&quot;,\n        &quot;app_secret&quot;: &quot;********************************&quot;\n    }\n    # my auth\n    if 'myauth' not in event['queryString'] or event['queryString']['myauth'] != 'feishu1':\n        return 'forbidden'\n    # Get content\n    postContent = event['body']\n    try:\n        postContent = json.loads(postContent)\n    except:\n        return 'error in json_loads(line: 19)'\n    if 'content' not in postContent:\n        return 'invalid params'\n    content = postContent['content']\n    # Get tenant_access_token\n    try:\n        res = requests.post('https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/', {\n            &quot;app_id&quot;: CONFIG['app_id'],\n            &quot;app_secret&quot;: CONFIG['app_secret']\n        })\n    except:\n        return 'error in get_tenant_access_token'\n    data = json.loads(res.text)\n    if data['code'] != 0:\n        return data['msg']\n    token = data['tenant_access_token']\n    # Get chat_id\n    try:\n        res = requests.get('https://open.feishu.cn/open-apis/chat/v4/list', headers={\n            'Authorization': 'Bearer %s' % (token)\n        })\n    except:\n        return 'error in get_chat_id'\n    data = json.loads(res.text)\n    if data['code'] != 0:\n        return data['msg']\n    groupList = data['data']['groups']\n    myGroupId = groupList[0]['chat_id']\n    # Send message\n    try:\n        res = requests.post('https://open.feishu.cn/open-apis/message/v4/send/', json={\n            &quot;chat_id&quot;: myGroupId,\n            &quot;msg_type&quot;: &quot;text&quot;,\n            &quot;content&quot;: {\n                &quot;text&quot;: content\n            }\n        }, headers={\n            'Authorization': 'Bearer %s' % (token),\n            'Content-Type': 'application/json'\n        })\n    except:\n        return 'error in send message'\n    data = json.loads(res.text)\n    if data['code'] != 0:\n        return data['msg']\n    return 'success'`, `45485799086813910000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">def <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    <span class=\"token keyword\">import</span> requests\n    <span class=\"token keyword\">import</span> json\n    <span class=\"token function\">print</span><span class=\"token punctuation\">(</span>event<span class=\"token punctuation\">)</span>\n    <span class=\"token constant\">CONFIG</span> <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token string\">\"app_id\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"********************\"</span><span class=\"token punctuation\">,</span>\n        <span class=\"token string\">\"app_secret\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"********************************\"</span>\n    <span class=\"token punctuation\">}</span>\n    # my auth\n    <span class=\"token keyword\">if</span> <span class=\"token string\">'myauth'</span> not <span class=\"token keyword\">in</span> event<span class=\"token punctuation\">[</span><span class=\"token string\">'queryString'</span><span class=\"token punctuation\">]</span> or event<span class=\"token punctuation\">[</span><span class=\"token string\">'queryString'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'myauth'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token string\">'feishu1'</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">'forbidden'</span>\n    # Get content\n    postContent <span class=\"token operator\">=</span> event<span class=\"token punctuation\">[</span><span class=\"token string\">'body'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n        postContent <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">loads</span><span class=\"token punctuation\">(</span>postContent<span class=\"token punctuation\">)</span>\n    except<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">'error in json_loads(line: 19)'</span>\n    <span class=\"token keyword\">if</span> <span class=\"token string\">'content'</span> not <span class=\"token keyword\">in</span> postContent<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">'invalid params'</span>\n    content <span class=\"token operator\">=</span> postContent<span class=\"token punctuation\">[</span><span class=\"token string\">'content'</span><span class=\"token punctuation\">]</span>\n    # Get tenant_access_token\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n        res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/'</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"app_id\"</span><span class=\"token punctuation\">:</span> <span class=\"token constant\">CONFIG</span><span class=\"token punctuation\">[</span><span class=\"token string\">'app_id'</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"app_secret\"</span><span class=\"token punctuation\">:</span> <span class=\"token constant\">CONFIG</span><span class=\"token punctuation\">[</span><span class=\"token string\">'app_secret'</span><span class=\"token punctuation\">]</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    except<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">'error in get_tenant_access_token'</span>\n    data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">loads</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'code'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'msg'</span><span class=\"token punctuation\">]</span>\n    token <span class=\"token operator\">=</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'tenant_access_token'</span><span class=\"token punctuation\">]</span>\n    # Get chat_id\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n        res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span><span class=\"token function\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://open.feishu.cn/open-apis/chat/v4/list'</span><span class=\"token punctuation\">,</span> headers<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">'Authorization'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'Bearer %s'</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    except<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">'error in get_chat_id'</span>\n    data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">loads</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'code'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'msg'</span><span class=\"token punctuation\">]</span>\n    groupList <span class=\"token operator\">=</span> data<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\">'groups'</span><span class=\"token punctuation\">]</span>\n    myGroupId <span class=\"token operator\">=</span> groupList<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">[</span><span class=\"token string\">'chat_id'</span><span class=\"token punctuation\">]</span>\n    # Send message\n    <span class=\"token keyword\">try</span><span class=\"token punctuation\">:</span>\n        res <span class=\"token operator\">=</span> requests<span class=\"token punctuation\">.</span><span class=\"token function\">post</span><span class=\"token punctuation\">(</span><span class=\"token string\">'https://open.feishu.cn/open-apis/message/v4/send/'</span><span class=\"token punctuation\">,</span> json<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">\"chat_id\"</span><span class=\"token punctuation\">:</span> myGroupId<span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"msg_type\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n                <span class=\"token string\">\"text\"</span><span class=\"token punctuation\">:</span> content\n            <span class=\"token punctuation\">}</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> headers<span class=\"token operator\">=</span><span class=\"token punctuation\">{</span>\n            <span class=\"token string\">'Authorization'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'Bearer %s'</span> <span class=\"token operator\">%</span> <span class=\"token punctuation\">(</span>token<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n            <span class=\"token string\">'Content-Type'</span><span class=\"token punctuation\">:</span> <span class=\"token string\">'application/json'</span>\n        <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    except<span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> <span class=\"token string\">'error in send message'</span>\n    data <span class=\"token operator\">=</span> json<span class=\"token punctuation\">.</span><span class=\"token function\">loads</span><span class=\"token punctuation\">(</span>res<span class=\"token punctuation\">.</span>text<span class=\"token punctuation\">)</span>\n    <span class=\"token keyword\">if</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'code'</span><span class=\"token punctuation\">]</span> <span class=\"token operator\">!=</span> <span class=\"token number\">0</span><span class=\"token punctuation\">:</span>\n        <span class=\"token keyword\">return</span> data<span class=\"token punctuation\">[</span><span class=\"token string\">'msg'</span><span class=\"token punctuation\">]</span>\n    <span class=\"token keyword\">return</span> <span class=\"token string\">'success'</span></code></pre></div>\n<p>关于 <code class=\"language-text\">index.py</code>，这里有几点需要作出说明：</p>\n<ol>\n<li>代码中的 <code class=\"language-text\">app_id</code> 和 <code class=\"language-text\">app_secret</code> 项需填写在准备工作记录的 <strong>App ID</strong> 和 <strong>App Secret</strong></li>\n<li>最终我们使用 <code class=\"language-text\">POST</code> 方法发送消息</li>\n<li>在调用时，我们还需要在 <code class=\"language-text\">query</code> 处加上 <code class=\"language-text\">?myauth=feishu1</code>，目的是作简单验证以防止他人发送，例如 <code class=\"language-text\">https://service-********-**********.**.apigw.tencentcs.com/release/?myauth=feishu1</code></li>\n</ol>\n<h2 id=\"三、部署-serverless-服务\"><a href=\"#%E4%B8%89%E3%80%81%E9%83%A8%E7%BD%B2-serverless-%E6%9C%8D%E5%8A%A1\" aria-label=\"三、部署 serverless 服务 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>三、部署 Serverless 服务</h2>\n<ol>\n<li>通过 npm 安装 Serverless</li>\n</ol>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"56621523705037920000\"\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(`\\$ npm install -g serverless`, `56621523705037920000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">$ npm install <span class=\"token operator\">-</span>g serverless</code></pre></div>\n<ol start=\"2\">\n<li>通过<code class=\"language-text\">serverless</code>命令进行部署，并添加<code class=\"language-text\">--debug</code>参数查看部署过程中的信息</li>\n</ol>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"37519225543589970000\"\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(`\\$ serverless --debug`, `37519225543589970000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\">$ serverless <span class=\"token operator\">--</span>debug</code></pre></div>\n<ol start=\"3\">\n<li>从终端获取 API 网关的 URL</li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266346-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"serverless\"></p>\n<p>获取 API 网关的 URL</p>\n<h2 id=\"四、上线应用\"><a href=\"#%E5%9B%9B%E3%80%81%E4%B8%8A%E7%BA%BF%E5%BA%94%E7%94%A8\" 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<ol>\n<li>回到<a href=\"https://open.feishu.cn/app/\">飞书开放平台</a>，在企业自建应用列表中点击刚刚创建成功的应用</li>\n<li>点击<strong>应用功能</strong>-<strong>机器人</strong>，点击<strong>启用机器人</strong></li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266342-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"启用机器人\"></p>\n<ol start=\"3\">\n<li>点击<strong>版本管理与发布</strong>-<strong>创建版本</strong>，参考下图进行配置（先不要点保存）</li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266347-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"创建版本\"></p>\n<ol start=\"4\">\n<li>在<strong>可用性状态</strong>处点击<strong>编辑</strong>，选择所有员工，然后点击<strong>保存</strong></li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171267537-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"配置可用性状态\"></p>\n<ol start=\"5\">\n<li>点击<strong>申请发布</strong></li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171267505-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"申请发布\"></p>\n<ol start=\"6\">\n<li>点击飞书网页版的头像，进入飞书管理后台</li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266679-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"进入管理后台\"></p>\n<ol start=\"7\">\n<li>点击<strong>工作台</strong>-<strong>应用审核</strong>，然后点击<strong>审核</strong></li>\n</ol>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266665-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"审核应用\"></p>\n<ol start=\"8\">\n<li>点击<strong>通过</strong></li>\n</ol>\n<h2 id=\"五、调用接口\"><a href=\"#%E4%BA%94%E3%80%81%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%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><strong>请求方式：</strong> POST</p>\n<p><strong>请求地址：</strong> 上面获取的 APIGateway 的 URL</p>\n<p><strong>请求 Header：</strong></p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">参数</th>\n<th align=\"left\">类型</th>\n<th align=\"left\">必填/选填</th>\n<th align=\"left\">说明</th>\n<th align=\"left\">默认值</th>\n<th align=\"left\">实例</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\">Content-Type</td>\n<td align=\"left\">string</td>\n<td align=\"left\">必填</td>\n<td align=\"left\">Content-Type</td>\n<td align=\"left\"></td>\n<td align=\"left\">application/json</td>\n</tr>\n</tbody>\n</table>\n<p><strong>请求 Query：</strong></p>\n<table>\n<thead>\n<tr>\n<th align=\"left\">参数</th>\n<th align=\"left\">类型</th>\n<th align=\"left\">必填/选填</th>\n<th align=\"left\">说明</th>\n<th align=\"left\">默认值</th>\n<th align=\"left\">实例</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td align=\"left\">myauth</td>\n<td align=\"left\">string</td>\n<td align=\"left\">必填</td>\n<td align=\"left\">简单验证</td>\n<td align=\"left\"></td>\n<td align=\"left\">feishu1</td>\n</tr>\n</tbody>\n</table>\n<p><strong>请求 Body：</strong></p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"89104952619935190000\"\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(`{\n    &quot;content&quot;: &quot;这里填入你想要发送的信息&quot;\n}`, `89104952619935190000`)\"\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=\"javascript\"><pre class=\"language-javascript\"><code class=\"language-javascript\"><span class=\"token punctuation\">{</span>\n    <span class=\"token string\">\"content\"</span><span class=\"token punctuation\">:</span> <span class=\"token string\">\"这里填入你想要发送的信息\"</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<h2 id=\"六、效果\"><a href=\"#%E5%85%AD%E3%80%81%E6%95%88%E6%9E%9C\" 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>为了方便，这里使用 Chrome 浏览器插件 <strong>Talend API Tester</strong> 进行调用</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171267436-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"使用 Talend API Tester 调用接口\"></p>\n<p>可以看到，飞书的消息推送很及时</p>\n<p><img src=\"https://img.serverlesscloud.cn/2020522/1590171266721-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901711409297.png\" alt=\"电脑端效果\"></p>\n<h2 id=\"七、结语\"><a href=\"#%E4%B8%83%E3%80%81%E7%BB%93%E8%AF%AD\" 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<ul>\n<li>腾讯云云函数（SCF）文档：<a href=\"https://cloud.tencent.com/document/product/583?from=10680\">https://cloud.tencent.com/document/product/583</a></li>\n<li>腾讯云 Serverless Framework 文档：<a href=\"https://cloud.tencent.com/document/product/1154?from=10680\">https://cloud.tencent.com/document/product/1154</a></li>\n<li>腾讯云 API 网关文档：<a href=\"https://cloud.tencent.com/document/product/628?from=10680\">https://cloud.tencent.com/document/product/628</a></li>\n<li>飞书开放平台开发文档：<a href=\"https://open.feishu.cn/document/\">https://open.feishu.cn/document/</a></li>\n</ul>\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=\"/blog/2020-04-08-Serverless-feishu/#%E4%B8%80%E3%80%81%E5%89%8D%E8%A8%80\">一、前言</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#%E4%BA%8C%E3%80%81%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C\">二、准备工作</a></li>\n<li>\n<p><a href=\"/blog/2020-04-08-Serverless-feishu/#%E4%BA%8C%E3%80%81%E7%BC%96%E5%86%99%E4%BB%A3%E7%A0%81\">二、编写代码</a></p>\n<ul>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#env\">.env</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#serverlessyml\">serverless.yml</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#indexpy\">index.py</a></li>\n</ul>\n</li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#%E4%B8%89%E3%80%81%E9%83%A8%E7%BD%B2-serverless-%E6%9C%8D%E5%8A%A1\">三、部署 Serverless 服务</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#%E5%9B%9B%E3%80%81%E4%B8%8A%E7%BA%BF%E5%BA%94%E7%94%A8\">四、上线应用</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#%E4%BA%94%E3%80%81%E8%B0%83%E7%94%A8%E6%8E%A5%E5%8F%A3\">五、调用接口</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#%E5%85%AD%E3%80%81%E6%95%88%E6%9E%9C\">六、效果</a></li>\n<li><a href=\"/blog/2020-04-08-Serverless-feishu/#%E4%B8%83%E3%80%81%E7%BB%93%E8%AF%AD\">七、结语</a></li>\n</ul>"},"previousBlog":{"id":"289c1d4d-1c87-50d3-8d31-d66dab070c24","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/202049/1586404016355-fengmian.jpg","authors":["serverless 社区"],"categories":["news"],"date":"2020-04-08T00:00:00.000Z","title":"腾讯云 Serverless Framework 正式发布公告","description":"今天，我们很高兴地宣布，腾讯云 Serverless Framework 已正式发布。这是由腾讯云提供的专为中国开发人员定制的 Serverless Framework 版本。","authorslink":null,"translators":null,"translatorslink":null,"tags":["Serverless","Meetup"],"keywords":"Serverless 发布动态,Serverless 发布,Serverless 功能,Serverless 特性","outdated":null},"wordCount":{"words":123,"sentences":21,"paragraphs":21},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-07-sfga.md","fields":{"slug":"/blog/2020-04-07-sfga/","keywords":["serverless","Serverless","开发人员","Framework","实时","腾讯","开发","部署","serverless"]}},"nextBlog":{"id":"8cb2fb27-5998-546f-88c8-35458216d90d","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020522/1590169274977-%E4%BC%81%E4%B8%9A%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_15901691298526.png","authors":["StatLee"],"categories":["user-stories"],"date":"2020-04-05T00:00:00.000Z","title":"使用 ServerLess 实现云原生","description":"今天来聊聊 ServerLess，也就是所谓的 FaaS，笔者有幸经历了 IaaS (OS)、CaaS (Container)，在这两年又听到了 FaaS (Funtion)，这也是运维开发领域里的第三个阶段了吧，今天我将从一个不懂得开发的系统工程师视角尝试诠释这个概念。","authorslink":["https://cloud.tencent.com/developer/article/1609585"],"translators":null,"translatorslink":null,"tags":["Serverless","云原生"],"keywords":"Serverless,Serverless网站,Serverless云原生","outdated":null},"wordCount":{"words":299,"sentences":38,"paragraphs":38},"fileAbsolutePath":"/opt/build/repo/content/blog/2020-04-05-serverLess-api-cloudnative.md","fields":{"slug":"/blog/2020-04-05-serverLess-api-cloudnative/","keywords":["go","python","serverless","云函数","ServerLess","serverless","serverlesscloud","Function"]}},"recommendBlogs":{"edges":[{"node":{"id":"4300b21c-7209-5256-86ff-0d38e3daec9b","frontmatter":{"thumbnail":"https://main.qcloudimg.com/raw/14f1c8eed372e76c1b139703b2f6d0fa.jpg","authors":["KieranMcCarthy"],"categories":["user-stories","engineering-culture"],"date":"2018-01-09T00:00:00.000Z","title":"我是如何在四年时间里，从厨师转行为 Serverless 应用开发者","description":"我是厨师出身，现在成为了一名 Serverless 应用开发者。","authorslink":["https://serverless.com/author/kieranmccarthy/"],"translators":["Aceyclee"],"translatorslink":["https://www.zhihu.com/people/Aceyclee"],"tags":["应用开发","Serverless"],"keywords":"Serverless 应用开发,Serverless 管理,厨师转行为 Serverless 应用开发者","outdated":null},"wordCount":{"words":285,"sentences":38,"paragraphs":36},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years.md","fields":{"slug":"/blog/2018-01-09-from-chef-to-serverless-developer-in-4-years/","keywords":["无服务器","无服务器开发","云函数","学习","Serverless","构建","Framework","开发者","服务器","应用","学位","简历"]}}},{"node":{"id":"713a0563-4bf9-5721-bacb-3b4ef609fe4a","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/camp-fire/camp-fire-housing-thumb.jpg","authors":["EricWyne"],"categories":["guides-and-tutorials","user-stories"],"date":"2018-12-05T00:00:00.000Z","title":"Serverless Twitter 机器人帮助为坎普山火受灾者安置住房","description":"加利福尼亚州的坎普山火致使数千人流离失所，为此，我构建了一个简单的 Serverless Twitter 机器人来帮助将受灾者安置在临时住房！","authorslink":["https://serverless.com/author/ericwyne/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":157,"sentences":26,"paragraphs":26},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-05-serverless-twitter-camp-fire.md","fields":{"slug":"/blog/2018-12-05-serverless-twitter-camp-fire/","keywords":["serverless","无服务器","云函数","Serverless","org","住房","Twitter","函数","受灾","机器人","山火"]}}},{"node":{"id":"98602143-b837-5f50-a24f-3b1ec76044d7","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/sqquid/sqquid-serverless-thumb.jpg","authors":["RonPeled"],"categories":["user-stories"],"date":"2018-12-17T00:00:00.000Z","title":"SQQUID：100% 无服务器初创公司","description":"SQQUID 将 AWS Lambda 和无服务器框架用于其核心产品和营销网站。我们来看看一个完全无服务器的初创公司是怎样的。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":266,"sentences":42,"paragraphs":42},"fileAbsolutePath":"/opt/build/repo/content/blog/2018-12-17-sqquid-one-hundred-percent-serverless.md","fields":{"slug":"/blog/2018-12-17-sqquid-one-hundred-percent-serverless/","keywords":["go","serverless","无服务器","无服务器架构","服务器","架构","Lambda","集成","FaaS","串行","系统"]}}},{"node":{"id":"29dc2e58-d2ba-56f9-aee1-d21b0bc62e0e","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/ao-com-story/ao-serverless-thumbnail.png","authors":["NickGottlieb"],"categories":["user-stories"],"date":"2019-04-24T00:00:00.000Z","title":"AO.com：逐渐转向无服务器优先","description":"AO.com 的 SCV 团队率先尝试无服务器服务。折服于无服务器框架的快速周转时间和低维护成本，整个团队逐渐转向无服务器优先。","authorslink":null,"translators":null,"translatorslink":null,"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":236,"sentences":42,"paragraphs":35},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-04-24-ao-serverless-first.md","fields":{"slug":"/blog/2019-04-24-ao-serverless-first/","keywords":["serverless","无服务器","服务器","团队","Lambda","功能","构建"]}}},{"node":{"id":"752d08d1-387a-5bde-acf3-98141baab294","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020414/1586871710979-%E5%85%AC%E5%85%B1%E7%94%A8.png","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-06-20T00:00:00.000Z","title":"如何用 Serverless 为 Python 云函数打包依赖","description":"在使用无服务器云函数SCF时通常会遇到导入第三方库的问题，很多小伙伴比较头疼是：应该如何打包进去？这里，推荐几个不错的方法。","authorslink":["https://zhuanlan.zhihu.com/ServerlessGo"],"translators":null,"translatorslink":null,"tags":["云函数","Serverless"],"keywords":"Serverless,Serverless应用,无服务器云函数","outdated":null},"wordCount":{"words":81,"sentences":43,"paragraphs":43},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-06-20-for-python-cloud-functions.md","fields":{"slug":"/blog/2019-06-20-for-python-cloud-functions/","keywords":["java","serverless","无服务器","无服务器云函数","云函数","serverlesscloud","安装","serverless","pillowtest"]}}},{"node":{"id":"2dc78814-9d77-555b-a1bb-ad202c8ec2d1","frontmatter":{"thumbnail":"https://s3-us-west-2.amazonaws.com/assets.blog.serverless.com/cloudforecast/thumbnail.png","authors":["FrancoisLagier"],"categories":["user-stories"],"date":"2019-08-07T00:00:00.000Z","title":"Serverless：初创企业的理想选择？（CloudForecast 案例分析）","description":"CloudForecast 是 2018 年成立的一家独立初创企业，本文将介绍他们决定选择 Serverless 的原因。","authorslink":["https://serverless.com/author/francoislagier/"],"translators":["Aceyclee"],"translatorslink":["zhihu.com/people/Aceyclee"],"tags":null,"keywords":null,"outdated":null},"wordCount":{"words":211,"sentences":29,"paragraphs":29},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-08-07-serverless-for-startups.md","fields":{"slug":"/blog/2019-08-07-serverless-for-startups/","keywords":["serverless","云函数","serverless","函数","Serverless","utm","Framework","blog","CloudForecast","cloudforecast"]}}},{"node":{"id":"97450b07-658b-5207-8216-1c7b9b51b115","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578988490344-v2-8b2cd2c5275aa2c5a3c5083a148a7a9f_1200x500.jpg","authors":["Anycodes"],"categories":["user-stories"],"date":"2019-09-01T00:00:00.000Z","title":"如何通过 Serverless 与自然语言处理，让搜索引擎「看」到你的博客","description":"Serverless 与自然语言处理结合的一个小应用","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["个人博客","serverless"],"keywords":"Serverless 自然语言处理","outdated":null},"wordCount":{"words":106,"sentences":34,"paragraphs":34},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-01-search-engine-blog.md","fields":{"slug":"/blog/2019-09-01-search-engine-blog/","keywords":["serverless","云函数","keywords","serverlesscloud","summary"]}}},{"node":{"id":"ae4fd2f8-515c-5aec-b584-38427ef33f7e","frontmatter":{"thumbnail":"https://img.serverlesscloud.cn/2020114/1578989800047-part-00492-780.jpg","authors":["Anycodes"],"categories":["guides-and-tutorials","user-stories"],"date":"2019-09-16T00:00:00.000Z","title":"突破传统 OJ 瓶颈，「判题姬」接入云函数","description":"通过 Serverless 实现在线编程","authorslink":["https://www.zhihu.com/people/liuyu-43-97"],"translators":null,"translatorslink":null,"tags":["在线编程","云函数"],"keywords":"Serverless 在线编程,Serverless OJ","outdated":null},"wordCount":{"words":169,"sentences":30,"paragraphs":30},"fileAbsolutePath":"/opt/build/repo/content/blog/2019-09-16-online-Judge.md","fields":{"slug":"/blog/2019-09-16-online-Judge/","keywords":["python","serverless","云函数","代码","函数","serverless"]}}}],"totalCount":64}},"pageContext":{"isCreatedByStatefulCreatePages":false,"blogId":"8a1a4c70-1042-5f69-b2dd-6254d859e6a2","previousBlogId":"289c1d4d-1c87-50d3-8d31-d66dab070c24","nextBlogId":"8cb2fb27-5998-546f-88c8-35458216d90d","categories":["user-stories"]}}}