目的一:驗證Python中文編程的可行性。
目的三:打造一個專屬於自己的翻譯器。
項目結果
核心思想:爬蟲技術獲取在線翻譯結果。
結果:使用中文(變量名及函數名的應用)編程驗證並實現預定目標。
中-英翻譯:
英-中翻譯:
小日本-中翻譯:
棒子-中翻譯:
可支持中英互譯;日、韓、法、德、俄等支持翻譯成中文。
可翻譯段落或者文章:
項目代碼
該工具不提供下載地址,直接上源代碼,感興趣的小夥伴可自行研究:
import requests,json
import time,random
import hashlib
import wx
import win32con,win32api
#--------------------------------md5加密---------------------------------
def 加密(要加密的數據):
加密後的值 = hashlib.md5(要加密的數據.encode())
return 加密後的值.hexdigest()
#----------------------------單擊事件調用函數----------------------------
def ck(fram):
if fram.m_textCtrl1.GetValue() == '':
win32api.MessageBox(0, "請輸入要翻譯的內容", "沒有要翻譯的內容",win32con.MB_ICONWARNING)
else:
fram.pr.SetValue(在線翻譯(fram.m_textCtrl1.GetValue()))
#---------------------------------在線翻譯-------------------------------
def 在線翻譯(要翻譯的內容):
翻譯鏈接 = 'http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
時間戳 = str(int(time.time()*1000))
隨機數 = str(random.randint(0,9))
salt = 時間戳 + 隨機數
sign = 加密('fanyideskweb' + 要翻譯的內容 + salt + 'n%A-rKaT5fb[Gy?;N5@Tj')
表單 = {
"i":要翻譯的內容
,"from":"AUTO"
,"to":"AUTO"
,"smartresult":"dict"
,"client":"fanyideskweb"
,"salt":salt
,"sign":sign
,"ts":時間戳
,"bv":"e2a78ed30c66e16a857c5b6486a1d326"
,"doctype":"json"
,"version":"2.1"
,"keyfrom":"fanyi.web"
,"action":"FY_BY_CLICKBUTTION"
}
請求頭 = {
'Host':'fanyi.youdao.com'
,'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'
,'Accept': 'application/json, text/javascript, */*; q=0.01'
,'Accept-Language':'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2'
,'Accept-Encoding':'gzip, deflate'
,'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'
,'X-Requested-With':'XMLHttpRequest'
,'Content-Length':'255'
,'Origin':'http://fanyi.youdao.com'
,'Connection':'keep-alive'
,'Referer':'http://fanyi.youdao.com/'
,'Cookie':'YOUDAO_MOBILE_ACCESS_TYPE=1; [email protected]; JSESSIONID=aaamhmHtcXNGSajBuz95w; ___rl__test__cookies=1574061887541; OUTFOX_SEARCH_USER_ID_NCOO=84762635.26386356'
}
try:
響應值 = requests.post(翻譯鏈接,data = 表單,headers = 請求頭)
except:
win32api.MessageBox(0, "翻譯超時,請檢查網絡連接", "翻譯超時",win32con.MB_ICONWARNING)
響應值彙總 = ''
響應值處理 = json.loads(響應值.text)
try:
for i in range(1,len(響應值處理['smartResult']['entries'])):
響應值彙總 = 響應值彙總 + 響應值處理['smartResult']['entries'][i]
except:
return 響應值處理['translateResult'][0][0]['tgt']
return 響應值彙總
###########################################################################
##在線翻譯圖形界面
###########################################################################
class MyFrame1 ( wx.Frame ):
def __init__( self, parent ):
wx.Frame.__init__ ( self, parent, id = wx.ID_ANY, title = u"在線翻譯", pos = wx.DefaultPosition, size = wx.Size( 500,300 ), style = wx.CAPTION|wx.CLOSE_BOX|wx.SYSTEM_MENU|wx.TAB_TRAVERSAL )
#self.SetSizeHintsSz( wx.DefaultSize, wx.DefaultSize )
bSizer1 = wx.BoxSizer( wx.VERTICAL )
bSizer2 = wx.BoxSizer( wx.HORIZONTAL )
self.m_staticText1 = wx.StaticText( self, wx.ID_ANY, u"要翻譯的內容:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText1.Wrap( -1 )
self.m_staticText1.SetFont( wx.Font( 9, 74, 90, 92, False, "微軟雅黑" ) )
self.m_staticText1.SetForegroundColour( wx.SystemSettings.GetColour( wx.SYS_COLOUR_BACKGROUND ) )
bSizer2.Add( self.m_staticText1, 0, wx.ALIGN_CENTER_VERTICAL|wx.ALL, 5 )
self.m_textCtrl1 = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 260,35 ), 0 )
bSizer2.Add( self.m_textCtrl1, 0, wx.ALIGN_CENTER|wx.ALL, 5 )
self.m_button1 = wx.Button( self, wx.ID_ANY, u"在線翻譯", wx.DefaultPosition, wx.DefaultSize, 0 )
bSizer2.Add( self.m_button1, 0, wx.ALIGN_CENTER|wx.ALL, 5 )
bSizer1.Add( bSizer2, 4, wx.EXPAND, 5 )
bSizer4 = wx.BoxSizer( wx.VERTICAL )
self.m_staticText3 = wx.StaticText( self, wx.ID_ANY, u"在線翻譯結果:", wx.DefaultPosition, wx.DefaultSize, 0 )
self.m_staticText3.Wrap( -1 )
self.m_staticText3.SetFont( wx.Font( 9, 74, 90, 92, False, "微軟雅黑" ) )
bSizer4.Add( self.m_staticText3, 0, wx.ALL, 5 )
self.pr = wx.TextCtrl( self, wx.ID_ANY, wx.EmptyString, wx.DefaultPosition, wx.Size( 500,400 ), wx.TE_MULTILINE )
bSizer4.Add( self.pr, 0, wx.ALL, 5 )
bSizer1.Add( bSizer4, 6, wx.EXPAND, 5 )
self.SetSizer( bSizer1 )
self.Layout()
self.Centre( wx.BOTH )
# 按鈕綁定事件函數
self.m_button1.Bind( wx.EVT_BUTTON, self.translation )
def __del__( self ):
pass
# 單擊事件調用函數
def translation( self, event ):
event.Skip()
ck(self)
#-----------------------程序入口------------------------
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame1(parent=None)
frame.Show()
app.MainLoop()