提交 126365a3 编写于 作者: H hjdhnx

更新api尝试增加搜索编码的兼容性

上级 e6a4a804
......@@ -14,8 +14,8 @@ from utils.web import *
from utils.system import getHost
from utils.config import playerConfig
from utils.log import logger
from utils.encode import base64Encode,base64Decode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome
from utils.encode import verifyCode,setDetail,join,urljoin2,parseText,requireCache,forceOrder
from utils.encode import base64Encode,base64Decode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome,atob,btoa
from utils.encode import verifyCode,setDetail,join,urljoin2,parseText,requireCache,forceOrder,base64ToImage,encodeStr, decodeStr
from utils.encode import md5 as mmd5
from utils.safePython import safePython
from utils.parser import runPy,runJScode,JsObjectWrapper,PyJsObject,PyJsString
......@@ -79,7 +79,8 @@ py_ctx = {
'buildUrl':buildUrl,'getHome':getHome,'setDetail':setDetail,'join':join,'urljoin2':urljoin2,
'PC_UA':PC_UA,'MOBILE_UA':MOBILE_UA,'UC_UA':UC_UA,'UA':UA,'IOS_UA':IOS_UA,
'setItem':setItem,'getItem':getItem,'clearItem':clearItem,'stringify':stringify,'encodeUrl':encodeUrl,
'requireObj':requireObj,'md5':md5
'requireObj':requireObj,'md5':md5,'atob': atob, 'btoa':btoa,'base64ToImage': base64ToImage, 'encodeStr': encodeStr,
'decodeStr': decodeStr
}
# print(getCryptoJS())
......@@ -166,6 +167,7 @@ class CMS:
self.oheaders['cookie'] = cookie
limit = rule.get('limit',6)
encoding = rule.get('编码', 'utf-8')
search_encoding = rule.get('搜索编码', '')
self.limit = min(limit,30)
keys = headers.keys()
for k in headers.keys():
......@@ -211,6 +213,7 @@ class CMS:
self.推荐 = rule.get('推荐','')
self.图片来源 = rule.get('图片来源','')
self.encoding = encoding
self.search_encoding = search_encoding
self.timeout = round(int(timeout)/1000,2)
self.filter = rule.get('filter',[])
self.filter_def = rule.get('filter_def',{})
......@@ -1250,8 +1253,12 @@ class CMS:
return result
def searchContent(self, key, fypage=1,show_name=False):
if self.encoding and str(self.encoding).startswith('gb'):
key = quote(key.encode('utf-8').decode('utf-8').encode(self.encoding,'ignore'))
if self.search_encoding:
if str(self.search_encoding).lower() != 'utf-8':
key = encodeStr(key,self.search_encoding)
elif self.encoding and str(self.encoding).startswith('gb'):
# key = quote(key.encode('utf-8').decode('utf-8').encode(self.encoding,'ignore'))
key = encodeStr(key,self.encoding)
# print(key)
pg = str(fypage)
if not self.searchUrl:
......
......@@ -13,6 +13,7 @@
var rule = {
title:'',//规则标题,没有实际作用,但是可以作为cms类名称依据
编码:'',//不填就默认utf-8
搜索编码:'',//不填则不编码,默认都是按utf-8.可优先于全局编码属性.比如网页源码编码是gbk,这里可以指定utf-8搜索独立编码。多数情况这个属性不填或者填写gbk应对特殊的网站搜索
host:'',//网页的域名根,包含http头如 https://www,baidu.com
homeUrl:'/latest/',//网站的首页链接,可以是完整路径或者相对路径,用于分类获取和推荐获取 fyclass是分类标签 fypage是页数
url:'/fyclass/fypage.html[/fyclass/]',//网站的分类页面链接
......
###### 2023/02/15
###### 2023/03/06
- [X] 3.9.37beta1 drpy增加属性搜索编码,用于解决某些网站搜索关键字必须是gbk编码结果的问题 目前js0已测试通过并实现了encodeStr和decodeStr函数。js1预留了逻辑暂未实现,函数已增加
###### 2023/03/03
- [X] 3.9.36beta1 drpy2.js和drpy2.min.js依赖引入改为从壳子内部引入和相对路径引入模板
###### 2023/02/15
......
......@@ -3,6 +3,7 @@ muban.首图2.二级.desc = '.data:eq(1)&&Text;;;.data:eq(6)&&Text;.data:eq(5)&&
muban.首图2.二级.tabs = '.nav-tabs.dpplay&&li';
var rule = {
title:'007影视',
搜索编码:'utf-8',
模板:'首图2',
ali_token:'{{ali_token}}',
bili_cookie:'{{bili_cookie}}',
......
3.9.36beta5
\ No newline at end of file
3.9.37beta1
\ No newline at end of file
......@@ -54,7 +54,7 @@ function pre(){
}
let rule = {};
const VERSION = 'drpy1 3.9.35 20230215';
const VERSION = 'drpy1 3.9.37beta1 20230306';
/** 已知问题记录
* 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了]
* Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下)
......@@ -394,6 +394,30 @@ function md5(text) {
return CryptoJS.MD5(text).toString();
}
/**
* 字符串按指定编码
* @param input
* @param encoding
* @returns {*}
*/
function encodeStr(input,encoding){
encoding = encoding||'gbk';
return input
}
/**
* 字符串指定解码
* @param input
* @param encoding
* @returns {*}
*/
function decodeStr(input,encoding){
encoding = encoding||'gbk';
return input
}
function getCryptoJS(){
// return request('https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/crypto-hiker.js');
return 'console.log("CryptoJS已装载");'
......@@ -2120,6 +2144,7 @@ function playParse(playObj){
rule.timeout = rule.timeout||5000;
rule.encoding = rule.编码||rule.encoding||'utf-8';
rule.search_encoding = rule.搜索编码||rule.search_encoding||'';
rule.图片来源 = rule.图片来源||'';
rule.play_json = rule.hasOwnProperty('play_json')?rule.play_json:[];
rule.pagecount = rule.hasOwnProperty('pagecount')?rule.pagecount:{};
......@@ -2265,6 +2290,15 @@ function play(flag, id, flags) {
* @returns {string}
*/
function search(wd, quick) {
if(rule.search_encoding){
if(rule.search_encoding.toLowerCase()!=='utf-8'){
// 按搜索编码进行编码
wd = encodeStr(wd,rule.search_encoding);
}
}else if(rule.encoding && rule.encoding.toLowerCase()!=='utf-8'){
// 按全局编码进行编码
wd = encodeStr(wd,rule.encoding);
}
let searchObj = {
searchUrl: rule.searchUrl,
搜索: rule.搜索,
......
此差异已折叠。
......@@ -39,7 +39,7 @@ function pre(){
let rule = {};
let vercode = typeof(pdfl) ==='function'?'drpy2.1':'drpy2';
const VERSION = vercode+' 3.9.36beta1 20230303';
const VERSION = vercode+' 3.9.37beta1 20230306';
/** 已知问题记录
* 1.影魔的jinjia2引擎不支持 {{fl}}对象直接渲染 (有能力解决的话尽量解决下,支持对象直接渲染字符串转义,如果加了|safe就不转义)[影魔牛逼,最新的文件发现这问题已经解决了]
* Array.prototype.append = Array.prototype.push; 这种js执行后有毛病,for in 循环列表会把属性给打印出来 (这个大毛病需要重点排除一下)
......@@ -381,6 +381,30 @@ function md5(text) {
return CryptoJS.MD5(text).toString();
}
/**
* 字符串按指定编码
* @param input
* @param encoding
* @returns {*}
*/
function encodeStr(input,encoding){
encoding = encoding||'gbk';
return input
}
/**
* 字符串指定解码
* @param input
* @param encoding
* @returns {*}
*/
function decodeStr(input,encoding){
encoding = encoding||'gbk';
return input
}
function getCryptoJS(){
// return request('https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/crypto-hiker.js');
return 'console.log("CryptoJS已装载");'
......@@ -1983,6 +2007,7 @@ function init(ext) {
rule.timeout = rule.timeout||5000;
rule.encoding = rule.编码||rule.encoding||'utf-8';
rule.search_encoding = rule.搜索编码||rule.search_encoding||'';
rule.图片来源 = rule.图片来源||'';
rule.play_json = rule.hasOwnProperty('play_json')?rule.play_json:[];
rule.pagecount = rule.hasOwnProperty('pagecount')?rule.pagecount:{};
......@@ -2128,6 +2153,15 @@ function play(flag, id, flags) {
* @returns {string}
*/
function search(wd, quick) {
if(rule.search_encoding){
if(rule.search_encoding.toLowerCase()!=='utf-8'){
// 按搜索编码进行编码
wd = encodeStr(wd,rule.search_encoding);
}
}else if(rule.encoding && rule.encoding.toLowerCase()!=='utf-8'){
// 按全局编码进行编码
wd = encodeStr(wd,rule.encoding);
}
let searchObj = {
searchUrl: rule.searchUrl,
搜索: rule.搜索,
......
此差异已折叠。
......@@ -5,10 +5,29 @@
# Date : 2022/8/28
import re
from urllib.parse import quote,unquote
txt = 'var player_aaaa={"flag":"play","encrypt":3,"trysee":0,"points":0,"link":"\/vodplay\/44640-1-1.html","link_next":"","link_pre":"","url":"Zd2fZg56c6y10828ZDRiNzZjNzk1Y2E3OWQzNmQzYWEyM2IwODM0ZjM3MgO0O0OO0O0O","url_next":"d","from":"vip","server":"no","note":"","id":"44640","sid":1,"nid":1}'
ret = re.search('var player_(.*?)=(.*?)<',txt,re.M|re.I)
print(ret)
def encodeStr(input, encoding='GBK'):
"""
指定字符串编码
:param input:
:param encoding:
:return:
"""
return quote(input.encode(encoding, 'ignore'))
def lazyParse(input,jsp,getParse,saveParse,headers,encoding):
pass
\ No newline at end of file
pass
str1 = '星'
key = str1.encode('gb2312','ignore')
print(quote(key))
print(quote(str1))
# print(str1.decode('utf-8',))
# str_gbk = str1.encode("gbk",ignore=True).strip()
# print("转码结果:"+repr(str_gbk))
# print( unquote('%D0%C7','GBK'))
print(encodeStr('星','utf-8'))
print(encodeStr('斗罗大陆','gbk')) # %B6%B7%C2%DE%B4%F3%C2%BD
\ No newline at end of file
......@@ -176,6 +176,33 @@ def base64Decode(text):
# print(text)
return base64.b64decode(text).decode("utf-8") #base64解码
def encodeStr(input, encoding='GBK'):
"""
指定字符串编码
:param input:
:param encoding:
:return:
"""
if isinstance(input,PyJsString):
input = parseText(str(input))
if isinstance(encoding,PyJsString):
encoding = parseText(str(input))
return quote(input.encode(encoding, 'ignore'))
def decodeStr(input, encoding='GBK'):
"""
指定字符串解码
:param input:
:param encoding:
:return:
"""
if isinstance(input,PyJsString):
input = parseText(str(input))
if isinstance(encoding,PyJsString):
encoding = parseText(str(input))
return unquote(input,encoding)
def parseText(text:str):
text = text.replace('false','False').replace('true','True').replace('null','None')
# print(text)
......
......@@ -9,66 +9,76 @@ import json
import requests
from utils.web import *
from utils.log import logger
from utils.encode import base64Encode,base64Decode,fetch,post,request,getCryptoJS,getPreJs,buildUrl,getHome,parseText,atob
from utils.encode import setDetail,join,urljoin2,parseText,requireCache,base64ToImage
from utils.encode import base64Encode, base64Decode, fetch, post, request, getCryptoJS, getPreJs, buildUrl, getHome, \
parseText, atob,btoa
from utils.encode import setDetail, join, urljoin2, parseText, requireCache, base64ToImage, encodeStr, decodeStr
from utils.encode import md5 as mmd5
from utils.parser import runPy,runJScode,JsObjectWrapper,PyJsObject,PyJsString
from utils.parser import runPy, runJScode, JsObjectWrapper, PyJsObject, PyJsString
from urllib.parse import quote
from utils.htmlParser import jsoup
from controllers.service import storage_service
def setItem(key,value):
def setItem(key, value):
lsg = storage_service()
if isinstance(key,PyJsString):
if isinstance(key, PyJsString):
key = parseText(str(key))
if isinstance(value,PyJsString):
if isinstance(value, PyJsString):
value = parseText(str(value))
return lsg.setItem(key,value)
return lsg.setItem(key, value)
def getItem(key,value=''):
def getItem(key, value=''):
lsg = storage_service()
if isinstance(key,PyJsString):
if isinstance(key, PyJsString):
key = parseText(str(key))
if isinstance(value,PyJsString):
if isinstance(value, PyJsString):
value = parseText(str(value))
return lsg.getItem(key,value)
return lsg.getItem(key, value)
def clearItem(key):
lsg = storage_service()
if isinstance(key,PyJsString):
if isinstance(key, PyJsString):
key = parseText(str(key))
return lsg.clearItem(key)
def encodeUrl(url):
# return base64Encode(quote(url))
# return base64Encode(url)
# print(type(url))
if isinstance(url,PyJsString):
if isinstance(url, PyJsString):
# obj = obj.to_dict()
url = parseText(str(url))
return quote(url)
def stringify(obj):
if isinstance(obj,PyJsObject):
if isinstance(obj, PyJsObject):
# obj = obj.to_dict()
obj = parseText(str(obj))
return json.dumps(obj, separators=(',', ':'), ensure_ascii=False)
def requireObj(url):
if isinstance(url,PyJsString):
if isinstance(url, PyJsString):
url = parseText(str(url))
return requireCache(url)
def md5(text):
if isinstance(text,PyJsString):
if isinstance(text, PyJsString):
text = parseText(str(text))
return mmd5(text)
py_ctx = {
'requests':requests,'print':print,'base64Encode':base64Encode,'base64Decode':base64Decode,
'log':logger.info,'fetch':fetch,'post':post,'request':request,'getCryptoJS':getCryptoJS,
'buildUrl':buildUrl,'getHome':getHome,'setDetail':setDetail,'join':join,'urljoin2':urljoin2,
'PC_UA':PC_UA,'MOBILE_UA':MOBILE_UA,'UC_UA':UC_UA,'IOS_UA':IOS_UA,
'setItem':setItem,'getItem':getItem,'clearItem':clearItem,'stringify':stringify,'encodeUrl':encodeUrl,
'requireObj':requireObj,'md5':md5,'atob':atob,'base64ToImage':base64ToImage
}
\ No newline at end of file
'requests': requests, 'print': print, 'base64Encode': base64Encode, 'base64Decode': base64Decode,
'log': logger.info, 'fetch': fetch, 'post': post, 'request': request, 'getCryptoJS': getCryptoJS,
'buildUrl': buildUrl, 'getHome': getHome, 'setDetail': setDetail, 'join': join, 'urljoin2': urljoin2,
'PC_UA': PC_UA, 'MOBILE_UA': MOBILE_UA, 'UC_UA': UC_UA, 'IOS_UA': IOS_UA,
'setItem': setItem, 'getItem': getItem, 'clearItem': clearItem, 'stringify': stringify, 'encodeUrl': encodeUrl,
'requireObj': requireObj, 'md5': md5, 'atob': atob, 'btoa':btoa,'base64ToImage': base64ToImage, 'encodeStr': encodeStr,
'decodeStr': decodeStr
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册