暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

徐美兰 2018-07-06
608

关注我们获得更多精彩


作者 | 徐美兰 ,邮政软件开发工程师,广东、湖南邮政金融数据中心任职多年,擅长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 写的。代码可以通过本文的『原文链接』下载。

    以下是实现代码示范:    

  1. # -*- coding:utf-8 -*-

  2. import sys

  3. import urllib2

  4. import json

  5. import cx_Oracle

  6. import os

  7. from selenium import webdriver

  8. from requests import Session

  9. from selenium.webdriver.firefox.options import Options as FirefoxOptions

  10. from selenium.webdriver.chrome.options import Options as ChromeOptions

  11. from time import sleep

  12. default_encoding = 'utf-8'

  13. if sys.getdefaultencoding() != default_encoding:

  14. reload(sys)

  15. sys.setdefaultencoding(default_encoding)


  16. os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'


  17. class Token(object):

  18. def __init__(self, corp_id, corp_secret):

  19. self.corp_id = corp_id

  20. self.corp_secret = corp_secret

  21. self.baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.corp_id, self.corp_secret)

  22. self.send_values = {}


  23. # Get AccessToken

  24. def get_token(self):

  25. conn = cx_Oracle.connect('FI_SAL/FI_SAL@*.*.*.*:1521/orcl')#本人企业号token定时爬取存在数据库里

  26. cur = conn.cursor()

  27. sql = "select * from WX_ACCESS_TOKEN"

  28. cur.execute(sql)

  29. result = cur.fetchall()

  30. for row in result:

  31. self.access_token = row[0]

  32. cur.close()

  33. conn.close()

  34. return self.access_token


  35. # Send Message

  36. def send_data(self, userid, message):

  37. self.message = message

  38. self.send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.access_token

  39. self.send_values = {

  40. "touser": userid,#接收人

  41. "msgtype": "text",

  42. "agentid": "55",#企业号对应的应用ID

  43. "text": {

  44. "content": message

  45. },

  46. "safe": "0"

  47. }

  48. send_data = json.dumps(self.send_values, ensure_ascii=False)

  49. send_request = urllib2.Request(self.send_url, send_data)

  50. response = urllib2.urlopen(send_request)

  51. # Get Response Message

  52. msg = response.read()

  53. print userid + ':' + msg

  54. return msg


  55. corpid = '*****************************'

  56. corpsecret = '**********************************'

  57. #接收人 DBA加部门领导

  58. toUser = '******|******'


  59. req = Session()

  60. req.headers.clear()

  61. options = FirefoxOptions()

  62. options.add_argument("--headless")

  63. wd = webdriver.Firefox(firefox_options=options)

  64. #wd = webdriver.Firefox()

  65. logInUrl = 'https://登录页面的IP:登录页面的端口/em/faces/logon/core-uifwk-console-login'

  66. wd.get(logInUrl)


  67. wd.find_element_by_xpath('//*[@id="j_username::content"]').send_keys('***填写登录账号**')

  68. wd.find_element_by_xpath('//*[@id="j_password::content"]').send_keys('***填写登录密码**')

  69. sleep(2)

  70. wd.find_element_by_xpath('//*[@id="login"]').click()

  71. sleep(2)

  72. wd.find_element_by_xpath('//*[@id="emT:lrmd1:iCustVw:4:custViewLink"]').click()

  73. sleep(2)

  74. i = 1

  75. wxPostList = []

  76. # start with 0 column

  77. while i < 100 :

  78. j = 1

  79. while j < 100 :

  80. xPathColumn1 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[1]'

  81. xPathColumn2 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[2]'

  82. xPathColumn3 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[3]'

  83. xPathColumn6 = '//*[@id="emT:lrmd1:tbmd1:pc2:t2::db"]/table[' + str(i) + ']/tbody/tr[' + str(j) + ']/td[2]/div/table/tbody/tr/td[6]'

  84. try :

  85. tableElementColumn1 = wd.find_element_by_xpath(xPathColumn1)

  86. tableElementColumn2 = wd.find_element_by_xpath(xPathColumn2)

  87. tableElementColumn3 = wd.find_element_by_xpath(xPathColumn3)

  88. tableElementColumn6 = wd.find_element_by_xpath(xPathColumn6)

  89. tableElementColumn1ImgTag = tableElementColumn1.find_element_by_tag_name("img")

  90. tableElementColumn1Content = tableElementColumn1ImgTag.get_attribute("title")

  91. tableElementColumn2Content = tableElementColumn2.get_attribute('textContent')

  92. tableElementColumn3Content = tableElementColumn3.get_attribute('textContent')

  93. tableElementColumn6Content = tableElementColumn6.get_attribute('textContent')


  94. tempMsg = \

  95. "Target: " + tableElementColumn3Content +  "\n" \

  96. + "Severity: " + tableElementColumn1Content + "\n" \

  97. + "Last Updated: \n" + tableElementColumn6Content[0:24]  + "\n" \

  98. + "Summary: " + tableElementColumn2Content + "\n\n"

  99. wxPostList.append(tempMsg)

  100. j = j + 1

  101. except :

  102. break

  103. #sleep(1)

  104. i = i  + 1

  105. wd.quit()


  106. i = 0

  107. j = 0

  108. wxMsg = '信息技术局技术开发部\n数据库巡检结果:\n\n'

  109. if len(wxPostList) > 0 :

  110. for i in range(len(wxPostList)) :

  111. wxMsg = wxMsg + wxPostList[i]

  112. if j == 9 or i ==  (len(wxPostList) - 1):

  113. wxMsg = wxMsg.encode('utf-8')

  114. get_test = Token(corpid, corpsecret)

  115. get_test.get_token()

  116. msg = get_test.send_data(toUser, wxMsg)

  117. wxMsg = ''

  118. j = 0

  119. j = j + 1

  120. else:

  121. wxMsg = wxMsg +  '所有鸿翔数据库无任何告警信息!'

  122. get_test = Token(corpid, corpsecret)

  123. get_test.get_token()

  124. msg = get_test.send_data(toUser, wxMsg)


三、以下是推送结果

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


作者:徐美兰

投稿:有投稿、寻求报道意向技术人请在微信对话框留言。

更多精彩请关注 “数据和云” 微信

资源下载

关注微信:数据和云(OraNews)回复关键字获取

2018DTCC , 数据库大会PPT

2017DTC,2017 DTC 大会 PPT

DBALIFE ,“DBA 的一天”海报

DBA04 ,DBA 手记4 电子书

122ARCH ,Oracle 12.2体系结构图

2017OOW ,Oracle OpenWorld 资料

PRELECTION ,大讲堂讲师课程资料

近期文章

仅仅使用AWR做报告? 性能优化还未入门

实战课堂:一则CPU 100%的故障分析

杨廷琨:如何编写高效SQL(含PPT)

一份高达555页的技术PPT会是什么样子?

大象起舞:用PostgreSQL解海盗分金问题

ProxySQL!像C罗一样的强大

高手过招:用SQL解决环环相扣的刑侦推理

最后修改时间:2020-05-07 23:50:03
文章转载自徐美兰,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论