class Dict(object): def __init__(self): self.service = services['qq'] self.query_word = '' self.feedback = Feedback() def fetch(self, word): return {} def parse(self, data): pass def query(self, word): if not word or not isinstance(word, (str, unicode)): return self.query_word = word self.parse(self.fetch(word)) def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem(title=self.query_word, subtitle='Sorry, no result.', arg=self.query_word) print(self.feedback.get(unescape=True))
class Dict(object): def __init__(self): self.service = services['qq'] self.query_word ='' self.feedback = Feedback() def fetch(self, word): return {} def parse(self, data): pass def query(self, word): if not word or not isinstance(word, (str, unicode)): return self.query_word = word self.parse( self.fetch(word) ) def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem( title = self.query_word, subtitle = 'Sorry, no result.', arg = self.query_word ) print(self.feedback.get(unescape = True))
class ShanbayDict(): def __init__(self): self.service = service self.query_word = '' self.feedback = Feedback() # 从字典中安全的取出值 self.save_get_dict_value = lambda d, k: d[k] if d.has_key(k) else '' def get_csrfmiddlewaretoken(self): page = requests.get(loginurl).text script = html.fromstring(page).xpath( "(//input[@name='csrfmiddlewaretoken']/@value)[1]")[0] return script def login(self): csrftoken = self.get_csrfmiddlewaretoken() postdata = {} postdata['csrfmiddlewaretoken'] = csrftoken postdata['username'] = username postdata['password'] = pwd postdata['login'] = '' postdata['continue'] = 'home' postdata['u'] = 1 postdata['next'] = '/review/new/' headers = { 'User-Agent': 'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0', 'Host': 'www.shanbay.com', 'Origin': 'http://www.shanbay.com', 'Referer': 'http://www.shanbay.com/accounts/login/', 'Cookie': 'csrftoken=' + csrftoken + ';csrftoken=' + csrftoken + ';sessionid=f7df88e25d184e487df6ddc6a88caafb;', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset': 'UTF-8,*;q=0.5', 'Accept-Encoding': 'gzip,deflate,sdc', 'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', 'Content-Type': 'application/x-www-form-urlencoded' } #r = requests.post(url, data=json.dumps(postdata), headers=headers) r = requests.post(loginurl, data=postdata, headers=headers) #print r.status_code #print r.headers self.cookies = r.cookies return True if r.status_code == 200 else False def fetch(self, word): islogin = self.login() if islogin == False: print '登陆失败' return url = self.service + word try: r = requests.get(url, cookies=self.cookies) res = json.loads(r.text) except: return {} return res def parse(self, data): if (data['voc']): voc = data['voc'] word = voc['content'] # 发音 pron = voc['pron'] title = "%s [%s]" % (word, pron) subtitle = voc['definition'] self.addItem(title=title, subtitle=subtitle, arg=word) # 解释 if voc.has_key('en_definitions') and voc['en_definitions']: for type in voc['en_definitions']: for line in voc['en_definitions'][type]: title = type + ', ' + line if not title: continue self.addItem(title=title, arg=word) else: self.addItem(title='no results') def query(self, word): if not word or not isinstance(word, (str, unicode)): return self.query_word = word self.parse(self.fetch(word)) def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem(title=self.query_word, subtitle='Sorry, no result.', arg=self.query_word) print(self.feedback.get(unescape=True))
class ShanbayDict(): def __init__(self): self.feedback = Feedback() def check_token(self, isexit=True): if not self.read_token(): self.addItem(title='授权登陆扇贝', subtitle='授权后才可以将单词添加到词库', arg='need_auth') if isexit: self.output() sys.exit() return False return True def read_token(self): if os.path.isfile(token_file): token_json = json.loads(open(token_file).read().strip()) #已过期 if token_json and token_json['timestamp'] + token_json[ 'expires_in'] < int(time.time()): return '' return token_json['access_token'] return '' def parse(self, voc): if (voc): word = voc['content'] # 发音 pron = voc['pron'] title = "%s [%s]" % (word, pron) subtitle = voc['definition'].decode("utf-8") subtitle = subtitle.replace("\n", '').replace('&', '') self.addItem(title=title, subtitle=subtitle, arg=word) self.check_token(False) # 解释 if voc.has_key('en_definitions') and voc['en_definitions']: for type in voc['en_definitions']: for line in voc['en_definitions'][type]: title = type + ', ' + line self.addItem(title=title, arg=word) else: self.addItem(title='no results') def query_voc(self, word): if not word or not isinstance(word, (str, unicode)): return None self.query_word = word url = 'https://api.shanbay.com/bdc/search/?word=' + word try: r = urllib2.urlopen(url).read() res = json.loads(r) if res['status_code'] == 0: return res['data'] else: return None except: return None def query(self, word): voc = self.query_voc(word) if voc: self.parse(voc) else: self.addItem(title='word not exists') def open_word(self, word): voc = self.query_voc(word) if voc: word_url = 'http://www.shanbay.com/bdc/vocabulary/%d/' % ( voc['id']) os.system('open ' + word_url) return True else: print 'word not exists' def open_oauth(self): auth_url = 'https://api.shanbay.com/oauth2/authorize/?client_id=00eef0bf7a879381c08b\&response_type=code\&state=123' os.system('open ' + auth_url) return True def get_token(self, code): url = 'http://sbalfred.sinaapp.com/token' data = urllib.urlencode({'code': code}) req = urllib2.Request(url, data) try: r = urllib2.urlopen(req).read() res = json.loads(r) if 'error' in res: print '授权失败: ' + res['error'] sys.exit() #save json to local f = open(token_file, 'w') f.write(r) f.close() os.system('open https://sbalfred.sinaapp.com/oauth_success') print '授权成功,现在可以使用添加单词或例句了' except: print '请求错误' return True def add(self, word): if word == 'need_auth': self.open_oauth() return False hastoken = self.check_token(0) if not hastoken: self.open_oauth() print '请先授权登陆扇贝' sys.exit() voc = self.query_voc(word) if not voc: print 'word not exists' return False url = 'https://api.shanbay.com/bdc/learning/?access_token=' + self.read_token( ) try: data = urllib.urlencode({'id': voc['id']}) req = urllib2.Request(url, data) r = urllib2.urlopen(req).read() res = json.loads(r) if res['status_code'] == 0: #通知内容会换行,这里直接返回全部字符 print '"' + word + '" 添加成功' else: print 'add fail' except: print 'request fail' def examples(self, word): self.check_token() voc = self.query_voc(word) if not voc: self.addItem(title='word not exists') return False url = 'https://api.shanbay.com/bdc/example/?vocabulary_id=%d&type=%s&access_token=%s' \ % (voc['id'], '', self.read_token()) try: r = urllib2.urlopen(url).read() res = json.loads(r) except: self.addItem(title='request fail') return False if res['status_code'] == 0: for s in res['data']: title = s['annotation'] title = title.replace('<vocab>', '[') title = title.replace('</vocab>', ']') self.addItem(title=title, subtitle=s['translation'], arg=str(s['id'])) #print s['annotation'] + s['translation'] + "\n" else: self.addItem(title='request error') def add_example(self, example_id): hastoken = self.check_token(0) if not hastoken: self.open_oauth() print '请先授权登陆扇贝' sys.exit() url = 'https://api.shanbay.com/bdc/learning_example/?access_token=' + self.read_token( ) try: data = urllib.urlencode({'example_id': example_id}) req = urllib2.Request(url, data) r = urllib2.urlopen(req).read() res = json.loads(r) if res['status_code'] == 0: print '例句收藏成功' else: print 'add fail' except: print 'request fail' def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem(title=self.query_word, subtitle='Sorry, no result.', arg=self.query_word) print(self.feedback.get(unescape=True))
class ShanbayDict(): def __init__(self): self.feedback = Feedback() def check_token(self, isexit = True): if not self.read_token(): self.addItem(title = '授权登陆扇贝', subtitle = '授权后才可以将单词添加到词库', arg = 'need_auth') if isexit: self.output() sys.exit() return False return True def read_token(self): if os.path.isfile(token_file): token_json = json.loads(open(token_file).read().strip()) #已过期 if token_json and token_json['timestamp'] + token_json['expires_in'] < int(time.time()): return '' return token_json['access_token'] return '' def parse(self, voc): if(voc): word = voc['content'] # 发音 pron = voc['pron'] title = "%s [%s]" % (word, pron) subtitle = voc['definition'].decode("utf-8") subtitle = subtitle.replace("\n", '').replace('&', '') self.addItem(title = title, subtitle = subtitle, arg = word) self.check_token(False) # 解释 if voc.has_key('en_definitions') and voc['en_definitions']: for type in voc['en_definitions']: for line in voc['en_definitions'][type]: title = type+', '+line self.addItem(title = title, arg = word) else: self.addItem(title='no results') def query_voc(self, word): if not word or not isinstance(word, (str, unicode)): return None self.query_word = word url = 'https://api.shanbay.com/bdc/search/?word='+word try: r = urllib2.urlopen(url).read() res = json.loads(r) if res['status_code'] == 0: return res['data'] else: return None except: return None def query(self, word): voc = self.query_voc(word) if voc: self.parse(voc) else: self.addItem(title='word not exists') def open_word(self, word): voc = self.query_voc(word) if voc: word_url = 'http://www.shanbay.com/bdc/vocabulary/%d/' % (voc['id']) os.system('open ' + word_url) return True else: print 'word not exists' def open_oauth(self): auth_url = 'https://api.shanbay.com/oauth2/authorize/?client_id=00eef0bf7a879381c08b\&response_type=code\&state=123' os.system('open ' + auth_url) return True def get_token(self, code): url = 'http://sbalfred.sinaapp.com/token' data = urllib.urlencode({'code':code}) req = urllib2.Request(url, data) try: r = urllib2.urlopen(req).read() res = json.loads(r) if 'error' in res: print '授权失败: ' + res['error'] sys.exit() #save json to local f = open(token_file, 'w') f.write(r) f.close() os.system('open https://sbalfred.sinaapp.com/oauth_success') print '授权成功,现在可以使用添加单词或例句了' except: print '请求错误' return True def add(self, word): if word == 'need_auth': self.open_oauth() return False hastoken = self.check_token(0) if not hastoken: self.open_oauth() print '请先授权登陆扇贝' sys.exit() voc = self.query_voc(word) if not voc: print 'word not exists' return False url = 'https://api.shanbay.com/bdc/learning/?access_token='+self.read_token() try: data = urllib.urlencode({'id':voc['id']}) req = urllib2.Request(url, data) r = urllib2.urlopen(req).read() res = json.loads(r) if res['status_code'] == 0: #通知内容会换行,这里直接返回全部字符 print '"'+word+'" 添加成功' else: print 'add fail' except: print 'request fail' def examples(self, word): self.check_token() voc = self.query_voc(word) if not voc: self.addItem(title='word not exists') return False url = 'https://api.shanbay.com/bdc/example/?vocabulary_id=%d&type=%s&access_token=%s' \ % (voc['id'], '', self.read_token()) try: r = urllib2.urlopen(url).read() res = json.loads(r) except: self.addItem(title = 'request fail') return False if res['status_code'] == 0: for s in res['data']: title = s['annotation'] title = title.replace('<vocab>', '[') title = title.replace('</vocab>', ']') self.addItem(title = title, subtitle = s['translation'], arg = str(s['id'])) #print s['annotation'] + s['translation'] + "\n" else: self.addItem(title = 'request error') def add_example(self, example_id): hastoken = self.check_token(0) if not hastoken: self.open_oauth() print '请先授权登陆扇贝' sys.exit() url = 'https://api.shanbay.com/bdc/learning_example/?access_token='+self.read_token() try: data = urllib.urlencode({'example_id':example_id}) req = urllib2.Request(url, data) r = urllib2.urlopen(req).read() res = json.loads(r) if res['status_code'] == 0: print '例句收藏成功' else: print 'add fail' except: print 'request fail' def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem( title = self.query_word, subtitle = 'Sorry, no result.', arg = self.query_word ) print(self.feedback.get(unescape = True))
class ShanbayDict(): def __init__(self): self.service = service self.query_word ='' self.feedback = Feedback() # 从字典中安全的取出值 self.save_get_dict_value = lambda d, k: d[k] if d.has_key(k) else '' def login(self): headers = { 'Host': host, 'User-Agent': (' Mozilla/5.0 (Windows NT 6.2; rv:23.0) Gecko' + '/20100101 Firefox/23.0'), } # 首先访问一次网站,获取 cookies r_first_vist = requests.get(loginurl, headers=headers, stream=True) # 判断 HTTP 状态码是否是 200 if r_first_vist.status_code != requests.codes.ok: raise LoginException # 获取 cookies 信息 cookies_first_vist = r_first_vist.cookies.get_dict() # 登陆post操作相关信息 url_post = loginurl # 获取csrftoken token = cookies_first_vist.get('csrftoken') # post请求的headers headers_post = copy.deepcopy(headers) headers_post.update({ 'Refere': loginurl, 'Content-Type': 'application/x-www-form-urlencoded', }) cookies_post = cookies_first_vist # post 提交的内容 data_post = { 'csrfmiddlewaretoken': token, # csrf 'username': username, # 用户名 'password': pwd, # 密码 'login': '', 'continue': 'home', 'u': 1, 'next': '', } # 提交登录表单同时提交第一次访问网站时生成的 cookies r_login = requests.post(url_post, headers=headers_post, cookies=cookies_post, data=data_post, allow_redirects=False, stream=True) self.cookies = r_login.cookies # print r_login.url if r_login.status_code == requests.codes.found: # 返回登录成功后生成的 cookies self.cookies = r_login.cookies return True else: raise LoginException def fetch(self, word): islogin = self.login() if islogin == False: print '登陆失败' return url = self.service+word try: r = requests.get(url, cookies = self.cookies) res = json.loads(r.text) except: return {} return res def parse(self, data): if(data['voc']): voc = data['voc'] word = voc['content'] # 发音 pron = voc['pron'] title = "%s [%s]" % (word, pron) subtitle = voc['definition'] self.addItem(title = title, subtitle = subtitle, arg = word) # 解释 if voc.has_key('en_definitions') and voc['en_definitions']: for type in voc['en_definitions']: for line in voc['en_definitions'][type]: title = type+', '+line if not title: continue self.addItem(title = title, arg = word) else: self.addItem(title='no results') def query(self, word): if not word or not isinstance(word, (str, unicode)): return self.query_word = word self.parse( self.fetch(word) ) def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem( title = self.query_word, subtitle = 'Sorry, no result.', arg = self.query_word ) print(self.feedback.get(unescape = True))
class ShanbayDict(): def __init__(self): self.service = service self.query_word ='' self.feedback = Feedback() # 从字典中安全的取出值 self.save_get_dict_value = lambda d, k: d[k] if d.has_key(k) else '' def get_csrfmiddlewaretoken(self): page = requests.get(loginurl).text script = html.fromstring(page).xpath("(//input[@name='csrfmiddlewaretoken']/@value)[1]")[0] return script def login(self): csrftoken = self.get_csrfmiddlewaretoken() postdata = {} postdata['csrfmiddlewaretoken'] = csrftoken postdata['username'] = username postdata['password'] = pwd postdata['login'] = '' postdata['continue'] = 'home' postdata['u'] = 1 postdata['next'] = '/review/new/' headers = { 'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0', 'Host':'www.shanbay.com', 'Origin':'http://www.shanbay.com', 'Referer':'http://www.shanbay.com/accounts/login/', 'Cookie':'csrftoken='+csrftoken+';csrftoken='+csrftoken+';sessionid=f7df88e25d184e487df6ddc6a88caafb;', 'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Charset':'UTF-8,*;q=0.5', 'Accept-Encoding':'gzip,deflate,sdc', 'Accept-Language':'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4', 'Cache-Control':'max-age=0', 'Connection':'keep-alive', 'Content-Type':'application/x-www-form-urlencoded' } #r = requests.post(url, data=json.dumps(postdata), headers=headers) r = requests.post(loginurl, data=postdata, headers=headers) #print r.status_code #print r.headers self.cookies = r.cookies return True if r.status_code == 200 else False def fetch(self, word): islogin = self.login() if islogin == False: print '登陆失败' return url = self.service+word try: r = requests.get(url, cookies = self.cookies) res = json.loads(r.text) except: return {} return res def parse(self, data): if(data['voc']): voc = data['voc'] word = voc['content'] # 发音 pron = voc['pron'] title = "%s [%s]" % (word, pron) subtitle = voc['definition'] self.addItem(title = title, subtitle = subtitle, arg = word) # 解释 if voc.has_key('en_definitions') and voc['en_definitions']: for type in voc['en_definitions']: for line in voc['en_definitions'][type]: title = type+', '+line if not title: continue self.addItem(title = title, arg = word) else: self.addItem(title='no results') def query(self, word): if not word or not isinstance(word, (str, unicode)): return self.query_word = word self.parse( self.fetch(word) ) def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem( title = self.query_word, subtitle = 'Sorry, no result.', arg = self.query_word ) print(self.feedback.get(unescape = True))
class ShanbayDict(): def __init__(self): self.service = service self.query_word = '' self.feedback = Feedback() # 从字典中安全的取出值 self.save_get_dict_value = lambda d, k: d[k] if d.has_key(k) else '' def login(self): headers = { 'Host': host, 'User-Agent': (' Mozilla/5.0 (Windows NT 6.2; rv:23.0) Gecko' + '/20100101 Firefox/23.0'), } # 首先访问一次网站,获取 cookies r_first_vist = requests.get(loginurl, headers=headers, stream=True) # 判断 HTTP 状态码是否是 200 if r_first_vist.status_code != requests.codes.ok: raise LoginException # 获取 cookies 信息 cookies_first_vist = r_first_vist.cookies.get_dict() # 登陆post操作相关信息 url_post = loginurl # 获取csrftoken token = cookies_first_vist.get('csrftoken') # post请求的headers headers_post = copy.deepcopy(headers) headers_post.update({ 'Refere': loginurl, 'Content-Type': 'application/x-www-form-urlencoded', }) cookies_post = cookies_first_vist # post 提交的内容 data_post = { 'csrfmiddlewaretoken': token, # csrf 'username': username, # 用户名 'password': pwd, # 密码 'login': '', 'continue': 'home', 'u': 1, 'next': '', } # 提交登录表单同时提交第一次访问网站时生成的 cookies r_login = requests.post(url_post, headers=headers_post, cookies=cookies_post, data=data_post, allow_redirects=False, stream=True) self.cookies = r_login.cookies # print r_login.url if r_login.status_code == requests.codes.found: # 返回登录成功后生成的 cookies self.cookies = r_login.cookies return True else: raise LoginException def fetch(self, word): islogin = self.login() if islogin == False: print '登陆失败' return url = self.service + word try: r = requests.get(url, cookies=self.cookies) res = json.loads(r.text) except: return {} return res def parse(self, data): if (data['voc']): voc = data['voc'] word = voc['content'] # 发音 pron = voc['pron'] title = "%s [%s]" % (word, pron) subtitle = voc['definition'] self.addItem(title=title, subtitle=subtitle, arg=word) # 解释 if voc.has_key('en_definitions') and voc['en_definitions']: for type in voc['en_definitions']: for line in voc['en_definitions'][type]: title = type + ', ' + line if not title: continue self.addItem(title=title, arg=word) else: self.addItem(title='no results') def query(self, word): if not word or not isinstance(word, (str, unicode)): return self.query_word = word self.parse(self.fetch(word)) def addItem(self, **kwargs): self.feedback.addItem(**kwargs) def output(self): if self.feedback.isEmpty(): self.addItem(title=self.query_word, subtitle='Sorry, no result.', arg=self.query_word) print(self.feedback.get(unescape=True))