SlackのIncoming WebHooksを使う

 
カテゴリー Python SaaS   タグ

SlackのIncoming Webhookを使う

json形式でWebhook用のURLにPOSTするだけ。

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
import os
import json
import requests

class SlackWebHook():
def __init__(self, webhook_url, user_name, channel):
self.incoming_webhook_url = webhook_url
self.user_name = user_name
self.channel = channel

def post(self, message):
post_dic = {
"text":message,
"username":self.user_name,
"icon_emoji":':ghost:',
"channel":self.channel,
}

requests.post(self.incoming_webhook_url, data=json.dumps(post_dic))

# Incoming Webhooksを使って対象のチャンネルにメッセージを送付
if __name__=='__main__':
incoming_webhook_url = os.environ['SLACK_INCOMING_WEBHOOK_URL']
slack = SlackWebHook(incoming_webhook_url, "JobRunner-BOT", '#report')
slack.post("テストメッセージ <https://www.google.co.jp>")

Slackの設定

SlackのAppからIncoming WebHooksを選択。

IncomingWebhook width=640

Appディレクトリで確認する。

IncomingWebhook width=640

Slackに追加。

IncomingWebhook width=640

投稿先のチャンネルを選択。

IncomingWebhook width=640

Webhook URLを取得する。

IncomingWebhook width=640

コメント・シェア

PythonでGmailを使ったメール送信

 
カテゴリー Google Python   タグ

smtplibを使ったメール送信

gmailの場合、SMTPサーバはsmtp.gmail.com:587で設定する。

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
import os
import smtplib
import email.utils
from email.mime.text import MIMEText

# 環境変数
mail_from = os.environ['MAIL_FROM']
rcpt_to = os.environ['RCPT_TO']
smtp_server = 'smtp.gmail.com'
smtp_port = 587
smtp_user = os.environ['SMTP_USER']
smtp_password = os.environ['SMTP_PASSWORD']

# Body
msg = MIMEText('テストメッセージ\n' + '送信テスト\n')
msg['To'] = email.utils.formataddr(('テスト宛先', mail_from))
msg['From'] = email.utils.formataddr(('テスト送信元', rcpt_to))
msg['Subject'] = 'テストメール'

# smtplib を使ったメール送信
server = smtplib.SMTP(smtp_server, smtp_port)
server.set_debuglevel(True)
try:
server.ehlo()
server.starttls()
server.login(smtp_user, smtp_password)
server.sendmail(mail_from, rcpt_to, msg.as_string())
finally:
server.quit()

Gmailの設定

デフォルトではSMTPサーバとして使用できない

SMTPでメール送信を行う設定をせずに送信するとエラーになる。

1
smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials xxxxxxxxxxxxxxxx.xx - gsmtp')

方法1: 安全性の低いアプリのアクセス

標準で無効になっている、安全性の低いアプリのアクセスを有効にして送信可能にする。
パスワードはGmailアカウントのパスワードを使用する。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

方法2: 2段階認証用のアプリパスワード

2段階認証を有効にして、アプリパスワードを発行する。
パスワードはアプリ用パスワードとして発行した16桁のパスワードを使用する。

GmailSecruity width=640

GmailSecruity width=640

SMSか音声通話で2段階認証プロセスを有効化する(ここでは音声通話)。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

認証アプリケーションを設定する。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

アプリ用パスワードを発行する。

GmailSecruity width=640

GmailSecruity width=640

GmailSecruity width=640

コメント・シェア

SMTPHandlerでログ出力をメール通知する

 
カテゴリー Python   タグ

SMTPHandlerを使ったメール通知

設定例

SMTPHandlerを使ってERRORレベルのログをメール送信する。

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
53
import os
import json
import logging.config

# 環境変数
mail_from = os.environ['MAIL_FROM']
rcpt_to = os.environ['RCPT_TO']
smtp_server = 'smtp.gmail.com'
smtp_port = 587
smtp_user = os.environ['SMTP_USER']
smtp_password = os.environ['SMTP_PASSWORD']

# json.load() で読み込むとタプルとリストの区別がつかないので、 json.load()で読み込めない
config = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
}
},
'handlers': {
'consoleHandler': {
'level': 'DEBUG',
'formatter': 'simple',
'class': 'logging.StreamHandler',
},
'smtpHandler': {
'level': 'ERROR',
'formatter': 'simple',
'class': 'logging.handlers.SMTPHandler',
'mailhost': (smtp_server, smtp_port),
'fromaddr': mail_from,
'toaddrs': [rcpt_to],
'subject': "error log",
'credentials': (smtp_user, smtp_password),
'secure': (),
}
},
'loggers': {
'': {
'handlers': ['consoleHandler', 'smtpHandler'],
'level': "INFO",
}
}
}

