百度翻譯腳本
- 一、解決方法:
- 第一難關: sign標簽獲取
- 第二難關 發現不管翻譯中文英文都是一樣的
- 二、代碼截圖
- 三、效果展示
一、解決方法:
第一難關: sign標簽獲取
- 首先介紹一個模塊神器 execjs
用途:通過python代碼去執行JavaScript代碼的庫 - 獲取sign值
1.按F12打開開發者模式,看它的頁面展示結果一看就是個ajax,直接去xhr里找,找到了包資料直接看response回應的結果,發現dst是我們要翻譯的結果,【回傳的資料太多不好分析按一鍵,然后再點擊翻譯按鈕】

- 我再去看headers,看到是post請求,一定有表單資料,from to【學過一點英文的應該都知道從…到…】,qurry【翻譯的內容】,sign【通過js拿到的】,token【這個引數經過分析,不影響請求,但一定要有】,經過post請求測驗需要拿到sign標簽

-好的,我們去all里找找看,看看有多少js,滑鼠放到Initiator發現就只有兩個js檔案,好的回傳編譯器里【我這里用的pycharm】新建倆個js檔案,兩個js檔案全域搜索sign按【citl+f】,發現找到的東西和formdata的幾乎類似
發現sign對應這【h(n)】,n由qurry,

- 上面我們找到了sign對應著【h(n)】,好的回到瀏覽器中,全域搜索那兩個js檔案查找h(n),加上斷點進行debug除錯去找h(n),隨便輸入一個內容,找到了一個【h:f e(r)】f是function,好的在次回到編譯器里的js檔案中全域搜索【function e?】,找到了一個內容,好的在次新建一個js檔案,把內容丟進去



- 接下匯入excejs庫
import execjs
with open('baidu.js','r') as f:
jsData=f.read()
sign=execjs.compile(jsData).call('e','你好') #e是js傳的引數,下一個引數就是翻譯的內容
print(sign)

運行了一下發現缺少i 引數,好的再去找i,發現不管翻譯什么【i】引數都是固定的,直接加入那個js檔案里繼續跑
var i="320305.131321201"


發現了又缺少【n】好的再去瀏覽器里找n的內容,發現n對應著一個函式方法,好的再去那個js里全域搜索那個函式內容,找到那個內容以后直接丟到里的那個js檔案中繼續跑,看看能不能獲取sign的值,
結果發現成功獲取到了sign的值,接下來就可以開開心心的寫自己的翻譯腳本呢




第二難關 發現不管翻譯中文英文都是一樣的
結果發現是請求方式的問題,from ,,,to,,,,
請求之前需要一個中英文判斷,判斷方法如下:
def is_chinese(uchar):
"""判斷一個unicode是否是漢字"""
if uchar >= u'\u4e00' and uchar<=u'\u9fa5':
return True
else:
return False
二、代碼截圖
# -*- coding: utf-8 -*-
# @Time : 2021/1/18 14:24
# @Author : Xchen
# @Email : 1272012812@qq.com
# @File : TranslateBaidu.py
# @Software: PyCharm
# token: ea5ada4109c67257a32b444d7add8f51
import requests
import json
import execjs
headers={
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36',
'cookie': '__yjs_duid=1_5ffb303a68cef187fa0bbd16672d28da1610896805863; BAIDUID=4D93AAC3A3CB1205043278144FDCA352:FG=1; BAIDUID_BFESS=4D93AAC3A3CB1205043278144FDCA352:FG=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; BIDUPSID=4D93AAC3A3CB1205043278144FDCA352; PSTM=1610897551; BDRCVFR[VXHUG3ZuJnT]=mk3SLVN4HKm; delPer=0; PSINO=5; H_PS_PSSID=; BA_HECTOR=0584alalak2g04ak8p1g0aar80r; BDORZ=FFFB88E999055A3F8A630C64834BD6D0; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1610896807,1610951535; __yjsv5_shitong=1.0_7_bf96750ce6e3c2775d6ff12d4dbf3b4bc889_300_1610951535893_114.238.103.53_018a390e; yjs_js_security_passport=ae192e80ccd59875d5ef5dbd8ddbfc0aadf049c9_1610951536_js; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1610951556; ab_sr=1.0.0_NmEwZGZjNDc1YThmMzM5YTM1NWNjZDBjZDdlMzAwMmU2NGQ4YWM4Yjc4ZDAxNDJlYmFkNTYzY2MwMWIyYmQxYjcyOTE3NjFlYmQ3YmRhOTcxNDQ4MWE5YTNlNjMzNzJh'
}
# 獲取sign標簽
def get_sign(content):
with open('baidu.js','r') as f:
rconnent=f.read()
sign=execjs.compile(rconnent).call('e',content)
return sign
#發送post請求
def parse_url(url,formdata):
try:
response=requests.post(url,data=formdata,headers=headers)
if response.status_code==200:
htmlstr=response.text
except Exception as e:
print(e.args)
print('Request Error!!!')
return htmlstr
pass
# 獲取json資料
def get_jsonData(htmlStr):
jsondata=json.loads(htmlStr)
result_c={}
for item in jsondata["trans_result"]["data"]:
result_c['result']=item['dst']
return result_c
# 判斷中英文
def is_chinese(uchar):
"""判斷一個unicode是否是漢字"""
if uchar >= u'\u4e00' and uchar<=u'\u9fa5':
return True
else:
return False
# 處理表單資料
def dealwith_formdata(e,z,content,sign):
'''
發現發送請求之前需要識別中英文
:param e: en
:param z: zh
:param content:翻譯的內容
:param sign: sign的值
:return:
'''
form = {
'from': e,
'to': z,
'query': content,
'sign': sign,
'token': 'ea5ada4109c67257a32b444d7add8f51',
}
return form
# 主函式邏輯及
def main():
en = 'en'
zh = 'zh'
url='https://fanyi.baidu.com/v2transapi'
content =input('請輸入要翻譯的內容【漢\英】: ')
sign=get_sign(content)
if is_chinese(content):
formdata=dealwith_formdata(zh,en,content,sign)
else:
formdata=dealwith_formdata(en,zh,content,sign)
pass
html_str = parse_url(url, formdata)
res=get_jsonData(html_str)
if is_chinese(content):
print('<{}>的英文翻譯為:{}'.format(content,res['result']))
else:
print('<{}>的中文翻譯為:{}'.format(content,res['result']))
pass
# 程式開關
if __name__ == '__main__':
print('-----------------xchen翻譯器----------------------')
while True:
main()
三、效果展示

最后:繼續加油中,互相學習交流哦!!!
奧力給,,,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250692.html
標籤:python
