feat/some feat and update

This commit is contained in:
SouthFox 2023-03-26 01:52:04 +08:00
parent 4ab1143a01
commit 17f291dae5
15 changed files with 2127 additions and 205 deletions

2
.gitignore vendored
View file

@ -2,6 +2,8 @@
.idea .idea
*.log *.log
tmp/ tmp/
.venv/
test.py
*.py[cod] *.py[cod]
*.egg *.egg

View file

@ -2,7 +2,7 @@
import click import click
from BDSM import app, db from BDSM import app, db
from BDSM.models import Settings, Toot, Other from BDSM.models import Settings, Toot
from BDSM.toot import app_login, toot_process from BDSM.toot import app_login, toot_process
from mastodon import MastodonNotFoundError from mastodon import MastodonNotFoundError
@ -16,6 +16,87 @@ def initdb(drop):
db.create_all() db.create_all()
click.echo('Initialized database.') click.echo('Initialized database.')
@app.cli.command()
def analysis():
"""Analysis current Year"""
from BDSM.models import Toot
from sqlalchemy.sql import extract
from sqlalchemy import func
from sqlalchemy import desc
from . import db
from wordcloud import WordCloud
from PIL import Image
import numpy as np
import jieba
import re
year_toots = Toot.query.filter(extract('year', Toot.created_at) == 2022)
print("2022 总计嘟文" + str(len(year_toots.all())))
print("2022 年发言最多天数排名" +
str(db.session.query(func.strftime("%Y-%m-%d", Toot.created_at
).label('date'),func.count('date')
).filter(extract('year', Toot.created_at) == 2022
).group_by('date'
).order_by(desc(func.count('date'))
).all()[:3])
)
print("2022 年互动最多帐号排名" +
str(db.session.query(Toot.acct.label('count'),func.count('count')
).filter(extract('year', Toot.created_at) == 2022
).group_by('count'
).order_by(desc(func.count('count'))
).all()[:3])
)
toots_counter = 0
public_counter = 0
toots_content = ''
html_pattern = re.compile(r'<[^>]+>',re.S)
url_pattern = re.compile(r'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()!@:%_\+.~#?&\/\/=]*)',re.S)
emoji_pattern = re.compile(r':+?[a-zA-Z0-9_]+:',re.S)
at_pattern = re.compile(r'@+?[a-zA-Z0-9\._]+ ',re.S)
mask = np.array(Image.open("misc/mask.png"))
for i in year_toots:
if i.content != None:
toot_content = html_pattern.sub('', i.content)
toot_content = url_pattern.sub('', toot_content)
toot_content = emoji_pattern.sub('', toot_content)
toot_content = at_pattern.sub('', toot_content)
toots_content += toot_content
toots_counter += 1
if i.visibility == 'public':
public_counter += 1
print("2022 实际有内容嘟文数量:" + str(toots_counter))
print("2022 公开嘟文数量" + str(public_counter))
jieba.load_userdict(r'misc/user_dict.txt')
wordlist = jieba.lcut(toots_content)
space_list = ' '.join(wordlist)
stopwords = set()
content = [line.strip() for line in open('misc/stopwords.txt','r',
encoding='utf-8').readlines()]
stopwords.update(content)
wc = WordCloud(width=1400, height=2200,
background_color='white',
mask=mask,
stopwords=stopwords,
mode='RGB',
max_words=500,
max_font_size=150,
#relative_scaling=0.6,
font_path="/usr/share/fonts/noto-cjk/NotoSerifCJK-Regular.ttc",
random_state=50,
scale=2
).generate(space_list)
wc.to_file("output.png")
print(" 词图统计已生成在根目录,名字为 output.png")
@app.cli.command() @app.cli.command()
def renderfile(): def renderfile():
"""render toot""" """render toot"""
@ -112,17 +193,15 @@ def renderfile():
def graball(): def graball():
"""Grab all toots context""" """Grab all toots context"""
settings = Settings.query.first() settings = Settings.query.first()
account = settings.account[1:] domain = settings.domain
username, domain = account.split("@")
url = "https://" + domain url = "https://" + domain
mastodon, user = app_login(url) mastodon, _ = app_login(url)
acct = mastodon.me().acct acct = mastodon.me().acct
toots = Toot.query.filter(Toot.in_reply_to_id.isnot(None)).all() toots = Toot.query.filter(Toot.in_reply_to_id.isnot(None)).all()
toots_id = [] toots_id = []
for i in toots: for i in toots:
if (Toot.query.get(i.in_reply_to_id) != None if (Toot.query.get(i.in_reply_to_id) != None):
or Other.query.get(i.in_reply_to_id) != None):
continue continue
#context api excluding itself #context api excluding itself
toots_id.append(i.id) toots_id.append(i.id)

View file

@ -26,29 +26,6 @@ class Toot(db.Model):
favourites_count = db.Column(db.Integer) favourites_count = db.Column(db.Integer)
language = db.Column(db.Text) language = db.Column(db.Text)
class Other(db.Model):
id = db.Column(db.Integer, primary_key=True)
acct = db.Column(db.Text)
url = db.Column(db.Text)
created_at = db.Column(db.DateTime)
edited_at = db.Column(db.DateTime)
in_reply_to_id = db.Column(db.Integer)
in_reply_to_account_id = db.Column(db.Integer)
content = db.Column(db.Text)
media_list = db.Column(db.Text)
emoji_list = db.Column(db.Text)
spoiler_text = db.Column(db.Text)
poll_id = db.Column(db.Integer)
visibility = db.Column(db.Text)
reblogged = db.Column(db.Boolean)
favourited = db.Column(db.Boolean)
bookmarked = db.Column(db.Boolean)
sensitive = db.Column(db.Boolean)
replies_count = db.Column(db.Integer)
reblogs_count = db.Column(db.Integer)
favourites_count = db.Column(db.Integer)
language = db.Column(db.Text)
class Tag(db.Model): class Tag(db.Model):
__table_args__ = {'sqlite_autoincrement': True} __table_args__ = {'sqlite_autoincrement': True}
tag_id = db.Column(db.Integer, primary_key=True) tag_id = db.Column(db.Integer, primary_key=True)
@ -79,6 +56,7 @@ class Poll(db.Model):
options = db.Column(db.Text) options = db.Column(db.Text)
class Settings(db.Model): class Settings(db.Model):
account = db.Column(db.Text, primary_key=True) domain = db.Column(db.Text, primary_key=True)
account = db.Column(db.Text)
timezone = db.Column(db.Text) timezone = db.Column(db.Text)
setup = db.Column(db.Boolean) setup = db.Column(db.Boolean)

View file

@ -28,6 +28,8 @@
<nav> <nav>
<ul> <ul>
<li><a href="{{ url_for('index') }}">主页</a></li> <li><a href="{{ url_for('index') }}">主页</a></li>
<li><a href="{{ url_for('favourited') }}">喜欢</a></li>
<li><a href="{{ url_for('bookmarked') }}">书签</a></li>
<li><a href="{{ url_for('settings') }}">设置</a></li> <li><a href="{{ url_for('settings') }}">设置</a></li>
<li><a href="{{ url_for('archive') }}">存档</a></li> <li><a href="{{ url_for('archive') }}">存档</a></li>
<form class="search-bar" method="post" action="{{url_for('search')}}"> <form class="search-bar" method="post" action="{{url_for('search')}}">

View file

@ -4,13 +4,12 @@
<h3>设置</h3> <h3>设置</h3>
<form method="post" class="form-horizontal" role="form"> <form method="post" class="form-horizontal" role="form">
{% if settings != None %} {% if settings != None %}
<div class="form-group"> <br>
<label class="col-sm-2 control-label">用户名</label> <h4>站点地址:</h4>
<div class="col-sm-10"> <p> {{ settings.domain }} </p>
<input type="text" class="form-control" name="account" autocomplete="off" required <br>
value="{{ settings.account }}"> <h4>用户名:</h4>
</div> <p> {{ settings.account }} </p>
</div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">时区</label> <label class="col-sm-2 control-label">时区</label>
<div class="col-sm-10"> <div class="col-sm-10">
@ -24,9 +23,9 @@
</div> </div>
{% else %} {% else %}
<div class="form-group"> <div class="form-group">
<label class="col-sm-2 control-label">用户名</label> <label class="col-sm-2 control-label">站点地址</label>
<div class="col-sm-10"> <div class="col-sm-10">
<input type="text" class="form-control" name="account" autocomplete="off" required value="@用户名@实例"> <input type="text" class="form-control" name="domain" autocomplete="off" required value="例如mastodon.social">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

