首先我想表达一下,我对奋战在前线的英雄们的感激。
我们一定会很快度过这次疫情的
我春节实在是无聊极了,所以我就点开,小甲鱼的python课。
然后看到很多人说不行,要不就 delete_o 法 就是把request url 中的_o去掉就可以无视他的反爬虫机制
然后我就比较头铁,我头真的很铁,我一米7的身高,非要跟一米八八的争顶
昨天阿森纳4:0 我开心爆了。
萨卡牛逼,扎卡够猛。佩佩终于发挥他8000万的身价了,爱他。
奥巴梅杨牛皮
然后我超爱拉卡泽特,他做的球,狗都能进,属实牛逼!
在这里再死一次厄狗
这是我第一次发帖,我就很机车,废话就很多。
我实在不想委屈求全,所以出现了这个教程
不废话,下面干货
首先我找了一个2018的博客:
https://blog.csdn.net/li939891142/article/details/84592442
首先在这里感谢一下他
但现在他的代码已经失效
按照前辈的方法论,我们现在行不通了,就应该去找有道的js加密方法,于是我们找到
http://fanyi.youdao.com/
进去后按F12,找到elem块,找到js
如图
点进去后我们发现是一堆代码,根本不能看,我们就需要工具来处理一下js代码,我们百度一下js代码格式化
然后保存在word文档中,搜索salt
如图:
我们需要开始对比了:
首先这个sign一看就很不一样,第四个参数的字符串明显改动了。
然后salt的生成方式也变了
多了bv和ts
知道这些后,我们把这些参数伪造出来,骗服务器我们是正常人就行了
最后会附上代码
我这边提一下这个bv
var t = n.md5(navigator.appVersion),
这个t也就是bv了。
对了,这个对应关系从
return {
ts: r,
bv: t,
salt: i,
sign: n.md5("fanyideskweb" + e + i + "n%A-rKaT5fb[Gy?;N5@Tj")
}
这里看出。
我不懂怎么让python返回服务器的appversion,所以我直接用js(按f12)
然后如图:
我代码是直接把这一串字符给copy上去的
莫笑
接下来是我修改后变丑的代码
def getSalt():
"""
这是计算salt的公式 "" + ((new Date).getTime() + parseInt(10 * Math.random(), 10));
把它翻译成Python代码
:return:
"""
import time,random
# (new Date).getTime()生成的时间戳与time.time()的单位不一致,所以需要乘1000
r= '' + str(str(int(time.time()*1000)))
salt = r + str(random.randint(0,10))
return salt
def getMd5(v):
import hashlib
md5 = hashlib.md5()
# 需要一个bytes格式的参数
md5.update(v.encode("utf-8"))
sign = md5.hexdigest()
return sign
def getSign(key, salt):
sign = "fanyideskweb" + key + str(salt) + "n%A-rKaT5fb[Gy?;N5@Tj"
sign = getMd5(sign)
return sign
def getbv():
appVersion='5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.106 Safari/537.36'
bv = getMd5(appVersion)
return bv
def getts():
import time, random
# (new Date).getTime()生成的时间戳与time.time()的单位不一致,所以需要乘1000
r = '' + str(str(int(time.time() * 1000)))
return r
from urllib import request,parse
def youdao(key):
url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
salt = getSalt()
data = {
"i": key,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": str(salt),
"sign": getSign(key, salt),
'ts' : getts(),
'bv' : getbv(),
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_CLICKBUTTION",
}
print(data)
# 参数data需要是bytes格式
data = parse.urlencode(data).encode('utf-8')
headers = {
"Accept": "application/json,text/javascript,*/*;q=0.01",
# "Accept-Encoding": "gzip,deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
# "Content-Length": len(data),
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
"Cookie": "[email protected];JSESSIONID=aaaZ6s5m9DVmYf8g3QoDw;OUTFOX_SEARCH_USER_ID_NCOO=473292646.5080033;___rl__test__cookies=1543228484656",
"Host": "fanyi.youdao.com",
"Origin":"http://fanyi.youdao.com",
"Referer":"http://fanyi.youdao.com/",
"User-Agent": "Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/69.0.3497.100Safari/537.36OPR/56.0.3051.104X-Requested-With:XMLHttpRequest"
}
req = request.Request(url=url, data=data, headers=headers)
rsp = request.urlopen(req)
html = rsp.read().decode('utf-8')
# for values in html["translateResult"]:
# print(values)
print(html)
if __name__ == '__main__':
youdao("girl")
# 参考:https://blog.csdn.net/li939891142/article/details/84592442博主 感谢他