僕は永瀬拓矢七段が好きです
作ったもの
明日の公式戦全対局予定をSlackに通知するBOT(毎日22時に更新)
対局カードによって背景画像を変更
種類 | 背景画像 |
---|---|
AbemaTVとニコニコ生放送で放送する対局 | |
AbemaTVで放送する対局 | |
ニコニコ生放送で放送する対局 | |
NHK杯将棋トーナメントで放送する対局 | |
銀河戦で放送する対局 | |
通常の対局 | |
女性棋士同士の対局 |
リンクボタン
画像下のリンクボタンをクリック(タップ)すると、ブラウザで以下のページを開きます
対局者名ボタン | 棋戦名ボタン |
---|---|
Googleの検索結果ページを開く (対局者名 + 将棋で検索) | 日本将棋連盟の公式ページを開く |
実装した構成
実装でこだわった所
対局者名の文字数に合わせて、文字の大きさをほどよく自動調整
最短文字数棋士同士の対局 | 最長文字数棋士同士の対局 |
---|---|
# フォントのサイズが描画領域のサイズを下回るまでループして縮小させる
while img_width < out_text_size[0] + 120 or img_height < out_text_size[1]+ 120:
font = ImageFont.truetype(text_font_family, text_max_font_size - font_size_offset)
out_text_size = draw.textsize(text, font=font)
font_size_offset += 1
w, h = font.getsize(text)
x = (img_width - w)/2
y = (img_height - h)/2
draw.text((x, y + text_height), text, fill=(text_color), font=font)
明日の対局予定を通知する前に、過去の対局予定を全て削除する
タイムラインに過去の対局予定が残っていると、明日の対局予定の開始時点がわかりづらいのと、将来的にSlackのファイルアップロード数制限に引っかかってしまうので、過去の対局予定は毎日削除する実装にしました
チャンネルのメッセージのhistoryを取得するAPIを叩き、取得したデータをループで回してdeleteのAPIを叩いてやります
slackメッセージの一括削除(python3)を参考にさせていただきました
画像とリンクボタンを一つのアタッチメントに
枠(アタッチメント)の中で 日付
画像
ボタン
の順にセットするのにちょっと苦労しました
というのも、現状Slackの各APIはこんな仕様になっています
・画像をアップロードするAPIは同時にボタンを配置することができない
・ボタンを配置するAPI(今回はIncoming Webhooks)は画像をアップロードすることができないが、画像のURLを指定するとその画像を表示することができる
というわけで「画像専用のチャンネルに画像をアップロードし、そのURLをIncoming WebHooksで指定する」といった二段階の処理でこれを実現することにしました
result = requests.post(url="https://slack.com/api/files.upload",params=param, files=files)
json_data = result.json()
image_url = json.dumps(json_data["file"]["url_private"])
return image_url.replace("\"", "") # 画像をアップロードしてURLを返却し...
payload = {
"attachments": [
{
"fallback": fallback,
"text": text,
"image_url": image_url, # ここで指定!
"actions": [
{
"type": "button",
"name": "player1",
"text": ":bust_in_silhouette: " + row_list[2],
"url": player1,
"style": "normal",
},
{
"type": "button",
"name": "player2",
"text": ":bust_in_silhouette: " + row_list[4],
"url": player2,
"style": "normal",
},
{
"type": "button",
"name": "title",
"text": ":newspaper: " + row_list[0] ,
"url": 'https://www.shogi.or.jp' + row_list[1],
"style": "normal",
}
]
}
]
}
requests.post(boto3.client('kms').decrypt(CiphertextBlob=b64decode(os.environ['incoming_web_hook_url']))['Plaintext'], data=json.dumps(payload))
最後に
誰でも無料でこのチャンネル(#game-info)に参加できます
https://goo.gl/forms/DJMFjivR2m807WpR2
(メールアドレスを入力すると招待メールが届きますので、アカウントを作成してください)
ちなみに放送予定の対局には@channel
にメンションを飛ばしているので、
とすれば、放送予定の対局のみPush通知されます
今回のBOTのソースコードはGitHubにアップロードしました
それでは良い将棋ライフを