toot_bot/heatmap.py
Ching ffb514da65 feat(heatmap): 增加 toot status 热力图每日更新脚本
增加 toot status 热力图每日更新脚本

Signed-off-by: Ching <loooching@gmail.com>
2022-05-25 16:00:41 +08:00

76 lines
2.0 KiB
Python

from pydoc import cli
import numpy as np
import matplotlib.pyplot as plt
import july
import logging
from mastodon import Mastodon
import pytz
import time
import os
# logging.basicConfig(filename='/home/captain/dev/log/heatmap.log', level=logging.INFO)
# logger = logging.getLogger('/home/captain/dev/log/heatmap.log')
banner_id = 108361439460735817
client = Mastodon(
access_token = 'Ug_bUMWCk3RLamOnqYIytmeB0nO6aNfjdmf06mAj2bE',
api_base_url = 'https://nofan.xyz'
)
fn = './heatmap.txt'
# read from file if exists
date = []
data = []
if os.path.exists(fn):
with open(fn) as f:
data_list = f.read().splitlines()
f.close()
for data_ in data_list:
date_, count = data_.split(' ')
date.append(date_)
data.append(int(count))
else:
# init
me = client.me()
tl = client.account_statuses(me.id)
zh = pytz.timezone('Asia/Shanghai')
while tl:
print(tl[0].created_at)
for status in tl:
date_ = status.created_at.astimezone(zh).date().strftime('%Y-%m-%d')
if date_ not in date:
date.append(date_)
data.append(0)
data[date.index(date_)] += 1
time.sleep(1)
tl = client.fetch_next(tl)
# write to file
with open(fn, 'w') as f:
for i in range(len(date)):
f.write(date[i] + ' ' + str(data[i]) + '\n')
f.close()
cleaned_date, cleaned_data = july.utils.preprocess_inputs(date, data)
july.heatmap(cleaned_date, cleaned_data, title='', cmap="BuGn")
img_path = './heatmap.png'
plt.savefig(img_path)
# upload image to mastodon
media = client.media_post(img_path)
headers = {}
headers['Authorization'] = 'Bearer ' + client.access_token
params = {
'status': '今天浑浑噩噩了吗',
'media_ids': [media.id]
}
kwargs = dict(headers=headers, files={}, timeout=client.request_timeout, json=params)
url = client.api_base_url + '/api/v1/statuses/%s/' % banner_id
resp = client.session.request('PUT', url, **kwargs)
if resp.status_code == 200:
client.session.request('GET', 'https://up.tunpok.com/api/push/qku6CYquGu?msg=OK&ping=')