使用转换后的JS函数在Python中除臭

2024-09-30 12:16:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要将以下函数转换为python,以便在抓取网页时对提取的文本进行消隐:

function obfuscateText(coded, key) {
// Email obfuscator script 2.1 by Tim Williams, University of Arizona
// Random encryption key feature by Andrew Moulden, Site Engineering Ltd
// This code is freeware provided these four comment lines remain intact
// A wizard to generate this code is at http://www.jottings.com/obfuscator/
shift = coded.length
link = ""
for (i = 0; i < coded.length; i++) {
    if (key.indexOf(coded.charAt(i)) == -1) {
        ltr = coded.charAt(i)
        link += (ltr)
    }
    else {
        ltr = (key.indexOf(coded.charAt(i)) - shift + key.length) % key.length
        link += (key.charAt(ltr))
    }
}
document.write("<a href='mailto:" + link + "'>" + link + "</a>")

}“”“”

下面是我转换的python等价物:

^{pr2}$

打印模糊文本(“uw#287u#Guw#287Xw8Iwu!#W7L#“,”WXYVZABUCDTFGSHIRKLQMNOPQORSTNUVMWXYLZ01K23J456I789H。@G!#$F%&E'*+D-/=C?^B `{A |}~”)

actionattraction$comcastWnet

但是我得到的输出有点不正确,而不是actionattraction@comcast.net我在上面。同样,上面的代码多次为同一个html页面提供随机字符

目标html页面在JS中有一个带编码和key的模糊文本函数,我在obsfunc中提取函数签名并动态执行:

email=eval(obsfunc)

它将email存储在上面的变量中,但问题是它大部分时间都能工作,但有时会失败,我强烈地感觉到问题出在python函数提供的参数上,它们可能需要转义或转换,因为它包含特殊字符?我尝试传递原始参数和不同的类型,如repr(),但问题仍然存在。在

一些例子actionattraction@comcast.net使用相同的python函数计算错误和正确(第一行是email):

@ation@ttr@ationVaoma@st!nct
 obfuscateText("KMd%Y@Kdd8KMd%Y@IMY!MKcdJ@*d", "utvsrwqxpyonzm0l1k2ji3h4g5fe6d7c8b9aZ.Y@X!WV#U$T%S&amp;RQ'P*O+NM-L/K=J?IH^G_F`ED{C|B}A~")

}ction}ttr}ction@comc}st.net
 obfuscateText("}ARGML}RRP}ARGMLjAMKA}QRiLCR", "}|{`_^?=/-+*'&amp;%$#!@.9876543210zyxwvutsrqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA~")

actionattraction@comcast.net
 obfuscateText("DEWLRQDWWUDEWLRQoERPEDVWnQHW", "%&amp;$#!@.'9876*54321+0zyxw-vutsr/qponm=lkjih?gfed^cbaZY_XWVUT`SRQPO{NMLKJ|IHGFE}DCBA~")

Tags: key函数文本netemaillinklengthamp
2条回答

我重写了除臭剂:

def deobfuscate_text(coded, key):
    offset = (len(key) - len(coded)) % len(key)
    shifted_key = key[offset:] + key[:offset]
    lookup = dict(zip(key, shifted_key))
    return "".join(lookup.get(ch, ch) for ch in coded)

测试结果是

^{pr2}$

这给了

actionattraction@comcast.net
actionattraction@comcast.net
actionattraction@comcast.net
anybody@home.com

注意,这三个键串都包含&amp;;用&替换它可以解决问题。可能在某个时候,javascript被错误地转义了html代码;Python有一个模块可以对html特殊字符进行解锁,如下所示:

# Python 2.x:
import HTMLParser
html_parser = HTMLParser.HTMLParser()
unescaped = html_parser.unescape(my_string)

# Python 3.x:
import html.parser
html_parser = html.parser.HTMLParser()
unescaped = html_parser.unescape(my_string)

首先,index不返回None,而是抛出一个异常。在您的例子中,W出现而不是一个点,因为返回的索引是0not inkey(这也是错误的)错误地认为键中不存在字符。在

其次,&amp;的出现表明您确实需要查找和解码HTML实体。在

最后,我建议重写它

len0 = len(code)
len1 = len(key)
link = ''
for ch in code:
    try:
        ch = key[(key.index(ch) - len0 + len1) % len1]
    except ValueError: pass
    link += ch
return link

相关问题 更多 >

    热门问题