feat/show other account replys

This commit is contained in:
SouthFox 2022-11-08 02:25:06 +08:00
parent 6793fda0c8
commit 670e7d42ba
3 changed files with 216 additions and 166 deletions

View file

@ -77,7 +77,9 @@
{% endif %}
</div>
<div class="action-bar">
{% if not toot.is_reblog %}
{% if toot.is_myself %}
<span><i class="fa-solid fa-satellite-dish"></i><a href="{{ url_for('grab', toot_id=toot.id) }}"
target=" _blank">抓取回复</a></span>
<span><i class="fa-solid fa-up-right-and-down-left-from-center"></i><a
href="{{ url_for('context', toot_id=toot.id) }}" target=" _blank">上下文</a></span>
{% endif %}

View file

@ -15,7 +15,7 @@ def app_register(url):
scopes=["read"]
)
def archive_toot(url):
def app_login(url):
mastodon = Mastodon(
client_id='pyBDSM_clientcred.secret',
access_token='user.secret',
@ -36,6 +36,187 @@ def archive_toot(url):
# exit in either case
sys.exit(1)
return mastodon, user
def get_context(url, toot_id):
mastodon, user = app_login(url)
acct = mastodon.me().acct
context = mastodon.status_context(toot_id)
statuses = []
statuses= context['ancestors'] + context['descendants']
toot_process(statuses, acct)
db.session.commit()
def toot_process(statuses, my_acct, duplicates_counter=0):
for status in statuses:
is_reblog = False
is_myself = False
if status['reblog'] != None:
if my_acct == status['reblog']['account']['acct']:
reblog_myself = True
else:
reblog_myself = False
is_reblog = True
reblog_id = status['reblog']['id']
id = status['id']
created_at = status['created_at']
toot = Toot(id=id, created_at=created_at, reblog_myself=reblog_myself, reblog_id=reblog_id)
db.session.merge(toot)
# cur.execute('''INSERT OR REPLACE INTO TOOT (id,created_at,reblog_myself,reblog_id) \
# VALUES (?,?,?,?)''',(id, created_at, reblog_myself, reblog_id))
if reblog_myself:
continue
status = status['reblog']
id = status['id']
acct = status['account']['acct']
if my_acct == acct:
is_myself = True
else:
is_myself = False
url = status['url']
created_at = status['created_at']
edited_at = status['edited_at']
if isinstance(edited_at, str):
edited_at = dateutil.parser.parse(status['edited_at'])
in_reply_to_id = status['in_reply_to_id']
in_reply_to_account_id = status['in_reply_to_account_id']
content = status['content']
if status['media_attachments'] != []:
media_list = ""
for media_dict in status['media_attachments']:
media_list += str(media_dict['id']) + ","
media = Media(id=media_dict['id'], type=media_dict['type'], url=media_dict['url'],
remote_url=media_dict['remote_url'], description=media_dict['description'])
db.session.merge(media)
# cur.execute('''INSERT OR REPLACE INTO MEDIA (id,type,url,remote_url,description) \
# VALUES (?,?,?,?,?)''',(media_dict['id'], media_dict['type'], media_dict['url'], \
# media_dict['remote_url'], media_dict['description']))
else:
media_list = ""
spoiler_text = status['spoiler_text']
if status['poll'] != None:
poll_dict = status['poll']
poll_id = poll_dict['id']
expires_at = poll_dict['expires_at']
options = str(poll_dict['options'])
poll = Poll(id=poll_dict['id'], expires_at=expires_at, multiple=poll_dict['multiple'], \
votes_count=poll_dict['votes_count'], options=options)
db.session.merge(poll)
# cur.execute('''INSERT OR REPLACE INTO POLL (id,expires_at,multiple,votes_count,options) \
# VALUES (?,?,?,?,?)''',(poll_dict['id'], expires_at, poll_dict['multiple'], \
# poll_dict['votes_count'], options))
else:
poll_id = None
if status['emojis'] != []:
emoji_list = ""
for emoji in status['emojis']:
shortcode = emoji['shortcode']
emoji_list += shortcode + ","
counter = ':' + shortcode + ':'
count = content.count(counter)
if not is_reblog:
data=Emoji.query.filter_by(shortcode=shortcode, acct=acct).first()
if data is None:
emoji_data = Emoji(shortcode=shortcode,
acct=acct,
url=emoji['url'],
static_url=emoji['static_url'],
count=count)
db.session.merge(emoji_data)
# cur.execute('''INSERT INTO EMOJI (shortcode,url,static_url,count) \
# VALUES (?,?,?,?)''', (shortcode, emoji['url'], emoji['static_url'], count))
else:
data.count += count
# cur.execute("UPDATE EMOJI SET count = ? WHERE shortcode = ?",(count, shortcode))
else:
emoji_data = Emoji(shortcode=shortcode,
acct=acct,
url=emoji['url'],
static_url=emoji['static_url'])
db.session.merge(emoji_data)
else:
emoji_list = ""
if status['tags'] != []:
for tag in status['tags']:
tag_data = Tag(id=id, name=tag['name'])
db.session.merge(tag_data)
# cur.execute('''INSERT OR REPLACE INTO TAG (id,name) \
# VALUES (?,?)''',(id, tag['name']))
visibility = status['visibility']
reblogged = status['reblogged']
favourited = status['favourited']
bookmarked = status['bookmarked']
sensitive = status['sensitive']
replies_count = status['replies_count']
reblogs_count = status['reblogs_count']
favourites_count = status['favourites_count']
language = status['language']
if is_reblog or not is_myself:
table = Other()
else:
table = Toot()
table.id=id
table.acct = acct
table.url=url
table.created_at=created_at
table.edited_at=edited_at
table.in_reply_to_id=in_reply_to_id
table.in_reply_to_account_id=in_reply_to_account_id
table.content=content
table.media_list=media_list
table.spoiler_text=spoiler_text
table.poll_id=poll_id
table.emoji_list=emoji_list
table.visibility=visibility
table.reblogged=reblogged
table.favourited=favourited
table.bookmarked=bookmarked
table.sensitive=sensitive
table.replies_count=replies_count
table.reblogs_count=reblogs_count
table.favourites_count=favourites_count
table.language=language
if Toot.query.get(id) == None or Other.query.get(id) == None:
duplicates_counter += 1
db.session.merge(table)
# sql = f'''INSERT OR REPLACE INTO {table} (id,url,created_at,edited_at,in_reply_to_id,in_reply_to_account_id,content,\
# media_list,spoiler_text,poll_id,emoji_list,visibility,reblogged,favourited,bookmarked,sensitive,reblogs_count,\
# favourites_count,language) \
# VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'''
# cur.execute(sql,(id,url,created_at,edited_at,in_reply_to_id,in_reply_to_account_id,content,media_list,spoiler_text,\
# poll_id,emoji_list,visibility,reblogged,favourited,bookmarked,sensitive,reblogs_count,favourites_count,language))
return duplicates_counter
def archive_toot(url):
mastodon, user = app_login(url)
acct = mastodon.me().acct
statuses_count = str(mastodon.me().statuses_count)
@ -48,158 +229,7 @@ def archive_toot(url):
duplicates_counter = 0
while(True):
for status in statuses:
is_reblog = False
if status['reblog'] != None:
if acct == status['reblog']['account']['acct']:
reblog_myself = True
else:
reblog_myself = False
is_reblog = True
reblog_id = status['reblog']['id']
id = status['id']
created_at = status['created_at']
toot = Toot(id=id, created_at=created_at, reblog_myself=reblog_myself, reblog_id=reblog_id)
db.session.merge(toot)
# cur.execute('''INSERT OR REPLACE INTO TOOT (id,created_at,reblog_myself,reblog_id) \
# VALUES (?,?,?,?)''',(id, created_at, reblog_myself, reblog_id))
if reblog_myself:
continue
status = status['reblog']
id = status['id']
acct = status['account']['acct']
url = status['url']
created_at = status['created_at']
edited_at = status['edited_at']
if isinstance(edited_at, str):
edited_at = dateutil.parser.parse(status['edited_at'])
in_reply_to_id = status['in_reply_to_id']
in_reply_to_account_id = status['in_reply_to_account_id']
content = status['content']
if status['media_attachments'] != []:
media_list = ""
for media_dict in status['media_attachments']:
media_list += str(media_dict['id']) + ","
media = Media(id=media_dict['id'], type=media_dict['type'], url=media_dict['url'],
remote_url=media_dict['remote_url'], description=media_dict['description'])
db.session.merge(media)
# cur.execute('''INSERT OR REPLACE INTO MEDIA (id,type,url,remote_url,description) \
# VALUES (?,?,?,?,?)''',(media_dict['id'], media_dict['type'], media_dict['url'], \
# media_dict['remote_url'], media_dict['description']))
else:
media_list = ""
spoiler_text = status['spoiler_text']
if status['poll'] != None:
poll_dict = status['poll']
poll_id = poll_dict['id']
expires_at = poll_dict['expires_at']
options = str(poll_dict['options'])
poll = Poll(id=poll_dict['id'], expires_at=expires_at, multiple=poll_dict['multiple'], \
votes_count=poll_dict['votes_count'], options=options)
db.session.merge(poll)
# cur.execute('''INSERT OR REPLACE INTO POLL (id,expires_at,multiple,votes_count,options) \
# VALUES (?,?,?,?,?)''',(poll_dict['id'], expires_at, poll_dict['multiple'], \
# poll_dict['votes_count'], options))
else:
poll_id = None
if status['emojis'] != []:
emoji_list = ""
for emoji in status['emojis']:
shortcode = emoji['shortcode']
emoji_list += shortcode + ","
counter = ':' + shortcode + ':'
count = content.count(counter)
if not is_reblog:
data=Emoji.query.filter_by(shortcode=shortcode, acct=acct).first()
if data is None:
emoji_data = Emoji(shortcode=shortcode,
acct=acct,
url=emoji['url'],
static_url=emoji['static_url'],
count=count)
db.session.merge(emoji_data)
# cur.execute('''INSERT INTO EMOJI (shortcode,url,static_url,count) \
# VALUES (?,?,?,?)''', (shortcode, emoji['url'], emoji['static_url'], count))
else:
data.count += count
# cur.execute("UPDATE EMOJI SET count = ? WHERE shortcode = ?",(count, shortcode))
else:
emoji_data = Emoji(shortcode=shortcode,
acct=acct,
url=emoji['url'],
static_url=emoji['static_url'])
db.session.merge(emoji_data)
else:
emoji_list = ""
if status['tags'] != []:
for tag in status['tags']:
tag_data = Tag(id=id, name=tag['name'])
db.session.merge(tag_data)
# cur.execute('''INSERT OR REPLACE INTO TAG (id,name) \
# VALUES (?,?)''',(id, tag['name']))
visibility = status['visibility']
reblogged = status['reblogged']
favourited = status['favourited']
bookmarked = status['bookmarked']
sensitive = status['sensitive']
replies_count = status['replies_count']
reblogs_count = status['reblogs_count']
favourites_count = status['favourites_count']
language = status['language']
table = Other() if is_reblog else Toot()
table.id=id
table.acct = acct
table.url=url
table.created_at=created_at
table.edited_at=edited_at
table.in_reply_to_id=in_reply_to_id
table.in_reply_to_account_id=in_reply_to_account_id
table.content=content
table.media_list=media_list
table.spoiler_text=spoiler_text
table.poll_id=poll_id
table.emoji_list=emoji_list
table.visibility=visibility
table.reblogged=reblogged
table.favourited=favourited
table.bookmarked=bookmarked
table.sensitive=sensitive
table.replies_count=replies_count
table.reblogs_count=reblogs_count
table.favourites_count=favourites_count
table.language=language
if Toot.query.get(id) == None or Other.query.get(id) == None:
duplicates_counter += 1
db.session.merge(table)
# sql = f'''INSERT OR REPLACE INTO {table} (id,url,created_at,edited_at,in_reply_to_id,in_reply_to_account_id,content,\
# media_list,spoiler_text,poll_id,emoji_list,visibility,reblogged,favourited,bookmarked,sensitive,reblogs_count,\
# favourites_count,language) \
# VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)'''
# cur.execute(sql,(id,url,created_at,edited_at,in_reply_to_id,in_reply_to_account_id,content,media_list,spoiler_text,\
# poll_id,emoji_list,visibility,reblogged,favourited,bookmarked,sensitive,reblogs_count,favourites_count,language))
duplicates_counter = toot_process(statuses, acct)
db.session.commit()
print(str(happy_counter) + ' / ' + statuses_count)
happy_counter += 20

View file

@ -6,7 +6,7 @@ from flask import render_template, request, url_for, redirect, flash
from flask_sqlalchemy import Pagination
from BDSM import app, db
from BDSM.models import Media, Settings, Toot, Emoji, Other
from BDSM.toot import app_register, archive_toot
from BDSM.toot import app_register, archive_toot, get_context
from mastodon import Mastodon
from types import SimpleNamespace
from datetime import timezone
@ -53,7 +53,8 @@ def search():
def context(toot_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 = process_toot(toots)
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:
if i.in_reply_to_id != None:
@ -71,7 +72,9 @@ def context(toot_id):
toot = []
toot_ = Toot.query.get(toots[0].in_reply_to_id)
if toot_ == None:
break
toot_ = Other.query.get(toots[0].in_reply_to_id)
if toot_ == None:
break
toot.append(toot_)
toot = process_toot(toot)
@ -80,6 +83,17 @@ def context(toot_id):
return render_template('view.html', toots=toots,)
@app.route('/grab/<int:toot_id>', methods=['GET', 'POST'])
def grab(toot_id):
settings = Settings.query.first()
account = settings.account[1:]
username, domain = account.split("@")
url = "https://" + domain
get_context(url, toot_id)
flash('抓取完成……大概!')
return redirect(url_for('context',toot_id=toot_id))
@app.route('/settings', methods=['GET', 'POST'])
def settings():
if request.method == 'POST':
@ -170,15 +184,19 @@ def process_toot(toots_):
toot.created_at = toot.created_at.replace(tzinfo=timezone.utc)
toot.created_at = toot.created_at.astimezone(user_timezone).strftime(fmt)
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
if hasattr(toot, 'reblog_id'):
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:
toot.is_myself = False
if toot.media_list != "":
toot.medias = []