在微信公众号中使用百度AI平台API接口

1.百度ai接口接入的流程(以车型识别为例,输入图像,输出文字)

req = requests.get(message.img)

通过request.get方法处理message.img,message.img是一个url域名,可以通过它下载图片
返回req(不懂这个req是什么,姑且叫热气球吧),官方解释是实体主体
经过打印,可以发现req的类型是一个request模型库里面的的一个类,类的名字叫做request.models.Response。应该是http协议中定义好的类型的名字和内容,专门用来作为request.get方法的返回值而设计好的,
这句话的意思就是python程序向message.img中存储的url(这个url其实是微信用于存储照片的服务器)发起请求,然后获得了这个图片的信息。

然而print不能全部打印req里面的内容,只打印出了<Response [200]>的一个类似label的框架性的东西。因为里面的内容实在是太多了,我尝试打印了.content,结果服务器端一直在打印导致了公众号服务出现故障。

pic4rec = req.content
img = base64.b64encode(pic4rec)

合并起来就是

img = base64.b64encode(requests.get(message.img).content)

把req里面的图像信息提取出来,用base64的编码格式对其进行编码
这句话我怎么感觉可以直接用 img = base64.b64encode(message.img) 简化呢?这个是错误的猜想,因为.img里面是url,而content应该是图片的内容,是一个字节流(Byte类)
req.content的内容经过b64encode的处理之后转换成了base64格式的字节流img,同样的,这个img数据也是巨长无比,打印之后会造成微信服务的故障。通过打印类型可以看到,img的数据类型也是Byte类的,说明这个变换仅仅是一个编码规则的变换,并没有改变数据类型(Byte类)。img中的信息应该就是图像以base64编码格式所生成的图像信息了。
这两句话其实就是提取了图像信息,为后面的处理提供了image参数。
除了这种方法以外,image参数还可以通过文件读取的方式获得,具体的代码可以参考:

f = open('car.jpg', 'rb')
img = base64.b64encode(f.read())

或者更加简洁地合并成一行:

img = base64.b64encode(open('car.jpg', 'rb').read())

这样就完成了图像的输入信息img的获取。

params = {"image":img}
params = urllib.parse.urlencode(params).encode('utf-8')

这两行代码是对图像信息做处理,使之符合后续函数(urllib.request.Request)参数要求的格式。关键是在于urllib.parse.urlencode方法,这个方法的本质是把字典格式的数据转化为query-string的格式,并且将中文转码。通过打印我们可以看到,query-string的格式是"image=一堆编码",其数据类型是Str。在对其进行encode操作,就将其转换成了"byte"格式的字节流了。这样操作是因为POST发送的data必须为bytes或bytes类型的可迭代对象,不能是字符串。
这两句代码其实可以简单地合并成:

params = urllib.parse.urlencode({"image":img}).encode('utf-8')

接下来根据百度给出的APP_ID和APP_KEY采用官网的方法获得百度账号的access_token, 然后就可以使用以下几句来生成新的request_url了。

request_url = 'https://aip.baidubce.com/rest/2.0/image-classify/v1/car'
request_url = request_url + "?access_token=" + access_token
  这里不建议合并,因为第一行的request就是百度给出的api,这句话比较好理解,就是把接口的名称存放在request_url变量中,如果下一次想换一个功能的话,只要把其他功能的api复制过来把这个替换掉就可以了,修改起来非常方便。

接下来要构造请求对象了,这是为了请求百度的ai服务器做准备的,用到了以下两句话:

request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/x-www-form-urlencoded')

第一句话是对请求进行了包装,本质上来说,是对一个Request类实例化的过程,把url和params按照定义的Request类进行了实例化,第二句话为请求增加了头部,其实也可以尝试其他的格式把这两句话合起来,参考文献里面写的比较清楚:https://blog.csdn.net/qq_39288751/article/details/83685427

这样就完成了全部的准备工作,request其实就是请求的格式,使用urllib.request.urlopen方法,向百度服务器发送请求:

response = urllib.request.urlopen(request)
content = response.read()

urlopen打开URL网址,url参数可以是一个字符串url或者是一个Request对象,返回的是http.client.HTTPResponse对象.。这里的request就是一个Request对象。可以用它的.read方法来读取网页的内容。值得一提的是,这个方法的基本功能和本文第一次请求时用到的requests.get()方法有点类似,但是参数和返回的类型有一些区别。request.get()方法的参数只需要一个url即可,而且它的返回对象是request.models.Response,可以使用Response的.text和.content直接获得内容,在我们的实战中可以看到,使用的是.content然后对其进行base64的编码操作。
之后,就可以对content里面的内容进行格式化的输出了。

if content:
		content = content.decode('utf-8')
		data = json.loads(content)
#接下去可以根据data(通过json.loads方法处理之后将json格式的字符串变成了一个字典)进行操作和输出,比较基础的内容了就不赘述了,参考数据类型基础部分的介绍。
else:
		return "内容为空"

总结一下:大致可以分成以下四步
第一步:准备参数
第二步:制作请求
第三步:请求响应

发布了207 篇原创文章 · 获赞 16 · 访问量 9866

猜你喜欢

转载自blog.csdn.net/weixin_41855010/article/details/104700669
今日推荐