python利用微信公眾號報警程式碼
微信公眾號共有三種,服務號、訂閱號、企業號。它們在獲取AccessToken上各有不同。
其中訂閱號比較坑,它的AccessToken是需定時重新整理,重複獲取將導致上次獲取的AccessToken失效。
而企業號就比較好,AccessToken有效期同樣為7200秒,但有效期內重複獲取返回相同結果。
為相容這兩種方式,因此按照訂閱號的方式處理。
處理辦法與介面文件中的要求相同:
為了保密appsecrect,第三方需要一個access_token獲取和重新整理的中控伺服器。
而其他業務邏輯伺服器所使用的access_token均來自於該中控伺服器,不應該各自去重新整理,否則會造成access_token覆蓋而影響業務。
下面的程式碼以企業號為例,將access_token儲存在sqlite3資料庫中,相比儲存在文字中,放在數
據庫裡,可以為後期存放其他資料提供向後相容。如果放在文字中,則不如放在資料庫中靈活。
設計思路和使用方法:
自動建立sqlite3資料庫,包括表結構和資料,並能在資料庫表結構不存在或者資料不存在或遭刪除的情況下,建立新的可用的資料
儘可能的保證Class中每一個可執行的函式單獨呼叫都能成功。
Class中只將真正能被用到的方法和變數設定為public的。
使用時只需要修改此檔案中的weixin_qy_CorpID和weixin_qy_Secret改成自己的,並import此檔案,使
用WeiXinTokenClass().get()方法即可得到access_token。
#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
import os
import sqlite3
import sys
import urllib
import urllib2
import json
import datetime
# import time
enable_debug = True
def debug(msg, code=None):
if enable_debug:
if code is None:
print "message: %s" % msg
else:
print "message: %s, code: %s " % (msg, code)
AUTHOR_MAIL = "uberurey_ups@163.com"
weixin_qy_CorpID = "your_corpid"
weixin_qy_Secret = "your_secret"
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
# Database
# https://docs.djangoproject.com/en/1.9/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, '.odbp_db.sqlite3'),
}
}
sqlite3_db_file = str(DATABASES['default']['NAME'])
def sqlite3_conn(database):
try:
conn = sqlite3.connect(database)
except sqlite3.Error:
print >> sys.stderr, """\
There was a problem connecting to Database:
%s
The error leading to this problem was:
%s
It's possible that this database is broken or permission denied.
If you cannot solve this problem yourself, please mail to:
%s
""" % (database, sys.exc_value, AUTHOR_MAIL)
sys.exit(1)
else:
return conn
def sqlite3_commit(conn):
return conn.commit()
def sqlite3_close(conn):
return conn.close()
def sqlite3_execute(database, sql):
try:
sql_conn = sqlite3_conn(database)
sql_cursor = sql_conn.cursor()
sql_cursor.execute(sql)
sql_conn.commit()
sql_conn.close()
except sqlite3.Error as e:
print e
sys.exit(1)
def sqlite3_create_table_token():
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
sql_cursor.execute('''CREATE TABLE "main"."weixin_token" (
"id" INTEGER ,
"access_token" TEXT,
"expires_in" TEXT,
"expires_on" TEXT,
"is_expired" INTEGER
)
;
''')
sqlite3_commit(sql_conn)
sqlite3_close(sql_conn)
def sqlite3_create_table_account():
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
sql_cursor.execute('''CREATE TABLE "main"."weixin_account" (
"id" INTEGER,
"name" TEXT,
"corpid" TEXT,
"secret" TEXT,
"current" INTEGER
)
;
''')
sqlite3_commit(sql_conn)
sqlite3_close(sql_conn)
def sqlite3_create_tables():
print "sqlite3_create_tables"
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
sql_cursor.execute('''CREATE TABLE "main"."weixin_token" (
"id" INTEGER ,
"access_token" TEXT,
"expires_in" TEXT,
"expires_on" TEXT,
"is_expired" INTEGER
)
;
''')
sql_cursor.execute('''CREATE TABLE "main"."weixin_account" (
"id" INTEGER,
"name" TEXT,
"corpid" TEXT,
"secret" TEXT,
"current" INTEGER
)
;
''')
sqlite3_commit(sql_conn)
sqlite3_close(sql_conn)
def sqlite3_set_credential(corpid, secret):
try:
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
sql_cursor.execute('''INSERT INTO "weixin_account" ("id", "name", "corpid", "secret", "current") VALUES
(1,
'odbp',
?,
?,
1)
''', (corpid, secret))
sqlite3_commit(sql_conn)
sqlite3_close(sql_conn)
except sqlite3.Error:
sqlite3_create_table_account()
sqlite3_set_credential(corpid, secret)
def sqlite3_set_token(access_token, expires_in, expires_on, is_expired):
try:
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
sql_cursor.execute('''INSERT INTO "weixin_token"
("id", "access_token", "expires_in", "expires_on", "is_expired") VALUES
(
1,
?,
?,
?,
?
)
''', (access_token, expires_in, expires_on, is_expired))
sqlite3_commit(sql_conn)
sqlite3_close(sql_conn)
except sqlite3.Error:
sqlite3_create_table_token()
sqlite3_set_token(access_token, expires_in, expires_on, is_expired)
def sqlite3_get_credential():
try:
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
credential = sql_cursor.execute('''SELECT "corpid", "secret" FROM weixin_account WHERE current == 1;''')
result = credential.fetchall()
sqlite3_close(sql_conn)
except sqlite3.Error:
sqlite3_set_credential(weixin_qy_CorpID, weixin_qy_Secret)
return sqlite3_get_credential()
else:
if result is not None and len(result) != 0:
return result
else:
print "unrecoverable problem, please alter to %s" % AUTHOR_MAIL
sys.exit(1)
def sqlite3_get_token():
try:
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
credential = sql_cursor.execute(
'''SELECT "access_token", "expires_on" FROM weixin_token WHERE "is_expired" == 1 ;''')
result = credential.fetchall()
sqlite3_close(sql_conn)
except sqlite3.Error:
info = sys.exc_info()
print info[0], ":", info[1]
else:
if result is not None and len(result) != 0:
return result
else:
# print "unrecoverable problem, please alter to %s" % AUTHOR_MAIL
# sys.exit(1)
return None
def sqlite3_update_token(access_token, expires_on):
sql_conn = sqlite3_conn(sqlite3_db_file)
sql_cursor = sql_conn.cursor()
sql_cursor.execute('''UPDATE "weixin_token" SET
access_token=?,
expires_on=?
WHERE _ROWID_ = 1;''', (access_token, expires_on)
)
sqlite3_commit(sql_conn)
sqlite3_close(sql_conn)
class WeiXinTokenClass(object):
def __init__(self):
self.__corpid = None
self.__corpsecret = None
self.__use_persistence = True
self.__access_token = None
self.__expires_in = None
self.__expires_on = None
self.__is_expired = None
if self.__use_persistence:
self.__corpid = sqlite3_get_credential()[0][0]
self.__corpsecret = sqlite3_get_credential()[0][1]
else:
self.__corpid = weixin_qy_CorpID
self.__corpsecret = weixin_qy_Secret
def __get_token_from_weixin_qy_api(self):
parameters = {
"corpid": self.__corpid,
"corpsecret": self.__corpsecret
}
url_parameters = urllib.urlencode(parameters)
token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?"
url = token_url + url_parameters
response = urllib2.urlopen(url)
result = response.read()
token_json = json.loads(result)
if token_json['access_token'] is not None:
get_time_now = datetime.datetime.now()
# TODO(Guodong Ding) token will expired ahead of time or not expired after the time
expire_time = get_time_now + datetime.timedelta(seconds=token_json['expires_in'])
token_json['expires_on'] = str(expire_time)
self.__access_token = token_json['access_token']
self.__expires_in = token_json['expires_in']
self.__expires_on = token_json['expires_on']
self.__is_expired = 1
try:
token_result_set = sqlite3_get_token()
except sqlite3.Error:
token_result_set = None
if token_result_set is None and len(token_result_set) == 0:
sqlite3_set_token(self.__access_token, self.__expires_in, self.__expires_on, self.__is_expired)
else:
if self.__is_token_expired() is True:
sqlite3_update_token(self.__access_token, self.__expires_on)
else:
debug("pass")
return
else:
if token_json['errcode'] is not None:
print "errcode is: %s" % token_json['errcode']
print "errmsg is: %s" % token_json['errmsg']
else:
print result
def __get_token_from_persistence_storage(self):
try:
token_result_set = sqlite3_get_token()
except sqlite3.Error:
self.__get_token_from_weixin_qy_api()
finally:
if token_result_set is None:
self.__get_token_from_weixin_qy_api()
token_result_set = sqlite3_get_token()
access_token = token_result_set[0][0]
expire_time = token_result_set[0][1]
else:
access_token = token_result_set[0][0]
expire_time = token_result_set[0][1]
expire_time = datetime.datetime.strptime(expire_time, '%Y-%m-%d %H:%M:%S.%f')
now_time = datetime.datetime.now()
if now_time < expire_time:
# print "The token is %s" % access_token
# print "The token will expire on %s" % expire_time
return access_token
else:
self.__get_token_from_weixin_qy_api()
return self.__get_token_from_persistence_storage()
@staticmethod
def __is_token_expired():
try:
token_result_set = sqlite3_get_token()
except sqlite3.Error as e:
print e
sys.exit(1)
expire_time = token_result_set[0][1]
expire_time = datetime.datetime.strptime(expire_time, '%Y-%m-%d %H:%M:%S.%f')
now_time = datetime.datetime.now()
if now_time < expire_time:
return False
else:
return True
def get(self):
return self.__get_token_from_persistence_storage()
Python實現通過微信企業號傳送文字訊息的Class
程式設計要點和呼叫方法:
支援傳送中文,核心語句“payload = json.dumps(self.data, encoding='utf-8', ensure_ascii=False)”,關鍵字“python json 中文”
這個Class只有一個公共方法send()。
使用方法:import這個class,然後呼叫send方法即可,方法引數只需要兩個,給誰(多UserID用"|"隔開),內容是什麼,例如:
import odbp_sendMessage
msg = odbp_sendMessage.WeiXinSendMsgClass()
msg.send("dingguodong", "Python 大魔王!")
#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File: LinuxBashShellScriptForOps:odbp_sendMessage.py
User: Guodong
Create Date: 2016/8/12
Create Time: 14:49
"""
import odbp_getToken
class WeiXinSendMsgClass(object):
def __init__(self):
self.access_token = odbp_getToken.WeiXinTokenClass().get()
self.to_user = ""
self.to_party = ""
self.to_tag = ""
self.msg_type = "text"
self.agent_id = 2
self.content = ""
self.safe = 0
self.data = {
"touser": self.to_user,
"toparty": self.to_party,
"totag": self.to_tag,
"msgtype": self.msg_type,
"agentid": self.agent_id,
"text": {
"content": self.content
},
"safe": self.safe
}
def send(self, to_user, content):
if to_user is not None and content is not None:
self.data['touser'] = to_user
self.data['text']['content'] = content
else:
raise RuntimeError
import requests
import json
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send"
querystring = {"access_token": self.access_token}
payload = json.dumps(self.data, encoding='utf-8', ensure_ascii=False)
headers = {
'content-type': "application/json",
'cache-control': "no-cache",
}
response = requests.request("POST", url, data=payload, headers=headers, params=querystring)
return_content = json.loads(response.content)
if return_content["errcode"] == 0 and return_content["errmsg"] == "ok":
print "Send successfully! %s " % return_content
else:
print "Send failed! %s " % return_content
python呼叫mongodb傳送微信企業號
python2.x
注意:data變數裡, agent_id為剛剛建立的應用id(可在web頁面看到)
toparty即為目標部門,或者可以用touser,totag指定目標賬戶
比較簡單的呼叫,已實測,可以使用。
#coding:utf-8
import sys
import requests
import json
from pymongo import MongoClient
reload(sys)
sys.setdefaultencoding('utf-8')
class Weixin(object):
def __init__(self, corp_id, corp_secret):
self.token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s' %(corp_id, corp_secret)
self.send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='
def get_token(self):
try:
r = requests.get(self.token_url, timeout=10)
except Exception as e:
print e
sys.exit(1)
if r.status_code == requests.codes.ok:
data = r.json()
if data.get('errcode'):
print data['errmsg']
sys.exit(1)
return data['access_token']
else:
print r.status_code
sys.exit(1)
def send(self,message):
url = self.send_url + self.get_token()
data = {
"touser": "hequan2011",
"msgtype": "text",
"agentid": "0",
"text": {
"content": message
},
"safe":"0"
}
send_data = json.dumps(data,ensure_ascii=False)
try:
r = requests.post(url, send_data)
except Exception, e:
print e
sys.exit(1)
if r.status_code == requests.codes.ok:
print r.json()
else:
print r.code
sys.exit(1)
corpid = 'xxxxxxxxxxx'
corpsecret = 'xxxxxxxxxxxxxxxxx'
client = MongoClient('mongodb://user:password@127.0.0.1:27017/')
db = client.ku
collection = db.biao
a = []
for data in collection.find():
a.append(data)
l = a[0]
g = l
z = str(g["name"])
z1 = int(g["jg"])
print z
msg = "1:{0}\n 2:{1}\n".format(z,z1)
w = Weixin(corpid,corpsecret)
w.send(msg)
ZABBIX 微信報警 外掛
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ = '懶懶的天空'
import requests
import sys
import json
from conf.INIFILES import read_config, write_config
import os
import datetime
from conf.BLog import Log
reload(sys)
sys.setdefaultencoding('utf-8')
class WeiXin(object):
def __init__(self, corpid, corpsecret): # 初始化的時候需要獲取corpid和corpsecret,需要從管理後臺獲取
self.__params = {
'corpid': corpid,
'corpsecret': corpsecret
}
self.url_get_token = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
self.url_send = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?'
self.__token = self.__get_token()
self.__token_params = {
'access_token': self.__token
}
def __raise_error(self, res):
raise Exception('error code: %s,error message: %s' % (res.json()['errcode'], res.json()['errmsg']))
global senderr
sendstatus = False
senderr = 'error code: %s,error message: %s' % (res.json()['errcode'], res.json()['errmsg'])
def __get_token(self):
# print self.url_get_token
headers = {'content-type': 'application/json'}
res = requests.get(self.url_get_token, headers=headers, params=self.__params)
try:
return res.json()['access_token']
except:
self.__raise_error(res.content)
def send_message(self, agentid, messages, userid='', toparty=''):
payload = {
'touser': userid,
'toparty': toparty,
'agentid': agentid,
"msgtype": "news",
"news": messages
}
headers = {'content-type': 'application/json'}
data = json.dumps(payload, ensure_ascii=False).encode('utf-8')
params = self.__token_params
res = requests.post(self.url_send, headers=headers, params=params, data=data)
try:
return res.json()
except:
self.__raise_error(res)
def main(send_to, subject, content):
try:
global sendstatus
global senderr
data = ''
messages = {}
body = {}
config_file_path = get_path()
CorpID = read_config(config_file_path, 'wei', "CorpID")
CorpSecret = read_config(config_file_path, 'wei', "CorpSecret")
agentid = read_config(config_file_path, 'wei', "agentid")
web = read_config(config_file_path, 'wei', "web")
content = json.loads(content)
messages["message_url"] = web
body["url"] = web + "history.php?action=showgraph&itemids[]=" + content[u'監控ID']
warn_message = ''
if content[u'當前狀態'] == 'PROBLEM':
body["title"] = "伺服器故障"
warn_message += subject + '\n'
warn_message += '詳情:\n'
warn_message += '告警等級:'+ content[u'告警等級'] + '\n'
warn_message += '告警時間:'+ content[u'告警時間'] + '\n'
warn_message += '告警地址:'+ content[u'告警地址'] + '\n'
warn_message += '持續時間:'+ content[u'持續時間'] + '\n'
warn_message += '監控專案:'+ content[u'監控專案'] + '\n'
warn_message += content[u'告警主機'] + '故障(' + content[u'事件ID']+ ')'
else:
body["title"] = "伺服器恢復"
warn_message += subject + '\n'
warn_message += '詳情:\n'
warn_message += '告警等級:'+ content[u'告警等級'] + '\n'
warn_message += '恢復時間:'+ content[u'恢復時間'] + '\n'
warn_message += '告警地址:'+ content[u'告警地址'] + '\n'
warn_message += '持續時間:'+ content[u'持續時間'] + '\n'
warn_message += '監控專案:'+ content[u'監控專案'] + '\n'
warn_message += content[u'告警主機'] + '恢復(' + content[u'事件ID']+ ')'
body['description'] = warn_message
data = []
data.append(body)
messages['articles'] = data
wx = WeiXin(CorpID, CorpSecret)
data = wx.send_message(toparty=send_to, agentid=agentid, messages=messages)
sendstatus = True
except Exception, e:
senderr = str(e)
sendstatus = False
logwrite(sendstatus, data)
def get_path():
path = os.path.dirname(os.path.abspath(sys.argv[0]))
config_path = path + '/config.ini'
return config_path
def logwrite(sendstatus, content):
logpath = '/var/log/zabbix/weixin'
if not sendstatus:
content = senderr
t = datetime.datetime.now()
daytime = t.strftime('%Y-%m-%d')
daylogfile = logpath+'/'+str(daytime)+'.log'
logger = Log(daylogfile, level="info", is_console=False, mbs=5, count=5)
os.system('chown zabbix.zabbix {0}'.format(daylogfile))
logger.info(content)
if __name__ == "__main__":
if len(sys.argv) > 1:
send_to = sys.argv[1]
subject = sys.argv[2]
content = sys.argv[3]
logwrite(True, content)
main(send_to, subject, content)
python實現微信企業號的文字訊息推送
#!/usr/bin/python
# _*_coding:utf-8 _*_
import urllib2
import json
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
def gettoken(corpid, corpsecret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
try:
token_file = urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token, user, party, agent, subject, content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
send_values = "{\"touser\":\"" + user + "\",\"toparty\":\"" + party + "\",\"totag\":\"\",\"msgtype\":\"text\",\"agentid\":\"" + agent + "\",\"text\":{\"content\":\"" + subject + "\n" + content + "\"},\"safe\":\"0\"}"
send_request = urllib2.Request(send_url, send_values)
response = json.loads(urllib2.urlopen(send_request).read())
print str(response)
if __name__ == '__main__':
user = str(sys.argv[1]) # 引數1:傳送給使用者的賬號,必須關注企業號,並對企業號有發訊息許可權
party = str(sys.argv[2]) # 引數2:傳送給組的id號,必須對企業號有許可權
agent = str(sys.argv[3]) # 引數3:企業號中的應用id
subject = str(sys.argv[4]) # 引數4:標題【訊息內容的一部分】
content = str(sys.argv[5]) # 引數5:文字具體內容
corpid = 'CorpID' # CorpID是企業號的標識
corpsecret = 'corpsecretSecret' # corpsecretSecret是管理組憑證金鑰
try:
accesstoken = gettoken(corpid, corpsecret)
senddata(accesstoken, user, party, agent, subject, content)
except Exception, e:
print str(e) + "Error Please Check \"corpid\" or \"corpsecret\" Config"
Nagios呼叫Python程式控制微信公眾平臺釋出報警資訊
vim Notify-host-by-weixin-party.py
import urllib.request
import json
import sys
#以上是匯入模組
#建立獲取AccessToken的方法
def gettoken(corp_id,corp_secret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corp_id + '&corpsecret=' + corp_secret
try:
token_file = urllib.request.urlopen(gettoken_url)
except urllib.error.HTTPError as e:
print(e.code)
print(e.read().decode("utf8"))
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
#這裡是傳送訊息的方法
def senddata(access_token,notify_str):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
#我傳入的引數是一段字串每個資訊用separator連起來,只要再用字串的split("separator")方法分開資訊就可以了。
notifydata = notify_str.split("separator")
party = notifydata[0]
cationtype = notifydata[1]
name = notifydata[2]
state = notifydata[3]
address = notifydata[4]
output = notifydata[5]
datatime = notifydata[6]
# content = '[擦汗]Host Notification[擦汗]\n\n型別: ' + cationtype + '\n主機名: ' + name + '\n狀態: ' + state + '\nIP地址: ' + address + '\n摘要: ' + output + '\n時間: ' + datatime + '\n'
if cationtype == "RECOVERY":
content = '[噓]' + address + ' is ' + state + '[噓]\n\nIP地址: ' + address + '\n主要用途: ' + name + '\n當前狀態: ' + state + '\n\n日誌摘要: ' + output + '\n檢測時間: ' + datatime + '\n'
else:
content = '[擦汗]' + address + ' is ' + state + '[擦汗]\n\nIP地址: ' + address + '\n主要用途: ' + name + '\n當前狀態: ' + state + '\n\n日誌摘要: ' + output + '\n檢測時間: ' + datatime + '\n'
send_values = {
"toparty":party,
"totag":"2",
"msgtype":"text",
"agentid":"15",
"text":{
"content":content
},
"safe":"0"
}
send_data = json.dumps(send_values, ensure_ascii=False).encode(encoding='UTF8')
#設定為非ascii解析,使其支援中文
send_request = urllib.request.Request(send_url, send_data)
response = urllib.request.urlopen(send_request)
#這個是返回微信公共平臺的資訊,除錯時比較有用
msg = response.read()
return msg
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
#我編輯的指令碼是要獲取nagios傳入的一段引數的(字串),下面這條程式碼是獲取執行指令碼後獲取的第一個引數(經測試nagios只能傳入一個參進python,所以把所有包括使用者名稱跟報警主機報警資訊放進一個字串裡)
notifystr = str(sys.argv[1])
corpid = 'wxb6162862801114c9da602'
corpsecret = '2nCsNcHxepBCV4U9Lcf-23By1RGzU1Zs422tdJpKTQzqjQ1b26IFxP76ydG2rKkchGN6E'
accesstoken = gettoken(corpid,corpsecret)
msg = senddata(accesstoken,notifystr)
print(msg)
[root@localhost python]# vim Notify-service-by-weixin-party.py
import urllib.request
import json
import sys
def gettoken(corp_id,corp_secret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corp_id + '&corpsecret=' + corp_secret
try:
token_file = urllib.request.urlopen(gettoken_url)
except urllib.error.HTTPError as e:
print(e.code)
print(e.read().decode("utf8"))
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,notify_str):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
notifydata = notify_str.split("separator")
party = notifydata[0]
cationtype = notifydata[1]
desc = notifydata[2]
alias = notifydata[3]
address = notifydata[4]
state = notifydata[5]
datatime = notifydata[6]
output = notifydata[7]
# content ='[擦汗]Service Notification [擦汗]\n\n型別: ' + cationtype + '\n\n服務名: ' + desc + '\n主機名: ' + alias + '\nIP址: ' + address + '\n狀態: ' + state + '\n時間: ' + datatime + '\n摘要:\n' + output + '\n'
if cationtype == "RECOVERY":
content ='[鼓掌]' + desc + ' is ' + state + '[鼓掌]\n\nIP地址: ' + address + '\n主要用途: ' + alias + '\n服務狀態: ' + desc + ' is ' + state + '\n檢測時間: ' + datatime + '\n日誌摘要: \n' + output + '\n'
else:
content ='[擦汗]' + desc + ' is ' + state + '[擦汗]\n\nIP地址: ' + address + '\n主要用途: ' + alias + '\n服務狀態: ' + desc + ' is ' + state + '\n檢測時間: ' + datatime + '\n日誌摘要: \n' + output + '\n'
send_values = {
"toparty":party,
"totag":"2",
"msgtype":"text",
"agentid":"15",
"text":{
"content":content
},
"safe":"0"
}
send_data = json.dumps(send_values, ensure_ascii=False).encode(encoding='UTF8')
send_request = urllib.request.Request(send_url, send_data)
response = urllib.request.urlopen(send_request)
msg = response.read()
return msg
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
notifystr = str(sys.argv[1])
corpid = 'wxb616286d28ds01114c9da602'
corpsecret = '2nCsNcHxepBCdtgV4U9Lcf-23By1RGzUgh1Zs422tdJpKTQzqjQ1b26IFxP76ydG2rKkchGN6E'
accesstoken = gettoken(corpid,corpsecret)
msg = senddata(accesstoken,notifystr)
print(msg)
shell和Python呼叫企業微信服務號進行報警
#!/bin/bash
corpid="wxd6b3"
corpsecret="aJTaPaGjW"
access_token=`curl -s "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$corpid&corpsecret=$corpsecret" |jq '.access_token' | awk -F'"' '{print $2}'`
curl -l -H "Content-type: application/json" -X POST -d '{"touser":"@all","msgtype":"text","toparty":"14","agentid":"14","text":{"content":"測試"} , "safe":"0"}' "
Python指令碼如下:
# coding:utf-8
import sys
import urllib2
import time
import json
import requests
reload(sys)
sys.setdefaultencoding('utf-8')
#title = sys.argv[2] # 位置引數獲取title 適用於zabbix
#content = sys.argv[3] # 位置引數獲取content 適用於zabbix
title = "title 測試" # 位置引數獲取title 適用於zabbix
content = "content 測試" # 位置引數獲取content 適用於zabbix
class Token(object):
# 獲取token
def __init__(self, corpid, corpsecret):
self.baseurl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(
corpid, corpsecret)
self.expire_time = sys.maxint
def get_token(self):
if self.expire_time > time.time():
request = urllib2.Request(self.baseurl)
response = urllib2.urlopen(request)
ret = response.read().strip()
ret = json.loads(ret)
if 'errcode' in ret.keys():
print >> ret['errmsg'], sys.stderr
sys.exit(1)
self.expire_time = time.time() + ret['expires_in']
self.access_token = ret['access_token']
return self.access_token
def send_msg(title, content):
# 傳送訊息
corpid = "" # 填寫自己應用的
corpsecret = "" # 填寫自己應用的
qs_token = Token(corpid=corpid, corpsecret=corpsecret).get_token()
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}".format(
qs_token)
payload = {
"touser": "@all",
"msgtype": "text",
"agentid": "14",
"text": {
"content": "標題:{0}\n 內容:{1}".format(title, content)
},
"safe": "0"
}
ret = requests.post(url, data=json.dumps(payload, ensure_ascii=False))
print ret.json()
if __name__ == '__main__':
# print title, content
send_msg(title, content)
python利用微信訂閱號報警
# coding=utf-8
import urllib
import urllib2
import cookielib
import json
import sys
data={'username':'yaokuaile-99',
'pwd':'f4bb2d8abe7a799ad62495a912ae3363',
'imgcode':'',
'f':'json'
}
cj=cookielib.LWPCookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
def getToken():
headers = {'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip,deflate,sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Content-Length': '74',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'mp.weixin.qq.com',
'Origin': 'https://mp.weixin.qq.com',
'Referer': 'https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
}
req = urllib2.Request('https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN',urllib.urlencode(data),headers)
ret = urllib2.urlopen(req)
retread= ret.read()
token = json.loads(retread)
token=token['redirect_url'][44:]
return token
### send msg
def sendWeixin(msg,token,tofakeid):
msg = msg
token = token
data1 = {'type':'1','content':msg,'imgcode':'','imgcode':'','tofakeid':tofakeid,'f':'json','token':token,'ajax':'1'}
headers = {'Accept':'*/*',
'Accept-Encoding': 'gzip,deflate,sdch',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Connection': 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Host': 'mp.weixin.qq.com',
'Origin': 'https://mp.weixin.qq.com',
'Referer': 'https://mp.weixin.qq.com/cgi-bin/singlemsgpage?msgid=&source=&count=20&t=wxm-singlechat&fromfakeid=150890&token=%s&lang=zh_CN',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36',
'X-Requested-With':'XMLHttpRequest',
}
req2 = urllib2.Request('https://mp.weixin.qq.com/cgi-bin/singlesend?t=ajax-response&f=json&lang=zh_CN',urllib.urlencode(data1),headers)
ret2=urllib2.urlopen(req2)
if __name__=='__main__':
'''
useage: ./send_wx.py msg
'''
token = getToken()
msg = sys.argv[1:]
msg = '\n'.join(msg)
tofakeid = '2443746922'
sendWeixin(msg, token, tofakeid)
使用python實現微信模板訊息
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import urllib2,json
import datetime,time
from config import *
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
class WechatPush():
def __init__(self,appid,secrect,file_name):
# 傳入appid
self.appid = appid
# 傳入密碼
self.secrect = secrect
# 傳入記錄token和過期時間的檔名
self.file_name=file_name
def build_timestamp(self,interval):
# 傳入時間間隔,得到指定interval後的時間 格式為"2015-07-01 14:41:40"
now = datetime.datetime.now()
delta = datetime.timedelta(seconds=interval)
now_interval=now + delta
return now_interval.strftime('%Y-%m-%d %H:%M:%S')
def check_token_expires(self):
# 判斷token是否過期
with open(self.file_name,'r') as f:
line=f.read()
if len(line)>0:
expires_time=line.split(",")[1]
token=line.split(",")[0]
else:
return "","true"
curr_time=time.strftime('%Y-%m-%d %H:%M:%S')
# 如果過期返回false
if curr_time>expires_time:
return token,"false"
# 沒過期返回true
else:
return token,"true"
def getToken(self):
# 獲取accessToken
url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='+self.appid + "&secret="+self.secrect
try:
f = urllib2.urlopen(url)
s = f.read()
# 讀取json資料
j = json.loads(s)
j.keys()
# 從json中獲取token
token = j['access_token']
# 從json中獲取過期時長
expires_in =j['expires_in']
# 將得到的過期時長減去300秒然後與當前時間做相加計算然後寫入到過期檔案
write_expires=self.build_timestamp(int(expires_in-300))
content="%s,%s" % (token,write_expires)
with open(self.file_name,'w') as f:
f.write(content)
except Exception,e:
print e
return token
def post_data(self,url,para_dct):
"""觸發post請求微信傳送最終的模板訊息"""
para_data = para_dct
f = urllib2.urlopen(url,para_data)
content = f.read()
return content
def do_push(self,touser,template_id,url,topcolor,data):
'''推送訊息 '''
#獲取存入到過期檔案中的token,同時判斷是否過期
token,if_token_expires=self.check_token_expires()
#如果過期了就重新獲取token
if if_token_expires=="false":
token=self.getToken()
# 背景色設定,貌似不生效
if topcolor.strip()=='':
topcolor = "#7B68EE"
#最紅post的求情資料
dict_arr = {'touser': touser, 'template_id':template_id, 'url':url, 'topcolor':topcolor,'data':data}
json_template = json.dumps(dict_arr)
requst_url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token="+token
content = self.post_data(requst_url,json_template)
#讀取json資料
j = json.loads(content)
j.keys()
errcode = j['errcode']
errmsg = j['errmsg']
#print errmsg
if __name__ == "__main__":
def alarm(title,hostname,timestap,level,message,state,tail):
"""報警函式"""
color="#FF0000"
data={"first":{"value":title},"keyword1":{"value":hostname,"color":color},"keyword2":{"value":timestap,"color":color},"keyword3":{"value":level,"color":color},"keyword4":{"value":message,"color":color},"keyword5":{"value":state,"color":color},"remark":{"value":tail}}
return data
def recover(title,message,alarm_time,recover_time,continue_time,tail):
"""恢復函式"""
re_color="#228B22"
data={"first":{"value":title},"content":{"value":message,"color":re_color},"occurtime":{"value":alarm_time,"color":re_color},"recovertime":{"value":recover_time,"color":re_color},"lasttime":{"value":continue_time,"color":re_color},"remark":{"value":tail}}
return data
# data=alarm("測試的報警訊息","8.8.8.8",time.ctime(),"最高階別","然並卵","掛了","大傻路趕緊處理")
# 例項化類
webchart=WechatPush(appid,secrect,file_name)
url="http://www.xiaoniu88.com"
print len(sys.argv)
# 傳送報警訊息
if len(sys.argv) == 9:
title=sys.argv[1]
hostname=sys.argv[2]
timestap=sys.argv[3]
level=sys.argv[4]
message=sys.argv[5]
state=sys.argv[6]
tail=sys.argv[7]
print "sys.argv[1]"+sys.argv[1]
print "sys.argv[2]"+sys.argv[2]
print "sys.argv[3]"+sys.argv[3]
print "sys.argv[4]"+sys.argv[4]
print "sys.argv[5]"+sys.argv[5]
print "sys.argv[6]"+sys.argv[6]
print "sys.argv[7]"+sys.argv[7]
print "sys.argv[8]"+sys.argv[8]
with open("/etc/zabbix/moniter_scripts/test.log",'a+') as f:
f.write(title+"\n")
f.write(hostname+"\n")
f.write(timestap+"\n")
f.write(level+"\n")
f.write(message+"\n")
f.write(state+"\n")
f.write(tail+"\n")
f.write("%s_%s" % ("group",sys.argv[8])+"\n")
data=alarm(title,hostname,timestap,level,message,state,tail)
group_name="%s_%s" % ("group",sys.argv[8])
for touser in eval("%s_%s" % ("group",sys.argv[8])):
webchart.do_push(touser,alarm_id,url,"",data)
for touser in group_super:
webchart.do_push(touser,alarm_id,url,"",data)
#傳送恢復訊息
elif len(sys.argv) == 8:
title=sys.argv[1]
message=sys.argv[2]
alarm_time=sys.argv[3]
recover_time=sys.argv[4]
continue_time=sys.argv[5]
tail=sys.argv[6]
print "sys.argv[1]"+sys.argv[1]
print "sys.argv[2]"+sys.argv[2]
print "sys.argv[3]"+sys.argv[3]
print "sys.argv[4]"+sys.argv[4]
print "sys.argv[5]"+sys.argv[5]
print "sys.argv[6]"+sys.argv[6]
print "sys.argv[7]"+sys.argv[7]
data=recover(title,message,alarm_time,recover_time,continue_time,tail)
for touser in eval("%s_%s" % ("group",sys.argv[7])):
webchart.do_push(touser,recover_id,url,"",data)
for touser in group_super:
webchart.do_push(touser,recover_id,url,"",data)
zabbix使用微信報警python指令碼
#!/usr/bin/python
# coding: utf-8
#python2將zabbix報警資訊傳送到微信。
#by linwangyi #2016-01-18
import urllib,urllib2
import json
import sys
def gettoken(corpid,corpsecret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + corpsecret
try:
token_file = urllib2.urlopen(gettoken_url)
except urllib2.HTTPError as e:
print e.code
print e.read().decode("utf8")
sys.exit()
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,user,content):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
send_values = {
"touser":user, #企業號中的使用者帳號,在zabbix使用者Media中配置,如果配置不正常,將按部門傳送。
"toparty":"1", #企業號中的部門id
"msgtype":"text", #企業號中的應用id,訊息型別。
"agentid":"1",
"text":{
"content":content
},
"safe":"0"
}
send_data = json.dumps(send_values, ensure_ascii=False)
send_request = urllib2.Request(send_url, send_data)
response = json.loads(urllib2.urlopen(send_request).read())
print str(response)
if __name__ == '__main__':
user = str(sys.argv[1]) #zabbix傳過來的第一個引數
content = str(sys.argv[3]) #zabbix傳過來的第三個引數
corpid = 'XXXX' #CorpID是企業號的標識
corpsecret = 'XXXXX' #corpsecretSecret是管理組憑證金鑰
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,user,content)
#!/usr/bin/python3
# coding: utf-8
#python3將zabbix報警資訊傳送到微信。
#by http://sunday208.blog.51cto.com/ #2016-01-18
import urllib.request
import json
import sys
def gettoken(corp_id,corp_secret):
gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corp_id + '&corpsecret=' + corp_secret
try:
token_file = urllib.request.urlopen(gettoken_url)
except urllib.error.HTTPError as e:
print(e.code)
print(e.read().decode("utf8"))
token_data = token_file.read().decode('utf-8')
token_json = json.loads(token_data)
token_json.keys()
token = token_json['access_token']
return token
def senddata(access_token,user,content):
try:
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + access_token
send_values = {
"touser":user, #企業號中的使用者帳號,在zabbix使用者Media中配置,如果配置不正常,將按部門傳送。
"toparty":"1", #企業號中的部門id
"msgtype":"text",
"agentid":"1", #企業號中的應用id,訊息型別。
"text":{
"content":content
},
"safe":"0"
}
send_data = json.dumps(send_values, ensure_ascii=False).encode(encoding='UTF8')
send_request = urllib.request.Request(send_url, send_data)
response = urllib.request.urlopen(send_request)
msg = response.read()
print("returned value : " + str(msg))
except:
print("returned value : " + str(msg))
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
user = str(sys.argv[1]) #zabbix傳過來的第一個引數
content = str(sys.argv[3]) #zabbix傳過來的第三個引數
corpid = 'XXXX' #CorpID是企業號的標識
corpsecret = 'XXXXX' #corpsecretSecret是管理組憑證金鑰
accesstoken = gettoken(corpid,corpsecret)
senddata(accesstoken,user,content)
相關文章
- 教你微信公眾號報名的製作方法 微信公眾號報名怎麼用?
- 如何排版 微信公眾號「程式碼塊」之 MarkEditor
- Python+Tornado開發微信公眾號Python
- 用python wxpy管理微信公眾號,並利用微信獲取自己的開源資料。Python
- 微信公眾號開發
- 微信公眾號智慧回答
- 微信公眾號託管
- 微搜網·微信公眾號大全
- 微信公眾號投票活動製作教程 微信公眾號投票怎麼弄?
- 實現支援多公眾號的微信公眾號掃碼登入服務
- 微信公眾號的留言功能
- Nodejs微信公眾號開發NodeJS
- 本地測試微信公眾號
- .net開發微信公眾號
- 微信公眾號開發-分享
- 微信公眾號介面導讀
- 微信公眾號獲取AccessToekn
- Python開發微信公眾號後臺(系列二)Python
- 微信公眾號讚賞功能開通方法 微信公眾號讚賞如何開通
- 狀態碼造成微信公眾號“該公眾號提供的服務出現故障”
- 公眾號生成微信渠道二維碼的方法?
- 微信公眾號可以關聯多少個小程式?
- 微信公眾號回覆小程式卡片如何實現?
- 微信公眾號自動回覆_JavaJava
- 微信公眾號支付踩坑記
- 微信公眾號-入門的坑
- 【微信公眾號】配置與應用
- [微信公眾號] 配置與應用
- 微信公眾號選單的配置
- 微信公眾號正文如何插入附件
- 爬取微信公眾號文章工具
- 微信公眾號和微信軟文采集網站網站
- 微信sdk 公眾號 微信支付 NFC 坑&筆記筆記
- 微信公眾號如何開啟關聯的小程式?
- 業餘草微信公眾號Markdown編輯器, 適合程式碼排版
- 微信公眾號測試號開發小結
- 微信公眾號開發之坑(一)
- PHP微信公眾號開發——公共方法PHP
- 【Java】微信公眾號開發筆記Java筆記