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

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

本文主要介绍通过 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 sys
import urllib2
import json
import cx_Oracle
import os
from selenium import webdriver
from requests import Session
from selenium.webdriver.firefox.options import Options as FirefoxOptions
from selenium.webdriver.chrome.options import Options as ChromeOptions
from time import sleep
default_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_id
self.corp_secret = corp_secret
self.baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(self.corp_id, self.corp_secret)
self.send_values = {}

# Get AccessToken
def 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 Message
def send_data(self, userid, message):
self.message = message
self.send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.access_token
self.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 Message
msg = response.read()
print userid + ':' + msg
return 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 = 1
wxPostList = []
# start with 0 column
while i < 100 :
j = 1
while 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 + 1
except :
break
#sleep(1)
i = i  + 1
wd.quit()

i = 0
j = 0
wxMsg = '信息技术局技术开发部\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 = 0
j = j + 1
else:
wxMsg = wxMsg +  '所有鸿翔数据库无任何告警信息!'
get_test = Token(corpid, corpsecret)
get_test.get_token()
msg = get_test.send_data(toUser, wxMsg)

三、以下是推送结果

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

原文发布时间为:2018-07-05
本文作者:徐美兰
本文来自云栖社区合作伙伴“数据和云”,了解相关信息可以关注“数据和云”。

相关文章
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
49 10
|
2月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
2月前
|
并行计算 调度 开发者
探索Python中的异步编程:从基础到实战
在Python的世界里,异步编程是一种让程序运行更加高效、响应更快的技术。本文不仅会介绍异步编程的基本概念和原理,还将通过具体代码示例展示如何在Python中实现异步操作。无论你是初学者还是有经验的开发者,都能从中获益,了解如何运用这一技术优化你的项目。
|
2月前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
2月前
|
机器学习/深度学习 数据采集 数据可视化
Python数据科学实战:从Pandas到机器学习
Python数据科学实战:从Pandas到机器学习
|
2月前
|
数据采集 机器学习/深度学习 人工智能
Python编程入门:从基础到实战
【10月更文挑战第36天】本文将带你走进Python的世界,从基础语法出发,逐步深入到实际项目应用。我们将一起探索Python的简洁与强大,通过实例学习如何运用Python解决问题。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供有价值的指导和灵感。让我们一起开启Python编程之旅,用代码书写想法,创造可能。
|
2月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
73 0
|
2月前
|
数据采集 存储 数据处理
探索Python中的异步编程:从基础到实战
【10月更文挑战第39天】在编程世界中,时间就是效率的代名词。Python的异步编程特性,如同给程序穿上了一双翅膀,让它们在执行任务时飞得更高、更快。本文将带你领略Python异步编程的魅力,从理解其背后的原理到掌握实际应用的技巧,我们不仅会讨论理论基础,还会通过实际代码示例,展示如何利用这些知识来提升你的程序性能。准备好让你的Python代码“起飞”了吗?让我们开始这场异步编程的旅程!
43 0
|
2月前
|
并行计算 数据挖掘 大数据
Python数据分析实战:利用Pandas处理大数据集
Python数据分析实战:利用Pandas处理大数据集
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等