View file

@ -3,7 +3,7 @@
from mastodon import Mastodon from mastodon import Mastodon
from tenacity import * from tenacity import *
from BDSM import db from BDSM import db
from BDSM.models import Other, Toot, Tag, Media, Emoji, Poll from BDSM.models import Toot, Tag, Media, Emoji, Poll, Settings
import sys import sys
import dateutil.parser import dateutil.parser
@ -40,8 +40,9 @@ def app_login(url):
return mastodon, user return mastodon, user
def get_context(url, toot_id): def get_context(url, toot_id):
mastodon, user = app_login(url) mastodon, _ = app_login(url)
acct = mastodon.me().acct settings = Settings.query.first()
acct = settings.account
context = mastodon.status_context(toot_id) context = mastodon.status_context(toot_id)
statuses = [] statuses = []
statuses= context['ancestors'] + context['descendants'] statuses= context['ancestors'] + context['descendants']
@ -52,7 +53,6 @@ def get_context(url, toot_id):
def toot_process(statuses, my_acct, duplicates_counter=0): def toot_process(statuses, my_acct, duplicates_counter=0):
for status in statuses: for status in statuses:
is_reblog = False is_reblog = False
is_myself = False
if status['reblog'] != None: if status['reblog'] != None:
if my_acct == status['reblog']['account']['acct']: if my_acct == status['reblog']['account']['acct']:
reblog_myself = True reblog_myself = True
@ -78,11 +78,6 @@ def toot_process(statuses, my_acct, duplicates_counter=0):
id = status['id'] id = status['id']
acct = status['account']['acct'] acct = status['account']['acct']
if my_acct == acct:
is_myself = True
else:
is_myself = False
url = status['url'] url = status['url']
created_at = status['created_at'] created_at = status['created_at']
@ -181,10 +176,7 @@ def toot_process(statuses, my_acct, duplicates_counter=0):
favourites_count = status['favourites_count'] favourites_count = status['favourites_count']
language = status['language'] language = status['language']
if is_reblog or not is_myself: table = Toot()
table = Other()
else:
table = Toot()
table.id=id table.id=id
table.acct = acct table.acct = acct
@ -208,7 +200,7 @@ def toot_process(statuses, my_acct, duplicates_counter=0):
table.favourites_count=favourites_count table.favourites_count=favourites_count
table.language=language table.language=language
if Toot.query.get(id) != None or Other.query.get(id) != None: if Toot.query.get(id) != None:
duplicates_counter += 1 duplicates_counter += 1
db.session.merge(table) db.session.merge(table)

View file

@ -5,9 +5,10 @@ import json
from flask import render_template, request, url_for, redirect, flash, abort from flask import render_template, request, url_for, redirect, flash, abort
from flask_sqlalchemy import Pagination from flask_sqlalchemy import Pagination
from sqlalchemy import or_
from BDSM import app, db from BDSM import app, db
from BDSM.models import Media, Poll, Settings, Toot, Emoji, Other from BDSM.models import Media, Poll, Settings, Toot, Emoji
from BDSM.toot import app_register, archive_toot, get_context from BDSM.toot import app_login, app_register, archive_toot, get_context
from mastodon import Mastodon from mastodon import Mastodon
from types import SimpleNamespace from types import SimpleNamespace
from datetime import timezone from datetime import timezone
@ -24,7 +25,7 @@ def index():
return redirect(url_for('settings')) return redirect(url_for('settings'))
else: else:
page = request.args.get('page', 1, type=int) page = request.args.get('page', 1, type=int)
toots_ = Toot.query.order_by(Toot.created_at.desc()).paginate(page=page, per_page=50) toots_ = Toot.query.order_by(Toot.created_at.desc()).filter(or_(Toot.acct==settings.account, Toot.reblog_id!=None)).paginate(page=page, per_page=50)
toots = process_toot(toots_) toots = process_toot(toots_)
path=SimpleNamespace() path=SimpleNamespace()
path.path = "index" path.path = "index"
@ -32,6 +33,36 @@ def index():
return render_template('view.html', toots=toots, pagination=toots_, path=path) return render_template('view.html', toots=toots, pagination=toots_, path=path)
@app.route('/favourited', methods=['GET', 'POST'])
def favourited():
settings = Settings.query.first()
if settings == None:
return redirect(url_for('settings'))
else:
page = request.args.get('page', 1, type=int)
toots_ = Toot.query.order_by(Toot.created_at.desc()).filter_by(favourited=True).paginate(page=page, per_page=50)
toots = process_toot(toots_)
path=SimpleNamespace()
path.path = "favourited"
path.args = {}
return render_template('view.html', toots=toots, pagination=toots_, path=path)
@app.route('/bookmarked', methods=['GET', 'POST'])
def bookmarked():
settings = Settings.query.first()
if settings == None:
return redirect(url_for('settings'))
else:
page = request.args.get('page', 1, type=int)
toots_ = Toot.query.order_by(Toot.created_at.desc()).filter_by(bookmarked=True).paginate(page=page, per_page=50)
toots = process_toot(toots_)
path=SimpleNamespace()
path.path = "bookmarked"
path.args = {}
return render_template('view.html', toots=toots, pagination=toots_, path=path)
@app.route('/search', methods=['GET', 'POST']) @app.route('/search', methods=['GET', 'POST'])
def search(): def search():
if request.method == 'POST': if request.method == 'POST':
@ -55,8 +86,6 @@ def search():
def context(toot_id): def context(toot_id):
def get_reply(reply_id): def get_reply(reply_id):
toots = Toot.query.order_by(Toot.created_at.desc()).filter_by(in_reply_to_id=reply_id).all() toots = Toot.query.order_by(Toot.created_at.desc()).filter_by(in_reply_to_id=reply_id).all()
other_toots = Other.query.order_by(Other.created_at.desc()).filter_by(in_reply_to_id=reply_id).all()
toots = process_toot(toots) + process_toot(other_toots)
for i in toots: for i in toots:
if i.in_reply_to_id != None: if i.in_reply_to_id != None:
@ -68,9 +97,7 @@ def context(toot_id):
toot_ = Toot.query.get(toot_id) toot_ = Toot.query.get(toot_id)
if toot_ == None: if toot_ == None:
toot_ = Other.query.get(toot_id) abort(404)
if toot_ == None:
abort(404)
toots.append(toot_) toots.append(toot_)
toots = process_toot(toots) toots = process_toot(toots)
@ -81,9 +108,7 @@ def context(toot_id):
toot = [] toot = []
toot_ = Toot.query.get(toots[0].in_reply_to_id) toot_ = Toot.query.get(toots[0].in_reply_to_id)
if toot_ == None: if toot_ == None:
toot_ = Other.query.get(toots[0].in_reply_to_id) break
if toot_ == None:
break
toot.append(toot_) toot.append(toot_)
toot = process_toot(toot) toot = process_toot(toot)
@ -95,8 +120,7 @@ def context(toot_id):
@app.route('/grab/<int:toot_id>', methods=['GET', 'POST']) @app.route('/grab/<int:toot_id>', methods=['GET', 'POST'])
def grab(toot_id): def grab(toot_id):
settings = Settings.query.first() settings = Settings.query.first()
account = settings.account[1:] domain = settings.domain
username, domain = account.split("@")
url = "https://" + domain url = "https://" + domain
get_context(url, toot_id) get_context(url, toot_id)
@ -106,20 +130,18 @@ def grab(toot_id):
@app.route('/settings', methods=['GET', 'POST']) @app.route('/settings', methods=['GET', 'POST'])
def settings(): def settings():
if request.method == 'POST': if request.method == 'POST':
account = request.form['account']
timezone = request.form['timezone'] timezone = request.form['timezone']
if not account or len(account) > 30:
flash('无效输入')
return redirect(url_for('settings'))
settings = Settings.query.first() settings = Settings.query.first()
if settings == None: if settings == None:
settings = Settings(account=account, timezone=timezone) domain = request.form['domain']
if not domain or len(domain) > 50:
flash('无效输入')
return redirect(url_for('settings'))
settings = Settings(domain=domain, timezone=timezone)
db.session.add(settings) db.session.add(settings)
else: else:
settings.account = account
settings.timezone = timezone settings.timezone = timezone
db.session.commit() db.session.commit()
@ -137,13 +159,17 @@ def settings():
def register(): def register():
settings = Settings.query.first() settings = Settings.query.first()
if settings == None: if settings == None:
flash('请先输入用户名') flash('请先输入站点地址')
return redirect(url_for('settings')) return redirect(url_for('settings'))
else: else:
account = settings.account[1:] domain = settings.domain
username, domain = account.split("@")
url = "https://" + domain url = "https://" + domain
mastodon, _ = app_login(url)
account = mastodon.me().acct
settings.account = account
db.session.commit()
if request.method == 'POST': if request.method == 'POST':
token = request.form['token'].rstrip() token = request.form['token'].rstrip()
mastodon = Mastodon(client_id='pyBDSM_clientcred.secret', api_base_url=url) mastodon = Mastodon(client_id='pyBDSM_clientcred.secret', api_base_url=url)
@ -168,8 +194,7 @@ def archive():
settings = Settings.query.first() settings = Settings.query.first()
if request.method == 'POST': if request.method == 'POST':
archive_match = request.form.getlist("archive_match") archive_match = request.form.getlist("archive_match")
account = settings.account[1:] domain = settings.domain
username, domain = account.split("@")
url = "https://" + domain url = "https://" + domain
archive_toot(url, archive_match) archive_toot(url, archive_match)
@ -196,20 +221,16 @@ def process_toot(toots_):
toot.created_at = toot.created_at.replace(tzinfo=timezone.utc) toot.created_at = toot.created_at.replace(tzinfo=timezone.utc)
toot.created_at = toot.created_at.astimezone(user_timezone).strftime(fmt) toot.created_at = toot.created_at.astimezone(user_timezone).strftime(fmt)
if hasattr(toot, 'reblog_id'): if toot.acct == settings.account:
toot.is_myself = True toot.is_myself = True
if toot.reblog_id != None:
if toot.reblog_myself:
toot = Toot.query.get(toot.reblog_id)
toot = SimpleNamespace(**toot.__dict__)
toot.is_reblog = True
else:
toot = Other.query.get(toot.reblog_id)
toot = SimpleNamespace(**toot.__dict__)
toot.is_reblog = True
else: else:
toot.is_myself = False toot.is_myself = False
if toot.reblog_id != None:
toot = Toot.query.get(toot.reblog_id)
toot = SimpleNamespace(**toot.__dict__)
toot.is_reblog = True
if toot.media_list != "": if toot.media_list != "":
toot.medias = [] toot.medias = []
#media_list "1111,2222,333," #media_list "1111,2222,333,"

