开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 111|回复: 3
收起左侧

[易语言] 完善源码

[复制链接]
结帖率:78% (69/89)
发表于 昨天 23:33 | 显示全部楼层 |阅读模式   湖北省荆州市
10精币
[backcolor=rgba(255, 255, 255, 0.06)]我要的是钉钉发信息类,队列发送,自由添加api,api是独立使用的不是都一样群,发送错误可以走固定api发送提示。失败的要本地存储。代码精简,运行速度快,代码不要重复。可以参考我发的代码例子,发送频率为1分钟不超过20条
[backcolor=rgba(255, 255, 255, 0.06)]

  
' ===================== 钉钉消息发送类 =====================
.类名 钉钉消息类
.对象集 公开
' ---- 私有成员 ----
.私有变量 API列表, API配置, , "0"
.私有变量 告警API名称, 文本型
.私有变量 发送队列, 队列
.私有变量 线程运行, 逻辑型
.私有变量 发送计数, 整数型
.私有变量 计数窗口期, 整数型
.私有常量 固定协议头, 文本型 = “Content-Type: application/json;charset=UTF-8”
.私有常量 频率上限, 整数型 = 20
.私有常量 窗口期时长, 整数型 = 60000
' ---- 结构体定义 ----
.自定义数据类型 API配置
数据类型名公开备 注
(未定义数据类型名)  
成员名类 型传址数组备 注
名称文本型  
地址文本型  
.自定义数据类型 队列项
数据类型名公开备 注
(未定义数据类型名)  
成员名类 型传址数组备 注
内容文本型  
API名称文本型  
序号整数型  
' ---- 初始化 ----
子程序名返回值类型公开备 注
_初始化 
计数窗口期 = 取启动时间 ()
' ---- 1. 自由添加独立API ----
子程序名返回值类型公开备 注
添加API逻辑型 
参数名类 型参考可空数组备 注
API名称文本型
API地址文本型
变量名类 型静态数组备 注
i整数型 
计次循环首 (取数组成员数 (API列表), i)
如果真 (API列表 [i].名称 = API名称) 返回 ()
计次循环尾 ()
加入成员 (API列表, { API名称, API地址 })
返回 ()
' ---- 2. 设置错误告警API ----
子程序名返回值类型公开备 注
设置告警API逻辑型 
参数名类 型参考可空数组备 注
API名称文本型
变量名类 型静态数组备 注
i整数型 
计次循环首 (取数组成员数 (API列表), i)
如果真 (API列表 [i].名称 = API名称)
告警API名称 = API名称
返回 ()

计次循环尾 ()
返回 ()
' ---- 3. 消息入队(核心入口) ----
子程序名返回值类型公开备 注
发送消息逻辑型 
参数名类 型参考可空数组备 注
消息内容文本型
目标API名称文本型
变量名类 型静态数组备 注
队列项 
i整数型 
计次循环首 (取数组成员数 (API列表), i)
如果真 (API列表 [i].名称 = 目标API名称)
项.内容 = 消息内容
项.API名称 = 目标API名称
项.序号 = 取启动时间 ()
发送队列.入列 ()
如果真 (线程运行 = )
线程运行 = 真
线程_启动 (&队列消费线程)
返回 ()

计次循环尾 ()
返回 ()
' ---- 4. 队列消费线程(频率控制+发送) ----
子程序名返回值类型公开备 注
队列消费线程整数型 
变量名类 型静态数组备 注
队列项 
API地址文本型 
i整数型 
判断循环首 (发送队列.取计数 () > 0)
项 = 发送队列.出列 ()
' 获取API地址
API地址 = “”
计次循环首 (取数组成员数 (API列表), i)
如果真 (API列表 [i].名称 = 项.API名称)
API地址 = API列表 [i].地址
跳出循环 ()

计次循环尾 ()

' 频率控制(1分钟≤20条)
如果真 (取启动时间 () - 计数窗口期 ≥ 窗口期时长)
发送计数 = 0
计数窗口期 = 取启动时间 ()
如果真 (发送计数 ≥ 频率上限)
延迟 (窗口期时长 (取启动时间 () - 计数窗口期))
发送计数 = 0
计数窗口期 = 取启动时间 ()

' 发送消息
发送计数 = 发送计数 + 1
如果真 (核心发信 (项.内容, API地址, 项.序号))
写失败日志 (项, API地址)
发送错误告警 (项, API地址)

