当前位置: 首页 > article >正文

达摩院春联模型实战教程:接入钉钉机器人实现群内春联点播

达摩院春联模型实战教程接入钉钉机器人实现群内春联点播过年贴春联是咱们中国人的传统习俗。但每年想一副有新意、有文采的春联可不容易。现在好了有了AI技术这事儿变得简单又有趣。今天要给大家分享的就是如何把达摩院出品的“春联生成模型”玩出花来——把它接入钉钉群聊机器人让群里的同事、朋友或者家人随时随地都能在群里“点播”一副专属的AI春联。想象一下群里有人喊一声“兔年”机器人立马送上一副应景的对联是不是既热闹又智能这个教程我会手把手带你从零开始完成整个流程。你不需要是AI专家只要会一些基础的Python和命令行操作就能轻松搞定。咱们的目标是让技术小白也能玩转AI春联让传统年俗焕发科技新意。1. 环境准备与模型部署在开始接入钉钉之前我们得先把春联生成模型这个“核心引擎”给跑起来。别担心过程很简单。1.1 获取并启动模型镜像首先你需要一个能运行这个模型的环境。最省事的方法就是使用已经预置好所有环境的Docker镜像。获取镜像你可以从一些AI镜像平台如CSDN星图镜像广场找到名为“AI春联生成器”或类似名称的镜像。这个镜像里已经包含了达摩院的PALM大模型、Gradio界面以及所有必要的Python依赖。启动容器通过平台的一键部署功能或者使用Docker命令启动这个镜像。启动后它会自动运行我们需要的服务。1.2 验证模型服务模型启动后我们需要确认它工作正常。根据提供的说明模型服务会运行在7860端口。你可以在浏览器中访问http://你的服务器IP:7860。如果一切顺利你会看到一个简洁的网页界面中间有一个输入框提示你输入“两字祝福词”。试着输入“新春”或“吉祥”然后点击“提交”。稍等片刻你就能看到AI生成的一副完整春联了通常还包括横批。这个界面是用Gradio框架搭建的它把复杂的模型调用包装成了一个简单的Web应用。我们后续的钉钉机器人本质上就是通过程序来自动访问这个Web应用获取生成结果。1.3 理解模型工作原理这个“春联生成模型-中文-base”是达摩院AliceMind团队的作品。它的原理并不复杂输入你给它两个字的祝福词比如“团圆”、“福气”。处理模型基于达摩院强大的PALM大模型理解这两个字背后的美好寓意和春节语境。输出它自动创作出一副上下联对仗工整、平仄协调且主题紧扣输入词汇的春联。它就像一个精通诗词格律的AI书法家你给个主题它立马挥毫泼墨。2. 搭建钉钉机器人中间件模型服务在本地跑起来了但它还是个“宅男”只在自己的小屋里7860端口工作。我们要做的就是建一个“传话员”中间件让它能接收钉钉群里的消息跑去问模型要春联再把结果带回群里。我们将使用Python的Flask框架来快速搭建这个“传话员”它轻量又简单。2.1 创建项目目录与文件在你的服务器上找一个合适的位置比如/root/dingtalk_bot创建我们的机器人项目。mkdir -p /root/dingtalk_bot cd /root/dingtalk_bot然后创建两个主要的Python文件app.py主程序处理钉钉消息和调用模型。requirements.txt列出项目需要的Python库。2.2 编写核心代码 (app.py)下面是app.py的完整代码我已经添加了详细的注释你可以直接复制使用。#!/usr/bin/env python3 # -*- coding: utf-8 -*- 钉钉春联机器人服务端 功能接收钉钉群消息调用春联生成模型返回结果到群聊。 import json import requests from flask import Flask, request, jsonify import logging # 配置日志方便查看运行情况 logging.basicConfig(levellogging.INFO, format%(asctime)s - %(levelname)s - %(message)s) logger logging.getLogger(__name__) app Flask(__name__) # 配置区域需要你修改的地方 # 1. 你的春联模型服务地址就是前面Gradio界面的地址 COUPLET_MODEL_URL http://localhost:7860 # 如果模型跑在其他服务器请修改IP # 2. 钉钉机器人Webhook地址创建机器人后获得 # 格式类似https://oapi.dingtalk.com/robot/send?access_tokenxxxxxx DINGTALK_WEBHOOK YOUR_DINGTALK_WEBHOOK_URL_HERE # def generate_couplet(keyword): 调用春联模型生成对联 :param keyword: 两个字的祝福词如“新春” :return: 生成的春联文本如果失败返回None try: # Gradio的API接口通常通过/api/predict路径调用 api_url f{COUPLET_MODEL_URL}/api/predict # 构造请求数据格式需要根据Gradio应用的输入组件名来定 # 通常Gradio的输入组件变量名在源码里能找到这里假设为input_text payload { data: [keyword] # 注意这里是一个列表包含输入数据 } logger.info(f正在向模型请求春联关键词: {keyword}) response requests.post(api_url, jsonpayload, timeout30) response.raise_for_status() # 如果状态码不是200抛出异常 result response.json() # Gradio API返回的数据结构通常是 {data: [...]} # 我们需要从中提取生成的春联文本。具体路径需要根据实际返回调整。 # 假设返回的春联在 result[data][0] 里 couplet_text result.get(data, [])[0] if result.get(data) else None if couplet_text: logger.info(f春联生成成功: {couplet_text[:50]}...) # 日志只打印前50字符 return couplet_text else: logger.error(模型返回了数据但未找到春联内容。) return None except requests.exceptions.RequestException as e: logger.error(f请求模型服务失败: {e}) return None except (KeyError, IndexError, json.JSONDecodeError) as e: logger.error(f解析模型返回结果失败: {e}, 原始返回: {response.text}) return None def send_dingtalk_message(text): 发送消息到钉钉群 :param text: 要发送的文本内容 if not DINGTALK_WEBHOOK or DINGTALK_WEBHOOK YOUR_DINGTALK_WEBHOOK_URL_HERE: logger.error(钉钉Webhook地址未配置) return False headers {Content-Type: application/json} # 钉钉机器人支持Markdown格式让消息更美观 data { msgtype: markdown, markdown: { title: AI春联已送达, text: text } } try: resp requests.post(DINGTALK_WEBHOOK, headersheaders, datajson.dumps(data), timeout10) resp.raise_for_status() logger.info(消息已成功发送至钉钉群。) return True except requests.exceptions.RequestException as e: logger.error(f发送钉钉消息失败: {e}) return False app.route(/dingtalk, methods[POST]) def handle_dingtalk(): 处理钉钉机器人回调的入口 钉钉的“自定义机器人”收到消息后会POST到这个地址 try: # 获取钉钉POST过来的数据 incoming_data request.get_json() logger.info(f收到钉钉回调: {json.dumps(incoming_data, ensure_asciiFalse)}) # 提取关键信息谁发的、发了什么、是否了机器人 # 钉钉消息结构比较复杂这里做简化处理提取文本内容 text_content if incoming_data.get(text, {}).get(content): # 处理普通文本消息 text_content incoming_data[text][content].strip() # 注意实际还需要处理机器人的标识符移除等此处为简化示例 # 简单判断如果消息包含“春联”二字则尝试提取关键词 if 春联 in text_content: # 这里用一个简单的方法提取两个中文字作为关键词 # 例如“来一副新春的春联” - 提取“新春” # 更健壮的做法可以用正则表达式匹配两个中文字 import re keywords re.findall(r[\u4e00-\u9fa5]{2}, text_content) if keywords: keyword keywords[0] # 取第一个找到的两字词 logger.info(f提取到关键词: {keyword}) # 调用模型生成春联 couplet generate_couplet(keyword) if couplet: # 组织回复消息使用Markdown格式更美观 reply_text f** 您点的「{keyword}」主题春联到啦** \n\n{couplet} \n\n---\n*由达摩院春联AI生成* send_dingtalk_message(reply_text) return jsonify({msg: 春联已发送}) else: send_dingtalk_message(抱歉AI书法家今天灵感不佳生成春联失败请稍后再试~) return jsonify({msg: 生成失败}) else: send_dingtalk_message(请告诉我两个字的祝福词哦比如新春、吉祥、团圆我就能为你创作春联啦) return jsonify({msg: 未找到关键词}) else: # 如果不是春联相关指令可以忽略或回复帮助信息 # 此处选择静默不回复 return jsonify({msg: 忽略非春联指令}) except Exception as e: logger.error(f处理钉钉回调时发生错误: {e}) return jsonify({msg: 服务器内部错误}), 500 app.route(/health, methods[GET]) def health_check(): 健康检查端点用于验证服务是否运行 return jsonify({status: healthy, service: DingTalk Couplet Bot}) if __name__ __main__: logger.info(钉钉春联机器人服务启动中...) logger.info(f春联模型地址: {COUPLET_MODEL_URL}) # 运行Flask应用默认端口5000对所有IP开放以便钉钉回调 app.run(host0.0.0.0, port5000, debugFalse)2.3 安装依赖并运行创建requirements.txt文件内容如下Flask2.0.0 requests2.25.0然后安装依赖并运行服务# 安装Python依赖 pip install -r requirements.txt # 运行机器人服务后台运行 nohup python app.py bot.log 21 现在你的“传话员”就在5000端口上待命了。你可以通过访问http://你的服务器IP:5000/health来检查它是否正常运行。3. 配置钉钉群自定义机器人我们的“传话员”准备好了现在需要在钉钉群里给它开个门让它能进出自由。这就是钉钉的“自定义机器人”。3.1 在钉钉群中添加机器人打开你想要添加机器人的钉钉群。点击群右上角的“设置”...图标。选择“智能群助手”。点击“添加机器人”。在机器人列表里选择“自定义机器人”通过Webhook接入。给机器人起个名字比如“AI春联小助手”并上传一个喜庆的图标。在“安全设置”中选择“自定义关键词”并添加“春联”这个词。这一步很重要它意味着只有当群消息包含“春联”时钉钉才会把消息转发给我们的服务。阅读并同意条款点击“完成”。完成后钉钉会提供一个Webhook地址长得像https://oapi.dingtalk.com/robot/send?access_tokenxxxxxx。请务必复制并保存好这个地址。3.2 配置机器人回调默认的机器人只能单向发送消息。为了让机器人能“听懂”它的指令并回复我们需要配置“消息接收”。在机器人创建完成后的页面或进入“群设置”-“智能群助手”-找到你的机器人进行管理。找到“消息接收”配置点击“设置”。将“消息接收模式”下的“Webhook”地址填写为我们刚才启动的Flask服务的地址。格式为http://你的公网服务器IP:5000/dingtalk。注意你的服务器必须有公网IP或者使用了内网穿透工具如ngrok、frp确保钉钉的服务器能访问到这个地址。点击“验证”和“保存”。至此钉钉机器人就配置好了。当群里有人发送包含“春联”关键词并机器人或根据安全设置的消息时钉钉就会把这条消息POST到你配置的/dingtalk地址。4. 在群内体验AI春联点播所有配置都完成了让我们来体验一下成果回到你的钉钉群尝试你的机器人“AI春联小助手”并发送一条消息例如AI春联小助手 来一副“新春”的春联稍等几秒钟你就会看到机器人回复了一条Markdown格式的消息 您点的「新春」主题春联到啦上联东风化雨山山翠 下联政策归心处处春 横批春风化雨由达摩院春联AI生成恭喜你你的群内AI春联点播系统已经成功运行。大家可以尽情尝试不同的祝福词比如“吉祥”、“团圆”、“福气”、“兔年”看看AI能创作出怎样精彩的对联。4.1 可能遇到的问题与解决机器人不回复检查Flask服务日志 (cat bot.log)看是否收到钉钉的请求。检查钉钉机器人安全设置中的关键词是否正确以及Webhook回调地址是否能从外网访问。春联生成失败检查COUPLET_MODEL_URL配置是否正确以及春联模型服务 (http://localhost:7860) 本身是否运行正常。消息格式错误我们的示例代码做了简化处理。钉钉实际回调的消息结构很复杂包含会话ID、发送者、信息等。如果需要对消息进行更精确的解析如只处理机器人的消息需要参考钉钉开放平台文档完善handle_dingtalk函数中的解析逻辑。5. 总结与扩展思路通过这个教程我们完成了一个非常有趣的AI应用落地案例将达摩院的春联生成模型与钉钉的协作场景相结合。回顾一下我们做了什么部署核心启动了达摩院的春联生成模型服务它提供了AI创作能力。搭建桥梁用Python Flask编写了一个轻量的中间件服务负责接收钉钉消息、调用AI模型、返回结果。连接场景在钉钉群中创建并配置了一个自定义机器人将群聊指令与我们的后端服务打通。这个项目的价值在于技术体验让你亲身实践了AI模型服务化、Web API调用、机器人回调等实用技能。场景创新为传统的AI模型找到了一个生动、有趣的落地场景提升了技术的趣味性和参与感。可扩展性这个框架完全可以复用。你可以把“春联模型”换成“诗词模型”、“笑话模型”、“天气查询接口”就能快速打造出其他类型的群聊机器人。一些扩展思路供你继续探索增强交互让指令更灵活例如支持“春联 平安”、“来对对联 富贵”等多种句式。美化输出将生成的春联文本通过其他API如图片生成转换成一张精美的、带有书法字体的春联图片再发送效果更震撼。多群管理改造服务使其能区分不同钉钉群的消息甚至记录每个群的点播历史。限流与缓存为避免模型被频繁调用导致压力过大可以加入简单的限流机制或对相同关键词的生成结果进行缓存。希望这个教程不仅能帮你实现一个好玩的小工具更能启发你探索更多AI技术与日常场景结合的可能性。技术不再是冷冰冰的代码它可以成为传递祝福、增添乐趣的桥梁。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关文章:

达摩院春联模型实战教程:接入钉钉机器人实现群内春联点播

达摩院春联模型实战教程:接入钉钉机器人实现群内春联点播 过年贴春联,是咱们中国人的传统习俗。但每年想一副有新意、有文采的春联可不容易。现在好了,有了AI技术,这事儿变得简单又有趣。 今天要给大家分享的,就是如…...

Qwen3-ForcedAligner-0.6B多场景落地:无障碍服务为听障人士生成精准字幕流

Qwen3-ForcedAligner-0.6B多场景落地:无障碍服务为听障人士生成精准字幕流 1. 引言:让音频内容"看得见"的技术突破 想象一下这样的场景:一位听障朋友正在观看视频课程,虽然视频有字幕,但字幕与语音不同步&…...

从翻译到定制:手把手教你用Buildroot 2025.05手册玩转嵌入式Linux BSP开发

从翻译到实战:深度解析Buildroot 2025.05手册的嵌入式Linux开发实践 1. 嵌入式Linux开发的新范式 在嵌入式系统开发领域,Buildroot已成为构建轻量级Linux系统的首选工具之一。2025.05版本的Buildroot手册不仅是一份技术文档,更是嵌入式开发者…...

Linux系统下USB蓝牙SPP服务端开发实战:从环境配置到数据通信

