一般来说,想给微信公众号增加更多的功能,需要有一台服务器,来进行公众号后台服务的搭建。那么在 Serverless 架构下,是否有更简便的方法来实现这么一个公众号后台呢?我们试试?

初步搭建

Serverless 原生开发

首先我们当然要有一个微信公众号!

接下来,我们要为我们的函数计算服务申请固定 IP:

点击白名单之后,我们可以填写表单,完成固定公网出口 IP 的申请。

接下来进行代码开发。

  1. 将函数绑定到公众号后台,参考文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html 我们可以先在函数中按照文档完成一个基本的鉴定功能:
def checkSignature(param):'''文档地址:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html:param param::return:'''signature = param['signature']timestamp = param['timestamp']nonce = param["nonce"]tmparr = [wxtoken, timestamp, nonce]tmparr.sort()tmpstr = ''.join(tmparr)tmpstr = hashlib.sha1(tmpstr.encode("utf-8")).hexdigest()return tmpstr == signature

再定义一个基本的回复方法:

def response(body, status=200):return {"isBase64Encoded": False,"statusCode": status,"headers": {"Content-Type": "text/html"},"body": body}

然后在函数入口处:

def main_handler(event, context):    if 'echostr' in event['queryString']:  # 接入时的校验return response(event['queryString']['echostr'] if checkSignature(event['queryString']) else False)

配置我们 Yaml:

# serverless.yml
Weixin_GoServerless:component: "@serverless/tencent-scf"inputs:name: Weixin_GoServerlesscodeUri: ./Adminhandler: index.main_handlerruntime: Python3.6region: ap-shanghaidescription: 微信公众号后台服务器配置memorySize: 128timeout: 20environment:variables:wxtoken: 自定义一个字符串appid: 暂时不写secret: 暂时不写events:- apigw:name: Weixin_GoServerlessparameters:protocols:- httpsenvironment: releaseendpoints:- path: /method: ANYfunction:isIntegratedResponse: TRUE

执行代码,完成部署:

接下来在公众号后台,选择基本配置:

选择修改配置:

这里要注意:

  • URL,写我们刚才部署完成返回给我们的地址,并且在最后加一个 /

  • Token,写我们 Yaml 中的 wxtoken,两个地方要保持一样的字符串

  • EncodingAESKey,可以点击随机生成

  • 消息加密方法可以选择明文

完成之后,我们可以点击提交:

看到提交成功,就说明我们已经完成了第一步骤的绑定。接下来,我们到函数的后台:

打开固定出口 IP,看到 IP 地址之后,复制 IP 地址:

点击查看->修改,并将 IP 地址复制粘贴进来,保存。
同时我们查看开发者 ID 和密码:

并将这两个内容复制粘贴,放到我们环境变量中:

至此,我们完成了一个公众号后台服务的绑定。

为了方便之后的操作,先获取一下全局变量:

wxtoken = os.environ.get('wxtoken')
appid = os.environ.get('appid')
secret = os.environ.get('secret')
  1. 接下来对各个模块进行编辑(本文只提供部分简单基础的模块,更多功能实现可以参考微信公众号文档实现)
  • 获取 AccessToken 模块:
def getAccessToken():'''文档地址:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html正常返回:{"access_token":"ACCESS_TOKEN","expires_in":7200}异常返回:{"errcode":40013,"errmsg":"invalid appid"}:return:'''url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (appid, secret)accessToken = json.loads(urllib.request.urlopen(url).read().decode("utf-8"))print(accessToken)return None if "errcode" in accessToken else accessToken["access_token"]
  • 创建自定义菜单模块:
def setMenu(menu):'''文档地址:https://developers.weixin.qq.com/doc/offiaccount/Custom_Menus/Creating_Custom-Defined_Menu.html正确返回:{"errcode":0,"errmsg":"ok"}异常返回:{"errcode":40018,"errmsg":"invalid button name size"}:return:'''accessToken = getAccessToken()if not accessToken:return "Get Access Token Error"url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s" % accessTokenpostData = urllib.parse.urlencode(menu).encode("utf-8")requestAttr = urllib.request.Request(url=url, data=postData)responseAttr = urllib.request.urlopen(requestAttr)responseData = json.loads(responseAttr.read())return responseData['errmsg'] if "errcode" in responseData else "success"
  • 常见消息回复模块:
