黑马程序员技术交流社区

标题: 【上海校区】python中API调用(最基本) [打印本页]

作者: 不二晨    时间: 2018-12-14 18:24
标题: 【上海校区】python中API调用(最基本)
python一小段代码单句解析

# -*- coding:utf-8 -*-
import http.client
import hashlib
import urllib.parse
import random
from flask import Flask
appKey = '2019c018c4d451ac'
secretKey = 'dPxFD2pQ7DbHblJlTVlUvGiQUtbVX8f0'
httpClient = None
myurl = '/api'
fromLang = 'zh-CHS'
toLang = 'EN'
salt = random.randint(1, 65536)
sign = appKey + q + str(salt) + secretKey
m1 = hashlib.md5()
m1.update(sign.encode("utf8"))
sign = m1.hexdigest()
myurl = myurl + '?appKey=' + appKey + '&q=' + urllib.parse.quote(q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + sign
except Exception as e:
httpClient.close()
app = Flask(__name__)
if __name__ == '__main__':app.run()
# -*- coding:utf-8 -*-
import http.client
import hashlib
import urllib.parse
import random
from flask import Flask

def trans(q):
    # coding=utf8

    appKey = '2019c018c4d451ac'
    secretKey = 'dPxFD2pQ7DbHblJlTVlUvGiQUtbVX8f0'

    httpClient = None
    myurl = '/api'

    fromLang = 'zh-CHS'
    toLang = 'EN'
    salt = random.randint(1, 65536)

    sign = appKey + q + str(salt) + secretKey
    m1 = hashlib.md5()
    m1.update(sign.encode("utf8"))
    sign = m1.hexdigest()
    myurl = myurl + '?appKey=' + appKey + '&q=' + urllib.parse.quote(
        q) + '&from=' + fromLang + '&to=' + toLang + '&salt=' + str(salt) + '&sign=' + sign

    try:
        httpClient = http.client.HTTPConnection('openapi.youdao.com')
        httpClient.request('GET', myurl)
        # response是HTTPResponse对象
        response = httpClient.getresponse()
        s = "translation"
        en = "errorCode"
        s0 = response.read().decode()
        n = s0.find(s)
        nen = s0.find(en)
        return (s0[(n+13):(nen - 2)])
    except Exception as e:
        return e
    finally:
        if httpClient:
            httpClient.close()


app = Flask(__name__)

@app.route('/API')
def main():
    q = '每一个人都有自己的理想,我的理想是当一名治病救人、救死扶伤的医生。当我看到那些患病的人在忍受着痛苦地煎熬,非常心痛!我想当一名医生,为他们减轻痛苦,医好他们的身体,使他们能健康地、快乐地和亲人们生活在一起。当下我必须好好学习,将来考入一所优秀的医科大学,用先进的医术和温暖的笑容去帮助每一个人,成为白求恩那样的白衣天使,那时才能真正实现我的理想。'
    return trans(q)

if __name__ == '__main__':
    app.run()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
此段代码的功能是运用 flask 搭建简易服务器,调用有道翻译提供的API,对一段文本进行翻译过后在http://localhost:5000/API输出翻译结果。

# -- coding:utf-8 --

在pycharm中编写代码用到中文(注释中的中文也算)时,如果使用的python版本是python2,在运行程序的时候就会报错,这时候输入这行代码,把文件的编码格式改成utf-8,就可以使用中文了。
注意: python3默认支持中文,但是为了程序的可移植性,建议仍加上

import http.client

http 模块简介

Python3 中的 http 包中含有几个用来开发 HTTP 协议的模块。

http.client 是一个底层的 HTTP 协议客户端,被更高层的 urllib.request 模块所使用。
http.server 包含基于 socketserver 的基本 HTTP 服务器的类。
http.cookies 实现 cookie 状态管理
http.cookiejar 与 cookie 相关
http.client 模块定义了实现 http 和 https 协议客户端的类。 该模块通常不会直接使用,而是用封装好的 urllib.request 模块来处理 URL 。

HTTPConnection 类
http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None

HTTPConnection 实例表示与 HTTP 服务器的事务。

HTTPResponse 类       
class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)

一旦连接成功就会返回该实例,该类的对象不能由用户直接实例化。

异常类 HTTPException 类
Exception 类的子类,也是 http 模块中其他异常类的基类。

HTTPConnection 对象方法
HTTPConnection 实例有如下的方法 :

HTTPConnection.request(method, url, body=None, headers={})
使用指定的 method 方法和 url 链接向服务器发送请求。
如果指定 了body 部分,那么 body 部分将在 header 部分发送完之后发送过去。body 部分可以是一个字符串、字节对象、文件对象或者是字节对象的迭代器。不同的 body 类型对应不同的要求。
header 参数应该是 HTTP 头部的映射,是一个字典类型。
如果 header 中不包含 Content-Length 项,那么会根据 body 的不同来自动添加上去。
HTTPConnection.getresponse()
必须在请求发送后才能调用得到服务器返回的内容,返回的是一个 HTTPResponse 实例。
HTTPConnection.close()
关闭链接。
HTTPResponse 对象方法
HTTPResponse 实例包含了从服务器返回的 HTTP 回应。
它提供了访问请求头部和 body 部分的方法。
HTTPResponse 是一个可迭代的对象而且可以使用 with 语句来声明。
HTTPResponse 实例有如下的方法 :
HTTPResponse.read([amt])
读取和返回 response 的 body 部分。
(其实还有很多方法,本文只讲以上代码中用到的)
import hashlib

