zoukankan      html  css  js  c++  java
  • [Python] 使用有道翻译API

    Python 使用youdao (有道翻译)API

    想写一个给自己记录背单词状况的软件,需要获取英文单词的中文释义(基本功能)。考虑使用有道翻译的API实现获取英文单词的中文释义的方法。

    获取API_KEY

    需要在 youdao 开发者站点获取API_KEY,其实获取的过程还是很容易的。

    使用basicDict为基类

    以前写好了一个 英文字典的基类,把API_KEY直接写到代码里面是不好的,为了做到程序与数据分离,该类实现了通过直接获取、通过URL获取和通过配置文件获取3种方式导入API_KEY。该类的代码:basicDict.py,并且依赖一个处理配置文件的类:configFile.py ,我们使用的这个基类具有以下的功能和特性:

    • 支持python2和3
    • 当初始化没有API_KEY的时候会抛出异常提示
    • 多种方式初始化获取API_KEY

    在这里我们还要实现:

    • 获取网易api接口的返回结果(json格式)
    • API_KEY进行检查,如果无效,则抛出异常

    实现完成后的代码为:youdao_API.py ,使用代码时候务必也要下载这两个依赖的文件,是的我都帮你打包好了。

    下面我们将介绍如何实现上述的两个功能,以及继续保持特性“支持python2&3”。

    继承、初始化、变量定义

    在定义这个类的时候,是要继承 基类basicDict 的:

    from basicDict import basicDict
    
    class youdao_API(basicDict):
        # ...
    

    在初始化过程中,获取API_KEY的过程已经在基类中的init函数中完成了,所以在定义新的init函数的时候,调用基类的函数:

        def __init__(self, API_KEY = 'DEFAULT',API_URL= 'DEFAULT',API_PATH = "DEFAULT", name='youdao'):
            super(youdao_API, self).__init__(API_KEY, API_URL,API_PATH,name)
            pass
    

    可以看到在对name变量初始化的时候,命名为'youdao'了,终于有了一个有意义的名字了。

    另外定义了几个变量:

    class youdao_API(basicDict):
        url_preffix = "http://fanyi.youdao.com/openapi.do?keyfrom=youdaoWord&key="
        url_suffix = "&type=data&doctype=json&version=1.1&q="
        current_json_text = ''
        current_error_code = 0
    

    12-11-2016更新!!

    我发现了一个问题,在
    url_preffix = "http://fanyi.youdao.com/openapi.do?keyfrom=youdaoWord&key="
    这个语句里面,youdaoWord 是我自己申请API时候的应用名称
    别人申请的应该不是这个名称
    自己用的时候一定要换成自己的!!
    

    两个和url有关的变量使用在网络请求中,current_json_text为存储当前的json文本内容,而current_error_code存储当前的错误代码,默认值为0,就是没有错误,以上两个变量会在每次获取新的词的json内容时候更新。

    获取json文本

    网络请求通过 requests 模块完成,其代码如下:

        def get_json(self,word, print_JSON = False):
            url = self.get_url(word)
            net_request = requests.get(url)
            json_content = net_request.text
            self.current_json_text = json_content
            if print_JSON:
                print(json_content)
                pass
            self.check_API_KEY(json_content)
            return json_content
    

    用到了获取url的函数,该函数根据查询的关键词(中文或者英文)构造出URL:

        def get_url(self,word,print_URL = False):
            url = self.url_preffix + self.API_KEY + self.url_suffix + self.urlencode(word)
            if print_URL:
                print(url)
                pass
            return url
    

    另外对于中文,不能直接在url中使用中文字符,要进行urlencode,这里需要根据python版本不同调用不同的函数:

        def urlencode(self,word,print_RESULT = False):
            if sys.version_info <= (2,8):
                # in python 2
                import urllib
                encoded_word = urllib.quote(word)
                pass
            elif sys.version_info <= (3,8):
                # in python 3
                from urllib.parse import quote
                encoded_word = quote(word)
                pass
            else:
                pass
            if print_RESULT:
                print(encoded_word)
            return encoded_word
            pass
    

    关于判断python版本的详细说明,查看这里(博文待完成)。

    注意在这个方法中还调用了检查API_KEY有效性的函数,根据的是:

    如果API_KEY无效,那么后续的操作显然无法继续进行,所以会抛出异常,函数实现如下:

        def check_API_KEY(self,json_text, print_CODE = False):
            json_content = json.loads(json_text)
            code = json_content['errorCode']
            if print_CODE:
                print(code)
                pass
            if code == 50:
                msg = 'InValid ' + self.name + ' API_KEY!'
                raise RuntimeError(msg)
            self.current_error_code = code
            pass 
    

    这几个函数实现了通过有道的api获取与查询词有关的json文本的功能。

    测试

    写了个主函数测试一下:

    def main():
        e = youdao_API()
        print(e.name)
        print(e.API_KEY)
        e.get_url('数学',print_URL = True)
        json_text = e.get_json('数学')
        print(json_text)
        # e.check_API_KEY('{"query":"book","errorCode":50}')
        pass
    
    if __name__ == "__main__":
        main()
    

    结果:

    api

  • 相关阅读:
    流程设计器的界面设计
    业务系统如何集成工作流系统
    初生牛犊式工作流系统
    任务提醒功能的实现
    动态分支在工作流中的应用
    流程实例运行轨迹的运用
    工作流系统之轨迹备注
    曾经迷茫的起点,多年后终于明白了(续)
    自己编写多线程类并发测试工作流系统(仿吉日老大的测试方法)
    Web自定义表单工具和协同办公系统之集成(1)
  • 原文地址:https://www.cnblogs.com/guoyunzhe/p/5813731.html
Copyright © 2011-2022 走看看