分享

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

 数据和云 2020-07-01

如有不了解 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的工作量。

作者:徐美兰

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

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约