群聊中@功能实现

本文介绍了群聊中@功能的实现,包括输入框中输入@后弹出选择列表,选中条目自动生成@内容,以及键盘操作如Delete和BackSpace的删除功能。核心难点在于理解Selection和Range,以及处理@条目与不可见字符的关系。文章提供了核心代码,并提出了可扩展的功能,如选择面板的光标控制和位置动态调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​​​​​​​ 

功能如下:

1、输入框中输入@弹出选择列表;

2、鼠标选中条目,在输入款中自动生成@条目;光标移动到@条目之后;

3、点击输入框中的@条目,选中@条目;

4、左右键自动跳过@条目;

5、实现Delete和BackSpace删除;

难点:

1、需要学习Selection和Range

2、任何操作实现都需要注意@条目(实为SPAN)与不可见字符(\u220B)之间的关系(一荣俱荣、一损俱损;共生关系)

以下代码为核心代码,在此之上可以进行扩展

可扩展功能1:展示选择面板列表后,首条目自动高亮,键盘上下键控制,鼠标控制(如果要实现此功能,注意鼠标使用onMouseMove事件,不要使用onMouseOver事件;如果使用onMouseOver,在出现滚动条时会与上下键冲突)

可扩展功能2:选择面板位置随着光标位置移动

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>contenteditable</title>
  <style>
    body {
      background: #e3e3e3;
    }

    .edit-box {
      position: absolute;
      left: 50%;
      top: 50%;
      transform: translate(-50%, -50%);
      width: 300px;
      height: 100px;
      background: #FFFFFF;
    }

    #inputRef {
      background: #FFFFFF;
      width: 300px;
      height: 100px;
      overflow-y: a
### 实现微信公众号在群聊中被@后的自动回复 为了实现当微信公众账号在群聊中被 @ 后能够自动回复并使该回复显示于群聊之中,通常依赖于第三方库或平台所提供的接口和服务。对于 Python 开发者而言,`itchat` 是一个常用的开源项目用于个人号自动化操作[^1],然而针对服务号/订阅号(即公众账号),官方 API 和认证机制有所不同。 #### 使用 WeChat Official Account API 要让公众号具备此功能,需利用 微信提供的服务器端消息处理能力: - **接入配置**:开发者需要设置 Web 接口信息,包括 URL 和 Token,并通过明文模式或加密模式验证请求合法性。 - **事件推送**:当用户发送消息给公众号时,会触发相应事件推送到上述配置好的服务器地址。特别地,在群聊场景下如果有人提到了公众号,则会产生一条特殊的 `event` 类型为 `<msgtype>event</msgtype><event>@me</event>` 的 XML 数据包[^2]。 - **响应逻辑编写**:接收到这样的通知之后,可以根据业务需求构建合适的应答内容并通过 POST 请求返回给微信服务器。注意这里涉及到的安全校验以及XML格式的消息体构造。 ```python from flask import Flask, request, make_response import hashlib import xml.etree.ElementTree as ET app = Flask(__name__) @app.route('/wechat', methods=['GET', 'POST']) def wechat(): if request.method == 'GET': token = "your_token" query = request.args signature = query.get('signature','') timestamp = query.get('timestamp','') nonce = query.get('nonce','') echostr = query.get('echostr','') list=[token,timestamp,nonce] list.sort() sha1=hashlib.sha1() map(sha1.update,list) hashcode=sha1.hexdigest() if hashcode == signature: return make_response(echostr) elif request.method == 'POST': webData = request.data recMsg = parse_xml(webData) # 判断是否为@本公众号的情况 if recMsg.EventKey and '@' in recMsg.EventKey: content="感谢您提到我!这是我的自动回复。" # 自定义回复文案 replyMsg = TextMsg(recMsg.FromUserName, recMsg.ToUserName, content) return replyMsg.send() def parse_xml(web_data): if len(web_data) == 0: return None xmlData = ET.fromstring(web_data) msg_type = xmlData.find('MsgType').text.lower() from_user_name = xmlData.find('FromUserName').text to_user_name = xmlData.find('ToUserName').text event_key = xmlData.find('EventKey') # 可能为空 return Message(msg_type=msg_type, from_user_name=from_user_name, to_user_name=to_user_name, event_key=event_key) class Message(object): def __init__(self,msg_type=None,from_user_name=None,to_user_name=None,event_key=None): self.MsgType=msg_type self.FromUserName=from_user_name self.ToUserName=to_user_name self.EventKey=event_key class TextMsg(Message): def __init__(self, toUserName, fromUserName, content): super().__init__('text', from_user_name=fromUserName, to_user_name=toUserName) self.Content = content def send(self): xmlForm = """ <xml> <ToUserName><![CDATA[{TOUSER}]]></ToUserName> <FromUserName><![CDATA[{FROMUSER}]]></FromUserName> <CreateTime>{TIME}</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[{CONTENT}]]></Content> </xml> """ return xmlForm.format(TOUSER=self.ToUserName,FROMUSER=self.FromUserName, TIME=int(time.time()), CONTENT=self.Content) ``` 这段代码展示了如何搭建一个简单的Flask应用来监听来自微信服务器的通知,并对特定条件下的消息做出回应。请注意实际部署前还需考虑安全性、稳定性和性能优化等方面因素。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值