def textXML(body, event):''':param body: {"msg": "test"}msg: 必填,回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示):param event::return:'''return """<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]></FromUserName><CreateTime>{time}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{msg}]]></Content></xml>""".format(toUser=event["FromUserName"],fromUser=event["ToUserName"],time=int(time.time()),msg=body["msg"])def pictureXML(body, event):''':param body:  {"media_id": 123}media_id: 必填,通过素材管理中的接口上传多媒体文件,得到的id。:param event::return:'''return """<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]]></FromUserName><CreateTime>{time}</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[{media_id}]]></MediaId></Image></xml>""".format(toUser=event["FromUserName"],fromUser=event["ToUserName"],time=int(time.time()),media_id=body["media_id"])def voiceXML(body, event):''':param body: {"media_id": 123}media_id: 必填,通过素材管理中的接口上传多媒体文件,得到的id:param event::return:'''return """<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]></FromUserName><CreateTime>{time}</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[{media_id}]]></MediaId></Voice></xml>""".format(toUser=event["FromUserName"],fromUser=event["ToUserName"],time=int(time.time()),media_id=body["media_id"])def videoXML(body, event):''':param body: {"media_id": 123, "title": "test", "description": "test}media_id: 必填,通过素材管理中的接口上传多媒体文件,得到的idtitle::选填,视频消息的标题description:选填,视频消息的描述:param event::return:'''return """<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]></FromUserName><CreateTime>{time}</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[{media_id}]]></MediaId><Title><![CDATA[{title}]]></Title><Description><![CDATA[{description}]]></Description></Video></xml>""".format(toUser=event["FromUserName"],fromUser=event["ToUserName"],time=int(time.time()),media_id=body["media_id"],title=body.get('title', ''),description=body.get('description', ''))def musicXML(body, event):''':param body:  {"media_id": 123, "title": "test", "description": "test}media_id:必填,缩略图的媒体id,通过素材管理中的接口上传多媒体文件,得到的idtitle:选填,音乐标题description:选填,音乐描述url:选填,音乐链接hq_url:选填,高质量音乐链接,WIFI环境优先使用该链接播放音乐:param event::return:'''return """<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]></FromUserName><CreateTime>{time}</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[{title}]]></Title><Description><![CDATA[{description}]]></Description><MusicUrl><![CDATA[{url}]]></MusicUrl><HQMusicUrl><![CDATA[{hq_url}]]></HQMusicUrl><ThumbMediaId><![CDATA[{media_id}]]></ThumbMediaId></Music></xml>""".format(toUser=event["FromUserName"],fromUser=event["ToUserName"],time=int(time.time()),media_id=body["media_id"],title=body.get('title', ''),url=body.get('url', ''),hq_url=body.get('hq_url', ''),description=body.get('description', ''))def articlesXML(body, event):''':param body: 一个list [{"title":"test", "description": "test", "picUrl": "test", "url": "test"}]title:必填,图文消息标题description:必填,图文消息描述picUrl:必填,图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200url:必填,点击图文消息跳转链接:param event::return:'''if len(body["articles"]) > 8:  # 最多只允许返回8个body["articles"] = body["articles"][0:8]tempArticle = """<item><Title><![CDATA[{title}]]></Title><Description><![CDATA[{description}]]></Description><PicUrl><![CDATA[{picurl}]]></PicUrl><Url><![CDATA[{url}]]></Url></item>"""return """<xml><ToUserName><![CDATA[{toUser}]]></ToUserName><FromUserName><![CDATA[{fromUser}]]></FromUserName><CreateTime>{time}</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>{count}</ArticleCount><Articles>{articles}</Articles></xml>""".format(toUser=event["FromUserName"],fromUser=event["ToUserName"],time=int(time.time()),count=len(body["articles"]),articles="".join([tempArticle.format(title=eveArticle['title'],description=eveArticle['description'],picurl=eveArticle['picurl'],url=eveArticle['url']) for eveArticle in body["articles"]]))
  • 对 main_handler 进行修改,使其:

    • 识别绑定功能

    • 识别基本信息

    • 识别特殊额外请求(例如通过url触发自定义菜单的更新)

整体代码:

