实战技巧:Python爬取OEM 12C上的告警信息并推送至微信企业号

作者 | 徐美兰 ,邮政软件开发工程师,广东、湖南邮政金融数据中心任职多年,擅长Oracle数据库性能诊断与调优,对基于Python的数据分析与挖掘开发具有浓厚兴趣。

编者说明:Python 作为流行的开发语言,在 DBA 的日常工作中,发挥着日益重要的作用,本文作者通过 Python 实现了将 OEM 告警采集分发到微信的功能,可以对我们的工作起到借鉴和启发之处,特整理供读者参考。

本文主要介绍通过 Python 爬虫脚本,将所有目标的告警信息爬下来,并推送到微信企业号应用实现单点对多目标的巡检。籍此以减少 DBA 的工作量。

如有不了解 Oracle Enterprise Manager Cloud Control 12c 的,可搜索信息自行了解。

一、设置 Incident Manager: All open incidents 为管理器打开的主页面

如下图所示:

二、利用 Python 编写爬虫

利用 python+selenium+geckodriver 爬取一中告警信息推送到企业号。

注意:需要安装 firefox 浏览器(linux 默认自带的 firefox 版本较低的请自行升级到最新版),同时是用 python2.7 写的。代码可以通过本文的『原文链接』下载。

以下是实现代码示范:

# -*- coding:utf-8 -*-import sysimport urllib2import jsonimport cx_Oracleimport osfrom selenium import webdriverfrom requests import Sessionfrom selenium.webdriver.firefox.options import Options as FirefoxOptionsfrom selenium.webdriver.chrome.options import Options as ChromeOptionsfrom time import sleepdefault_encoding = 'utf-8'if sys.getdefaultencoding() != default_encoding:reload(sys)sys.setdefaultencoding(default_encoding)
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
class Token(object):def __init__(self, corp_id, corp_secret):self.corp_id = corp_idself.corp_secret = corp_secretself.baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.corp_id, self.corp_secret)self.send_values = {}
# Get AccessTokendef get_token(self):conn = cx_Oracle.connect('FI_SAL/FI_SAL@*.*.*.*:1521/orcl')#本人企业号token定时爬取存在数据库里cur = conn.cursor()sql = "select * from WX_ACCESS_TOKEN"cur.execute(sql)result = cur.fetchall()for row in result:self.access_token = row[0]cur.close()conn.close()return self.access_token
# Send Messagedef send_data(self, userid, message):self.message = messageself.send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.access_tokenself.send_values = {"touser": userid,#接收人"msgtype": "text","agentid": "55",#企业号对应的应用ID"text": {"content": message},"safe": "0"}send_data = json.dumps(self.send_values, ensure_ascii=False)send_request = urllib2.Request(self.send_url, send_data)response = urllib2.urlopen(send_request)# Get Response Messagemsg = response.read()print userid + ':' + msgreturn msg
corpid = '*****************************'corpsecret = '**********************************'#接收人 DBA加部门领导toUser = '******|******'
req = Session()req.headers.clear()options = FirefoxOptions()options.add_argument("--headless")wd = webdriver.Firefox(firefox_options=options)#wd = webdriver.Firefox()logInUrl = 'https://登录页面的IP:登录页面的端口/em/faces/logon/core-uifwk-console-login'wd.get(logInUrl)
wd.find_element_by_xpath('//*[@id="j_username::content"]').send_keys('***填写登录账号**')wd.find_element_by_xpath('//*[@id="j_password::content"]').send_keys('***填写登录密码**')sleep(2)wd.find_element_by_xpath('//*[@id="login"]').click()sleep(2)wd.find_element_by_xpath('//*[@id="emT:lrmd1:iCustVw:4:custViewLink"]').click()sleep(2)i = 1wxPostList = []# start with 0 columnwhile i < 100 :j = 1while j < 100 :xPathColumn1 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[1]'xPathColumn2 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[2]'xPathColumn3 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[3]'xPathColumn6 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[6]'try :tableElementColumn1 = wd.find_element_by_xpath(xPathColumn1)tableElementColumn2 = wd.find_element_by_xpath(xPathColumn2)tableElementColumn3 = wd.find_element_by_xpath(xPathColumn3)tableElementColumn6 = wd.find_element_by_xpath(xPathColumn6)tableElementColumn1ImgTag = tableElementColumn1.find_element_by_tag_name("img")tableElementColumn1Content = tableElementColumn1ImgTag.get_attribute("title")tableElementColumn2Content = tableElementColumn2.get_attribute('textContent')tableElementColumn3Content = tableElementColumn3.get_attribute('textContent')tableElementColumn6Content = tableElementColumn6.get_attribute('textContent')
tempMsg = \"Target: " + tableElementColumn3Content +  "\n" \+ "Severity: " + tableElementColumn1Content + "\n" \+ "Last Updated: \n" + tableElementColumn6Content[0:24]  + "\n" \+ "Summary: " + tableElementColumn2Content + "\n\n"wxPostList.append(tempMsg)j = j + 1except :break#sleep(1)i = i  + 1wd.quit()
i = 0j = 0wxMsg = '信息技术局技术开发部\n数据库巡检结果:\n\n'if len(wxPostList) > 0 :for i in range(len(wxPostList)) :wxMsg = wxMsg + wxPostList[i]if j == 9 or i ==  (len(wxPostList) - 1):wxMsg = wxMsg.encode('utf-8')get_test = Token(corpid, corpsecret)get_test.get_token()msg = get_test.send_data(toUser, wxMsg)wxMsg = ''j = 0j = j + 1else:wxMsg = wxMsg +  '所有鸿翔数据库无任何告警信息!'get_test = Token(corpid, corpsecret)get_test.get_token()msg = get_test.send_data(toUser, wxMsg)

