前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python模拟发送Slack消息

Python模拟发送Slack消息

作者头像
公众号: 云原生生态圈
发布2021-11-15 18:01:02
1.3K0
发布2021-11-15 18:01:02
举报
文章被收录于专栏:云原生生态圈云原生生态圈

有一个看似很简单的小需求,但是对于一个Python入门的新手来讲还是有些难度的,虽然人家也有写好的代码,但是自己就是不想直接去搬人家的代码,在不懂得时候还装的那么高大上,没办法,就是想自己折腾折腾,别人能写的出来,就说明在某些地方肯定有相关的文章,所以不要怕折腾…

1 一些Slack相关的链接

  • Python slackclient
  • API Methods
  • Slack Token

2 如何能码出功能

  1. 写代码,只要是有关平台的,首先在平台的官网上搜搜有没有相关的api文档之类的
  2. 其次在github上搜搜,有没有官方的开源模块或者第三方模块
  3. 在这就是Google你的需求了

3 找到方法如何运用

3.1 在浏览器中模拟方法请求

这里有一个参考的文章

  • 火狐的poster下载地址

3.2 自己写代码

用python发送一条消息到slack指定的频道中

代码语言:javascript
复制
from slackclient import SlackClientslack_token = os.environ["SLACK_API_TOKEN"]
sc = SlackClient(slack_token)sc.api_call(
 "chat.postMessage",
 channel="C0XXXXXX",
 text="Hello from Python! :tada:"
)

api_call是模块中封装的一个调用接口,这个接口的作用就是相当于你使用浏览器模拟post请求的执行过程,他把你在浏览器中要实现post请求所要执行的点点点封装成一个黑箱子,只要按格式填写参数就可以了

  • chat.postMessage 发送消息的方法
  • channel 要指定消息要发送到的channel
  • text 你所要发送的内容

这样是不是一目了然了,再比如说我想获取workspace中所有的channel列表,怎么做?

  1. 是不是首先要在API Methods中找到获取列表方法
  2. 可以在次使用上面的代码,换一个获取channel列表的方法就可以了
  3. 至于返回的对象是什么,可以通过Type查看,方便下一步处理
代码语言:javascript
复制
from slackclient import SlackClient
# import requests
import json
slack_token="#不给你看"
sc= SlackClient(slack_token)resp =sc.api_call(
   "channels.list"
)

学习的是方法,剩下的要自己努力专研,要有所收获,分享一个自己写的代码,虽然垃圾,但是还能跑,在不断成长后,我觉得会一眼看出其中的什么bug吧

代码语言:javascript
复制
#!/usr/bin/env python3.5
###############################
# function: send zabbix/cacti/ops alert to slack.
#
###############################
from exchangelib import DELEGATE, IMPERSONATION, Account, Credentials, ServiceAccount, \
   EWSDateTime, EWSTimeZone, Configuration, NTLM, CalendarItem, Message, \
   Mailbox, Attendee, Q, ExtendedProperty, FileAttachment, ItemAttachment, \
   HTMLBody, Build, Version
from exchangelib.protocol import BaseProtocol, NoVerifyHTTPAdapterfrom exchangelib import UTC_NOW
import re
import getopt, sys
import base64
import requests
import json
import datetime
import time
import urllib3
import configparsertry:
   configcfg = configparser.ConfigParser()
   configcfg.read("config.ini")
   slackApp_postUser=configcfg["info"]["slackApp_postUser"]
   username=configcfg["info"]["username"]
   # password=str(base64.b64decode(configcfg["info"]["password"]),"utf-8")
   password=configcfg["info"]["password"]
   slack_channel = configcfg["info"]["slack_channel"]
   mail_server = configcfg["info"]["mail_server"]
   # print(username,password,slack_channel,slackApp_postUser)
   # slackAPP_postMessageAPI = config.get("info", "slackAPP_postMessageAPI")
   # slackApp_postUser = config.get("info", "slackApp_postUser")except:
   print("ERR : no configuration \n")
   print("please create configuration file\n")
   print("configuration must be renamed config.ini\n")
   print("the script will be exit in 5 second\n")
   time.sleep(5)# 转换时间的格式
def timestamp(timestr):
   time_array = time.strptime(timestr, "%Y-%m-%d %H:%M:%S")
   return time.mktime(time_array)cred = Credentials(username, password)
config = Configuration(server=mail_server, credentials=cred, auth_type=NTLM)
account = Account(primary_smtp_address=username, config=config,autodiscover=False,access_type=DELEGATE)email_address = ["1451032707@qq.com"]
with open("timestamp", "r") as f:
   beforce_timestamp = float(f.read())
while True:
   time.sleep(5)
   try:
       for item in account.inbox.all().order_by('-datetime_received')[:20]:
           alertinfo = ":slack:邮件主题: %s" % item.subject
           data = {
               'as_user': "true",
               "channel": "#devops",
               "text": alertinfo,
           }
           latest_timestamp = timestamp(str(item.datetime_received).replace("+00:00", ""))
           # 读取最后一次获得邮件的时间
           if float(latest_timestamp) > float(beforce_timestamp):
               # 把最后一次读取邮件的时间写入文件
               with open("timestamp", "w") as f:
                   f.write(str(latest_timestamp))               beforce_timestamp = latest_timestamp
               if item.sender not in email_address:                   header = {'Content-Type': 'application/json',
                             'Authorization': '$slack_token'} #注意修改这里的Token                   netRequest = requests.post(url="https://slack.com/api/chat.postMessage", headers=header,
                                              data=json.dumps(data), timeout=(10, 30))
               else:
                   continue
   except urllib3.exceptions:
       break   except requests.exceptions:
       break

以上的功能主要是把发送到outlook邮箱里面的监控告警过滤出来,发送到Slack的channel中

需要的python module的版本requirements.txt

代码语言:javascript
复制
slackclien==1.2.1
exchangelib=1.10.7
requests==2.18.4
configparser==3.5.0

需要的配置文件的格式为config.ini

代码语言:javascript
复制
[info]
username = $EMAIL_ADDRESS
password = $EMAIL_PASSWORD
slack_channel = $CHANNEL
slackApp_postUser = @Marion
mail_server= $EMAIL_SERVER_ADDR

时间戳文件timestamp,用这个临时文件的目的是为了方便迁移脚本后也能不漏读

代码语言:javascript
复制
1524462419.0

3.3 脚本运行在容器中

3.3.1 Dockerfile
代码语言:javascript
复制
FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
COPY timestamp ./
COPY config.ini ./
COPY test2.py ./
RUN pip install --no-cache-dir -r requirements.txt
CMD [ "python", "./test2.py" ]
3.3.2 构建镜像
代码语言:javascript
复制
root@ts:/home/xue.long/mailv1# ls
config.ini  Dockerfile  iaasslack.yaml  requirements.txt  test1.py  test2.py  test.py  timestamp
root@ts:/home/xue.long/mailv1# docker build -t bluerdocker/alertnotify:v2 -f ./Dockerfile .
3.3.3 运行容器
代码语言:javascript
复制
docker run -d bluerdocker/alertnotify:v2
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生生态圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 一些Slack相关的链接
  • 2 如何能码出功能
  • 3 找到方法如何运用
    • 3.1 在浏览器中模拟方法请求
      • 3.2 自己写代码
        • 3.3 脚本运行在容器中
          • 3.3.1 Dockerfile
          • 3.3.2 构建镜像
          • 3.3.3 运行容器
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档