1. 环境准备:从零搭建蓝牙开发环境 第一次在Linux下折腾蓝牙开发时,我对着满屏的命令行参数发懵。后来才发现,其实只要搞定三个核心组件就能开工:BlueZ蓝牙协议栈、USB蓝牙适配器驱动、基础开发工具链。这里分享下我验证过的配置方…...

【计算机网络】网络基础 (网络协议/TCP/IP协议栈/局域网内外数据传输/数据封装、解包、分用)

目录 计算机网络的发展历程 我国的互联网发展历程 认识“协议” 初识网络协议 OSI 七层模型 TCP/IP协议栈 TCP/IP协议栈、局域网、以太网、互联网之间的关系 局域网内部数据传输基本流程 数据的封装、解包和分用 以太网通信基本原理 跨局域网数据传输基本流程 计算机…...

STM32实战:串口USART数据收发与中断处理(基于STM32F103C8T6标准库)*从零到一*

1. 串口通信基础与STM32硬件准备 第一次接触STM32串口通信时,我对着USART和UART这两个词发懵——后来发现它们就像孪生兄弟,USART比UART多了同步时钟功能。我们常用的STM32F103C8T6开发板上有3个USART接口,最常用的是USART1,对应P…...

Ansible之Playbook(五):高级用法

Playbook高级用法一、本地执行(Local Action)应用场景当控制节点(非目标主机)需要执行特定操作时使用,如生成报告、处理临时文件等。OpenEuler实现方式- name: 在控制节点生成主机清单报告hosts: alltasks:- name: 收集…...