三、以下是推送结果

通过这样的监控设置,将信息及时送达,即起到通知的及时性,又实现了自动化流程,一定的减少了DBA的工作量。

作者:徐美兰

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2018-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏jessetalks

Open ID Connect(OIDC)在 ASP.NET Core中的应用

我们在《ASP.NET Core项目实战的课程》第一章里面给identity server4做了一个全面的介绍和示例的练习 ,这篇文章是根据大家对OIDC遇到的...

3498
来自专栏月色的自留地

RS232串口的Windows编程纪要

2434
来自专栏MongoDB中文社区

9月.精华文章推荐

1.《GDPR: Impact to Your Data Management Landscape:Part 3 》

1252
来自专栏FreeBuf

伽利略远程监控系统完全安装指南

7月初,外媒用臭名昭著形容意大利的网络军火商公司hacking team及其被黑事件,黑吃黑的黑客将该公司rcs系统的安装程序、源代码和邮件打包供所有人下载,更...

37410
来自专栏web编程技术分享

简单粗暴,详细得不要不要的 JavaWeb快速入门

4019
来自专栏Fundebug

XSS攻击之窃取Cookie

译者按: 10 年前的博客似乎有点老了,但是XSS 攻击的威胁依然还在,我们不得不防。

1845
来自专栏月色的自留地

RS232串口的Windows编程纪要

1.1K8
来自专栏Android群英传

Siri 帮我开灯

1122
来自专栏FreeBuf

正确姿势:如何调戏蹭网者

这篇文章本来是知乎回答的一个问题,但是由于本人五行缺勤奋,所以一直没写(其实是忘了=。=),下面是我的一个实验,如何通过squid调戏那些蹭网的人。没什么技术含...

2578
来自专栏北京马哥教育

推荐!国外程序员整理的系统管理员资源大全(一)

备份软件 Amanda -客户端-服务器模型备份工具 Bacula - 另一个客户端-服务器模型备份工具 Backupninja -轻量级,可扩展的元数据备份系...

52510

扫码关注云+社区

领取腾讯云代金券