def main_handler(event, context):print('event: ', event)if event["path"] == '/setMenu':  # 设置菜单接口menu = {"button": [{"type": "view","name": "精彩文章","url": "https://mp.weixin.qq.com/mp/homepage?__biz=Mzg2NzE4MDExNw==&hid=2&sn=168bd0620ee79cd35d0a80cddb9f2487"},{"type": "view","name": "开源项目","url": "https://mp.weixin.qq.com/mp/homepage?__biz=Mzg2NzE4MDExNw==&hid=1&sn=69444401c5ed9746aeb1384fa6a9a201"},{"type": "miniprogram","name": "在线编程","appid": "wx453cb539f9f963b2","pagepath": "/page/index"}]}return response(setMenu(menu))if 'echostr' in event['queryString']:  # 接入时的校验return response(event['queryString']['echostr'] if checkSignature(event['queryString']) else False)else:  # 用户消息/事件event = getEvent(event)if event["MsgType"] == "text":# 文本消息return response(body=textXML({"msg": "这是一个文本消息"}, event))elif event["MsgType"] == "image":# 图片消息return response(body=textXML({"msg": "这是一个图片消息"}, event))elif event["MsgType"] == "voice":# 语音消息passelif event["MsgType"] == "video":# 视频消息passelif event["MsgType"] == "shortvideo":# 小视频消息passelif event["MsgType"] == "location":# 地理位置消息passelif event["MsgType"] == "link":# 链接消息passelif event["MsgType"] == "event":# 事件消息if event["Event"] == "subscribe":# 订阅事件if event.get('EventKey', None):# 用户未关注时,进行关注后的事件推送(带参数的二维码)passelse:# 普通关注passelif event["Event"] == "unsubscribe":# 取消订阅事件passelif event["Event"] == "SCAN":# 用户已关注时的事件推送(带参数的二维码)passelif event["Event"] == "LOCATION":# 上报地理位置事件passelif event["Event"] == "CLICK":# 点击菜单拉取消息时的事件推送passelif event["Event"] == "VIEW":# 点击菜单跳转链接时的事件推送pass

在上述代码中可以看到:

if event["MsgType"] == "text":# 文本消息return response(body=textXML({"msg": "这是一个文本消息"}, event))
elif event["MsgType"] == "image":# 图片消息return response(body=textXML({"msg": "这是一个图片消息"}, event))

这里就是说,当用户发送了文本消息时候,我们给用户回复一个文本消息:这是一个文本消息。当用户发送了一个图片,我们给用户返回这是一个图片消息,用这两个功能测试我们这个后台的连通性:

可以看到,系统已经可以正常返回。

有人问了,这样一个简单的 Demo 有什么意义呢?可以告诉大家,我们可以很轻量地通过一个函数来实现微信公众号的后端服务;这里都是基础能力,我们可以在这个基础能力之上,尽情添加创新力,例如:

  1. 用户传过来的是图片消息,我们可以通过一些识图 API 告诉用户这个图片包括了什么?

  2. 用户传过来的是文字消息,我们可以先设定一些帮助信息/检索信息进行对比,如果没找到就给用户开启聊天功能(这里涉及到人工智能中的自然语言处理,例如文本相似度检测)

  3. 如果用户发送的是语音,我们还可以将其转成文本,生成对话消息,然后再转换成语音返回给用户

  4. 如果用户发送了地理位置信息,我们可以返回用户所在经纬度的街景信息,或者周边生活服务信息等

  5. 留给大家想象!

使用 Werobot 框架

上面的方法,是通过 Serverless 原生开发的方法进行对接。除此之外,我们还可以选择一些已有的框架,例如werobot等。

WeRoBot 是一个微信公众号开发框架。通过 Serverless Component 中的tencent-werobot组件快速部署该框架:

Weixin_Werobot:component: "@serverless/tencent-werobot"inputs:functionName: Weixin_Werobotcode: ./testwerobotProjectName: appwerobotAttrName: robotfunctionConf:timeout: 10memorySize: 256environment:variables:wxtoken: 你的tokenapigatewayConf:protocols:- httpenvironment: release

然后新建代码:

import os
import werobotrobot = werobot.WeRoBot(token=os.environ.get('wxtoken'))robot.config['SESSION_STORAGE'] = False
robot.config["APP_ID"] = os.environ.get('appid')
robot.config["APP_SECRET"] = os.environ.get('secret')# @robot.handler 处理所有消息
@robot.handler
def hello(message):return 'Hello World!'if __name__ == "__main__":# 让服务器监听在 0.0.0.0:80robot.config['HOST'] = '0.0.0.0'robot.config['PORT'] = 80robot.run()

并且在本地安装 werobot 相关依赖,完成之后,执行部署:

将下面的这个地址复制到公众号后台,开启调用即可。

参考 Git:https://github.com/serverless-tencent/tencent-werobot
这里需要注意的是,我们一定要关掉 Session 或者将 Session 改成云数据库,不能使用本地文件等,例如关闭 Session 配置:

robot.config['SESSION_STORAGE'] = False

文本相似度实现图文检索