View file

@ -9,6 +9,9 @@ flask = "*"
flask-sqlalchemy = ">3.0.0" flask-sqlalchemy = ">3.0.0"
python-dotenv = "*" python-dotenv = "*"
tenacity = "*" tenacity = "*"
jieba = "*"
wordcloud = "*"
numpy = "*"
[dev-packages] [dev-packages]

523
Pipfile.lock generated
View file

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "57b5f4bb9fd3f2d51e80ac64791821561c28edb776138137bfb3ef01295b8fc0" "sha256": "ebc55cebd08f9b6f108b8cf54493152783ee04f2134f0766133c52bf28d2a170"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": { "requires": {
@ -25,18 +25,18 @@
}, },
"certifi": { "certifi": {
"hashes": [ "hashes": [
"sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3",
"sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382" "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"
], ],
"markers": "python_version >= '3.6'", "markers": "python_version >= '3.6'",
"version": "==2022.9.24" "version": "==2022.12.7"
}, },
"charset-normalizer": { "charset-normalizer": {
"hashes": [ "hashes": [
"sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845", "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845",
"sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f" "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"
], ],
"markers": "python_version >= '3.6'", "markers": "python_full_version >= '3.6.0'",
"version": "==2.1.1" "version": "==2.1.1"
}, },
"click": { "click": {
@ -47,6 +47,89 @@
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==8.1.3" "version": "==8.1.3"
}, },
"contourpy": {
"hashes": [
"sha256:0236875c5a0784215b49d00ebbe80c5b6b5d5244b3655a36dda88105334dea17",
"sha256:03d1b9c6b44a9e30d554654c72be89af94fab7510b4b9f62356c64c81cec8b7d",
"sha256:0537cc1195245bbe24f2913d1f9211b8f04eb203de9044630abd3664c6cc339c",
"sha256:06ca79e1efbbe2df795822df2fa173d1a2b38b6e0f047a0ec7903fbca1d1847e",
"sha256:08e8d09d96219ace6cb596506fb9b64ea5f270b2fb9121158b976d88871fcfd1",
"sha256:0b1e66346acfb17694d46175a0cea7d9036f12ed0c31dfe86f0f405eedde2bdd",
"sha256:0b97454ed5b1368b66ed414c754cba15b9750ce69938fc6153679787402e4cdf",
"sha256:0e4854cc02006ad6684ce092bdadab6f0912d131f91c2450ce6dbdea78ee3c0b",
"sha256:12a7dc8439544ed05c6553bf026d5e8fa7fad48d63958a95d61698df0e00092b",
"sha256:1b1ee48a130da4dd0eb8055bbab34abf3f6262957832fd575e0cab4979a15a41",
"sha256:1c0e1308307a75e07d1f1b5f0f56b5af84538a5e9027109a7bcf6cb47c434e72",
"sha256:1dedf4c64185a216c35eb488e6f433297c660321275734401760dafaeb0ad5c2",
"sha256:208bc904889c910d95aafcf7be9e677726df9ef71e216780170dbb7e37d118fa",
"sha256:211dfe2bd43bf5791d23afbe23a7952e8ac8b67591d24be3638cabb648b3a6eb",
"sha256:341330ed19074f956cb20877ad8d2ae50e458884bfa6a6df3ae28487cc76c768",
"sha256:344cb3badf6fc7316ad51835f56ac387bdf86c8e1b670904f18f437d70da4183",
"sha256:358f6364e4873f4d73360b35da30066f40387dd3c427a3e5432c6b28dd24a8fa",
"sha256:371f6570a81dfdddbb837ba432293a63b4babb942a9eb7aaa699997adfb53278",
"sha256:375d81366afd547b8558c4720337218345148bc2fcffa3a9870cab82b29667f2",
"sha256:3a1917d3941dd58732c449c810fa7ce46cc305ce9325a11261d740118b85e6f3",
"sha256:4081918147fc4c29fad328d5066cfc751da100a1098398742f9f364be63803fc",
"sha256:444fb776f58f4906d8d354eb6f6ce59d0a60f7b6a720da6c1ccb839db7c80eb9",
"sha256:46deb310a276cc5c1fd27958e358cce68b1e8a515fa5a574c670a504c3a3fe30",
"sha256:494efed2c761f0f37262815f9e3c4bb9917c5c69806abdee1d1cb6611a7174a0",
"sha256:50627bf76abb6ba291ad08db583161939c2c5fab38c38181b7833423ab9c7de3",
"sha256:5641927cc5ae66155d0c80195dc35726eae060e7defc18b7ab27600f39dd1fe7",
"sha256:5b117d29433fc8393b18a696d794961464e37afb34a6eeb8b2c37b5f4128a83e",
"sha256:613c665529899b5d9fade7e5d1760111a0b011231277a0d36c49f0d3d6914bd6",
"sha256:6e459ebb8bb5ee4c22c19cc000174f8059981971a33ce11e17dddf6aca97a142",
"sha256:6f56515e7c6fae4529b731f6c117752247bef9cdad2b12fc5ddf8ca6a50965a5",
"sha256:730c27978a0003b47b359935478b7d63fd8386dbb2dcd36c1e8de88cbfc1e9de",
"sha256:75a2e638042118118ab39d337da4c7908c1af74a8464cad59f19fbc5bbafec9b",
"sha256:78ced51807ccb2f45d4ea73aca339756d75d021069604c2fccd05390dc3c28eb",
"sha256:7ee394502026d68652c2824348a40bf50f31351a668977b51437131a90d777ea",
"sha256:8468b40528fa1e15181cccec4198623b55dcd58306f8815a793803f51f6c474a",
"sha256:84c593aeff7a0171f639da92cb86d24954bbb61f8a1b530f74eb750a14685832",
"sha256:913bac9d064cff033cf3719e855d4f1db9f1c179e0ecf3ba9fdef21c21c6a16a",
"sha256:9447c45df407d3ecb717d837af3b70cfef432138530712263730783b3d016512",
"sha256:9b0e7fe7f949fb719b206548e5cde2518ffb29936afa4303d8a1c4db43dcb675",
"sha256:9bc407a6af672da20da74823443707e38ece8b93a04009dca25856c2d9adadb1",
"sha256:9e8e686a6db92a46111a1ee0ee6f7fbfae4048f0019de207149f43ac1812cf95",
"sha256:9fc4e7973ed0e1fe689435842a6e6b330eb7ccc696080dda9a97b1a1b78e41db",
"sha256:a457ee72d9032e86730f62c5eeddf402e732fdf5ca8b13b41772aa8ae13a4563",
"sha256:a628bba09ba72e472bf7b31018b6281fd4cc903f0888049a3724afba13b6e0b8",
"sha256:a79d239fc22c3b8d9d3de492aa0c245533f4f4c7608e5749af866949c0f1b1b9",
"sha256:aa4674cf3fa2bd9c322982644967f01eed0c91bb890f624e0e0daf7a5c3383e9",
"sha256:acd2bd02f1a7adff3a1f33e431eb96ab6d7987b039d2946a9b39fe6fb16a1036",
"sha256:b3b1bd7577c530eaf9d2bc52d1a93fef50ac516a8b1062c3d1b9bcec9ebe329b",
"sha256:b48d94386f1994db7c70c76b5808c12e23ed7a4ee13693c2fc5ab109d60243c0",
"sha256:b64f747e92af7da3b85631a55d68c45a2d728b4036b03cdaba4bd94bcc85bd6f",
"sha256:b98c820608e2dca6442e786817f646d11057c09a23b68d2b3737e6dcb6e4a49b",
"sha256:c1baa49ab9fedbf19d40d93163b7d3e735d9cd8d5efe4cce9907902a6dad391f",
"sha256:c38c6536c2d71ca2f7e418acaf5bca30a3af7f2a2fa106083c7d738337848dbe",
"sha256:c78bfbc1a7bff053baf7e508449d2765964d67735c909b583204e3240a2aca45",
"sha256:cd2bc0c8f2e8de7dd89a7f1c10b8844e291bca17d359373203ef2e6100819edd",
"sha256:d2eff2af97ea0b61381828b1ad6cd249bbd41d280e53aea5cccd7b2b31b8225c",
"sha256:d8834c14b8c3dd849005e06703469db9bf96ba2d66a3f88ecc539c9a8982e0ee",
"sha256:d912f0154a20a80ea449daada904a7eb6941c83281a9fab95de50529bfc3a1da",
"sha256:da1ef35fd79be2926ba80fbb36327463e3656c02526e9b5b4c2b366588b74d9a",
"sha256:dbe6fe7a1166b1ddd7b6d887ea6fa8389d3f28b5ed3f73a8f40ece1fc5a3d340",
"sha256:dcd556c8fc37a342dd636d7eef150b1399f823a4462f8c968e11e1ebeabee769",
"sha256:e13b31d1b4b68db60b3b29f8e337908f328c7f05b9add4b1b5c74e0691180109",
"sha256:e1739496c2f0108013629aa095cc32a8c6363444361960c07493818d0dea2da4",
"sha256:e43255a83835a129ef98f75d13d643844d8c646b258bebd11e4a0975203e018f",
"sha256:e626cefff8491bce356221c22af5a3ea528b0b41fbabc719c00ae233819ea0bf",
"sha256:eadad75bf91897f922e0fb3dca1b322a58b1726a953f98c2e5f0606bd8408621",
"sha256:f33da6b5d19ad1bb5e7ad38bb8ba5c426d2178928bc2b2c44e8823ea0ecb6ff3",
"sha256:f4052a8a4926d4468416fc7d4b2a7b2a3e35f25b39f4061a7e2a3a2748c4fc48",
"sha256:f6ca38dd8d988eca8f07305125dec6f54ac1c518f1aaddcc14d08c01aebb6efc"
],
"markers": "python_version >= '3.7'",
"version": "==1.0.6"
},
"cycler": {
"hashes": [
"sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3",
"sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"
],
"markers": "python_version >= '3.6'",
"version": "==0.11.0"
},
"decorator": { "decorator": {
"hashes": [ "hashes": [
"sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330",
@ -71,6 +154,14 @@
"index": "pypi", "index": "pypi",
"version": "==3.0.2" "version": "==3.0.2"
}, },
"fonttools": {
"hashes": [
"sha256:2bb244009f9bf3fa100fc3ead6aeb99febe5985fa20afbfbaa2f8946c2fbdaf1",
"sha256:820466f43c8be8c3009aef8b87e785014133508f0de64ec469e4efb643ae54fb"
],
"markers": "python_version >= '3.7'",
"version": "==4.38.0"
},
"greenlet": { "greenlet": {
"hashes": [ "hashes": [
"sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9", "sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9",
@ -145,14 +236,6 @@
"markers": "python_version >= '3.5'", "markers": "python_version >= '3.5'",
"version": "==3.4" "version": "==3.4"
}, },
"importlib-metadata": {
"hashes": [
"sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab",
"sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"
],
"markers": "python_version < '3.10'",
"version": "==5.0.0"
},
"itsdangerous": { "itsdangerous": {
"hashes": [ "hashes": [
"sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44", "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44",
@ -161,6 +244,13 @@
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==2.1.2" "version": "==2.1.2"
}, },
"jieba": {
"hashes": [
"sha256:055ca12f62674fafed09427f176506079bc135638a14e23e25be909131928db2"
],
"index": "pypi",
"version": "==0.42.1"
},
"jinja2": { "jinja2": {
"hashes": [ "hashes": [
"sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852", "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852",
@ -169,6 +259,80 @@
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==3.1.2" "version": "==3.1.2"
}, },
"kiwisolver": {
"hashes": [
"sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b",
"sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166",
"sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c",
"sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c",
"sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0",
"sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4",
"sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9",
"sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286",
"sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767",
"sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c",
"sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6",
"sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b",
"sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004",
"sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf",
"sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494",
"sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac",
"sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626",
"sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766",
"sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514",
"sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6",
"sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f",
"sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d",
"sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191",
"sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d",
"sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51",
"sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f",
"sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8",
"sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454",
"sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb",
"sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da",
"sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8",
"sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de",
"sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a",
"sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9",
"sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008",
"sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3",
"sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32",
"sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938",
"sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1",
"sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9",
"sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d",
"sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824",
"sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b",
"sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd",
"sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2",
"sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5",
"sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69",
"sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3",
"sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae",
"sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597",
"sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e",
"sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955",
"sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca",
"sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a",
"sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea",
"sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede",
"sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4",
"sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6",
"sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686",
"sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408",
"sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871",
"sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29",
"sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750",
"sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897",
"sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0",
"sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2",
"sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09",
"sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"
],
"markers": "python_version >= '3.7'",
"version": "==1.4.4"
},
"markupsafe": { "markupsafe": {
"hashes": [ "hashes": [
"sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003", "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003",
@ -217,11 +381,175 @@
}, },
"mastodon.py": { "mastodon.py": {
"hashes": [ "hashes": [
"sha256:49afbf9f4347f355bee5638b71a5231b0e1164a58d253ccd9b4345d999c43369", "sha256:31624c881318682577b76c082a9e8e4114a42e80ad3652c6bc00e5c658cea1a7",
"sha256:c98fd97b7450cd02262669b80be20f53657b5540c4888a47231df11856910918" "sha256:f5af3bb16df6409bed0bb8b97543d7979237a6a2a2a4bc484dec261c36918668"
], ],
"index": "pypi", "index": "pypi",
"version": "==1.5.2" "version": "==1.8.0"
},
"matplotlib": {
"hashes": [
"sha256:0844523dfaaff566e39dbfa74e6f6dc42e92f7a365ce80929c5030b84caa563a",
"sha256:0eda9d1b43f265da91fb9ae10d6922b5a986e2234470a524e6b18f14095b20d2",
"sha256:168093410b99f647ba61361b208f7b0d64dde1172b5b1796d765cd243cadb501",
"sha256:1836f366272b1557a613f8265db220eb8dd883202bbbabe01bad5a4eadfd0c95",
"sha256:19d61ee6414c44a04addbe33005ab1f87539d9f395e25afcbe9a3c50ce77c65c",
"sha256:252957e208c23db72ca9918cb33e160c7833faebf295aaedb43f5b083832a267",
"sha256:32d29c8c26362169c80c5718ce367e8c64f4dd068a424e7110df1dd2ed7bd428",
"sha256:380d48c15ec41102a2b70858ab1dedfa33eb77b2c0982cb65a200ae67a48e9cb",
"sha256:3964934731fd7a289a91d315919cf757f293969a4244941ab10513d2351b4e83",
"sha256:3cef89888a466228fc4e4b2954e740ce8e9afde7c4315fdd18caa1b8de58ca17",
"sha256:4426c74761790bff46e3d906c14c7aab727543293eed5a924300a952e1a3a3c1",
"sha256:5024b8ed83d7f8809982d095d8ab0b179bebc07616a9713f86d30cf4944acb73",
"sha256:52c2bdd7cd0bf9d5ccdf9c1816568fd4ccd51a4d82419cc5480f548981b47dd0",
"sha256:54fa9fe27f5466b86126ff38123261188bed568c1019e4716af01f97a12fe812",
"sha256:5ba73aa3aca35d2981e0b31230d58abb7b5d7ca104e543ae49709208d8ce706a",
"sha256:5e16dcaecffd55b955aa5e2b8a804379789c15987e8ebd2f32f01398a81e975b",
"sha256:5ecfc6559132116dedfc482d0ad9df8a89dc5909eebffd22f3deb684132d002f",
"sha256:74153008bd24366cf099d1f1e83808d179d618c4e32edb0d489d526523a94d9f",
"sha256:78ec3c3412cf277e6252764ee4acbdbec6920cc87ad65862272aaa0e24381eee",
"sha256:795ad83940732b45d39b82571f87af0081c120feff2b12e748d96bb191169e33",
"sha256:7f716b6af94dc1b6b97c46401774472f0867e44595990fe80a8ba390f7a0a028",
"sha256:83dc89c5fd728fdb03b76f122f43b4dcee8c61f1489e232d9ad0f58020523e1c",
"sha256:8a0ae37576ed444fe853709bdceb2be4c7df6f7acae17b8378765bd28e61b3ae",
"sha256:8a8dbe2cb7f33ff54b16bb5c500673502a35f18ac1ed48625e997d40c922f9cc",
"sha256:8a9d899953c722b9afd7e88dbefd8fb276c686c3116a43c577cfabf636180558",
"sha256:8d0068e40837c1d0df6e3abf1cdc9a34a6d2611d90e29610fa1d2455aeb4e2e5",
"sha256:9347cc6822f38db2b1d1ce992f375289670e595a2d1c15961aacbe0977407dfc",
"sha256:9f335e5625feb90e323d7e3868ec337f7b9ad88b5d633f876e3b778813021dab",
"sha256:b03fd10a1709d0101c054883b550f7c4c5e974f751e2680318759af005964990",
"sha256:b0ca2c60d3966dfd6608f5f8c49b8a0fcf76de6654f2eda55fc6ef038d5a6f27",
"sha256:b2604c6450f9dd2c42e223b1f5dca9643a23cfecc9fde4a94bb38e0d2693b136",
"sha256:ca0e7a658fbafcddcaefaa07ba8dae9384be2343468a8e011061791588d839fa",
"sha256:d0e9ac04065a814d4cf2c6791a2ad563f739ae3ae830d716d54245c2b96fead6",
"sha256:d50e8c1e571ee39b5dfbc295c11ad65988879f68009dd281a6e1edbc2ff6c18c",
"sha256:d840adcad7354be6f2ec28d0706528b0026e4c3934cc6566b84eac18633eab1b",
"sha256:e0bbee6c2a5bf2a0017a9b5e397babb88f230e6f07c3cdff4a4c4bc75ed7c617",
"sha256:e5afe0a7ea0e3a7a257907060bee6724a6002b7eec55d0db16fd32409795f3e1",
"sha256:e68be81cd8c22b029924b6d0ee814c337c0e706b8d88495a617319e5dd5441c3",
"sha256:ec9be0f4826cdb3a3a517509dcc5f87f370251b76362051ab59e42b6b765f8c4",
"sha256:f04f97797df35e442ed09f529ad1235d1f1c0f30878e2fe09a2676b71a8801e0",
"sha256:f41e57ad63d336fe50d3a67bb8eaa26c09f6dda6a59f76777a99b8ccd8e26aec"
],
"markers": "python_version >= '3.8'",
"version": "==3.6.2"
},
"numpy": {
"hashes": [
"sha256:0044f7d944ee882400890f9ae955220d29b33d809a038923d88e4e01d652acd9",
"sha256:0e3463e6ac25313462e04aea3fb8a0a30fb906d5d300f58b3bc2c23da6a15398",
"sha256:179a7ef0889ab769cc03573b6217f54c8bd8e16cef80aad369e1e8185f994cd7",
"sha256:2386da9a471cc00a1f47845e27d916d5ec5346ae9696e01a8a34760858fe9dd2",
"sha256:26089487086f2648944f17adaa1a97ca6aee57f513ba5f1c0b7ebdabbe2b9954",
"sha256:28bc9750ae1f75264ee0f10561709b1462d450a4808cd97c013046073ae64ab6",
"sha256:28e418681372520c992805bb723e29d69d6b7aa411065f48216d8329d02ba032",
"sha256:442feb5e5bada8408e8fcd43f3360b78683ff12a4444670a7d9e9824c1817d36",
"sha256:6ec0c021cd9fe732e5bab6401adea5a409214ca5592cd92a114f7067febcba0c",
"sha256:7094891dcf79ccc6bc2a1f30428fa5edb1e6fb955411ffff3401fb4ea93780a8",
"sha256:84e789a085aabef2f36c0515f45e459f02f570c4b4c4c108ac1179c34d475ed7",
"sha256:87a118968fba001b248aac90e502c0b13606721b1343cdaddbc6e552e8dfb56f",
"sha256:8e669fbdcdd1e945691079c2cae335f3e3a56554e06bbd45d7609a6cf568c700",
"sha256:ad2925567f43643f51255220424c23d204024ed428afc5aad0f86f3ffc080086",
"sha256:b0677a52f5d896e84414761531947c7a330d1adc07c3a4372262f25d84af7bf7",
"sha256:b07b40f5fb4fa034120a5796288f24c1fe0e0580bbfff99897ba6267af42def2",
"sha256:b09804ff570b907da323b3d762e74432fb07955701b17b08ff1b5ebaa8cfe6a9",
"sha256:b162ac10ca38850510caf8ea33f89edcb7b0bb0dfa5592d59909419986b72407",
"sha256:b31da69ed0c18be8b77bfce48d234e55d040793cebb25398e2a7d84199fbc7e2",
"sha256:caf65a396c0d1f9809596be2e444e3bd4190d86d5c1ce21f5fc4be60a3bc5b36",
"sha256:cfa1161c6ac8f92dea03d625c2d0c05e084668f4a06568b77a25a89111621566",
"sha256:dae46bed2cb79a58d6496ff6d8da1e3b95ba09afeca2e277628171ca99b99db1",
"sha256:ddc7ab52b322eb1e40521eb422c4e0a20716c271a306860979d450decbb51b8e",
"sha256:de92efa737875329b052982e37bd4371d52cabf469f83e7b8be9bb7752d67e51",
"sha256:e274f0f6c7efd0d577744f52032fdd24344f11c5ae668fe8d01aac0422611df1",
"sha256:ed5fb71d79e771ec930566fae9c02626b939e37271ec285e9efaf1b5d4370e7d",
"sha256:ef85cf1f693c88c1fd229ccd1055570cb41cdf4875873b7728b6301f12cd05bf",
"sha256:f1b739841821968798947d3afcefd386fa56da0caf97722a5de53e07c4ccedc7"
],
"index": "pypi",
"version": "==1.24.1"
},
"packaging": {
"hashes": [
"sha256:2198ec20bd4c017b8f9717e00f0c8714076fc2fd93816750ab48e2c41de2cfd3",
"sha256:957e2148ba0e1a3b282772e791ef1d8083648bc131c8ab0c1feba110ce1146c3"
],
"markers": "python_version >= '3.7'",
"version": "==22.0"
},
"pillow": {
"hashes": [
"sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040",
"sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8",
"sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65",
"sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2",
"sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627",
"sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07",
"sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef",
"sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535",
"sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c",
"sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc",
"sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3",
"sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1",
"sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c",
"sha256:32a44128c4bdca7f31de5be641187367fe2a450ad83b833ef78910397db491aa",
"sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32",
"sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502",
"sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4",
"sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f",
"sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812",
"sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636",
"sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20",
"sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c",
"sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91",
"sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe",
"sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b",
"sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad",
"sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9",
"sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72",
"sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4",
"sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de",
"sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29",
"sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee",
"sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c",
"sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7",
"sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11",
"sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c",
"sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c",
"sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448",
"sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b",
"sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20",
"sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228",
"sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd",
"sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699",
"sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b",
"sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2",
"sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4",
"sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c",
"sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f",
"sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2",
"sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c",
"sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3",
"sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193",
"sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48",
"sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02",
"sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8",
"sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e",
"sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f",
"sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b",
"sha256:e6ea6b856a74d560d9326c0f5895ef8050126acfdc7ca08ad703eb0081e82b74",
"sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb",
"sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0"
],
"markers": "python_version >= '3.7'",
"version": "==9.3.0"
},
"pyparsing": {
"hashes": [
"sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb",
"sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"
],
"markers": "python_full_version >= '3.6.8'",
"version": "==3.0.9"
}, },
"python-dateutil": { "python-dateutil": {
"hashes": [ "hashes": [
@ -247,13 +575,6 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==0.4.27" "version": "==0.4.27"
}, },
"pytz": {
"hashes": [
"sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427",
"sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2"
],
"version": "==2022.6"
},
"requests": { "requests": {
"hashes": [ "hashes": [
"sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983",
@ -272,50 +593,50 @@
}, },
"sqlalchemy": { "sqlalchemy": {
"hashes": [ "hashes": [
"sha256:0be9b479c5806cece01f1581726573a8d6515f8404e082c375b922c45cfc2a7b", "sha256:01aa76f324c9bbc0dcb2bc3d9e2a9d7ede4808afa1c38d40d5e2007e3163b206",
"sha256:17aee7bfcef7bf0dea92f10e5dfdd67418dcf6fe0759f520e168b605855c003e", "sha256:06055476d38ed7915eeed22b78580556d446d175c3574a01b9eb04d91f3a8b2e",
"sha256:21f3df74a0ab39e1255e94613556e33c1dc3b454059fe0b365ec3bbb9ed82e4a", "sha256:081e2a2d75466353c738ca2ee71c0cfb08229b4f9909b5fa085f75c48d021471",
"sha256:237067ba0ef45a518b64606e1807f7229969ad568288b110ed5f0ca714a3ed3a", "sha256:099efef0de9fbda4c2d7cb129e4e7f812007901942259d4e6c6e19bd69de1088",
"sha256:2dda5f96719ae89b3ec0f1b79698d86eb9aecb1d54e990abb3fdd92c04b46a90", "sha256:0e068b8414d60dd35d43c693555fc3d2e1d822cef07960bb8ca3f1ee6c4ff762",
"sha256:393f51a09778e8984d735b59a810731394308b4038acdb1635397c2865dae2b6", "sha256:13578d1cda69bc5e76c59fec9180d6db7ceb71c1360a4d7861c37d87ea6ca0b1",
"sha256:3ca21b35b714ce36f4b8d1ee8d15f149db8eb43a472cf71600bf18dae32286e7", "sha256:16ad798fc121cad5ea019eb2297127b08c54e1aa95fe17b3fea9fdbc5c34fe62",
"sha256:3cbdbed8cdcae0f83640a9c44fa02b45a6c61e149c58d45a63c9581aba62850f", "sha256:1a92685db3b0682776a5abcb5f9e9addb3d7d9a6d841a452a17ec2d8d457bea7",
"sha256:3eba07f740488c3a125f17c092a81eeae24a6c7ec32ac9dbc52bf7afaf0c4f16", "sha256:26b8424b32eeefa4faad21decd7bdd4aade58640b39407bf43e7d0a7c1bc0453",
"sha256:3f68eab46649504eb95be36ca529aea16cd199f080726c28cbdbcbf23d20b2a2", "sha256:29a29d02c9e6f6b105580c5ed7afb722b97bc2e2fdb85e1d45d7ddd8440cfbca",
"sha256:4c56e6899fa6e767e4be5d106941804a4201c5cb9620a409c0b80448ec70b656", "sha256:2d1539fbc82d2206380a86d6d7d0453764fdca5d042d78161bbfb8dd047c80ec",
"sha256:53f90a2374f60e703c94118d21533765412da8225ba98659de7dd7998641ab17", "sha256:2d6f178ff2923730da271c8aa317f70cf0df11a4d1812f1d7a704b1cf29c5fe3",
"sha256:595b185041a4dc5c685283ea98c2f67bbfa47bb28e4a4f5b27ebf40684e7a9f8", "sha256:2db887dbf05bcc3151de1c4b506b14764c6240a42e844b4269132a7584de1e5f",
"sha256:65a0ad931944fcb0be12a8e0ac322dbd3ecf17c53f088bc10b6da8f0caac287b", "sha256:416fe7d228937bd37990b5a429fd00ad0e49eabcea3455af7beed7955f192edd",
"sha256:68e0cd5d32a32c4395168d42f2fefbb03b817ead3a8f3704b8bd5697c0b26c24", "sha256:445914dcadc0b623bd9851260ee54915ecf4e3041a62d57709b18a0eed19f33b",
"sha256:6a06c2506c41926d2769f7968759995f2505e31c5b5a0821e43ca5a3ddb0e8ae", "sha256:52b90c9487e4449ad954624d01dea34c90cd8c104bce46b322c83654f37a23c5",
"sha256:6d7e1b28342b45f19e3dea7873a9479e4a57e15095a575afca902e517fb89652", "sha256:55ddb5585129c5d964a537c9e32a8a68a8c6293b747f3fa164e1c034e1657a98",
"sha256:6f0ea4d7348feb5e5d0bf317aace92e28398fa9a6e38b7be9ec1f31aad4a8039", "sha256:561605cfc26273825ed2fb8484428faf36e853c13e4c90c61c58988aeccb34ed",
"sha256:7313e4acebb9ae88dbde14a8a177467a7625b7449306c03a3f9f309b30e163d0", "sha256:5953e225be47d80410ae519f865b5c341f541d8e383fb6d11f67fb71a45bf890",
"sha256:7cf7c7adbf4417e3f46fc5a2dbf8395a5a69698217337086888f79700a12e93a", "sha256:6a91b7883cb7855a27bc0637166eed622fdf1bb94a4d1630165e5dd88c7e64d3",
"sha256:80ead36fb1d676cc019586ffdc21c7e906ce4bf243fe4021e4973dae332b6038", "sha256:6cd53b4c756a6f9c6518a3dc9c05a38840f9ae442c91fe1abde50d73651b6922",
"sha256:9470633395e5f24d6741b4c8a6e905bce405a28cf417bba4ccbaadf3dab0111d", "sha256:715f5859daa3bee6ecbad64501637fa4640ca6734e8cda6135e3898d5f8ccadd",
"sha256:94c0093678001f5d79f2dcbf3104c54d6c89e41ab50d619494c503a4d3f1aef2", "sha256:7e32ce2584564d9e068bb7e0ccd1810cbb0a824c0687f8016fe67e97c345a637",
"sha256:95f4f8d62589755b507218f2e3189475a4c1f5cc9db2aec772071a7dc6cd5726", "sha256:88f4ad3b081c0dbb738886f8d425a5d983328670ee83b38192687d78fc82bd1e",
"sha256:9c857676d810ca196be73c98eb839125d6fa849bfa3589be06201a6517f9961c", "sha256:96821d806c0c90c68ce3f2ce6dd529c10e5d7587961f31dd5c30e3bfddc4545d",
"sha256:a22208c1982f1fe2ae82e5e4c3d4a6f2445a7a0d65fb7983a3d7cbbe3983f5a4", "sha256:9a21c1fb71c69c8ec65430160cd3eee44bbcea15b5a4e556f29d03f246f425ec",
"sha256:ad5f966623905ee33694680dda1b735544c99c7638f216045d21546d3d8c6f5b", "sha256:9b7025d46aba946272f6b6b357a22f3787473ef27451f342df1a2a6de23743e3",
"sha256:ae1ed1ebc407d2f66c6f0ec44ef7d56e3f455859df5494680e2cf89dad8e3ae0", "sha256:a3bcd5e2049ceb97e8c273e6a84ff4abcfa1dc47b6d8bbd36e07cce7176610d3",
"sha256:afd1ac99179d1864a68c06b31263a08ea25a49df94e272712eb2824ef151e294", "sha256:a62ae2ea3b940ce9c9cbd675489c2047921ce0a79f971d3082978be91bd58117",
"sha256:b6a337a2643a41476fb6262059b8740f4b9a2ec29bf00ffb18c18c080f6e0aed", "sha256:a87f8595390764db333a1705591d0934973d132af607f4fa8b792b366eacbb3c",
"sha256:b737fbeb2f78926d1f59964feb287bbbd050e7904766f87c8ce5cfb86e6d840c", "sha256:c8051bff4ce48cbc98f11e95ac46bfd1e36272401070c010248a3230d099663f",
"sha256:c46322354c58d4dc039a2c982d28284330f8919f31206894281f4b595b9d8dbe", "sha256:ca152ffc7f0aa069c95fba46165030267ec5e4bb0107aba45e5e9e86fe4d9363",
"sha256:c7e3b9e01fdbe1ce3a165cc7e1ff52b24813ee79c6df6dee0d1e13888a97817e", "sha256:cd95a3e6ab46da2c5b0703e797a772f3fab44d085b3919a4f27339aa3b1f51d3",
"sha256:c9aa372b295a36771cffc226b6517df3011a7d146ac22d19fa6a75f1cdf9d7e6", "sha256:d458fd0566bc9e10b8be857f089e96b5ca1b1ef033226f24512f9ffdf485a8c0",
"sha256:d3b6d4588994da73567bb00af9d7224a16c8027865a8aab53ae9be83f9b7cbd1", "sha256:db3ccbce4a861bf4338b254f95916fc68dd8b7aa50eea838ecdaf3a52810e9c0",
"sha256:d3b9ac11f36ab9a726097fba7c7f6384f0129aedb017f1d4d1d4fce9052a1320", "sha256:dc10423b59d6d032d6dff0bb42aa06dc6a8824eb6029d70c7d1b6981a2e7f4d8",
"sha256:d654870a66027af3a26df1372cf7f002e161c6768ebe4c9c6fdc0da331cb5173", "sha256:e91a5e45a2ea083fe344b3503405978dff14d60ef3aa836432c9ca8cd47806b6",
"sha256:d8080bc51a775627865e0f1dbfc0040ff4ace685f187f6036837e1727ba2ed10", "sha256:f1d3fb02a4d0b07d1351a4a52f159e5e7b3045c903468b7e9349ebf0020ffdb9",
"sha256:da60b98b0f6f0df9fbf8b72d67d13b73aa8091923a48af79a951d4088530a239", "sha256:f61e54b8c2b389de1a8ad52394729c478c67712dbdcdadb52c2575e41dae94a5",
"sha256:f5e8ed9cde48b76318ab989deeddc48f833d2a6a7b7c393c49b704f67dedf01d", "sha256:f7944b04e6fcf8d733964dd9ee36b6a587251a1a4049af3a9b846f6e64eb349a",
"sha256:f8e5443295b218b08bef8eb85d31b214d184b3690d99a33b7bd8e5591e2b0aa1" "sha256:fd69850860093a3f69fefe0ab56d041edfdfe18510b53d9a2eaecba2f15fa795"
], ],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==1.4.44" "version": "==1.4.45"
}, },
"tenacity": { "tenacity": {
"hashes": [ "hashes": [
@ -325,21 +646,13 @@
"index": "pypi", "index": "pypi",
"version": "==8.1.0" "version": "==8.1.0"
}, },
"typing-extensions": {
"hashes": [
"sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa",
"sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"
],
"markers": "python_version < '3.8'",
"version": "==4.4.0"
},
"urllib3": { "urllib3": {
"hashes": [ "hashes": [
"sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc",
"sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8"
], ],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5' and python_version < '4'", "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==1.26.12" "version": "==1.26.13"
}, },
"werkzeug": { "werkzeug": {
"hashes": [ "hashes": [
@ -349,13 +662,59 @@
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.7'",
"version": "==2.2.2" "version": "==2.2.2"
}, },
"zipp": { "wordcloud": {
"hashes": [ "hashes": [
"sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1", "sha256:001a0b4483fe4ec26302b306c1590a4c44a99483c2da8232012ac62177296594",
"sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8" "sha256:14f7d34c25ddad412fac32760bd5d6d1565a98821f6dd021cf6617203b0db5ae",
"sha256:15da7c4ff531b19527fb605da11e747d418a4d81d78503c34fb11babf3196b7a",
"sha256:16ed864495573094e5b64f424d66d9030a638569182ad7c5b2c8e11ab78a2541",
"sha256:19c444200056b3d75b5d84a6cc018d6491da1841462546663ea3a88300db03f1",
"sha256:1dc69a57a349272119ae633b8d6bcc9cde600aeb4342261e12ce169badcd28ca",
"sha256:2a90f512c1c3c2a483d9d12b06a80124cecf813ec7a49b328dce6181c5440f2d",
"sha256:31c09d77a01b3d5638f2e0e043cfcb0d90f1c8b4d12864132e1d421dc525467f",
"sha256:334318eb345eafc3494d81fbbe11823fc945833e6a77cf05c7a6a1b88c1e1db0",
"sha256:3639eeb7c8b09f71376c6369277fb78d2dd8c96648034c3c25ee0f34f3e9249c",
"sha256:3b50378e7cb7b9a1990ff3a10dfcad968185a1fbfd99de68c436245bbd5cd669",
"sha256:3c39bd66f172f56257f09cec8fe246cd11ef36e9e16eeabe88933788d983c6a1",
"sha256:3d4da63b8f315caf3f715b23ab0a05d43139b9395e5e78b7e12b7ed2701d3a8e",
"sha256:3e3f01635def27b971f178b8bc3438f3be09d91f72ab3b51b90a1ae16e4028d8",
"sha256:43a71a15ac8f721f425d1030633f26a8037ddb767fe9bb45647fe5ed94b92eda",
"sha256:4580f1cbf42b3a0565b140d580d6e249230373b8fa31e4491620af1caec45e92",
"sha256:47f329426a0952a4509d4d0c8b84867f8d11e65cb81ee852ebcfad588598cda8",
"sha256:523db887e47e840eb5c2e60428243bb1d7439fdc60f89626b17bafa1be64459c",
"sha256:52acd837fdd26239352f77be1491148b36e77f3c31ce7a9fe232664bfadd1a2c",
"sha256:55224971bd7c3ba2a1038dd5aefa0559b3a320bf6f0b864c0469db5dfa7d587b",
"sha256:55f6416f9958042fe92d751962a3dfd83e583828504d9f6e8f886e034b3354d0",
"sha256:5b6573eaab49a3682822ea7208077ed5b81210daa3ddb41a9d4879f9803d7b6b",
"sha256:61b292af5d88e719a641bb832280b81902df24a39936e6cf87ae0b6ea7910262",
"sha256:66bd735eb869a769806154067da01ecaeb4ce165d3c523c306e8ea7d376a1706",
"sha256:7344df98ea8556a4f8e12924cf0b2e2d7055b1565440fd0c2a453c2b7e1e240b",
"sha256:7b0a7e43b961ea7be13d7d7397fd131f8e795e1b36a23fdcab914a14d7c50def",
"sha256:90174d2154d554e186e4db14121315bb0e2cb4b0c88d0ca0f8f99831f672cfea",
"sha256:948a947960ce688088e7617c9f82c26a0992c1e4e28a4de1f9a0afa736102556",
"sha256:9595200d2e30ba161f585dfc5bf568010e76adc7c7bbc5d7149f0bf3b96996aa",
"sha256:a17055e10baee8e5f19d2b72c474d59dfb45660f66b92d3468fef44f0cc67b37",
"sha256:a3e6c77da50d1f5263281c72db8c2cf5893b2dd624ce684910b7830eb7069163",
"sha256:aa0ddb25cde58232131072870f139d6c737d74d7a3b6a80fcb9721f3b9b2e7bb",
"sha256:b4e4dcd8c1c2483c2c45082d1e9cd600924d84b52154324cce5579a3dac33c46",
"sha256:b8fc88ce6bd9edb514473f10ea4fb14ef78fbd5266b56a614939c5a8a0256283",
"sha256:bc2974162313e3702cfd314401c943bb94add4ae64a4d7d4ecdf93863133b5e1",
"sha256:be045984d2cdb4f181c7aff24001a97ade10d04b1098ac5c859748e2802263f4",
"sha256:c162814bc0ca2f1436e553ef8c451009c689f5a3f04be8acb5f1df7389b2dbc2",
"sha256:c1fa72f4f94d7236eb6a1a86cfcfa6df292411047320c8deb173cac379a87c2a",
"sha256:c70fd9ff86a4370d0ba9aede977440635a859b3c6a86693e178f2ecb4369e153",
"sha256:c887681e9353e559f25421bfd3b358990ae80ed77c42f28eed810ab180047578",
"sha256:ccd027f089df42d9d99f0a2d227823f1248d49826b82dc942e6066a16b825d99",
"sha256:cf81862e9ff7c7abca1fb883ee60d3274b1ce1b30f99cd07cc29c5f5d95cbab8",
"sha256:d2a966bdebdb4eab57ce4ce9a31e96b8772c0e5c46f7e334cb2e8afa59297d8a",
"sha256:d512c9867a43cbbfa51661ea2d7e3e84c4309ef29ee1be3e10b64f9d3353bd70",
"sha256:d76e1939ca45907dcdf8b17fd64d5a392534f42a90b6194e806f08b65ed73948",
"sha256:dd6d3f253f163ce21f6efc2cc675caf16ce474977de925b0adcdae9b97fe8659",
"sha256:e6376f09543416d03844313d7e6e39eb0a42547e07001ac50be93fbd4c6c4431",
"sha256:f6377f570838661ade045793e100f506a4e1f92ddac23455470a03617e30d2a8"
], ],
"markers": "python_version >= '3.7'", "index": "pypi",
"version": "==3.10.0" "version": "==1.8.2.2"
} }
}, },
"develop": {} "develop": {}

View file

@ -1,29 +0,0 @@
长毛象嘟文备份及管理工具
Mastodon Backup Data & Sqlite Management Tool
简称 Mastodon BDSM Tool 。
## 安装
克隆 `BDSM` 的代码 `git clone https://git.southfox.me/southfox/mastodon-BDSM.git` 或是直接访问 `https://git.southfox.me/southfox/mastodon-BDSM/archive/master.zip` 下载。
然后进入文件夹,在根目录(能看到 README.md 文件)下打开控制台,安装前置包 `pip install -r requirements.txt` ,理论上 Python 3.7+ 版本都可使用。推荐使用 `pipenv``venv` 等虚拟环境管理器进行安装。
## 运行
安装完前置包后,在控制台下输入:
- `flask initdb` 初始化数据库
- `flask --debug run` 运行,浏览器打开 `http://127.0.0.1:5000/settings` 进入设置页面,输入帐号后根据提示打开授权链接授权本应用,其实现在真正起作用的是域名,因为实际操作的是授权所用的帐号,所以设置里的前半段帐号理论来说可以乱填(
- 之后进入 `http://127.0.0.1:5000/archive` 抓取所授权帐号的全部嘟文,现在没做网页端进度条,所以请查看控制台获取进度
- 完成后前往主页即可浏览备份了
## 参见
[mastodon-backup](https://github.com/kensanata/mastodon-backup)
[mastodon-data-viewer.py](https://github.com/blackle/mastodon-data-viewer.py)
[Flask 入门教程](https://tutorial.helloflask.com/)

25
README.org Normal file
View file

@ -0,0 +1,25 @@
长毛象嘟文备份及管理工具
Mastodon Backup Data & Sqlite Management Tool
简称 Mastodon BDSM Tool 。
** 安装
克隆 `BDSM` 的代码 =git clone https://git.southfox.me/southfox/mastodon-BDSM.git= 或是直接访问 =https://git.southfox.me/southfox/mastodon-BDSM/archive/master.zip= 下载。
然后进入文件夹,在根目录(能看到 README.md 文件)下打开控制台,安装前置包 =pip install -r requirements.txt= ,理论上 =Python 3.7+= 版本都可使用。推荐使用 =pipenv==venv= 等虚拟环境管理器进行安装。
** 运行
安装完前置包后,在控制台下输入:
- =flask initdb= 初始化数据库
- =flask --debug run= 运行,浏览器打开 =http://127.0.0.1:5000/settings= 进入设置页面,输入帐号后根据提示打开授权链接授权本应用,其实现在真正起作用的是域名,因为实际操作的是授权所用的帐号,所以设置里的前半段帐号理论来说可以乱填(
- 之后进入 =http://127.0.0.1:5000/archive= 抓取所授权帐号的全部嘟文,现在没做网页端进度条,所以请查看控制台获取进度
- 完成后前往主页即可浏览备份了
** 参见
[[https://github.com/kensanata/mastodon-backup][mastodon-backup]]
[[https://github.com/blackle/mastodon-data-viewer.py][mastodon-data-viewer.py]]
[[(https://tutorial.helloflask.com/][Flask 入门教程]]

BIN
misc/mask.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

1477
misc/stopwords.txt Normal file

File diff suppressed because it is too large Load diff

3
misc/user_dict.txt Normal file
View file

@ -0,0 +1,3 @@
狐说站
长毛象
嘟文

View file

@ -1,26 +1,37 @@
blurhash==1.1.4 blurhash==1.1.4
certifi==2022.9.24 certifi==2022.12.7
charset-normalizer==2.1.1 charset-normalizer==2.1.1
click==8.1.3 click==8.1.3
contourpy==1.0.6
cycler==0.11.0
decorator==5.1.1 decorator==5.1.1
Flask==2.2.2 Flask==2.2.2
Flask-SQLAlchemy==3.0.2 Flask-SQLAlchemy==3.0.2
fonttools==4.38.0
greenlet==2.0.1 greenlet==2.0.1
idna==3.4 idna==3.4
importlib-metadata==5.0.0 importlib-metadata==5.0.0
itsdangerous==2.1.2 itsdangerous==2.1.2
jieba==0.42.1
Jinja2==3.1.2 Jinja2==3.1.2
kiwisolver==1.4.4
MarkupSafe==2.1.1 MarkupSafe==2.1.1
Mastodon.py==1.5.2 Mastodon.py==1.8.0
matplotlib==3.6.2
numpy==1.24.1
packaging==22.0
Pillow==9.3.0
pyparsing==3.0.9
python-dateutil==2.8.2 python-dateutil==2.8.2
python-dotenv==0.21.0 python-dotenv==0.21.0
python-magic==0.4.27 python-magic==0.4.27
pytz==2022.6 pytz==2022.6
requests==2.28.1 requests==2.28.1
six==1.16.0 six==1.16.0
SQLAlchemy==1.4.43 SQLAlchemy==1.4.45
tenacity==8.1.0 tenacity==8.1.0
typing_extensions==4.4.0 typing_extensions==4.4.0
urllib3==1.26.12 urllib3==1.26.13
Werkzeug==2.2.2 Werkzeug==2.2.2
wordcloud==1.8.2.2
zipp==3.10.0 zipp==3.10.0