用 Python 造了个运维小小弟,运维的活就交给我了
off999 2024-09-18 22:34 28 浏览 0 评论
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,,版权归原作者所有,如有问题请及时联系我们以作处理
作者:somenzz
原文链接:https://cloud.tencent.com/developer/article/1758817
周六,正和家人在外边玩得起劲,突然接收到微信报警,某某系统供数出错……
此时,内心是崩溃的,有一万个羊驼在翻腾,我能瞬间说出这系统的 100 个缺陷。
然而,也有另外一个声音在耳边提醒着:抱怨是最没用的,可怜之人必有可恨之处,老板在乎不是你的苦劳,而是你的功劳。
算了,回家打开电脑,解决报错。
以上的场景做过运维的朋友想必比较熟悉,没做过运维的人相信也有类似的经历,总之就是那些让你不爽的事,如果这些不爽的事与电脑有关,不妨继续一看。
痛定思痛,我再也不愿意做如此重复又没技术含量的杂事了,今天必须拿出一个方案来。
向领导说不干这个了
换系统
自己想办法解决
俗话说三思而后行,常言道换位思考,当今互联网时代更要学会产品思维。
假如我是客户,我会喜欢什么样的产品呢?肯定是有问题会自我修复的产品,如果确实无法自我修复,应该提示我升级或找售后维护,如果拒绝服务却又没有任何信息提示,那么这个产品只好废弃不用了。作为一名员工,其实也是领导的一款产品,需要提高自己的核心竞争力,做别人不愿做或做别人做不好的事,这样才能体现自己的价值。这样想,心情平静了许多。
那么,我选择先做 3 。
分析问题:这个属于系统 bug,上传失败通过在网页上再点一次上传按钮就可以传成功。
不如干脆造个运维小小弟在报错的时候自动帮我点下得了!想到这里,我被自己想法折服了,这个还真可以实现,找当今稳排第一的编程语言 Python 来实现这个小小弟就成了,毕竟还是打过交道的,应该没有大问题。
有想法就要有行动,just do it。
思路:我需要的是一个可以在网页上自动操作的小小弟,因此先分析网页 Web 请求,再选取相应的工具,最后编码调试。
第一步 分析网页。网站是需要登陆的,打开 Chrome 浏览器,输入用户名和密码,按 F12 /或 Ctrl + Shift + I 打开开发者工具 ,勾选以下选项。
再点击登陆按钮,然后查看开发者工具的网络请求记录。
发现这一步为 POST 请求,参数中出现了刚才输入用户名密码,这里未加密,有些网站密码可能通过JavaScript 对密码进行了加密后上传至服务器的,此时则需要使用加密后的密码提交 Post 请求。查看其 ResPonse 如下:
发现返回值是 Json 格式的字符串,有个 methodName 为 login,参数也是刚才输入的用户名密码,更进一步说明,这一请求就是验证登陆用户是否合法的。
第二步 选取工具。这里涉及到爬虫,我熟悉的爬虫工具有 urllib(标准库),requests(第三方库),selenium(第三方库),
urllib 比较简单,实现 Session 有点麻烦;selenium 太笨重,虽然可以运行 JavaScript,但是需要浏览器驱动,找各种元素的 xpath,运行起来也很慢;而 requests 库就非常 Pythonnic ,简单而优雅,能轻松处理 Session ,这也是我的最爱用的工具。
于是选定 requests 先做一个登陆验证。
第三步 编码调试。由于页面需要登陆,因此需要保留与服务器通讯的会话 Session。
登陆的代码如下:
import requests
s = requests.Session()
url = "http://xxx.xxx.xxx.xxx:9080/******/vision/RMIServlet"
data = {
"className": "UserService",
"methodName": "login",
"params": '["admin","******"]',
}
r = s.post(url, data=data)
print(r.text)
print(r.status_code)
执行结果为
{"retCode":0,"result":true}
200
返回 200 说明访问成功,小兴奋了一把。接着,同样的方法我点击供数配置菜单,得到供数的页面,继续分析。
点击供数配置时的请求
点击供数配置后的应答
发现其返回了跳转页面的参数,我们获取该参数,继续请求即可,对应的代码如下:
import requests
import json
s = requests.Session()
url = "http://xxx.xxx.xxx.xxx:9080/******/vision/RMIServlet"
data = {
"className": "UserService",
"methodName": "login",
"params": '["admin","******"]',
}
r = s.post(url, data=data)
print(r.text)
print(r.status_code)
data2 = {
"className": "UrlLinkService",
"methodName": "getURLLink",
"params": '["I8ae3cd903146dcb1013146df075c000c"]',
}
r2 = s.post(url, data=data2)
print("获取供数配置页面参数信息",r2.status_code)
result = json.loads(r2.text) # 将Json 字符串转化为 Python 字典
print(result['result']['url']) # 获取 url 参数
运行结果如下:
{"retCode":0,"result":true}
200
获取供数配置页面参数信息 200
/bioffice/vision/SupplyManagement?opFlg=querySysCfgTask&forwardPage=list.jsp
接下来,点击我们要处理的系统名称,再点击详细信息,找到重新上传按钮,注意每一步的 Post 或 Get 请求,道理都是通的,编写相应的 Post 或 Get 代码即可。
完整代码如下所示:
import requests
import json
s = requests.Session()
url = "http://xxx.xxx.xxx.xxx:9080/******/vision/RMIServlet"
data = {
"className": "UserService",
"methodName": "login",
"params": '["admin","******"]',
}
r = s.post(url, data=data)
print(r.text)
print(r.status_code)data2 = {
"className": "UrlLinkService",
"methodName": "getURLLink",
"params": '["I8ae3cd903146dcb1013146df075c000c"]',
}
r2 = s.post(url, data=data2)
print("获取供数配置页面参数信息",r2.status_code)
result = json.loads(r2.text) # 将Json 字符串转化为 Python 字典
print(result['result']['url']) # 获取 url 参数url3 = f"http://xxx.xxx.xxx.xxx:9080{result['result']['url']}"
#print(url3)
r3 = s.get(url3)
print(r3.url, r3.status_code)taskinfo = ['988909',CRM.DJJGXCKMX','2018-08-19','CRM'] #实际使用时可做为参数传入payload0 = {
"opFlg": "queryTask",
"forwardPage": "listtask.jsp",
"sysid": taskinfo[3],
"sysname": "",
"rundate": taskinfo[2],
}
payload1 = {
"opFlg": "modifyTask",
"forwardPage": "listtask.jsp",
"flg": "U",
"sid": taskinfo[0],
"vname": taskinfo[1],
"rundate": taskinfo[2],
}r4 = s.get(
"http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement", params=payload0
)
r5 = s.get(
"http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement", params=payload1
)print(r4.url, r4.status_code)
print(r5.url, r5.status_code)
if r5.status_code == 200:
print("已执行上传")
else:
print("执行上传失败")
测试环境验证:
执行前:
原本运行结束时间为 2018-08-20 05:37:11
执行上述代码,打印信息如下:
{"retCode":0,"result":true}
200
获取供数配置页面参数信息 200
/bioffice/vision/SupplyManagement?opFlg=querySysCfgTask&forwardPage=list.jsp
http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement/list.jsp 200
http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement/listtask.jsp 200
http://xxx.xxx.xxx.xxx:9080/******/vision/SupplyManagement/listtask.jsp 200
已执行上传
再次查看运行结束时间为2018-08-20 22:47:39
说明这个小小弟已经成功的为我执行了重新上传的任务,后续可监控的报警信息传递给这个小小弟,小小弟就可以在生产环境自动帮我处理上传失败的问题了。
总结:只要思想不滑坡,办法总比困难多。上面分享的这些,对于懂 http 协议的人来说简单地就像老戏骨看小娃娃表演一般,所以起名叫小小弟,他的功能还是非常简单的,但是把这些技术用于解决实际的运维问题我认为还是比较有意义的,具有自动修复功能的运维才是真正的自动化运维。后续会逐步加强小小弟的功能。
相关推荐
- 使用 python-fire 快速构建 CLI_如何搭建python项目架构
-
命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。Python是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并...
- Python 闭包:从底层逻辑到实战避坑,附安全防护指南
-
一、闭包到底是什么?你可以把闭包理解成一个"带记忆的函数"。它诞生时会悄悄记下自己周围的变量,哪怕跑到别的地方执行,这些"记忆"也不会丢失。就像有人出门时总会带上...
- 使用Python实现九九乘法表的打印_用python打印一个九九乘法表
-
任务要求九九乘法表的结构如下:1×1=11×2=22×2=41×3=32×3=63×3=9...1×9=92×9=18...9×9=81使用Python编写程序,按照上述格式打印出完整的九...
- 吊打面试官(四)--Java语法基础运算符一文全掌握
-
简介本文介绍了Java运算符相关知识,包含运算规则,运算符使用经验,特殊运算符注意事项等,全文5400字。熟悉了这些内容,在运算符这块就可以吊打面试官了。Java运算符的规则与特性1.贪心规则(Ma...
- Python三目运算基础与进阶_python三目运算符判断三个变量
-
#头条创作挑战赛#Python中你学会了三步运算,你将会省去很多无用的代码,我接下来由基础到进阶的方式讲解Python三目运算基础在Python中,三目运算符也称为条件表达式。它可以通过一行代码实现条...
- Python 中 必须掌握的 20 个核心函数——set()详解
-
set()是Python中用于创建集合的核心函数,集合是一种无序、不重复元素的容器,非常适合用于成员检测、去重和数学集合运算。一、set()的基本用法1.1创建空集合#创建空集合empty_se...
- 15个让Python编码效率翻倍的实用技巧
-
在软件开发领域,代码质量往往比代码数量更重要。本文整理的15个Python编码技巧,源自开发者在真实项目中验证过的工作方法,能够帮助您用更简洁的代码实现更清晰的逻辑。这些技巧覆盖基础语法优化到高级特性...
- 《Python从小白到入门》自学课程目录汇总(和猫妹学Python)
-
小朋友们好,大朋友们好!不知不觉,这套猫妹自学Python基础课程已经结束了,猫妹体会到了水滴石穿的力量。水一直向下滴,时间长了能把石头滴穿。只要坚持不懈,细微之力也能做出很难办的事。就比如咱们的学习...
- 8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……
-
近日,国外网友因为一道小学数学题在推特上争得热火朝天。事情的起因是一个推特网友@pjmdoll发布了一条推文,让他的关注者解答一道数学题:Viralmathequationshavebeen...
- Python学不会来打我(21)python表达式知识点汇总
-
在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...
- Python运算符:数学助手,轻松拿咧
-
Python中的运算符就像是生活中的数学助手,帮助我们快速准确地完成这些计算。比如购物时计算总价、做家务时分配任务等。这篇文章就来详细聊聊Python中的各种运算符,并通过实际代码示例帮助你更好地理解...
- Python学不会来打我(17)逻辑运算符的使用方法与使用场景
-
在Python编程中,逻辑运算符(LogicalOperators)是用于组合多个条件表达式的关键工具。它们可以将多个布尔表达式连接起来,形成更复杂的判断逻辑,并返回一个布尔值(True或Fa...
- Python编程基础:运算符的优先级_python中的运算符优先级问题
-
多个运算符同时出现在一个表达式中时,先执行哪个,后执行哪个,这就涉及运算符的优先级。如数学表达式,有+、-、×、÷、()等,优先级顺序是()、×、÷、+、-,如5+(5-3)×4÷2,先计算(5-3)...
- Python运算符与表达式_python中运算符&的功能
-
一、运算符分类总览1.Python运算符全景图2.运算符优先级表表1.3.1Python运算符优先级(从高到低)优先级运算符描述结合性1**指数右→左2~+-位非/一元加减右→左3*//...
- Python操作Excel:从基础到高级的深度实践
-
Python凭借其丰富的库生态系统,已成为自动化处理Excel数据的强大工具。本文将深入探讨五个关键领域,通过实际代码示例展示如何利用Python进行高效的Excel操作,涵盖数据处理、格式控制、可视...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 使用 python-fire 快速构建 CLI_如何搭建python项目架构
- Python 闭包:从底层逻辑到实战避坑,附安全防护指南
- 使用Python实现九九乘法表的打印_用python打印一个九九乘法表
- 吊打面试官(四)--Java语法基础运算符一文全掌握
- Python三目运算基础与进阶_python三目运算符判断三个变量
- Python 中 必须掌握的 20 个核心函数——set()详解
- 15个让Python编码效率翻倍的实用技巧
- 《Python从小白到入门》自学课程目录汇总(和猫妹学Python)
- 8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……
- Python学不会来打我(21)python表达式知识点汇总
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)