有时候用户不知道我们发了什么文章,也不清楚每个文章具体内容,他可能只需要简单的关键词,来看一下这个公众号是否有他想要的东西。

例如他搜索:如何上传文件?或者搜索:如何开发Component?而图文检索功能就可以快速把最相关的历史文章推送给用户,这将会是很方便的一件事情。效果图如下:

通过简单的问题描述,找到目标结果,这就是我们做的文章搜索功能。当然,我们还可以把它拓展成「客服系统」,这是后话了。

回到正题,我们在之前的代码基础上,新增两个函数:

  • 函数 1:索引建立函数

主要功能:通过触发该函数,可以将现有的公众号数据进行整理,并且建立适当的索引文件,存储到 COS 中。


# -*- coding: utf8 -*-
import os
import re
import json
import random
from snownlp import SnowNLP
from qcloud_cos_v5 import CosConfig
from qcloud_cos_v5 import CosS3Clientbucket = os.environ.get('bucket')
secret_id = os.environ.get('secret_id')
secret_key = os.environ.get('secret_key')
region = os.environ.get('region')
client = CosS3Client(CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key))def main_handler(event, context):response = client.get_object(Bucket=bucket,Key=event["key"],)response['Body'].get_stream_to_file('/tmp/output.txt')with open('/tmp/output.txt') as f:data = json.loads(f.read())articlesIndex = []articles = {}tempContentList = ["_", "&nbsp;",]for eveItem in data:for i in range(0, len(eveItem['content']['news_item'])):content = eveItem['content']['news_item'][i]['content']content = re.sub(r'<code(.*?)</code>', '_', content)content = re.sub(r'<.*?>', '', content)for eve in tempContentList:content = content.replace(eve, "")desc = "%s。%s。%s" % (eveItem['content']['news_item'][i]['title'],eveItem['content']['news_item'][i]['digest'],"。".join(SnowNLP(content).summary(3)))tempKey = "".join(random.sample('zyxwvutsrqponmlkjihgfedcba', 5))articlesIndex.append({"media_id": tempKey,"description": desc})articles[tempKey] = eveItem['content']['news_item'][i]client.put_object(Bucket=bucket,Body=json.dumps(articlesIndex).encode("utf-8"),Key=event['index_key'],EnableMD5=False)client.put_object(Bucket=bucket,Body=json.dumps(articles).encode("utf-8"),Key=event['key'],EnableMD5=False)

这一部分,可能定制化比较多一些。首先是 tempContentList 变量,这里可以写上一些公众号中可能出现但不重要的话,例如公众号末尾的引导关注文案,这些文案一般不参与搜索,所以最好在建立索引的时候进行替换去除。然后我们还通过上述代码去掉了 code 标签里面的内容,因为代码也会影响结果。同时我还去掉了 html 标签。

原始的文件大概是这样的:

处理好的文件(通过标题+描述+SnowNLP提取的摘要):

这些文件将存储到 COS 中。

这一部分的核心就是,正确让我们提取出来的 description 尽可能准确地描述文章的内容。一般情况下,标题就是文章的核心,但是标题可能有一些信息丢失。

例如文章「用腾讯云 Serverless 你要知道他们两个的区别」,但实际上描述的是 Plugin 和 Component 的区别。虽然标题知道是两个东西,但是却缺少了核心的目标,所以再加上我们下面的描述:什么是 Serverless Framework Plugin?什么是Component?Plugin与Component 有什么区别?想要入门 Serverless CLI,这两个产品必须分的清楚,本文将会分享这二者区别与对应的特点、功能。

当然,加上描述之后内容变得已经相当精确,但是正文中,可能有更加精准的描述或者额外的内容,所以采用的是标题+描述+摘要(textRank 提取出来的前三句,属于提取式文本)。

  • 函数 2: 搜索函数

主要功能:当用户向微信号发送了指定关键词,通过该函数获取的结果。

思考:函数 1 和函数 2,都可以集成在之前的函数中,为什么要把这两个函数单独拿出来做一个独立的函数存在呢?将它们放在同一个函数中不好么?

原因是 —— 主函数触发次数相对来说是最多的,而且这个函数本身不需要太多的资源配置(64M 就够了),而函数 1 和函数 2,可能需要消耗更多的资源,如果三个函数合并放在一起,可能函数的内存大小需要整体调大,满足三个函数需求。这样可能会消耗更多资源,

例如:主函数触发了 10 次(64M,每次 1S),函数 1 触发了 2 次(512 M,每次 5S),函数 2 触发了 4 次(384M,每次 3S)