判断循环尾 ()
线程运行 = 假
返回 (0)
' ---- 5. 核心发信(精简高速) ----
子程序名返回值类型公开备 注
核心发信逻辑型 
参数名类 型参考可空数组备 注
内容文本型
地址文本型
序号整数型
变量名类 型静态数组备 注
json类_json 
提交数据文本型 
返回数据字节集 
返回文本文本型 
.静态变量 JSON模板, 文本型
如果真 (JSON模板 = “”)
JSON模板 = “{""msgtype"":""text"",""text"":{""content"":""""},""at"":{""atUserIds"":[],""isAtAll"":false}}”

json.解析 (JSON模板)
json.置属性 (“text.content”, 内容)
提交数据 = json.取数据文本 ()
返回数据 = 网页_访问_对象 (地址, #POST, 提交数据, , , 固定协议头, , , 5000)
返回文本 = 到文本 (编码_转换 (返回数据, #编码_UTF8, #编码_GBK ))
返回 (寻找文本 (返回文本, “errmsg":"ok”, , ) ≠ -1)
' ---- 6. 失败日志存储 ----
子程序名返回值类型公开备 注
写失败日志 
参数名类 型参考可空数组备 注
队列项
API地址文本型
变量名类 型静态数组备 注
日志内容文本型 
日志路径文本型 = 取运行目录 () + “\ding_fail.log” 
日志内容 = “[”到文本 (取现行时间 ()) + “] 序号:”到文本 (项.序号)#换行
日志内容 = 日志内容 + “API:” + 项.API名称 + “ | 地址:” + API地址 + #换行
日志内容 = 日志内容 + “内容:” + 项.内容 + #换行 × 2
写到文件 (日志路径, 读入文件 (日志路径)到字节集 (日志内容))
' ---- 7. 错误告警发送 ----
子程序名返回值类型公开备 注
发送错误告警 
参数名类 型参考可空数组备 注
队列项
API地址文本型
变量名类 型静态数组备 注
告警内容文本型 
告警API地址文本型 
i整数型 
告警API地址 = “”
计次循环首 (取数组成员数 (API列表), i)
如果真 (API列表 [i].名称 = 告警API名称)
告警API地址 = API列表 [i].地址
跳出循环 ()

计次循环尾 ()
如果真 (告警API地址 = “”) 返回 ()
告警内容 = “【钉钉发送失败】”#换行
告警内容 = 告警内容 + “序号:”到文本 (项.序号)#换行
告警内容 = 告警内容 + “失败API:” + 项.API名称 + #换行
告警内容 = 告警内容 + “失败地址:” + API地址 + #换行
告警内容 = 告警内容 + “消息内容:” + 项.内容
核心发信 (告警内容, 告警API地址, 项.序号)
' ===================== 调用示例 =====================
子程序名返回值类型公开备 注
测试调用 
变量名类 型静态数组备 注
钉钉工具钉钉消息类 
' 1. 初始化类
钉钉工具.创建 ()
' 2. 添加不同群的独立API
钉钉工具.添加API (“订单群”, “https://oapi.dingtalk.com/robot/send?access_token=订单群token”)
钉钉工具.添加API (“运维群”, “https://oapi.dingtalk.com/robot/send?access_token=运维群token”)
' 3. 设置告警API
钉钉工具.设置告警API (“运维群”)
' 4. 发送消息(自动入队+频率控制)
钉钉工具.发送消息 (“订单12345支fu成功”, “订单群”)
钉钉工具.发送消息 (“服务器CPU使用率90%”, “运维群”)


i支持库列表   支持库注释   
spec特殊功能支持库
json(未知支持库)
internet互联网支持库
EThread多线程支持库
dp1数据操作支持库一


回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值
结帖率:100% (1/1)

签到天数: 13 天

发表于 昨天 23:43 | 显示全部楼层   江苏省苏州市
回复

使用道具 举报

结帖率:100% (3/3)

签到天数: 18 天

发表于 昨天 23:49 | 显示全部楼层   重庆市重庆市
你这应该属于定制化功能开发需求了。而且你的代码都是错的,没什么参考价值...
回复

使用道具 举报

结帖率:89% (16/18)

签到天数: 2 天

发表于 3 小时前 | 显示全部楼层   四川省成都市
你这个需求里真正要拆开的核心就 4 块:

1、API管理
每个API独立保存:名称、地址、启用状态、失败次数、最后发送时间

2、发送队列
入队时只放:消息内容、目标API、时间戳、重试次数
不要把业务逻辑散在各处

3、限速器
你要求 1 分钟不超过 20 条,建议不要每发一条就硬算全局,直接做一个“时间戳队列”,超过窗口期就弹出旧时间

4、失败持久化
失败消息建议写本地文本/数据库,至少记录:内容、目标API、失败原因、时间

你现在这份更像“功能都塞一起了”,后面会越改越乱。我的建议是:
发送类只负责队列调度,
API配置单独管理,
失败记录单独模块。

这样后面加告警API、重试、补发会轻松很多。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表