用于街头拍摄的摄像头

1 充电宝2 太阳能板我觉得用充电宝,物联网低功耗摄像头就可以了,因为录制的视频是等到拿回去以后再分析的,不用联网,联网是为了确保摄像头的安全,不被别人拿走。但是这个安装的过程:1 如果晚上12点去安装&a…...

未来5年最“钱“景岗位揭晓:AI产品经理,普通人如何从0到1逆袭?(内含3步进阶法+学习资源)

文章指出AI产品经理是未来5年最具潜力的岗位,并分析了想抓住AI机会的人常遇到的3种状态:观望者、探索者和跑偏者。文章将AI产品经理分为工具型、应用型和专业型,建议普通人以成为应用型AI产品经理为目标。文章提出了从入门到上手的3步学习法&…...

c++ string字符串详解

一.string背景以及需要了解的知识点 1.1STL string是STL的一部分,但是STL创建的比string晚一些,后面才把string加入到STL里。STL(standard template library)是c的重要组成部分,可以简单理解为一个囊括了数据结构里面我们学的结构与算法的集…...

AutoLisp实战:从零到一构建你的第一个绘图工具

1. 为什么选择AutoLisp来自动化绘图 如果你经常使用AutoCAD进行绘图工作,一定会遇到大量重复性的操作。比如每次都要手动选择两点画线,然后再单独添加标注。这种机械劳动不仅效率低下,还容易出错。AutoLisp就是AutoCAD内置的解决方案&#xf…...