如果将三个函数放在一起,资源消耗是:

如果将其变成三个函数来执行,资源消耗是:

前者总计资源消耗 13308,后者 10432。调用次数越多,主函数的调用比例越大,所以节约的资源也就会越多。因此此处建议将资源消耗差距比较大的模块,分成不同函数进行部署。

import os
import json
import jieba
from qcloud_cos_v5 import CosConfig
from qcloud_cos_v5 import CosS3Client
from collections import defaultdict
from gensim import corpora, models, similaritiesbucket = os.environ.get('bucket')
secret_id = os.environ.get('secret_id')
secret_key = os.environ.get('secret_key')
region = os.environ.get('region')
client = CosS3Client(CosConfig(Region=region, SecretId=secret_id, SecretKey=secret_key))def main_handler(event, context):response = client.get_object(Bucket=bucket,Key=event["key"],)response['Body'].get_stream_to_file('/tmp/output.txt')with open('/tmp/output.txt') as f:data = json.loads(f.read())articles = []articlesDict = {}for eve in data:articles.append(eve['description'])articlesDict[eve['description']] = eve['media_id']sentence = event["sentence"]documents = []for eve_sentence in articles:tempData = " ".join(jieba.cut(eve_sentence))documents.append(tempData)texts = [[word for word in document.split()] for document in documents]frequency = defaultdict(int)for text in texts:for word in text:frequency[word] += 1dictionary = corpora.Dictionary(texts)new_xs = dictionary.doc2bow(jieba.cut(sentence))corpus = [dictionary.doc2bow(text) for text in texts]tfidf = models.TfidfModel(corpus)featurenum = len(dictionary.token2id.keys())sim = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featurenum)[tfidf[new_xs]]answer_list = [(sim[i], articles[i]) for i in range(1, len(articles))]answer_list.sort(key=lambda x: x[0], reverse=True)result = []print(answer_list)for eve in answer_list:if eve[0] > 0.10:result.append(articlesDict[eve[1]])if len(result) >= 8:result = result[0:8]return {"result": json.dumps(result)}

这一部分的代码也是很简单,主要是通过文本的相似度对每个文本进行评分,然后按照评分从高到低进行排序,给定一个阈值(此处设定的阈值为 0.1),输出阈值之前的数据。

另外要注意,此处引用了两个依赖是 jieba 和 gensim,这两个依赖都可能涉及到二进制文件,所以强烈推荐在 CentOS 系统下进行打包。

接下来就是主函数中的调用,为了实现上述功能,需要在主函数中新增方法:

  1. 获取全部图文消息
def getTheTotalOfAllMaterials():'''文档地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Get_the_total_of_all_materials.html:return:'''accessToken = getAccessToken()if not accessToken:return "Get Access Token Error"url = "https://api.weixin.qq.com/cgi-bin/material/get_materialcount?access_token=%s" % accessTokenresponseAttr = urllib.request.urlopen(url=url)return json.loads(responseAttr.read())def getMaterialsList(listType, count):'''文档地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/Get_materials_list.html:return:'''accessToken = getAccessToken()if not accessToken:return "Get Access Token Error"url = "https://api.weixin.qq.com/cgi-bin/material/batchget_material?access_token=%s" % accessTokenmaterialsList = []for i in range(1, int(count / 20) + 2):requestAttr = urllib.request.Request(url=url, data=json.dumps({"type": listType,"offset": 20 * (i - 1),"count": 20}).encode("utf-8"), headers={"Content-Type": "application/json"})responseAttr = urllib.request.urlopen(requestAttr)responseData = json.loads(responseAttr.read().decode("utf-8"))materialsList = materialsList + responseData["item"]return materialsList

可以通过以下代码调用:

rticlesList = getMaterialsList("news", getTheTotalOfAllMaterials()['news_count'])
  1. 将图文消息存储到 COS,并且通过函数的 Invoke 接口,实现函数间调用:
def saveNewsToCos():global articlesListarticlesList = getMaterialsList("news", getTheTotalOfAllMaterials()['news_count'])try:cosClient.put_object(Bucket=bucket,Body=json.dumps(articlesList).encode("utf-8"),Key=key,EnableMD5=False)req = models.InvokeRequest()params = '{"FunctionName":"Weixin_GoServerless_GetIndexFile", "ClientContext":"{\\"key\\": \\"%s\\", \\"index_key\\": \\"%s\\"}"}' % (key, indexKey)req.from_json_string(params)resp = scfClient.Invoke(req)resp.to_json_string()response = cosClient.get_object(Bucket=bucket,Key=key,)response['Body'].get_stream_to_file('/tmp/content.json')with open('/tmp/content.json') as f:articlesList = json.loads(f.read())return Trueexcept Exception as e:print(e)return False
  1. 根据搜索反馈回来的 Key 实现文章内容的对应