python中的hashlib模块用来进行hash或者md5加密,而且这种加密是不可逆的,所以这种算法又被称为摘要算法。
加盐:这里的“盐”有点类似于给密码信息加点调料,提高密码的安全性,只要’Salt’部分不被泄露,就没办法反推用户的简单密码。

hashlib.md5()方法创建一个md5加密模式的hash对象
update(arg):用字符串参数来更新hash对象,如果同一个has对象重复调用该方法,如下:m.update(a); m.update(b),则等于m.update(a+b)
hexdigest():返回摘要,作为十六进制数据字符串值
示例:
import hashlib
m = hashlib.md5()
m.update('how to use md5'.encode('utf-8'))
m.update('in python hashlib'.encode('utf-8'))
print m.hexdigest()
1
2
3
4
5
import urllib.parse

简单的说就是可以拆分URL,也可以拼接URL。

按照标准,URL只允许一部分ASCII字符,其他字符(如汉字)是不符合标准的,此时就要进行编码。用urllib.parse.quote(q)方法
import random

salt = random.randint(1, 65536)

print( random.randint(1,10) )        # 产生 1 到 10 的一个整数型随机数   
print( random.random() )             # 产生 0 到 1 之间的随机浮点数
print( random.uniform(1.1,5.4) )     # 产生  1.1 到 5.4 之间的随机浮点数,区间可以不是整数
print( random.choice('tomorrow') )   # 从序列中随机选取一个元素
print( random.randrange(1,100,2) )   # 生成从1到100的间隔为2的随机整数
1
2
3
4
5
其中 randint、uniform、choice的区间是全闭的,random、randrange的区间是左闭右开的。

from flask import Flask

引入Flask类,Flask类实现了一个WSGI应用
python-Flask框架说明文档
appKey = ‘2019c018c4d451ac’

在有道智云申请的API-Key
secretKey = ‘dPxFD2pQ7DbHblJlTVlUvGiQUtbVX8f0’

在有道智云申请的secretKey 密钥
httpClient = None

此处不懂,没有找到答案,有知道的网友可以评论告知一下吗

myurl = ‘/api’

fromLang = ‘zh-CHS’

toLang = ‘EN’

以上三条均为API说明文档中规定url的一部分
salt = random.randint(1, 65536)

产生 [1,65536] 的一个整数型随机数
sign = appKey + q + str(salt) + secretKey

将作为加密参数对密钥加密
m1 = hashlib.md5()

创建一个md5加密模式的hash对象 m1
m1.update(sign.encode(“utf8”))

用sign.encode("utf8")来更新hash对象
sign = m1.hexdigest()

返回摘要,作为十六进制数据字符串值
myurl = myurl + ‘?appKey=’ + appKey + ‘&q=’ + urllib.parse.quote(q) + ‘&from=’ + fromLang + ‘&to=’ + toLang + ‘&salt=’ + str(salt) + ‘&sign=’ + sign

作为参数传入API网站
httpClient = http.client.HTTPConnection('openapi.youdao.com')
httpClient.request('GET', myurl)
        # response是HTTPResponse对象
response = httpClient.getresponse()
1
2
3
4
以“get”方法连接到url

s = "translation"
en = "errorCode"
s0 = response.read().decode()  //读取返回值
n = s0.find(s)             //python字符串方法,找到字符串中,子字符串第一次出现的下标值
nen = s0.find(en)
1
2
3
4
5
except Exception as e:

处理异常
httpClient.close()

关闭连接
app = Flask(name)

app是Flask的实例,它接收包或者模块的名字作为参数,但一般都是传递__name__。
让flask.helpers.get_root_path函数通过传入这个名字确定程序的根目录,以便获得静态文件和模板文件的目录。
@app.route('/API')
def main():
    q = '每一个人都有自己的理想,我的理想是当一名治病救人、救死扶伤的医生。当我看到那些患病的人在忍受着痛苦地煎熬,非常心痛!我想当一名医生,为他们减轻痛苦,医好他们的身体,使他们能健康地、快乐地和亲人们生活在一起。当下我必须好好学习,将来考入一所优秀的医科大学,用先进的医术和温暖的笑容去帮助每一个人,成为白求恩那样的白衣天使,那时才能真正实现我的理想。'
    return trans(q)
1
2
3
4
使用app.route装饰器会将URL和执行的视图函数的关系保存到app.url_map属性上。
处理URL和视图函数的关系的程序就是路由,这里的视图函数就是main()。
if name == ‘main’:app.run()

使用这个判断可以保证当其他文件引用这个文件的时候(例如“from hello import app”)不会执行这个判断内的代码,也就是不会执行app.run函数。
此处mian与上文main()函数无关
---------------------
【转载】仅作分享,侵删
作者:繁星DD
原文:https://blog.csdn.net/ZhangWanyu_/article/details/84930159



作者: 不二晨    时间: 2018-12-18 17:48
奈斯
作者: 梦缠绕的时候    时间: 2018-12-20 16:51





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2