Java-Study

基础环境搭建 下载jdk JDK 26 Documentation - Home JDK(Java Development Kit,Java 开发工具包) 是开发、编译、运行 Java 程序的核心基础环境,相当于你写 Java 代码的「工具箱 + 编译器 + 运行环境」三合一。 JDK 里到底有什么?(核心组成) JDK 不是一个单独的程序…...

如何科学构建TVA项目的成功标尺:从KPI设定到价值闭环

「本文已用流量券推广,欢迎收藏 关注」技术背景介绍:AI智能体视觉检测系统(TVA,全称为“Transformer-based Vision Agent”),即基于Transformer架构以及“因式智能体”创新理论的高精度视觉智能体&#xf…...

中国首部纯 AI 制作院线电影《第一大道》高清资源下载与观影指南

一、电影基本信息 《第一大道》是2026年推出的中国首部纯AI制作院线级史诗电影,由王铁编剧执导,全程采用字节跳动Seedance 2.0模型生成,片长150分钟,2K电影级画质(20481080),融合历史、权谋、科…...

Java工程师视角:j-langchain 快速上手 Agent

引言:为什么 Java 工程师也需要 Agent? 过去两年,几乎所有 AI Agent 教程都默认使用 Python。 你看到的往往是: LangChainLangGraphAutoGenCrewAI 但现实情况是,大多数企业后端系统并不是 Python,而是 Java…...

豆包 Rocky Linux 10.1 环境下 100 道 grep 命令高频面试题 + 详细答案

Rocky Linux 10.1 环境下 100 道 grep 命令高频面试题 + 详细答案 全部基于 GNU grep,可直接在 Rocky Linux 10.1 / RHEL 10 / CentOS Stream 上运行验证,覆盖基础、正则、递归、过滤、运维场景、性能与坑点。 一、基础用法(1–10) 1. grep 基本语法 答案 grep [选项] …...

Photon光影包深度技术解析:从物理渲染到游戏体验的全面优化方案

Photon光影包深度技术解析:从物理渲染到游戏体验的全面优化方案 【免费下载链接】photon A gameplay-focused shader pack for Minecraft 项目地址: https://gitcode.com/gh_mirrors/photon3/photon Photon是一个专注于游戏体验的Minecraft光影包&#xff0c…...

LVGL实战:5分钟用ESP32驱动ST7789屏幕打造智能家居控制面板(附完整代码)

ESP32LVGLST7789智能家居控制面板实战指南 1. 硬件准备与环境搭建 在开始之前,我们需要准备好所有必要的硬件组件。ESP32开发板因其强大的处理能力和丰富的接口资源,成为物联网项目的首选。ST7789则是一款性价比极高的TFT LCD驱动芯片,支持24…...

