
WindowsPython实战用PaddleOCR飞书机器人搭建自动打卡通知系统前言日常办公中经常会遇到这样一种重复操作先保存一张截图再打开图片确认里面的文字最后把结果复制到群聊中。偶尔操作一次问题不大但如果每天都要重复完全可以交给程序先完成其中一部分工作。本文会在Windows中搭建一套简单的OCR通知流程。Python负责读取指定的截图文件PaddleOCR负责识别图片中的文字再通过飞书自定义机器人Webhook把识别结果发送到指定群聊。这里需要先说明本文实现的是截图识别和消息通知并不会直接操作企业的真实考勤系统也不会验证员工是否实际完成考勤。它更适合作为本人授权范围内的办公记录、截图识别和通知自动化示例。基础流程跑通以后还会使用Flask把Python脚本包装成一个HTTP触发接口。访问指定路径时服务器会执行一次OCR识别和飞书消息发送任务。最后再通过cpolar为本地5000端口创建公网入口让原本只能在Windows本机或局域网中访问的测试接口也可以从其他网络环境进行调用。1.准备工作下面是在Windows系统Win10/Win11上从零开始 搭建一个OCR 飞书 Python自动打卡机器人 的完整、详细、新手友好的操作指南。目标你把打卡截图如钉钉、企业微信放入一个文件夹 → Python自动识别图中文字 → 通过飞书机器人发送“打卡成功”消息到群聊。你需要准备一台 Windows 10/11 电脑一个飞书账号免费一部手机用于拍照打卡截图网络畅通2.安装Python打开浏览器访问 https://www.python.org/downloads/点击 “Download Python 3.11.x”推荐 3.11稳定且兼容性好)下载完成后双击安装包。务必勾选Add Python to PATH关键Install launcher for all users点击 “Install Now”安装完成后按 Win R输入cmd回车运行python--version如果显示Python版本说明安装成功3.创建飞书群机器人3.1 创建机器人打开 飞书 App或网页版 https://www.feishu.cn创建一个新群聊点击右上角 设置→ 「群机器人」 → 「添加机器人」选择 「自定义机器人」名称填打卡安全设置选择 「自定义关键词」输入关键词打卡成功点击「添加」复制 Webhook 地址一长串 URL以 https://open.feishu.cn/open-apis/bot/v2/hook/ 开头重要后面发的消息必须包含“打卡成功”这四个字否则飞书会拒绝发送3.2 测试webhook时候可用使用下面测试代码$webhookhttps://open.feishu.cn/open-apis/bot/v2/hook/你的完整hook地址$body{msg_typetextcontent{text打卡成功手动测试消息}}|ConvertTo-Json# 关键设置编码为 UTF-8Invoke-RestMethod-Uri$webhook-MethodPost-Body$body-ContentTypeapplication/json; charsetutf-8飞书群接收成功4.创建项目文件夹在桌面或任意位置新建一个文件夹命名为clock_in_bot进入该文件夹在这个目录下在创建一个文件夹clock_in_images用于后续识别图片上传一张图片名为test.py5.安装Python依赖OCR 网络库进入你的项目文件夹cdC:\Users\admin\Desktop\clock_in_bot安装所需库使用清华源加速pipinstallpaddlepaddle paddleocr requests pillow opencv-python-ihttps://pypi.tuna.tsinghua.edu.cn/simple安装成功后测试OCR是否可用如果输出OCR OK!说明安装成功python-cfrom paddleocr import PaddleOCR; print(OCR OK!)6.编写Python脚本在clock_in_bot文件夹中新建一个文本文件重命名为test.py注意后缀是 .py不是 .txt右键 → “编辑”用记事本打开粘贴以下代码这段代码是我反复测试最终成功的一版这版会一步步验证importosimporttimefrom paddleocrimportPaddleOCRimportrequests# 第 0 步配置 print(第 0 步加载配置...)FEISHU_WEBHOOK替换成你的飞书Webhook地址IMAGE_FOLDER./clock_in_imagesTEST_IMAGEos.path.join(IMAGE_FOLDER,test.png)# 放一张叫 test.png 的图进去print(f Webhook: {FEISHU_WEBHOOK})print(f 图片路径: {TEST_IMAGE})print(-*50)# 第 1 步确保文件夹存在 print(第 1 步创建图片文件夹...)os.makedirs(IMAGE_FOLDER,exist_okTrue)print(✅ 文件夹已准备好)print(-*50)# 第 2 步初始化 OCR print(第 2 步初始化 PaddleOCR可能需要1-2分钟...)try: ocrPaddleOCR(langch,use_gpuFalse,show_logFalse)print(✅ OCR 初始化成功)except Exception as e: print(f❌ OCR 初始化失败: {e})exit(1)print(-*50)# 第 3 步检查图片是否存在 print(第 3 步检查测试图片是否存在...)ifnot os.path.isfile(TEST_IMAGE): print(f❌ 图片不存在请放一张截图并命名为: {TEST_IMAGE})exit(1)else: print(✅ 图片存在)print(-*50)# 第 4 步执行 OCR 识别 print(第 4 步开始 OCR 识别...)try: resultocr.ocr(TEST_IMAGE,clsTrue)textifresult and result[0]:forlineinresult[0]:ifline and len(line)1: wordline[1][0]ifisinstance(word, str): textword texttext.strip()or[未识别到文字]except Exception as e: print(f OCR 异常详细信息: {e})text[OCR 异常]print(-*50)# 第 5 步构造消息强制包含关键词print(第 5 步构造飞书消息...)messagef打卡成功\n【OCR结果】\n{text}print(f 消息内容:\n{message})print(-*50)# 第 6 步发送到飞书 print(第 6 步发送消息到飞书...)try: resprequests.post(FEISHU_WEBHOOK,json{msg_type:text,content:{text:message}},timeout10,headers{Content-Type:application/json; charsetutf-8})resultresp.json()print(f 飞书返回: {result})ifresult.get(code)0: print(✅ 成功请去飞书群查看消息)else: print(f❌ 失败原因: {result.get(msg, 未知错误)})print(⚠️ 常见原因关键词不匹配必须包含“打卡成功”)except Exception as e: print(f 网络或请求异常: {e})print(-*50)print( 测试结束。按回车退出...)input()关键修改找到这一行FEISHU_WEBHOOK替换成你的飞书Webhook地址保留双引号不要删除7. 运行程序进入你的项目文件夹cdC:\Users\admin\Desktop\clock_in_bot运行脚本python auto_clock_in.py首次运行会自动下载OCR模型约 100MB请等待 1~2 分钟直到出现监听提示。运行成功后飞牛群聊自动发送消息成功程序会立即识别打卡截图文字并向你的飞书群发送消息推荐python脚本使用vscode测试因为测试效果更加直观恭喜你你已经拥有了一个全自动打卡通知机器人8.扩展在Windows上用Flask/FastAPI写一个简单的Web服务暴露一个/clockin接口。调用这个接口就执行打卡逻辑PaddleOCR 打卡。实际自动打卡路径C:\Users\admin\Desktop\clock_in_bot\test.py# 1.pyfrom flaskimportFlaskimportsubprocessimportos appFlask(__name__)# 主页可选用于测试服务是否在线app.route(/)def home():return✅ 打卡机器人在线访问 /clockin 触发打卡。# 核心打卡接口app.route(/clockin)def clock_in(): try:# 替换为你的实际打卡脚本路径建议用绝对路径script_pathrC:\Users\admin\Desktop\clock_in_bot\test.pyresultsubprocess.run([python, script_path],cwdos.path.dirname(script_path),# 设置工作目录capture_outputTrue,textTrue,timeout60# 防止卡死)outputresult.stdout \n result.stderrreturnfpre✅ 打卡执行完成:\n{output}/preexcept Exception as e:returnfpre❌ 打卡失败: {str(e)}/preif__name____main__:app.run(host0.0.0.0,port5000,debugFalse)执行成功后访问ip5000就可以查看打卡状态访问/clockin触发打卡。将你的Flask打卡服务与cpolar结合只需在本地运行 Flask 应用如http://127.0.0.1:5000然后通过cpolar创建一条HTTP隧道将其映射到公网地址例如https://xxxx.cpolar.cn这样无论你身处何地只要访问该公网链接的**/clockin**路径就能远程触发打卡脚本实现自动化操作——整个过程无需公网IP、无需复杂配置cpolar会安全地将外部请求转发到你的本地服务。9.安装cpolar实现随时随地开发9.1 什么是cpolarcpolar是一款安全高效的内网穿透工具无需公网IP或复杂配置只需一条命令即可将本地服务器、Web服务或任意端口映射到公网让你随时随地远程访问内网应用特别适合开发调试、远程运维和应急部署等场景。9.2 部署cpolarcpolar可以将你本地电脑中的服务如SSH、Web、数据库映射到公网。即使你在家里或外出时也可以通过公网地址连接回本地运行的开发环境。❤️以下是安装cpolar步骤使用一键脚本安装命令sudocurlhttps://get.cpolar.sh|sh安装完成后执行下方命令查看cpolar服务状态如图所示即为正常启动sudosystemctl status cpolarCpolar安装和成功启动服务后在浏览器上输入虚拟机主机IP加9200端口即:【http://ip:9200】访问Cpolar管理界面使用Cpolar官网注册的账号登录,登录后即可看到cpolar web 配置界面,接下来在web 界面配置即可打开浏览器访问本地9200端口使用cpolar账户密码登录即可,登录后即可对隧道进行管理。10.配置公网地址登录cpolar web UI管理界面后,点击左侧仪表盘的隧道管理——创建隧道隧道名称可自定义本例使用了:daka注意不要与已有的隧道名称重复协议http本地地址5000域名类型随机域名地区选择China Top创建成功后打开左侧在线隧道列表,可以看到刚刚通过创建隧道生成了公网地址接下来就可以在其他电脑或者移动端设备异地上使用地址访问。访问成功。11.保留固定公网地址使用cpolar为其配置二级子域名该地址为固定地址不会随机变化。点击左侧的预留选择保留二级子域名地区选择china Top然后设置一个二级子域名名称我使用的是daka大家可以自定义。填写备注信息点击保留。登录cpolar web UI管理界面点击左侧仪表盘的隧道管理——隧道列表找到所要配置的隧道点击右侧的编辑。修改隧道信息将保留成功的二级子域名配置到隧道中域名类型选择二级子域名Sub Domain填写保留成功的二级子域名地区: China Top点击更新更新完成后打开在线隧道列表此时可以看到随机的公网地址已经发生变化地址名称也变成了保留和固定的二级子域名名称。最后我们使用固定的公网地址在任意设备的浏览器中访问可以看到成功访问的页面这样一个永久不会变化的二级子域名公网网址即设置好了。总结完成以上配置后这套Windows环境中的OCR通知流程已经能够读取指定图片并通过PaddleOCR提取其中的文字内容。识别完成以后Python脚本会按照预设格式整理OCR结果再调用飞书自定义机器人Webhook把文本消息发送到指定群聊。本文随后使用Flask为这段脚本增加了一个HTTP入口因此除了直接在命令行执行Python文件也可以通过访问指定接口触发一次识别和通知任务。通过cpolar为Flask使用的5000端口创建公网隧道后这个测试接口也可以从其他网络环境访问。随机域名适合临时测试配置固定二级子域名后可以获得一个更加方便持续使用的入口地址。需要区分的是这套流程完成的是“截图读取、OCR识别、飞书通知和远程触发”并没有直接操作实际考勤系统也不能仅根据发送出的“打卡成功”文字判断真实考勤状态。从Windows Python环境、PaddleOCR图片识别到飞书Webhook消息发送、Flask接口和公网访问本文完成了一套基础的OCR办公通知自动化流程。