logger = logging.getLogger(__name__)
logging.config.dictConfig(config)
logger.debug('Debug log message')
logger.info('Info log message')
logger.warning('Warning log message')
logger.error('Error log message')

実行結果

実行するとrootで設定したINFOレベル以上のログをlogging.StreamHandlerで表示。

1
2
3
4
$python log_to_mail.py
2020-04-19 00:18:11,840 - __main__ - INFO - Info log message
2020-04-19 00:18:11,840 - __main__ - WARNING - Warning log message
2020-04-19 00:18:11,840 - __main__ - ERROR - Error log message

ERRORレベルのログはSMTPHandlerでメール通知。

  • 件名 error log
  • 本文 2020-04-19 00:18:11,840 - __main__ - ERROR - Error log message

コメント・シェア

Keyring

バックエンドとして各種OSのパスワード機構を使える

  • macOS Keychain
  • Freedesktop Secret Service supports many DE including GNOME (requires secretstorage)
  • KDE4 & KDE5 KWallet (requires dbus)
  • Windows Credential Locker

Linuxの場合、GnomeかKDEが稼働しているホストでなければならない。

keyring-cliツール

python:3-slimベースのContainer上ではNoKeyringErrorになる

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
$keyring
Usage: keyring [get|set|del] SERVICE USERNAME

Options:
-h, --help show this help message and exit
-p KEYRING_PATH, --keyring-path=KEYRING_PATH
Path to the keyring backend
-b KEYRING_BACKEND, --keyring-backend=KEYRING_BACKEND
Name of the keyring backend
--list-backends List keyring backends and exit
--disable Disable keyring and exit
$keyring set system test
Password for 'test' in 'system': ***********
Traceback (most recent call last):
File "/usr/local/bin/keyring", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.8/site-packages/keyring/cli.py", line 136, in main
return cli.run(argv)
File "/usr/local/lib/python3.8/site-packages/keyring/cli.py", line 89, in run
set_password(service, username, password)
File "/usr/local/lib/python3.8/site-packages/keyring/core.py", line 62, in set_password
_keyring_backend.set_password(service_name, username, password)
File "/usr/local/lib/python3.8/site-packages/keyring/backends/fail.py", line 25, in get_password
raise NoKeyringError(msg)
keyring.errors.NoKeyringError: No recommended backend was available. Install a recommended 3rd party backend package; or, install the keyrings.alt package if you want to use the non-recommended backends. See https://pypi.org/project/keyring for details.

Windows Credential Locker(Windows資格情報)をバックエンドにした場合

Windows資格情報に対する追加・削除・参照ができる。

1
2
3
4
5
6
7
import keyring

keyring.set_password('test', 'testuser', 'passpasstest')
print(keyring.get_password('test', 'testuser'))

keyring.delete_password('test', 'testuser')
print(keyring.get_password('test', 'testuser'))

実行結果

1
2
3
PS > python .\keyring-test.py
passpasstest
None

コメント・シェア

プロセスのメモリダンプをとる

 
カテゴリー Windows   タグ

プロセスがクラッシュしたときのメモリダンプ

プロセスがクラッシュしたときのダンプはユーザモードダンプで取得できる。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumpsというキーに設定する。

タイプ デフォルト 内容
DumpFolder REG_EXPAND_SZ %LOCALAPPDATA%\CrashDumps ダンプ保存先
DumpCount REG_DWORD 10 ダンプファイルの最大数
DumpType REG_DWORD 1 0:Custom dump, 1:Mini dump, 2:Full dump
CustomDumpFlags REG_DWORD カスタムダンプのオプション

CustomDumpFlagsはデフォルトでMiniDumpWithDataSegs | MiniDumpWithUnloadedModules | MiniDumpWithProcessThreadData

これらを設定することによって、ユーザモードダンプファイルを取得できる。

プロセスをクラッシュをテストする

BadAppというソフトでプロセスのクラッシュを再現できる。
実行するとDumpFolderにはBadApp.exe.2112.dmpというファイル名で生成されていた。

特定プロセスのみクラッシュダンプをとる

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\実行ファイル名.exeというキーに設定する。

再起動必要?

再起動しなくてもレジストリ設定を行えばすぐ反映される。

クラッシュしないプロセスのダンプをとる

クラッシュしないが意図しない挙動のプロセスのダンプをとりたいこともある。
タスクマネージャーのプロセス一覧から対象プロセスを右クリックするとダンプファイルの作成というメニューがあり、作成できる。
これはC:\Users\<ユーザ名>\AppData\Local\Temp\に生成される。

コメント・シェア

  • page 1 of 1


nullpo

めも


募集中


Japan