皆さん
お疲れサマンサ!
今回は、前回Snortの内容をSlackにただただ飛ばしていたhtmlの内容を、もう少しわかりやすくするようにしますー。
前回はあまりにもポーイってslackに投げていたので、投稿内容が何のことかさっぱりでした。
↓こんな感じw
ちょいとキレイにしませう・・・。
なので、美しいスープを使いましょう!
・・・「BeautifulSoup4」のことです。
(個人的には美しいスープはコンソメ味だと思ってますw)
とりあえず、ささっとインストールしましょう。
1 |
pip -m install BeautifulSoup4 |
そこからpythonのコードを編集しましょう!
まずは、イケてない読み込み部分をスープに投入しましょう。
1 2 3 |
with open('index.html','r') as f: alertHtml = f.read() soup = BeautifulSoup(alertHtml, 'html.parser') |
アラート一覧は、tableタグにあるようなので、tableタグを取得します。
1 |
soupTable = soup.find_all('table') |
alertの内容が記載されているtableは一番最後のtableタグっぽいので、
最後を取得し、そこからtrタグを取得します。
1 |
soupTr = soup.find_all('table')[-1].find_all('tr') |
取得したtrをループさせて、いい感じにデータを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
alertData = [] for tr in soupTr: tdList = [] workData = {'pretext':'', 'text':''} # 最初の行に文字入ってるからスキップする if not tr.td.text.isdigit(): continue for td in tr: # tdデータを取得する tdList.append(td.text) # 表なので位置を固定してデータを流す # シグネチャ名をpretextに設定 workData['pretext'] = tdList[1] # 優先度、各件数はtextに設定 workData['text'] = 'Priority : ' + tdList[0] + '\n' + 'Alert : ' + tdList[2] + '\n' + 'Sources : ' + tdList[3] + '\n' + 'Dests : ' + tdList[4] + '\n' # 流し込んだデータを1attachmentにする。 alertData.append(workData) |
件数が表示されないので、件数も表示させましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
alertData = [] cnt = 1 count = len(soupTr) - 1 for tr in soupTr: tdList = [] workData = {'pretext':'', 'text':''} # 最初の行に文字入ってるからスキップする if not tr.td.text.isdigit(): continue for td in tr: # tdデータを取得する tdList.append(td.text) # 表なので位置を固定してデータを流す # シグネチャ名をpretextに設定 workData['pretext'] = str(cnt) + ' / ' + str(count) + ': ' + tdList[1] # 優先度、各件数はtextに設定 workData['text'] = 'Priority : ' + tdList[0] + '\n' + 'Alert : ' + tdList[2] + '\n' + 'Sources : ' + tdList[3] + '\n' + 'Dests : ' + tdList[4] + '\n' # 流し込んだデータを1attachmentにする。 alertData.append(workData) cnt += 1 |
ここにcronの実行時間を表示するために、実行時間を出力しませう。
1 |
print ('exec time : ' + datetime.now().strftime("%Y/%m/%d %H:%M:%S")) |
いい感じになった!
↓が最終形
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/usr/bin/python # -*- Coding: utf-8 -*- import sys, os, re from datetime import datetime import json import requests from bs4 import BeautifulSoup as bs msgUrl = 'https://slack.com/api/chat.postMessage' msgPayload = {'token':'', 'channel':'', 'text':'alert.html', 'attachments':[]} def getAlertData(): with open('index.html','r') as f: alertHtml = f.read() soup = bs(alertHtml, 'html.parser') soupTr = soup.find_all('table')[-1].find_all('tr') alertData = [] cnt = 1 count = len(soupTr) - 1 for tr in soupTr: tdList = [] workData = {'pretext':'', 'text':''} # 最初の行に文字入ってるからスキップする if not tr.td.text.isdigit(): continue for td in tr: # tdデータを取得する tdList.append(td.text) # 表なので位置を固定してデータを流す # シグネチャ名をpretextに設定 workData['pretext'] = str(cnt) + ' / ' + str(count) + ': ' + tdList[1] workData['text'] = 'Priority : ' + tdList[0] + '\n' + 'Alert : ' + tdList[2] + '\n' + 'Sources : ' + tdList[3] + '\n' + 'Dests : ' + tdList[4] + '\n' alertData.append(workData) cnt += 1 return alertData def sendSlack(): htmlData = getAlertData() msgPayload['attachments'] = json.dumps(htmlData) r = requests.post(msgUrl, data=msgPayload) jsonData = r.json() if not jsonData['ok']: print ('Error') print (str(jsonData['error'])) exit if __name__ == '__main__': print ('exec time : ' + datetime.now().strftime("%Y/%m/%d %H:%M:%S")) sendSlack() print ('sent slack done!') |
上記コードの実行結果が↓
だいぶ見やすくなった!
でも、このalertのindex.htmlは、リンクなどが埋まってていい感じなので、
webアクセスで確認したい感じですね・・・。
次回は、そのあたりを書こうと思いますー。
でゎでゎ、ヨロコ