python+selenium+docker+飞书机器人部署自动预约程序
python+selenium+docker+飞书机器人部署自动预约程序
- 项目介绍
- python+selenium
- 滑块验证
- selenium提示元素无法操作
- 无法定位到元素
- 接口+服务器部署
- 本地测试
- 开放端口
- 内网穿透
- 服务器部署
- 与飞书机器人连结
- 飞书机器人部署
- 飞书开放平台事件订阅请求网址URL配置
- 使用飞书机器人发消息给用户(open_id版)
- 飞书机器人收到消息后会多次重复请求
- docker部署
- 安装
- 打包为Image
- 下载chrome+chromedriver
- 写在最后
项目介绍
笔者最近需要重复使用一个预约程序,就想实现自动化预约,本以为是一个简单的项目,但从编写到部署还是兜兜转转了好久,写文章记录一下,也分享一下遇到的问题方便读者更快的搭建
python+selenium
selenium是一个web模拟应用,可以模仿用户在浏览器中的行为
在一开始测试的时候,是在自己的服务器配置selenium,这是配置文档,配置好后,按照selenium的基本操作方式,进入页面,点位元素,登陆账户,完成自己需要的功能即可,这里附上定位元素的文档,建议xpath定位
记住最后要关闭浏览器,不然会开webdriver会在后台运行,很占内存甚至导致后面的selenium错误
# 关闭浏览器
driver.quit()
在编写的过程里遇到了很多小问题,一一解决真的花了很多时间,这里记录几个比较典型的
滑块验证
笔者要进入的网站中的滑块验证是最简单的那类,滑倒最右端即可,如果读者需要滑动到空缺处请自行查看相关机器视觉的内容
读者解决滑块验证的方法
# 滑块验证# 实例化动作链对象action = ActionChains(driver)huakuai = driver.find_element_by_id("button")# # 滚动指定元素位置driver.execute_script("arguments[0].scrollIntoView();", huakuai)sleep(2)# #点击长按指定的标签action.click_and_hold(huakuai).perform()# #.perform()表示立即执行动作链操作for i in range(5):# .perform()表示立即执行动作链操作action.move_by_offset(52, 0).perform()sleep(1)action.release().perform()
在执行动作链的时候出现过错误
MoveTargetOutOfBoundsException
笔者的解决办法是
driver.maximize_window()
selenium提示元素无法操作
这个错误出现的原因各种各样,笔者遇到的是因为位于下拉框中,并不是显示元素,所以无法操作,但每次点击下拉框又去找太过麻烦,这里有一个简单粗暴的办法,直接调用js原生的点击事件
driver.execute_script("arguments[0].click();", area_part)
无法定位到元素
笔者在编写的时候遇到过很多次无法定位到元素错误,有很多原因,无法一一列出,大部分都可以找到解决办法,这里列出一个比较特殊的原因
dotenv_path = join(dirname(__file__), '.env1')
# load env parameters form file named .env
load_dotenv(find_dotenv())
上方代码是为了找到当前文件夹的全局环境变量,但添加后则显示无法找到网页元素,现在的解决办法是删除该段代码,在根文件下创建全局环境变量
接口+服务器部署
本地测试
虽然最后的项目是部署到服务器自动执行,但测试还是得在本地,就需要开放端口,并进行内网穿透
开放端口
# flask完成
from flask import Flask, jsonify, request
app = Flask(__name__)@app.route("/", methods=["POST"])
def callback_event_handler():# init callback instance and handleevent_handler, event = event_manager.get_handler_with_event(VERIFICATION_TOKEN, ENCRYPT_KEY)return event_handler(event)if __name__ == "__main__":# init()# 监听3000端口,多线程执行,具体的使用请参看flask相关教程app.run(host="0.0.0.0", port=3000, debug=True,threaded=True)
内网穿透
笔者之前是用花生壳做内网穿透,就没再去了解其他工具,本次编写偶然知道ngrok,的确很简单方便
但不知道什么原因,每次开启Ngrok,如果rigion是ap,则根本无法访问,每次都重复开启端口很多次,知道不是ap(笔者的是japan)才可以使用,虽然Ngrok很好用,但是调节点很烦,不知道是不是笔者的问题,希望有经验的读者可以支支招
服务器部署
nohup命令用于不挂断地运行命令(关闭当前session不会中断改程序,只能通过kill等命令删除)
nohup python server.py
杀死进程
- kill
作用:根据进程号杀死进程
用法: kill [信号代码] 进程ID
kill -9 来强制终止退出 - killall
作用:通过程序的名字,直接杀死所有进程
用法:killall 正在运行的程序名 - pkill
作用:通过程序的名字,直接杀死所有进程
用法:#pkill 正在运行的程序名
查看进程 - 根据名称查看
ps -ed |grep - 通过进程id查看占用的端口
netstat -nap | grep <进程id>
与飞书机器人连结
程序编写完成了提供了一个api,可以帮助笔者完成需要的功能,如果纯自动,直接部署到服务器即可,但是有时候笔者需要自定义时间,需要提供一个自定义接口,所以需要一个能够接收我自定义时间并向服务器发送请求的容器,笔者锁定了飞书机器人
飞书机器人部署
飞书官方文档提供了示例机器人代码,里面也包括了相关验证和发送消息的接口,demo下载,读者参考官方文档的介绍及相关代码,即可完成基础部署
飞书开放平台事件订阅请求网址URL配置
虽然我在飞书里设置了encrypt_key,但是发送的验证请求还是没有encrypt_key,所以为了先通过url验证,改了一下代码
# 源码# 位于event.py 的EventManager类@staticmethoddef _decrypt_data(encrypt_key, data):encrypt_data = data.get("encrypt")if encrypt_key == "" and encrypt_data is None:# data haven't been encryptedreturn dataif encrypt_key == "":raise Exception("ENCRYPT_KEY is necessary")cipher = AESCipher(encrypt_key)return json.loads(cipher.decrypt_string(encrypt_data))
# 改动后的代码,改第四行的and为or@staticmethoddef _decrypt_data(encrypt_key, data):encrypt_data = data.get("encrypt")if encrypt_key == "" or encrypt_data is None:# data haven't been encryptedreturn dataif encrypt_key == "":raise Exception("ENCRYPT_KEY is necessary")cipher = AESCipher(encrypt_key)return json.loads(cipher.decrypt_string(encrypt_data))
使用飞书机器人发消息给用户(open_id版)
在demo代码里面自带了发送消息的函数,但是笔者在其他文件里自定义内容时总是提示发送错误,查看文档后发现是格式的问题
Content 是 string 类型, json 结构需要转义。可以先构造一个结构体,然后使用json序列化后再转成string类型,也可以通过已有的网页json转换工具进行转义。
{"receive_id": "","content": "{\"text\":\" test content\"}","msg_type": "text"
}
飞书机器人收到消息后会多次重复请求
笔者将消息发送至机器人后,理论上应该是执行一次请求,后台完成自动预约程序,但是在测试的时候发现,总是会重复执行,百思不得其解的时候我去查了一下官方文档,结论如下
收到此请求后,需要在1秒内以 HTTP 200状态码 响应该请求,否则飞书开放平台会视此次推送失败并以5s、5m、1h、6h的间隔重新推送事件,最多重试4次。
笔者的情况如下:
在收到请求后,笔者会发送一个post的请求给服务器,然后一定时间后完成预约程序,但是这个post请求无法在一秒内返回
笔者也为这个停顿了很久,试了多进程,监听全局变量,都以失败告终,最后的解决办法是守护线程的多线程办法
thread = threading.Thread(target=access_subseat, args=(post_data,), daemon=True)
thread.start()
docker部署
这是笔者第一次使用docker,断断续续遇到了好些麻烦,像无头苍蝇一样碰了很久才大概弄出来
安装
先进行docker服务器安装,安装文档
打包为Image
docker build -t <name> .
下载chrome+chromedriver
因为docker容器不包含chrome+chromedriver,所以在运行镜像的时候提示没有chromedriver,可以在打包的dockerfile中进行下载
FROM python:3.8# 安装chrome
RUN apt-get update
RUN apt-get -y upgrade
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN dpkg -i google-chrome-stable_current_amd64.deb; apt-get -fy install# 安装chromedriver
RUN wget http://chromedriver.storage.googleapis.com/101.0.4951.41/chromedriver_linux64.zip && \
unzip chromedriver_linux64.zip && \
mv -f chromedriver /usr/local/share/chromedriver && \
ln -s /usr/local/share/chromedriver /usr/local/bin/chromedriver && \
ln -s /usr/local/share/chromedriver /usr/bin/chromedriverADD . /home/feishu-botWORKDIR /home/feishu-botCOPY ./requirements.txt /requirements.txt
COPY requirements.txt requirements.txt
RUN python -m pip install --upgrade pipRUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txtCMD ["python", "./server.py"]EXPOSE 3000
在下载好后还遇到错误说"chrome not reachable"
搜索后明白是默认的"shm-size"太小,导致无法运行selenium
所以打包成镜像后要调用以下命令来运行容器
docker run -it --shm-size=1g -d -p 3000:3000 feishu-bot
写在最后
一开始以为是个很简单的程序,没想到遇到了很多问题,编写了很久,但也学习到了很多新东西,对很多也还只是一知半解,会好好精进,有什么错误也希望读者指出,一起交流
python+selenium+docker+飞书机器人部署自动预约程序相关推荐
- Python实现飞书机器人定时发送文本、图片等群消息
工作中会经常遇到监控告警相关问题,监控和告警的目的是要在事中及时发现问题并定位系统问题,那么当系统或平台出现问题了,如何及时暴露这些问题给对应的项目开发人员呢? 本文记录了在Python项目中利用飞书 ...
- zabbix对接飞书机器人告警
一.环境 zabbix-5.0.13 Python3 飞书 二.创建飞书机器人 将webhook地址复制,并保存好 三.Python脚本 vim /usr/lib/zabbix/alertscript ...
- 干货|Webhook配置钉钉/飞书机器人告警
马嘉炜 | Zabbix开源社区签约专家 SRE运维工程师,六年Zabbix监控系统使用经验.在Zabbix架构设计及性能优化领域有丰富的经验,擅长监控模板制作及Zabbix API的二次开发. 官方 ...
- 飞书接入ChatGPT - 将ChatGPT集成到飞书机器人,直接拉满效率
文章目录 前言 环境列表 视频教程 1.飞书设置 2.克隆feishu-chatgpt项目 3.配置config.yaml文件 4.运行feishu-chatgpt项目 5.安装cpolar内网穿透 ...
- Jenkins+Allure测试报告+飞书机器人发送通知
Python微信订餐小程序课程视频 https://blog.csdn.net/m0_56069948/article/details/122285951 Python实战量化交易理财系统 https ...
- SVN提交更新飞书群通知 (飞书机器人)
Jenkins发送飞书信息 2022.9.16更新 用python脚本 效果 步骤 1.修改 svn/hooks/post-commit 脚本. export LANG=zh_CN.UTF-8 exp ...
- 结合python,给飞书(lark)群组发送自动化测试报告(保姆级)
1.基础信息:首先获取飞书机器人的webhook 地址 打开飞书,进入群组里,点击群机器人-添加机器人-自定义机器人-添加自定义机器人进群-配置 webhook,配置的页面有webhook 地址,需要 ...
- 飞书接入ChatGPT - 将ChatGPT集成到飞书机器人,直接拉满效率 【飞书ChatGPT机器人】
文章目录 前言 环境列表 视频教程 1.飞书设置 2.克隆feishu-chatgpt项目 3.配置config.yaml文件 4.运行feishu-chatgpt项目 5.安装cpolar内网穿透 ...
- python+selenium实现淘宝双十一自动下单
python+selenium实现淘宝双十一自动下单 思路/工具参考我的另一篇文章python+selenium实现京东秒杀脚本 1. 扫码登录版 # !/usr/bin/env python # 2 ...
最新文章
- 使用脚本编写 Vim 编辑器,第 2 部分: 用户定义函数
- 敏友的【敏捷个人】有感(3): 有感于“敏捷个人”讨论与练习
- MapTask、ReduceTask并行度决定机制
- 我们活在世界上,不是为了求人们原谅。
- linux下挂载共享目录,linux下挂载windows的共享目录
- selenium chrome历史版本docker镜像分享
- Layui-select 修复搜索之后上下键的bug
- 计算机一级照片错误怎么改,电脑上要怎么修改一寸照片大小
- “传递关爱 感恩社会” ——美斯坦福2017年捐资助学仪式隆重举行
- 左室短轴切面_心脏超声常用切面与解剖.pptx
- android最强的平板,最强安卓游戏平板曝光,NVIDIA的Shield Tablet X1来了
- 基于轮廓系数来选择n_clusters(Kmeans聚类分析)
- [資源]RAID是什么意思?RAID的应用
- 2008年度中国最佳MBA排行榜
- 学生版计算机隐藏游戏,玩了近15年的QQ,才发现这3个隐藏功能,学生党看完炸锅了!...
- 实时数据库 - 笔记
- 有一种风险让期权交易员如坐针毡——谨慎管理 “大头针风险”
- ‘数据分析实战’——战略分析案例(某购物商城分析案例)
- IT资讯精选(2022-09-11)
- 大数据培训技术logstsh filter
热门文章
- HDU 5115 Dire Wolf (区间DP)
- 怎样用手机照片识别植物?推荐这些方法给你
- Qml Image 截取一部分图片形式
- 笔记本桌面没显示计算机,笔记本不显示桌面怎么回事_笔记本电脑开机不显示桌面如何处理-win7之家...
- word 技巧之一:给word文档添加目录、查看word文档结构图
- word2013插入excel对象报错_使用Excel中的插入对象功能在Excel中插入Word文档
- INTERSPEECH 2022 | 钉钉蜂鸣鸟音频实验室论文入选国际顶会,创新提出窄带滤波网络架构
- .NET转JAVA曲折之路
- 减肥日记---那个胖子终于瘦下来了 程序员减肥记录 程序员减肥日记
- MATLAB代码显示内存不足的解决方法