2018年8月15日水曜日

お盆休みに Python スクリプトをいじる

大体長期休暇の時期になると、ボーっとして過ごすのもどうかと思うので何か事前にやることを決めておいたりすることがあります。GW には Python の勉強のために Slack の bot を作ったりしました。

今回は discord で bot をと思ったのですが、何の bot を作ろうかアイデアが浮かばず、結局前回の 5ch を読み出す bot を移植してみたものの、すぐ完成しちゃって長期連休向けのネタじゃなかった感がある。とりあえずとっても参考になった記事が以下の2つ。

DiscordでTwitterやSteamやブログRSSを通知するBOTを作る方法
https://kagasu.hatenablog.com/entry/2017/07/18/110848
Pythonで実用Discord bot(discord.py解説)
https://qiita.com/1ntegrale9/items/9d570ef8175cf178468f

今後、なんかの役に立つかもしれないからメモとして残しておくに越したことはない。

その後、興味を持ったのが Slack のメッセージ一括削除スクリプトです。Slack の無料プランは直近のメッセージ 10000 件まで閲覧可能という制限があります。Slack は会社でも個人でも使用していて、個人の方は無料プランでニュースやら Twitter やらを全部集めて自分専用のポータルのように利用しています。ニュースの中でも天気予報や電車の運行状況などは時間が過ぎると価値がなくなる情報は1日過ぎたら削除するというスクリプトを組んでみようと考えました。

slackメッセージの一括削除(python3)
https://qiita.com/maruga/items/448c0a1fa0c15f54e919

こちらが参考にした情報。とりあえず上記ページの通り、トークンとチャネルIDを調べておく。あとはタイムスタンプ情報を参照して今日より前のメッセージを削除するようにスクリプトに手を加えてみます。

タイムスタンプは今日の日付を取得して unixtime という形式に変換した後、今日より前のタイムスタンプのメッセージは削除するという内容になっています。

#coding: utf-8
import urllib.request
import urllib.parse
import json
import time
import datetime

hist_url = "https://slack.com/api/channels.history"
delete_url = "https://slack.com/api/chat.delete"

token = 'ここにトークン'
# 削除したいチャネルID配列
channels = ["チャネルID1","チャネルID2","チャネルID3"]

today = datetime.date.today()
msects = time.mktime(today.timetuple())
print(msects)

for channel in channels:
    hist_params = {
        'channel' : channel,
        'token' : token,
        'count' : '200'
    }

    req = urllib.request.Request(hist_url)
    hist_params = urllib.parse.urlencode(hist_params).encode('ascii')
    req.data = hist_params

    res = urllib.request.urlopen(req)

    body = res.read()
    data = json.loads(body)

    for m in data['messages']:
        print(m)
        if float(m["ts"]) < msects:
            delete_params = {
                'channel' : channel,
                'token' : token,
                'ts' :  m["ts"]
            }
            req = urllib.request.Request(delete_url)
            delete_params = urllib.parse.urlencode(delete_params).encode('ascii')
            req.data = delete_params

            res = urllib.request.urlopen(req)
            body = res.read()

            print(body)

            time.sleep(2)

ってか、元のスクリプトから1行加えただけやんけ!Raspberry Pi の cron にでも仕込んで1日1回実行するようにしておけばメッセージ数が節約できそうです。