提交 7483901c 编写于 作者: H hjdhnx

优化排序和 防白嫖

上级 556512b1
......@@ -36,6 +36,8 @@ OCR_API = 'http://dm.mudery.com:10000' # 验证码识别接口,传参数data
UNAME = 'admin' # 管理员账号
PWD = 'drpy' # 管理员密码
USE_PY = 0 # 开启py源
JS0_DISABLE = 0 # 禁用js0
JS0_PASSWORD = '' # js0密码
JS_MODE = 0 # js模式 0 drpy服务器解析 1 pluto本地解析
MAX_CONTENT_LENGTH = 1 * 1024 * 100 # 100 kB
LIVE_MODE = 0 # 0 本地 1外网
......
无法预览此类型文件
......@@ -37,12 +37,13 @@ def admin_index(): # 管理员界面
lsg = storage_service()
live_url = lsg.getItem('LIVE_URL')
use_py = lsg.getItem('USE_PY')
js0_password = lsg.getItem('JS0_PASSWORD')
# print(f'live_url:', live_url)
rules = getRules('js')
# print(rules)
cache_count = getCacheCount()
# print(cache_count)
return render_template('admin.html', pystate=use_py,rules=rules,cache_count=cache_count, ver=getLocalVer(), live_url=live_url)
return render_template('admin.html',js0_password=js0_password, pystate=use_py,rules=rules,cache_count=cache_count, ver=getLocalVer(), live_url=live_url)
@admin.route('/settings')
def admin_settings(): # 管理员界面
......@@ -158,6 +159,7 @@ def admin_rule_order(order=0): # 管理员修改规则顺序
# print(rules.getState(rule_list[0]))
# print(rule_list)
success_list = []
rule_list.reverse() # 倒序解决时间多重排序问题
for rule in rule_list:
try:
res_id = rules.setOrder(rule,order)
......
......@@ -24,6 +24,7 @@ from utils.update import getLocalVer,getHotSuggest
from js.rules import getJxs
import random
from utils.web import getParmas
import functools
home = Blueprint("home", __name__,static_folder='/static')
......@@ -221,18 +222,19 @@ def config_render(mode):
lsg = storage_service()
store_conf_dict = lsg.getStoreConfDict()
new_conf.update(store_conf_dict)
# print(new_conf)
# print(type(new_conf),new_conf)
host = getHost(mode)
# ali_token = lsg.getItem('ALI_TOKEN')
ali_token = new_conf.ALI_TOKEN
xr_mode = new_conf.XR_MODE
js0_password = new_conf.JS0_PASSWORD
js_mode = int(new_conf.JS_MODE or 0)
print(f'{type(js_mode)} jsmode:{js_mode}')
# print(ali_token)
customConfig = getCustonDict(host,ali_token)
# print(customConfig)
jxs = getJxs(host=host)
lsg = storage_service()
use_py = lsg.getItem('USE_PY')
pys = getPys() if use_py else []
# print(pys)
......@@ -242,7 +244,7 @@ def config_render(mode):
rules = getRules('js',js_mode)
rules = get_multi_rules(rules)
# html = render_template('config.txt',rules=getRules('js'),host=host,mode=mode,jxs=jxs,base64Encode=base64Encode,config=new_conf)
html = render_template('config.txt',UA=UA,xr_mode=xr_mode,ISTVB=ISTVB,pys=pys,rules=rules,host=host,mode=mode,js_mode=js_mode,jxs=jxs,alists=alists,alists_str=alists_str,live_url=live_url,config=new_conf)
html = render_template('config.txt',js0_password=js0_password,UA=UA,xr_mode=xr_mode,ISTVB=ISTVB,pys=pys,rules=rules,host=host,mode=mode,js_mode=js_mode,jxs=jxs,alists=alists,alists_str=alists_str,live_url=live_url,config=new_conf)
merged_config = custom_merge(parseText(html),customConfig)
# print(merged_config['sites'])
merged_hide(merged_config)
......@@ -273,16 +275,32 @@ def sort_sites_by_order(sites,js_mode=0):
site_rule = rule_list[rule_names.index(site_name)]
sites[i]['state'] = 1 if site_rule['state'] is None else site_rule['state']
sites[i]['order'] = 0 if site_rule['order'] is None else site_rule['order']
sites[i]['write_date'] = 0 if site_rule['write_date'] is None else site_rule['write_date'].timestamp()
else:
sites[i]['state'] = 1
sites[i]['order'] = 0
sites[i]['write_date'] = 0
# sites[i]['site_name'] = site_name
# print(sites)
sites.sort(key=lambda x: x['order'], reverse=False)
def comp(x, y):
if x['order'] > y['order']:
return 1
elif x['order'] < y['order']:
return - 1
else:
if x['write_date'] < y['write_date']:
return 1
elif x['write_date'] > y['write_date']:
return -1
else:
return 0
# sites.sort(key=lambda x: x['order'], reverse=False)
sites.sort(key=functools.cmp_to_key(comp), reverse=False)
# print(sites)
for site in sites:
del site['state']
del site['order']
del site['write_date']
return sites
@home.route('/configs')
......@@ -296,6 +314,7 @@ def config_gen():
try:
use_py = lsg.getItem('USE_PY')
js_mode = int(new_conf.JS_MODE or 0)
js0_password = new_conf.JS0_PASSWORD
pys = getPys() if use_py else False
alists = getAlist()
alists_str = json.dumps(alists,ensure_ascii=False)
......@@ -303,15 +322,15 @@ def config_gen():
rules = get_multi_rules(rules)
host0 = getHost(0)
jxs = getJxs(host=host0)
set_local = render_template('config.txt',pys=pys,rules=rules,alists=alists,alists_str=alists_str,live_url=get_live_url(new_conf,0),mode=0,js_mode=js_mode,host=host0,jxs=jxs)
set_local = render_template('config.txt',js0_password=js0_password,pys=pys,rules=rules,alists=alists,alists_str=alists_str,live_url=get_live_url(new_conf,0),mode=0,js_mode=js_mode,host=host0,jxs=jxs)
# print(set_local)
host1 = getHost(1)
jxs = getJxs(host=host1)
set_area = render_template('config.txt',pys=pys,rules=rules,alists=alists,alists_str=alists_str,live_url=get_live_url(new_conf,1),mode=1,js_mode=js_mode,host=host1,jxs=jxs)
set_area = render_template('config.txt',js0_password=js0_password,pys=pys,rules=rules,alists=alists,alists_str=alists_str,live_url=get_live_url(new_conf,1),mode=1,js_mode=js_mode,host=host1,jxs=jxs)
host2 = getHost(2) or host1
# print('远程地址:'+host2)
jxs = getJxs(host=host2)
set_online = render_template('config.txt',pys=pys,rules=rules,alists=alists,alists_str=alists_str,live_url=get_live_url(new_conf,2),mode=1,js_mode=js_mode,host=host2,jxs=jxs)
set_online = render_template('config.txt',js0_password=js0_password,pys=pys,rules=rules,alists=alists,alists_str=alists_str,live_url=get_live_url(new_conf,2),mode=1,js_mode=js_mode,host=host2,jxs=jxs)
ali_token = new_conf.ALI_TOKEN
with open('txt/pycms0.json','w+',encoding='utf-8') as f:
customConfig = getCustonDict(host0,ali_token)
......
......@@ -12,6 +12,8 @@ from utils.system import getHost
from utils.files import getCustonDict,custom_merge
from utils.encode import parseText
from js.rules import getRules,getPys
from operator import itemgetter, attrgetter
import functools
layui = Blueprint("layui", __name__)
......@@ -64,12 +66,42 @@ def layui_rule_list():
site_rule = rule_list[rule_names.index(site_name)]
sites[i]['state'] = 1 if site_rule['state'] is None else site_rule['state']
sites[i]['order'] = 0 if site_rule['order'] is None else site_rule['order']
sites[i]['write_date'] = 0 if site_rule['write_date'] is None else site_rule['write_date'].timestamp()
else:
sites[i]['state'] = 1
sites[i]['order'] = 0
sites[i]['write_date'] = 0
sites[i]['site_name'] = site_name
sites.sort(key=lambda x:x['order'],reverse=False)
def multisort(sites, specs):
"""
https://zhuanlan.zhihu.com/p/109269549?utm_id=0
多重排序,来自知乎的代码.明显只对了最后的元素进行排序.看完评论和实践发现不对
:param sites:
:param specs:
:return:
"""
for key, reverse in specs:
# sites.sort(key=attrgetter(key), reverse=reverse)
sites.sort(key=lambda x:x[key], reverse=reverse)
return sites
def comp(x, y):
if x['order'] > y['order']:
return 1
elif x['order'] < y['order']:
return - 1
else:
if x['write_date'] < y['write_date']:
return 1
elif x['write_date'] > y['write_date']:
return -1
else:
return 0
# multisort(sites, (('order', False), ('write_date', True)))
# sites.sort(key=lambda x:x['order'],reverse=False)
sites.sort(key=functools.cmp_to_key(comp),reverse=False)
new_sites = sites[(page-1)*limit:page*limit]
# print(new_sites)
return layuiBack('获取成功',new_sites,count=len(sites))
......@@ -9,6 +9,7 @@ import os
from utils.cfg import cfg
from utils.log import logger
from utils.encode import OcrApi
from controllers.service import storage_service
from utils.pyctx import py_ctx,getPreJs,runJScode,JsObjectWrapper,PyJsString,parseText,jsoup,time
import base64
......@@ -106,7 +107,8 @@ def parse_home(filename):
@parse.route('/ocr',methods=['POST'])
def base64_ocr():
ocr_api = cfg.OCR_API
lsg = storage_service()
ocr_api = lsg.getItem('OCR_API',cfg.OCR_API)
# print(ocr_api)
# print('params:',getParmas())
img = getParmas('img')
......
......@@ -9,6 +9,7 @@ from models.storage import Storage
from models.ruleclass import RuleClass
from utils.cfg import cfg
from base.database import db
from datetime import datetime,timedelta
class storage_service(object):
......@@ -19,7 +20,7 @@ class storage_service(object):
return copy_utils.obj_to_list(res)
def __init__(self):
conf_list = ['LIVE_URL', 'USE_PY', 'JS_MODE','PLAY_URL', 'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
conf_list = ['LIVE_URL', 'USE_PY', 'JS_MODE','JS0_DISABLE','JS0_PASSWORD','PLAY_URL', 'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
'WALL_PAPER', 'UNAME', 'PWD', 'LIVE_MODE', 'CATE_EXCLUDE', 'TAB_EXCLUDE','SEARCH_TIMEOUT','MULTI_MODE','XR_MODE','ALI_TOKEN']
for conf in conf_list:
if not self.hasItem(conf):
......@@ -29,9 +30,9 @@ class storage_service(object):
@classmethod
def getStoreConf(self):
# MAX_CONTENT_LENGTH 最大上传和端口ip一样是顶级配置,无法外部修改的
conf_list = ['LIVE_URL', 'LIVE_MODE','PLAY_URL', 'PID_URL','USE_PY','JS_MODE', 'PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
conf_list = ['LIVE_URL', 'LIVE_MODE','PLAY_URL', 'PID_URL','USE_PY','JS_MODE', 'JS0_DISABLE','JS0_PASSWORD','PLAY_DISABLE', 'LAZYPARSE_MODE', 'WALL_PAPER_ENABLE',
'WALL_PAPER', 'UNAME', 'PWD', 'CATE_EXCLUDE', 'TAB_EXCLUDE','SEARCH_TIMEOUT','MULTI_MODE','XR_MODE','ALI_TOKEN']
conf_name_list = ['直播地址', '直播模式','远程地址', '进程管理链接','启用py源', 'js模式','禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号',
conf_name_list = ['直播地址', '直播模式','远程地址', '进程管理链接','启用py源', 'js模式','禁用js0','js0密码','禁用免嗅', '免嗅模式', '启用壁纸', '壁纸链接', '管理账号',
'管理密码', '分类排除', '线路排除','聚搜超时','多源模式','仙人模式','阿里tk']
conf_lists = []
for i in range(len(conf_list)):
......@@ -75,7 +76,9 @@ class rules_service(object):
@staticmethod
def query_all():
# 查询所有
res = RuleClass.query.all()
res = RuleClass.query.order_by(RuleClass.order.asc(),RuleClass.write_date.desc()).all()
# print(res)
# res = RuleClass.query.order_by(RuleClass.write_date.asc()).all()
return copy_utils.obj_to_list(res)
@classmethod
......@@ -113,6 +116,10 @@ class rules_service(object):
res = RuleClass.query.filter(RuleClass.name == key).first()
if res:
res.order = order
# print(f'{res.name}设置order为:{order}')
if res.order == order:
res.write_date = datetime.now()
# res.write_date = res.write_date + timedelta(hours=2)
db.session.add(res)
else:
res = RuleClass(name=key, order=order)
......
......@@ -5,7 +5,7 @@
# Date : 2022/9/6
import json
from flask import Blueprint,request,render_template,jsonify,make_response,redirect
from flask import Blueprint,abort,request,render_template,jsonify,make_response,redirect
from time import time
from utils.web import getParmas,get_interval
from utils.cfg import cfg
......@@ -183,6 +183,16 @@ def multi_search(wd):
@vod.route('/vod')
def vod_home():
lsg = storage_service()
js0_disable = lsg.getItem('JS0_DISABLE',cfg.get('JS0_DISABLE',0))
if js0_disable:
abort(403)
js0_password = lsg.getItem('JS0_PASSWORD', cfg.get('JS0_PASSWORD', ''))
# print('js0_password:',js0_password)
if js0_password:
pwd = getParmas('pwd')
if pwd != js0_password:
abort(403)
t0 = time()
rule = getParmas('rule')
ac = getParmas('ac')
......
......@@ -22,7 +22,7 @@
$(".view_home").click(function(){
let rule = this.getAttribute('value').trim();
location.href = '/vod?rule='+rule;
location.href = '/vod?{% if js0_password %}pwd={{js0_password}}&{% endif %}rule='+rule;
});
$("#checkUpdate").click(function(){
......
......@@ -10,7 +10,7 @@
"key":"dr_{{ rule.name }}",
"name":"{{ rule.name }}(道长)",
"type":1,
"api":"{{ host }}/vod?rule={{ rule.name }}",
"api":"{{ host }}/vod?{% if js0_password %}pwd={{js0_password}}&{% endif %}rule={{ rule.name }}",
"searchable": {{ rule.searchable }},
"quickSearch": {{ rule.quickSearch }},
"filterable": {{ rule.filterable }}
......@@ -30,7 +30,7 @@
"key":"js_drpy",
"name":"drpy(道长)",
"type":1,
"api":"{{ host }}/vod?rule=drpy",
"api":"{{ host }}/vod?{% if js0_password %}pwd={{js0_password}}&{% endif %}rule=drpy",
"searchable": 1,
"quickSearch": 1,
"filterable": 1
......
......@@ -49,8 +49,11 @@
<script type="text/html" id="barDemo">
<!-- <a class="layui-btn layui-btn-xs" lay-event="edit">编辑</a>-->
<a class="layui-btn layui-btn-xs" lay-event="set_top">置顶</a>
<a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">隐藏</a>
<a class="layui-btn layui-btn-xs" lay-event="set_top"></a>
<a class="layui-btn layui-btn-xs layui-btn-danger" lay-event="set_bottom"></a>
<a class="layui-btn layui-btn-xs layui-btn-info" lay-event="set_order"></a>
<!-- <a class="layui-btn layui-btn-danger layui-btn-xs" lay-event="del">隐藏</a>-->
</script>
......@@ -118,6 +121,7 @@ layui.use(['table', 'dropdown'], function(){
// curr: 3 //重新从第 1 页开始
// }
});
layer.msg('已设置顺序为'+to_set_order,{time:1000});
}else{
console.log('修改失败了...');
return false
......@@ -170,7 +174,7 @@ layui.use(['table', 'dropdown'], function(){
// var td = obj.td(this.field); //获取当前 td
// return td.find('select').val();
// }}
,{fixed: 'right', title:'操作', width: 125, minWidth: 125, toolbar: '#barDemo'}
,{fixed: 'right', title:'操作', width: 130, minWidth: 130, toolbar: '#barDemo'}
]]
,done: function(){
var id = this.id;
......@@ -308,7 +312,6 @@ layui.use(['table', 'dropdown'], function(){
}else{
setOrder(data,Number(value));
layer.close(index);
layer.msg('请设置顺序为'+value,{time:1000});
}
});
// setOrder(data,0);
......@@ -390,6 +393,32 @@ layui.use(['table', 'dropdown'], function(){
table.on('tool(test)', function(obj){ // 双击 toolDouble
var data = obj.data;
//console.log(obj)
function setPos(od,msg){
let obj_name;
try{
obj_name = obj.data.api.match(/rule=(.*)/)[1].split('&')[0];
}catch (e){
obj_name = obj.data.key;
}
console.log(obj);
let params = {"names":[obj_name].join(',')};
console.log(params);
$.post("/admin/rule_order/"+od,params,function(res,status){
console.log(res);
if(res.code === 200){
data.order = od;
// console.log(obj);
obj.update({
order: data.order
});
layer.msg(''+msg);
}else{
console.log('修改失败了...');
layer.msg(msg+'失败,具体错误看日志');
return false
}
});
}
if(obj.event === 'del'){
let obj_name;
try{
......@@ -432,29 +461,26 @@ layui.use(['table', 'dropdown'], function(){
content: '<div style="padding: 16px;">自定义表单元素</div>'
});
}else if(obj.event === 'set_top'){
let obj_name;
try{
obj_name = obj.data.api.match(/rule=(.*)/)[1].split('&')[0];
}catch (e){
obj_name = obj.data.key;
}
console.log(obj);
let params = {"names":[obj_name].join(',')};
console.log(params);
$.post("/admin/rule_order/0",params,function(res,status){
console.log(res);
if(res.code === 200){
data.order = 0;
obj.update({
order: data.order
setPos(0,'置顶');
}else if(obj.event === 'set_bottom'){
setPos(9999,'置底');
}else if(obj.event === 'set_order'){
layer.prompt({
formType: 0,
value: '',
title: '请输入指定的排序序号,数字越小排名越靠前',
btn: ['确定','取消'], //按钮,
btnAlign: 'c'
}, function(value,index){
console.log('value:'+value);
var reg = /^[\d]+$/;
if(!reg.test(value)){
layer.msg('请输入有效数字!',{time:500});
}else{
setPos(Number(value),'指定顺序');
layer.close(index);
}
});
layer.msg('已置顶');
}else{
console.log('修改失败了...');
layer.msg('置顶失败,具体错误看日志');
return false
}
});
}
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册