Maple_公式推导进阶:subs与isolate的高效应用技巧

1. Maple公式推导的核心优势 第一次接触Maple时,我被它纸面般的公式显示效果惊艳到了。这就像用钢笔在草稿纸上演算,但永远不用担心写错——因为随时可以按CtrlZ重来。在完成流体力学方程的推导项目后,我总结了Maple最打动工程师的四个特点&a…...

手把手教你用GD32的ADC+DMA实现多通道数据采集(含二分查找法优化技巧)

GD32多通道ADC数据采集实战:从DMA配置到二分查找优化 在嵌入式开发中,模拟信号采集是连接物理世界与数字系统的关键桥梁。GD32系列MCU凭借其高性能ADC模块和灵活的DMA控制器,为多通道数据采集提供了可靠解决方案。本文将带您从基础配置到高级…...

高项论文「范围管理」超详细写作攻略:从框架到字句,手把手教你写出高分答卷

前言:阅卷老师到底在看什么? 很多人认为论文是“玄学”,其实不然。范围管理论文的评分标准非常清晰,阅卷老师在几分钟内重点抓取以下5个关键得分维度:得分维度占比具体含义你的对策结构完整性20%6个子过程是否全部覆盖…...

如何用AI修复受损音频:VoiceFixer完整指南

如何用AI修复受损音频:VoiceFixer完整指南 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 还在为嘈杂的录音、失真的语音或老旧音频而烦恼吗?VoiceFixer是你的AI音频修复专家&…...

如何快速通过手机号找回QQ账号:Python工具终极指南

如何快速通过手机号找回QQ账号:Python工具终极指南 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾经因为忘记QQ号而无法登录工作群聊,或者因为更换手机导致重要账号无法找回?现在&#x…...

Spring Boot 4 Spring Data AOT:从反射深渊到编译时确定性

我们是由枫哥组建的IT技术团队,成立于2017年,致力于帮助IT从业者提供实力,成功入职理想企业,我们提供一对一学习辅导,由知名大厂导师指导,分享Java技术、参与项目实战等服务,并为学员定制职业规…...

当医生意见不一时,AI怎么办?聊聊CVPR 2025 AmbiSSL如何解决医学图像分割的‘标注模糊’难题

当医生意见不一时,AI如何破局?解读CVPR 2025 AmbiSSL在医学图像分割中的创新实践 在放射科读片室里,三位资深医师正对同一张肺部CT片展开讨论。一位认为结节边缘需要扩大2mm勾画以确保安全切除,另一位坚持精确贴合可见边界&#x…...

AI声学A-59P模组:智能降噪,清晰通话

随着物联网与智能交互技术普及,语音已成为人机交互的主流入口。在楼宇对讲、车载通讯、远程会议、安防拾音等实际场景中,设备常面临稳态噪声(空调 / 风扇)、冲击噪声(敲击 / 碰撞)、风噪、交通噪声及强耦合…...

计算机网络 --- 动态路由

静态路由:由网络管理员手工配置的路由信息动态路由:所有路由器运行相同的路由协议,彼此之间沟通交流最终计算出到达未知网段的路由信息静态路由:优点:1.静态路由选路更加合理2.不需要额外消耗资源3.更加安全缺点&#…...

基于“灵珠AI平台”从0到1搭建一个博物馆数字人导游智能体教程

一、前言 有没有小伙伴去过博物馆?是不是经常遇到这种情况:租一个讲解器,走到哪听到哪,但它只管自己讲,根本不关心你想听什么。你对某件青铜器特别好奇,想多问两句?不好意思,讲解器不…...

寄存器与操作寄存器(小白级教学)

前言到目前为止,计算机依然只能读入二进制,此时肯定会有读者好奇了,那我们电脑中各种各样的图案,声音还有颜色都是如何来的呢,因为电脑本身就是硬件,硬件内部中,1就是代表高电压,0就…...

MyBatisPlus之核心功能+扩展功能

1.核心功能之Lamba更新普通写法:基于lamba写法:1.在controller层中编写接口,调用一个自己写的方法2.在IUserService接口,在UserServiceImpl实现该方法3.在UserServiceImpl编写代码,使用Lamba编写与lambdaQuery方法类似…...