def searchNews(sentence):req = models.InvokeRequest()params = '{"FunctionName":"Weixin_GoServerless_SearchNews", "ClientContext":"{\\"sentence\\": \\"%s\\", \\"key\\": \\"%s\\"}"}' % (sentence, indexKey)req.from_json_string(params)resp = scfClient.Invoke(req)print(json.loads(json.loads(resp.to_json_string())['Result']["RetMsg"]))media_id = json.loads(json.loads(json.loads(resp.to_json_string())['Result']["RetMsg"])["result"])return media_id if media_id else None

最后在 main_handler 中,增加使用逻辑:

逻辑很简答,就是根据用户发的消息,去查找对应的结果.拿到结果之后判断结果个数,如果有 1 个相似内容,则返回一个图文,如果有多个则返回带有链接的文本。

另外一个逻辑是建立索引,直接是通过 API 网关触发即可。当然,如果怕不安全或者有需要的话,可以增加权限坚定的参数:

额外优化:

在接口列表中,我们可以看到获取 accessToken 的接口实际上是有次数限制的,每次获取有效期两个小时。所以,我们就要在函数中,对这部分内容做持久化。为了这个小东西,弄一个 MySQL 并不划算,所以决定用 COS:

def getAccessToken():'''文档地址:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html正常返回:{"access_token":"ACCESS_TOKEN","expires_in":7200}异常返回:{"errcode":40013,"errmsg":"invalid appid"}:return:'''global accessToken# 第一次判断是判断本地是否已经有了accessToken,考虑到容器复用情况if accessToken:if int(time.time()) - int(accessToken["time"]) <= 7000:return accessToken["access_token"]# 如果本地没有accessToken,可以去cos获取try:response = cosClient.get_object(Bucket=bucket,Key=accessTokenKey,)response['Body'].get_stream_to_file('/tmp/token.json')with open('/tmp/token.json') as f:accessToken = json.loads(f.read())except:pass# 这一次是看cos中是否有,如果cos中有的话,再次进行判断段if accessToken:if int(time.time()) - int(accessToken["time"]) <= 7000:return accessToken["access_token"]# 如果此时流程还没停止,则说明accessToken还没获得到,就需要从接口获得,并且同步给cosurl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" % (appid, secret)accessTokenResult = json.loads(urllib.request.urlopen(url).read().decode("utf-8"))accessToken = {"time": int(time.time()), "access_token": accessTokenResult["access_token"]}print(accessToken)response = cosClient.put_object(Bucket=bucket,Body=json.dumps(accessToken).encode("utf-8"),Key=accessTokenKey,EnableMD5=False)return None if "errcode" in accessToken else accessToken["access_token"]

当然这段代码可以继续优化,这里只是一个思路。

除了利用文本相似度进行图文检索,我们还可以利用云厂商提供的 AI 能力,为公众号增加机器人功能,限于篇幅就先告一段落,感兴趣的读者可以自己探索一下。

总结

至此,我们完成了一个简单的公众号开发。通过 Serverless 的原生开发思路(也可以使用 Werobot 等公众号开发框架),将公众号后台服务部署到 Serverless 架构上。再通过自然语言处理技术(特指文本相似度等)实现了一个图文检索功能。

Serverless 架构在开发微信公众号这种事件驱动类的触发式场景有着很大的优势,本文也仅仅是一个小探索,更多的功能和应用,能力和价值,还是要看具体业务。希望读者可以通过本文,对 Serverless 架构有更深入的了解。

Serverless Framework 30 天试用计划

我们诚邀您来体验最便捷的 Serverless 开发和部署方式。在试用期内,相关联的产品及服务均提供免费资源和专业的技术支持,帮助您的业务快速、便捷地实现 Serverless!

详情可查阅:Serverless Framework 试用计划

One More Thing

3 秒你能做什么?喝一口水,看一封邮件,还是 —— 部署一个完整的 Serverless 应用?

复制链接至 PC 浏览器访问:https://serverless.cloud.tencent.com/deploy/express

3 秒极速部署,立即体验史上最快的 Serverless HTTP 实战开发!

传送门:

  • GitHub: github.com/serverless
  • 官网:serverless.com

欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!


