Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
从有道单词本导出单词到anki
#!/bin/python
# -*- coding:utf-8 -*-
# a script sync. wordbook from youdao dict to anki
import sys
import hashlib,time
import httplib, urllib2, cookielib
from xml.dom.minidom import parse, parseString
class Youdao:
"""init login for Youdao"""
def __init__(self, username,password):
self.username = username
self.password = hashlib.md5(password.encode('utf-8')).hexdigest()
status = {'LOGIN_SUCCESS':'201'}
loginHost = 'reg.163.com'
loginPath = '/services/userlogin?username=%s&password=%s&type=1&product=search' \
% (self.username, self.password)
self.headers = {
'User-Agent':'YoudaoDictPro/3.1.0 CFNetwork/548.1.4 Darwin/11.0.0'
}
conn = httplib.HTTPConnection(loginHost)
conn.request('GET', loginPath,None, self.headers)
response = conn.getresponse()
txt = response.read().splitlines()
if txt[0] == '201':
self.cookies = response.getheader('Set-Cookie')
print 'Login Success!'
else:
self.cookies = ''
print '[ERROR]', [i for i in txt]
response.close()
def syncDict(self, output):
dictHost = 'dict.youdao.com'
dictPath = '/wordbook/api?appVer=mdict.3.1.0.iphonepro&id=961aaaebd8fb1d8c65385561e32bf244&model=iPod%20touch&deviceid=49b0d44f517212e77c74d5c67d30d932e6cae827&mid=5.1'
nowtimestamp = repr(time.time() * 1000).split('.')[0]
'''
FORMAT like:
<actionlist>
<type>words</type>
<localtimestamp>1337502741787</localtimestamp>
<remlocaltimestamp>1337502741778</remlocaltimestamp>
<action type="refresh">
<localtimestamp>1337517090.037</localtimestamp>
<remlocaltimestamp>0</remlocaltimestamp>
</action>
</actionlist>
'''
#expected lastest timestamp
remlocaltimestamp = nowtimestamp
#local last updated time
localtimestamp = '1117217156809' #Sat May 28 2005 02:05:56 GMT+0800 that is OLD enough!;) @TODO :cached
data='data=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22utf-8%22%20%3F%3E%3Cactionlist%3E%3Ctype%3Ewords%3C%2Ftype%3E%3Clocaltimestamp%3E' + localtimestamp \
+ '%3C%2Flocaltimestamp%3E%3Cremlocaltimestamp%3E' + remlocaltimestamp \
+ '%3C%2Fremlocaltimestamp%3E%3Caction%20type%3D%22refresh%22%3E%3Clocaltimestamp%3E' + localtimestamp \
+ '%3C%2Flocaltimestamp%3E%3Cremlocaltimestamp%3E' + remlocaltimestamp \
+ '%3C%2Fremlocaltimestamp%3E%3C%2Faction%3E%3C%2Factionlist%3E'
self.headers['Cookie'] = self.cookies
self.headers['Content-Type'] = 'application/x-www-form-urlencoded'
self.headers['User-Agent'] = 'iphonepro'
conn = httplib.HTTPConnection(dictHost)
conn.request('POST',dictPath,data,self.headers)
response = conn.getresponse()
status,reason = response.status, response.reason
if status == 200:
self.dictXML = response.read()
f = open('dict.xml', 'w')
f.write(self.dictXML)
f.close()
else:
print '[ERROR]',status, reason
response.close()
dom = parseString(self.dictXML)
f = open(output, 'w')
for item in dom.getElementsByTagName('alter'):
word = item.getElementsByTagName('word')[0].firstChild.wholeText
try:
trans = item.getElementsByTagName('trans')[0].firstChild.wholeText
except:
trans = ''
word = word.strip().encode('utf-8')
trans = trans.strip().encode('utf-8')
f.write(word + ' , ' + trans)
f.write('\r\n')
f.close()
print 'Fetch Success! check out wordbook.txt'
def main(args):
if len(args) < 3 or \
args[1] in ['-u', '--usage', '-h', '--help', '/h', '/help']:
print 'Usage:\n\t python', args[0], 'your@email.com your_password\n'
sys.exit(0)
youdao = Youdao(args[1],args[2])
youdao.syncDict('wordbook.txt')
if __name__ == '__main__':
main(sys.argv)
@hairuo

This comment has been minimized.

Copy link

commented Jul 20, 2013

hello, could u give more detail on how to use this .py in order to import wordbook of youdao to anki?
I run it under windows 7 and it seems no response.
thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.