def get_token_record(token=None) -> dict: error_msg = None ret = { "success": False, } if token: record = mysql.exec( "SELECT `useage_remain` FROM `api`.`ptboard_token` WHERE `token`='{}'" .format(token)) try: token_quote = int(record[0]) except TypeError: token_quote = 0 error_msg = "This token is not exist in database." else: if token_quote <= 0: mysql.exec( "DELETE FROM `api`.`ptboard_token` WHERE `token`='{}'". format(token)) error_msg = "The quote of this token is exhaustion" else: ret.update({"success": True}) ret.update({"token": token, "quote": token_quote}) else: error_msg = "No token." ret.update({"error": error_msg}) return ret
def gen(): if request.method == "POST": url = request.form["url"] elif request.method == "GET": url = request.args.get("url") else: url = "" if url: _gen = Gen(url=url) row, data = mysql.exec( "SELECT * FROM `api`.`gen_info` WHERE `site`='{}' AND `sid`='{}'". format(_gen.site, _gen.sid), r_dict=True, ret_row=True) if int(row) == 0: data = _gen.gen() if data["success"]: # 正确获取的情况下缓存请求结果 mysql.exec( "INSERT INTO `api`.`gen_info` (`site`, `sid`, `data`)" " VALUES ('{}', '{}', '{}')".format( _gen.site, _gen.sid, escape_string(json.dumps(data)))) else: data_str = data.get("data") data = json.loads(data_str) return jsonify(data) else: return redirect("https://git.io/vFvmP", code=301)
def sign(): ret = {} token = request.args.get("token") or None hashes = request.args.get("hashes") or None if token and hashes: token_verify = poi.token_verify(token=token, hashes=hashes) if token_verify["success"]: mysql.exec( "INSERT INTO `api`.`ptboard_token` (`token`) VALUES ('{}')". format(token)) ret.update(get_token_record(token)) return jsonify(ret)
def token_use(token=None) -> dict: record = get_token_record(token) token_quote = record.setdefault("quote", 0) if token_quote > 0: token_quote -= 1 mysql.exec( "UPDATE `api`.`ptboard_token` SET `useage_remain`={} WHERE `token`='{}'" .format(token_quote, token)) record.update({"quote": token_quote}) return record
def ptboard(): t0 = time.time() search_raw = request.args.get("search") or "" order_raw = request.args.get("order") or "desc" limit_raw = request.args.get("limit") or 50 offset_raw = request.args.get("offset") or 0 search = re.sub(r"[ _\-,.]", " ", search_raw) search = search.split() search = search[:10] if search: opt = " AND ".join([ "`title` LIKE '%{key}%'".format(key=escape_string(i)) for i in search ]) else: opt = "1=1" order = "desc" if order_raw not in ["desc", "asc"] else order_raw try: limit = int(limit_raw) if limit > 200: limit = 200 except ValueError or TypeError: limit = 50 try: offset = int(offset_raw) except ValueError or TypeError: offset = 0 sql = ( "SELECT * FROM `rss_pt_site` WHERE {opt} ORDER BY `pubDate` {_da} LIMIT {_offset}, {_limit}" .format(opt=opt, _da=order.upper(), _offset=offset, _limit=limit)) rows_count, rows_data = mysql.exec(sql=sql, r_dict=True, fetch_all=True, ret_row=True) total_data = mysql.exec( "SELECT `TABLE_ROWS` FROM `information_schema`.`TABLES` " "WHERE `TABLE_NAME`='rss_pt_site'")[0] return jsonify({ "cost": time.time() - t0, "rows": rows_data, "total": rows_count if search else total_data })
def token_valid(token_): if len(token_) != 32: return False row, data = mysql.exec("SELECT * FROM `api`.`ptboard_token` WHERE token = %s", token_, ret_row=True) if row > 0: return True else: return False
def get_site_list(): return [i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`", fetch_all=True)]
def ptboard(): ret = { "success": False, "error": None } t0 = time.time() # 1. Get user requests search_raw = request.args.get("search") or search_default order_raw = request.args.get("order") or order_default site_raw = request.args.get("site") or site_default no_site_raw = request.args.get("no_site") or no_site_default limit = request.args.get("limit") or limit_default offset = request.args.get("offset") or offset_default start_time = request.args.get("start_time") or start_time_default end_time = request.args.get("end_time") or end_time_default # 2. Clean user requests search = re.sub(r"[ _\-,.+]", " ", search_raw) search = search.split() search = list(filter(lambda l: len(l) > 1, search)) # Remove those too short letter search = search[:10] search_opt = site_opt = no_site_opt = "1=1" if search: search_opt = warp_str(" AND ".join(map(lambda i: "title LIKE '%{}%'".format(escape_string(i)), search))) start_time = recover_int_to_default(start_time, start_time_default) end_time = recover_int_to_default(end_time, end_time_default) time_opt = warp_str("ptboard_record.pubDate BETWEEN {start} AND {end}".format(start=start_time, end=end_time)) @cache.cached(timeout=86400) def get_site_list(): return [i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`", fetch_all=True)] site_list = get_site_list() site = list(filter(lambda i: i in site_list, site_raw.split(","))) no_site = list(filter(lambda i: i in site_list, no_site_raw.split(","))) if site: site_opt = warp_str(" OR ".join(["ptboard_record.site = '{site}'".format(site=s) for s in site])) if no_site: no_site_opt = warp_str(" AND ".join(["ptboard_record.site != '{site}'".format(site=s) for s in no_site])) limit = recover_int_to_default(limit, limit_default) offset = recover_int_to_default(offset, offset_default) if limit > 200: limit = 200 order = "desc" if order_raw.lower() not in ["desc", "asc"] else order_raw # 3. Get response data from Database opt = " AND ".join([time_opt, site_opt, no_site_opt, search_opt]) sql = ("SELECT ptboard_record.sid, ptboard_site.site, ptboard_record.title, " "concat(ptboard_site.torrent_prefix,ptboard_record.sid, ptboard_site.torrent_suffix) AS link, " "ptboard_record.pubDate FROM api.ptboard_record " "INNER JOIN api.ptboard_site ON api.ptboard_site.site = api.ptboard_record.site " "WHERE {opt} ORDER BY `pubDate` {_da} " "LIMIT {_offset}, {_limit}".format(opt=opt, _da=order.upper(), _offset=offset, _limit=limit) ) record_count, rows_data = mysql.exec(sql=sql, r_dict=True, fetch_all=True, ret_row=True) # 4. Sort Response data if app.config.get("DEBUG"): ret["sql"] = sql def fix_predb(d: dict): if d["site"] == "PreDB": d["link"] = predb_prefix + d["title"].split(" | ")[1] return d ret.update({ "success": True, "rows": list(map(fix_predb, rows_data)), "total": record_count if search else mysql.exec("SELECT count(*) FROM `api`.`ptboard_record`")[0], }) ret["cost"] = time.time() - t0 return jsonify(ret)
def get_site_list(): return [ i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`", fetch_all=True) ]
def ptboard(): ret = {"success": False, "error": None} t0 = time.time() # 1. Get user requests search_raw = request.args.get("search") or search_default order_raw = request.args.get("order") or order_default site_raw = request.args.get("site") or site_default no_site_raw = request.args.get("no_site") or no_site_default limit = request.args.get("limit") or limit_default offset = request.args.get("offset") or offset_default start_time = request.args.get("start_time") or start_time_default end_time = request.args.get("end_time") or end_time_default # 2. Clean user requests search = re.sub(r"[ _\-,.+]", " ", search_raw) search = search.split() search = list(filter(lambda l: len(l) > 1, search)) # Remove those too short letter search = search[:10] search_opt = site_opt = no_site_opt = "1=1" if search: search_opt = warp_str(" AND ".join( map(lambda i: "title LIKE '%{}%'".format(escape_string(i)), search))) start_time = recover_int_to_default(start_time, start_time_default) end_time = recover_int_to_default(end_time, end_time_default) time_opt = warp_str( "ptboard_record.pubDate BETWEEN {start} AND {end}".format( start=start_time, end=end_time)) @cache.cached(timeout=86400) def get_site_list(): return [ i[0] for i in mysql.exec("SELECT `site` FROM `api`.`ptboard_site`", fetch_all=True) ] site_list = get_site_list() site = list(filter(lambda i: i in site_list, site_raw.split(","))) no_site = list(filter(lambda i: i in site_list, no_site_raw.split(","))) if site: site_opt = warp_str(" OR ".join( ["ptboard_record.site = '{site}'".format(site=s) for s in site])) if no_site: no_site_opt = warp_str(" AND ".join([ "ptboard_record.site != '{site}'".format(site=s) for s in no_site ])) limit = recover_int_to_default(limit, limit_default) offset = recover_int_to_default(offset, offset_default) if limit > 200: limit = 200 order = "desc" if order_raw.lower() not in ["desc", "asc"] else order_raw # 3. Get response data from Database opt = " AND ".join([time_opt, site_opt, no_site_opt, search_opt]) sql = ( "SELECT ptboard_record.sid, ptboard_site.site, ptboard_record.title, " "concat(ptboard_site.torrent_prefix,ptboard_record.sid, ptboard_site.torrent_suffix) AS link, " "ptboard_record.pubDate FROM api.ptboard_record " "INNER JOIN api.ptboard_site ON api.ptboard_site.site = api.ptboard_record.site " "WHERE {opt} ORDER BY `pubDate` {_da} " "LIMIT {_offset}, {_limit}".format(opt=opt, _da=order.upper(), _offset=offset, _limit=limit)) record_count, rows_data = mysql.exec(sql=sql, r_dict=True, fetch_all=True, ret_row=True) # 4. Sort Response data if app.config.get("DEBUG"): ret["sql"] = sql def fix_predb(d: dict): if d["site"] == "PreDB": d["link"] = predb_prefix + d["title"].split(" | ")[1] return d ret.update({ "success": True, "rows": list(map(fix_predb, rows_data)), "total": record_count if search else mysql.exec("SELECT count(*) FROM `api`.`ptboard_record`")[0], }) ret["cost"] = time.time() - t0 return jsonify(ret)
def ptboard(): ret = {"success": False, "error": None} t0 = time.time() search_raw = request.args.get("search") or search_default order_raw = request.args.get("order") or order_default site_raw = request.args.get("site") or site_default no_site_raw = request.args.get("no_site") or no_site_default limit = request.args.get("limit") or limit_default offset = request.args.get("offset") or offset_default start_time = request.args.get("start_time") or start_time_default end_time = request.args.get("end_time") or end_time_default search = re.sub(r"[ _\-,.+]", " ", search_raw) search = search.split() search = search[:10] search_opt = site_opt = no_site_opt = "1=1" if search: search_opt = warp_str(" AND ".join([ "`title` LIKE '%{key}%'".format(key=escape_string(i)) for i in search ])) start_time = recover_int_to_default(start_time, start_time_default) end_time = recover_int_to_default(end_time, end_time_default) time_opt = warp_str("`pubDate` BETWEEN {start} AND {end}".format( start=start_time, end=end_time)) if site_raw: site = site_raw.split(",") site_opt = warp_str(" OR ".join( ["`site` = '{site}'".format(site=escape_string(s)) for s in site])) if no_site_raw: no_site = no_site_raw.split(",") no_site_opt = warp_str(" AND ".join([ "`site` != '{site}'".format(site=escape_string(s)) for s in no_site ])) limit = recover_int_to_default(limit, limit_default) offset = recover_int_to_default(offset, offset_default) if limit > 200: limit = 200 order = "desc" if order_raw not in ["desc", "asc"] else order_raw opt = " AND ".join([search_opt, time_opt, site_opt, no_site_opt]) sql = ( "SELECT * FROM `api`.`ptboard_record` WHERE {opt} ORDER BY `pubDate` {_da} " "LIMIT {_offset}, {_limit}".format(opt=opt, _da=order.upper(), _offset=offset, _limit=limit)) record_count, rows_data = mysql.exec(sql=sql, r_dict=True, fetch_all=True, ret_row=True) ret.update({ "success": True, "rows": rows_data, "total": record_count if search else mysql.exec("SELECT count(*) FROM `api`.`ptboard_record`")[0], }) ret.update({"cost": time.time() - t0}) return jsonify(ret)