python+selenium+docker+飞书机器人部署自动预约程序

这篇具有很好参考价值的文章主要介绍了python+selenium+docker+飞书机器人部署自动预约程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

项目介绍

笔者最近需要重复使用一个预约程序,就想实现自动化预约,本以为是一个简单的项目,但从编写到部署还是兜兜转转了好久,写文章记录一下,也分享一下遇到的问题方便读者更快的搭建

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 handle
    event_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类
    @staticmethod
    def _decrypt_data(encrypt_key, data):
        encrypt_data = data.get("encrypt")
        if encrypt_key == "" and encrypt_data is None:
            # data haven't been encrypted
            return data
        if encrypt_key == "":
            raise Exception("ENCRYPT_KEY is necessary")
        cipher = AESCipher(encrypt_key)

        return json.loads(cipher.decrypt_string(encrypt_data))
 # 改动后的代码,改第四行的and为or
 @staticmethod
    def _decrypt_data(encrypt_key, data):
        encrypt_data = data.get("encrypt")
        if encrypt_key == "" or encrypt_data is None:
            # data haven't been encrypted
            return data
        if 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/chromedriver

ADD  . /home/feishu-bot

WORKDIR /home/feishu-bot

COPY ./requirements.txt /requirements.txt
COPY requirements.txt requirements.txt
RUN python -m pip install --upgrade pip

RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txt

CMD ["python", "./server.py"]

EXPOSE 3000

在下载好后还遇到错误说"chrome not reachable"
搜索后明白是默认的"shm-size"太小,导致无法运行selenium
所以打包成镜像后要调用以下命令来运行容器

docker run -it --shm-size=1g -d -p 3000:3000 feishu-bot

写在最后

一开始以为是个很简单的程序,没想到遇到了很多问题,编写了很久,但也学习到了很多新东西,对很多也还只是一知半解,会好好精进,有什么错误也希望读者指出,一起交流文章来源地址https://www.toymoban.com/news/detail-418272.html

到了这里,关于python+selenium+docker+飞书机器人部署自动预约程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实现飞书机器人定时发送文本、图片等群消息

    工作中会经常遇到监控告警相关问题,监控和告警的目的是要在事中及时发现问题并定位系统问题,那么当系统或平台出现问题了,如何及时暴露这些问题给对应的项目开发人员呢? 本文记录了在Python项目中利用飞书的自定义机器人webhook向飞书群推送文本及图片消息~ 飞书群

    2024年01月25日
    浏览(50)
  • 飞书机器人webhook调用

    调用飞书机器人webhook进行打卡提醒

    2024年02月16日
    浏览(41)
  • php对接飞书机器人

    有同事接到对接飞书机器人任务,开发中遇到响应错误: 意思应该就是签名错误或者时间戳不在有效范围内等,官方文档解释: 时间戳是取的实时的,也确认过了没问题,那基本确认就是签名错误了。 按照文档尝试调试了一下还是一样的结果,如果把后台安全设置那个签名

    2024年02月07日
    浏览(45)
  • 飞书ChatGPT机器人 – 打造智能问答助手

    在飞书中创建chatGPT机器人并且对话,在下面操作步骤中,使用到了Git克隆项目,需提前安装好Git,克隆的项目是Go语言项目,所以需提前安装Go语言环境。 Git Go1.20 首次注册飞书,我们可以创建个人账号 进入后 我们创建一个飞书 企业自建项目 然后设置机器人名称和描述,下面

    2024年02月16日
    浏览(109)
  • 飞书机器人小助手@特定人

    文档接口: https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN 创建机器人小助手   消息推送测试 获取艾特人 open_id @特定人请求

    2024年02月16日
    浏览(128)
  • 飞书自定义机器人消息接入指南

    操作流程 第一步 邀请自定义机器人入群:进入你的目标群组,打开 会话设置 ,找到 群机器人 ,并点击 添加机器人 ,选择 自定义机器人 加入群聊。 为机器人输入一个合适的名字和描述,也可以为机器人设置一个合适的头像,然后点击下一步。 第二部:配置 webhook 获取该

    2024年03月18日
    浏览(179)
  • zabbix对接飞书机器人告警

    一、zabbix后台配置 1. 创建报警媒介类型 2. 导入脚本 目录在/usr/lib/zabbix/alertscripts/feishu.py 二、安装python3.8 1. 安装依赖项: 2. 下载Python 3.8: 3. 解压文件并进入目录: 4. 配置: 5. 编译并安装: 6. 验证安装: 如果输出结果为Python 3.8.0,则表示安装成功。 注意:安装过程可能需

    2024年02月05日
    浏览(43)
  • 使用飞书自定义机器人发送消息

    使用飞书机器人可以很方便的获取自动化任务的反馈: 在群里创建一个机器人: 记住下面的 webhook地址,这个是标识机器人的唯一ID,比如它的webhook地址是: \\\"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxx-ab01-4427-xxxxx-xxxxx\\\" 然后创建程序: 发送之后的效果如下:

    2024年02月03日
    浏览(67)
  • 使用飞书机器人发送消息与文件

    本文默认你已拥有一个机器人,如果没有请点击以下链接创建机器人 检查机器人权限 如果需要跨部门发送消息,检查是否开通跨部门权限 在发布版本时选择作用范围为所有员工 机器人发送消息需要获取以下权限: 通过手机号或邮箱获取用户 ID 查看、评论和下载云空间中所

    2024年04月10日
    浏览(53)
  • 飞书接入机器人NODE开发自动回复

    1.登录飞书开放平台 进入开发者后台 创建自建应用 2.添加应用能力 选择机器人添加 3.添加事件订阅并根据权限开通权限  此处只添加获取消息事件 4.配置应用服务端地址(当事件触发 会触发设置的地址 并发送事件数据)开启Encrypt Key 实现回调数据加密 接收到数据后 通过开

    2024年02月12日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包