Browse Source

完善新建/重置提问箱,美化界面

master
欧醚 3 years ago
parent
commit
5e8a53325a
3 changed files with 121 additions and 78 deletions
  1. +63
    -70
      ask.py
  2. +20
    -8
      static/ask.html
  3. +38
    -0
      templates/inbox.html

+ 63
- 70
ask.py View File

@ -1,12 +1,14 @@
from flask import Flask, request, render_template, send_from_directory
from flask import Flask, request, render_template, send_from_directory, abort
from flask_sqlalchemy import SQLAlchemy
from mastodon import Mastodon
import re
#import html2text
import re, random, string
import html2text
BOT_NAME = '@ask_me_bot'
DOMAIN = 'thu.closed.social'
WORK_URL = 'https://closed.social'
token = open('token.secret','r').read().strip('\n')
th = Mastodon(
access_token = token,
@ -16,35 +18,26 @@ th = Mastodon(
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///ask.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
#h2t = html2text.HTML2Text()
#h2t.ignore_links = True
def PM(msg, name):
th.status_post(msg + '\n@' + name, visibility='direct')
h2t = html2text.HTML2Text()
h2t.ignore_links = True
db = SQLAlchemy(app)
'''
class Record(db.Model):
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
s = db.Column(db.String(64))
name_hash = db.Column(db.String(64))
full_hash = db.Column(db.String(64))
ip = db.Column(db.String(32))
cs_username = db.Column(db.String(32))
def __init__(self, s, name_hash, full_hash, ip):
self.s = s
self.name_hash = name_hash
self.full_hash = full_hash
self.ip = ip
self.cs_username = ''
acct = db.Column(db.String(64))
disp = db.Column(db.String(64))
avat = db.Column(db.String(256))
url = db.Column(db.String(128))
secr = db.Column(db.String(16))
def __init__(self, acct):
self.acct = acct
def __repr__(self):
return '%s[%s]<%s>'%(self.s, self.cs_username, self.ip)
'''
return '@%s[%s]'%(self.acct, self.disp)
@app.route('/js/<path:path>')
def send_js(path):
@ -58,52 +51,52 @@ def root():
return app.send_static_file('ask.html')
@app.route('/askMe/inbox/', methods=['POST'])
def api():
username = request.form.get('username')
if not re.match('[a-z0-9_]{1,30}(@[a-z\.-_]+)?', username):
return '闭社id格式错误', 422
return 'okkk'
ha = request.form.get('hash')
if( not ha or len(ha) != 64 * 2):
return '哈希格式不正确', 422
ip = request.remote_addr
if ip in ip_count:
ip_count[ip] += 1
if ip_count[ip] > 50:
return '该ip告白次数太多', 403
else:
ip_count[ip] = 1
if Record.query.filter_by(s=s).count():
return '暗号重复', 422
if Record.query.filter_by(name_hash=ha[64:]).count():
return '一个名字只能告白一次,\n重名/哈希冲突请联系主办方', 422
ta = Record.query.filter_by(full_hash=ha[:64]).first()
def set_inbox():
acct = request.form.get('username')
if not re.match('[a-z0-9_]{1,30}(@[a-z\.-_]+)?', acct):
return '无效的闭社id', 422
r = th.conversations()
for conv in r:
status = conv.last_status
account = status.account
#print(account)
if acct == account.acct:
pt = h2t.handle(status.content).strip()
x = re.findall('新建(\[[a-z]{1,32}\])?', pt)
if not x:
return '私信格式无效,请检查并重新发送', 422
secr = x[0][1:-1] if x[0] else ''.join(random.choice(string.ascii_lowercase) for i in range(16))
u = User.query.filter_by(acct=acct).first()
if not u:
u = User(acct)
db.session.add(u)
u.disp = account.display_name
u.url = account.url
u.avat = account.avatar
u.secr = secr
db.session.commit()
th.status_post(f"@{acct} 设置成功! 当前提问箱链接 {WORK_URL}/askMe/{acct}/{secr}\n(如需在微信等无链接预览的平台分享,建议先发给自己,点开,再点击分享到朋友圈等)",
in_reply_to_id=status.id,
visibility='direct'
)
return acct + '/' + secr
rec = Record(s, ha[64:], ha[:64], ip)
rec = Record(s, ha[64:], ha[:64], ip)
db.session.add(rec)
db.session.commit()
return '未找到私信,请确认已发送且是最近发送', 404
if not ta:
return ''
else:
if ta.cs_username:
PM('叮~ TA也给你表白啦! https://closed.social/meetLove/result/', ta.cs_username)
return 'y' if ta.cs_username else 'n'
@app.route('/meetLove/result/')
def result():
rs = Record.query.all()
rs.sort(key=lambda r:r.full_hash)
lovers = [(rs[i].s[:-4]+'****', rs[i+1].s[:-4]+'****') for i in range(len(rs)-1) if rs[i].full_hash == rs[i+1].full_hash]
return render_template('result.html', lovers=lovers)
@app.route('/askMe/<acct>/<secr>')
def inbox(acct, secr):
u = User.query.filter_by(acct=acct, secr=secr).first()
if not u:
abort(404)
return render_template('inbox.html', acct=u.acct, disp=u.disp, url=u.url, avat=u.avat)
if __name__ == '__main__':
app.run()
app.run(debug=True)

+ 20
- 8
static/ask.html View File

@ -5,11 +5,16 @@
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap-grid.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/js-sha256/0.9.0/sha256.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.min.js"></script>
<script src="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.bootcss.com/js-sha256/0.9.0/sha256.min.js"></script>
<script src="/js/notify.min.js"></script>
<title>匿名提问箱</title>
<style>
.popover-header {
color:black;
}
@keyframes downn {
0% {
transform: translate(0px, 0px);
@ -57,7 +62,11 @@
<hr style="border-top: 1px solid white;"/>
<div id="start" style="margin:30px auto;padding:15px;border: 1px dashed white;border-radius:15px; max-width:450px;">
<p>输入闭社id并私信 <b>@ask_me_bot</b> “新建”或“重置”,然后点击按钮,即可新建提问箱或重置提问箱链接。</p>
<p>输入闭社id并私信 <b>@ask_me_bot</b> “新建”,然后点击按钮,即可新建或重置提问箱链接。
<button type="button" class="btn btn-secondary btn-sm" data-toggle="popover" data-placement="bottom" title="提示" data-content="* 已建立过提问箱的情况下再次执行该步骤将重置链接已有的提问不受影响可通过重置后并不再分享新链接来实现关闭提问箱 <br/><br/>
** 非清华站用户请使用完整用户名而非本地用户名,例如 @somebody@tha.closed.social。<br/><br/>
*** 高级用法:私信“新建[路径]”以指定加密路径,而非默认的随机路径。也可利用该功能恢复以前曾经用过的路径。限长度不超过16的小写字母串,示例:<br/>“@ask_me_bot 新建[hhhhhhh]”。" data-html="true">提示</button>
</p>
<form class="form-inline" action="javascript:void(0);" onsubmit="return sendData()">
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
@ -67,11 +76,7 @@
</div>
<button id="send" type="submit" class="btn btn-primary mb-2">我已私信</button>
</form>
<p style="font-size:80%"> <br/>
* 可通过重置链接并不再分享新链接来实现关闭提问箱。 <br/>
** 非清华站用户请使用完整用户名而非本地用户名,例如 @somebody@tha.closed.social。<br/>
** 高级用法:私信“重置[路径]”以指定加密路径,而非默认的随机路径。限长度不超过32的小写字母,示例:<br/>“@ask_me_bot 重置[hhhhhhh]”。
</p>
</div>
<hr/>
@ -79,7 +84,12 @@
</div>
<script type="text/javascript">
$(function () {
$.notify.defaults({autoHideDelay: 1500});
$('[data-toggle="popover"]').popover()
})
function test() {alert('test');}
@ -95,6 +105,7 @@ function sendData() {
success:(result,status,xhr) => {
console.log(result+' : '+status);
$.notify("操作成功", "success");
location.pathname += result
},
error:(xhr,status,error) => {
$.notify(xhr.status+' : '+xhr.responseText, "error");
@ -113,7 +124,7 @@ function sendData() {
<div class="col-lg-6 col-md-6 col-sm-6 col-xs-6">
<img style="float:left;margin:0 15px 15px 5px;" src="/img/logo.svg" width="48px"/>
<h4> 闭社出品 closed.social </h4>
<p>隐私 安全 开源</p>
<p>隐私 安全 开源 分布式社交网络</p>
</div>
<div class="col-lg-3 col-sm-2 col-xs-3">
@ -131,6 +142,7 @@ function sendData() {
<div>
<hr style="border-top: 1px solid white;"/>
<p style="font-size:75%;margin:0;text-align:center"> 灵感来自popi,特此致谢</p>
<p style="font-size:75%;margin:0;text-align:center"> © 2020 Copyright: closed.social</p>
</div>
</div>

+ 38
- 0
templates/inbox.html View File

@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<title>欢迎向我提问!- {{disp}}的提问箱</title>
</head>
<body style="background-color: #001a37;color:#e8e8e8">
<div style="max-width:700px;" class="container">
<div style="background-color:rgba(230,230,250,0.5);margin-bottom:80px">
<div align='center' style='background-color:rgba(180,180,250,0.5);padding:10px;color:#ffffff;'>
<div style="margin:20px">
<span style='color:#555555;margin:0 10px;'> 闭社匿名提问箱</span>
<a type="button" class="btn btn-primary btn-sm" href="/askMe">我也要创建</a>
</div>
<h1 align='center'><a href={{url}}>{{disp}}</a>的提问箱</h1>
<div style="text-align:left; margin-bottom:10px;height:30px" id="acct-info">
<a href="{{url}}"><img src="{{avat}}" width="96"><span></span></a>
<span>{{acct}}</span>
</div>
</div>
</div>
<form>
<div class="form-group" style="background:#e8e8e8;padding:5px;color:black">
<label>向 {{disp}} 匿名提问</label>
<textarea class="form-control" id="question" rows="5" maxlength="500" placeholder="在此处写下你想问的"></textarea>
<button type="submit" class="btn btn-primary">发送提问</button>
</div>
</form>
</div>
</body>
</html>

Loading…
Cancel
Save