推荐阅读:《Serverless 架构:从原理、设计到项目实战》

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 常见JVM面试题整理

    前言 总结了JVM一些经典面试题,分享出我自己的解题思路,希望对大家有帮助,有哪里你觉得不正确的话,欢迎指出,后续有空会更新。 1.什么情况下会发生栈内存溢出。 思路: 描述栈定义,再描述为什么会溢出,再说明一下相关配置参数,OK的话可以给面试官手写是一个栈溢出的dem…...

    2024/4/23 15:43:16
  2. 「硬见小百科」如何将原理图符号画得通俗易懂?

    有很多关于绘制原理图符号的讨论。使你的原理图符号能够让人理解非常重要。有时用计算机辅助设计(CAD)软件包中预先做好的符号就可以了,但大多数符号并不太理想。请确保你的软件包能方便地创建符号,因为你可能得重新绘制每个单独元件,以及创建新的元件。CAD软件包含的上万种…...

    2024/4/28 2:31:41
  3. 【解决方案】使用Wireshark工具抓取TCP数据包时为什么遇到了52.114.77.164与168.63.202.111?

    先说问题。使用Wireshark工具、Microsoft Edge浏览器,抓取TCP数据包,网络封包分析窗口如下所示:很意外地,发现有52.114.77.164与168.63.202.111这两个IP地址的报文。 我们的源主机IP地址为192.168.0.101,目的服务器IP地址为128.119.245.12,我们要分析的三次握手过程、数据…...

    2024/4/27 21:18:24
  4. 这么写参数校验(Validator)就不会被劝退了,不相信你就看看本文!

    为什么要用validator 实战演练@Validated 声明要检查的参数 对参数的字段进行注解标注 在全局校验中增加校验异常 测试 自定义参数注解 比如我们来个 自定义身份证校验 注解 然后自定义Validator 使用自定义的注解 4.使用groups的校验 5.restful风格用法 总结很痛苦遇到大量的参…...

    2024/4/28 19:19:57
  5. Linux系统信号量机制互斥访问共享内存区进行进程间通信

    Linux系统信号量机制互斥访问共享内存区进行进程间通信 实现代码 #include <bits/stdc++.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/types.h> #include <sys/sem.h> #include <sys/wait.h> #include <sys/shm.h> …...

    2024/4/27 21:23:31
  6. 提取帧图片

    提取帧图片,并根据当前时间命名,效果如下:import cv2 import os from datetime import datetime, timedeltaroot_path = D:/2root_data/video/ files = os.listdir(root_path)for file in files:if file.endswith(.mp4):video_path = root_path + filecap = cv2.VideoCaptur…...

    2024/4/27 22:32:37
  7. Java的抽象类

    1、定义抽象方法:只有方法名字,没有具体方法实现的方法 抽象类:有抽象方法的类即为抽象类2、规则 (1)抽象方法和抽象类必须使用abstract修饰符来修饰 (2)有抽象方法的类必须为抽象类、但抽象类里可以没有抽象方法 (3)抽象类不可被实例化,无法使用new关键字调用抽象类…...

    2024/4/28 23:10:22
  8. Docker命令大全(一):安装Docker

    1.检查版本[root@localhost ~]# uname -r先升级CentOS系统内核是否跟最新docker兼容:这教程随时间推移会慢慢变老,我此刻能用,但你现在也许不能了,先升级下吧。升级内核:[root@localhost ~]# yum update然后等待升级完成2.安装docker (安装,其实默认就是安装最新)[root@…...

    2024/4/28 22:42:11
  9. css 根据屏幕宽度控制样式

    @media screen and (max-width: 768px) {// 这里写对应要修改的样式如:.warp {text-align: center;font-size: 14px;}}...

    2024/4/28 22:58:08
  10. Mac安装软件过程中遇到XXXXXXX显示文件损坏

    安装过程中如遇到XXXXXXX显示文件损坏: 1:在系统偏好设置中找到 “安全与隐私”把允许从以下位置下载的应用:改成任何来源。2:如果升级了macos sierra 没有任何来源选项。在终端中输入sudo spctl --master-disable 然后回车后输入用户密码,接着安装软件。...

    2024/4/23 15:43:05
  11. Java入门

    Java入门 Java的三大版本 JavaSE:标准版(桌面程序,控制台开发…) JavaME:嵌入式开发(手机,小家电…) JavaEE:E企业级开发(wed端,服务器开发…) Java最基本的是SE版本,先把这个版本学会,然后再去学EE版本的,ME版本的现在已经没什么用了 JDK、JRE、JVM JDK : Java…...

    2024/4/19 22:50:36
  12. java基本数据类型的double 和float

    @JAVA的float和double数据的取值范围 float和double的范围是由指数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits(指数位) 23bits(尾数位) double: 1bit(符号位) 11bits(指数位) 52bits(尾数位) 于是,fl…...

    2024/4/17 1:35:17
  13. elementui锚点,点击跳转到目标位置 滚动效果

    代码如下: <template><div class="container"><div class="wrapper"><div class="section" style="width:80%;margin-left: 8px" v-for="(item, index) in list" :key="index"><div …...

    2024/4/20 4:55:32
  14. Express Pi 开发例程-Modbus RTU

    ■ 软件需求本例程以Modbus RTU协议为例,ExpOS设备做主机,通讯串口使用com1连接4台modbus RTU从设备(地址01 ~ 04)进行通讯,查询和控制从机的状态。■ 设计步骤1.首先设置串口com1协议为ModbusRTU,速率为9600,如果需要处理通讯超时,需要勾选“使能超时”属性,默认接收超…...

    2024/4/19 21:04:55
  15. Path Aggregation Network for Instance Segmentation 论文笔记

    前言 作者认为在Mask R-CNN中的信息传递过程可以得到进一步提升。一般来说,低级特征有助于识别较大的目标,但低级特征到高级特征的路径太长了,这增加了定位信息流动的难度。而且,每个proposal是基于某一个特征层级得到的,而具体将proposal分配到哪个特征层级,这是一个启发…...

    2024/4/17 1:34:41
  16. 移动端使用vant组件完成时间选择

    局部引入需要用到的vant组件 import {DatetimePicker, Popup, Field} from vant; Vue.use(DatetimePicker); Vue.use(Popup); Vue.use(Field);<van-field v-model="employeeForm.PredictReturnTime" @click="end" readonly :style="{borderColor:t…...

    2024/4/15 7:51:36
  17. 2020 我的C++的学习之路 第九章 内存模型与名称空间

    以C++ Primer Plus为参考书籍,自身归纳知识点,加深记忆。 内存模型与名称空间存储持续性作用域与链接自动存储持续性静态持续变量静态持续性、外部链接性静态持续性、内部链接性静态持续性、无链接性说明符和限定符存储说明符cv-限定符定位new运算符名称空间using声明与using…...

    2024/4/19 17:14:17
  18. js input type=file 选择图片预览并压缩图片

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>压缩图片</title><script type="text/javascript" src="js/jquery-1.12.1.min.js" ></script></head><body><div i…...

    2024/4/19 16:36:17
  19. 课程大作业 POJ15288状态压缩dp

    题目 D:课程大作业 总时间限制: 1000ms 内存限制: 65536kB 描述 小明是北京大学信息科学技术学院三年级本科生。他喜欢参加各式各样的校园社团。这个学期就要结束了,每个课程大作业的截止时间也快到了,可是小明还没有开始做。每一门课程都有一个课程大作业,每个课程大作业都…...

    2024/4/23 15:43:06
  20. 机器学习与数据挖掘课程记录(二)

    线性学习 本节主要包括:线性回归、广义线性回归、逻辑蒂斯回归和多分类学习。 线性学习适合解决连续属性值的问题。 线性回归 1、回归和分类的区别 回归:预测的目标函数是连续值 分类:预测的目标函数是离散值 2、线性回归 给定由m个属性值描述的样本x,得到一个用属性值的线…...

    2024/4/23 15:43:05

最新文章

  1. 【ARM Cache 系列文章 11.1 -- ARM Cache 组织形式详细介绍 2】

    请阅读【ARM Cache 系列文章专栏导读】 文章目录 Cache 全相连(Fully Associative)全相联映射示例全相联映射原理紧接文章:【ARM Cache 系列文章 11 – ARM Cache 组织形式详细介绍】 Cache 全相连(Fully Associative) 介绍: 在全相连缓存中,任何内存地址都可以缓存在…...

    2024/4/29 2:19:56
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 最新AI智能系统ChatGPT网站源码V6.3版本,GPTs、AI绘画、AI换脸、垫图混图+(SparkAi系统搭建部署教程文档)

    一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧。已支持GPT…...

    2024/4/25 2:00:46
  4. vscode安装通义灵码

    作为vscode的插件&#xff0c;直接使用 通义灵码-灵动指间&#xff0c;快码加编&#xff0c;你的智能编码助手 通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研…...

    2024/4/24 15:00:15
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57