예제 #1
0
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))
예제 #2
0
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))
예제 #3
0
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))
예제 #4
0
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))
예제 #5
0
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))
예제 #6
0
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))
예제 #7
0
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))
예제 #8
0
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))