本帖最后由 风之轻云之白 于 2020-6-7 17:33 编辑
三、增加请求方式 我们来分析一下这个wx_sdk.py的代码,首先看一下他的头文件,它用到了request、sys、hashlib、time和urllib这几个库。然后再看下Micro python的库,发现只有urllib没有。再看下它是在def file_get_contents(filename, use_include_path = 0, context =None, offset = -1, maxlen = -1)函数中使用的,嗯呢推测他应该是用来打开文件的,这里它用if判断的应该是文件的位置是网络上的资源还是本地资源,这里我们只是用本地的音频文件所以上面的if就可以删去,所以urllib这个库也就不需要了。可以看到这里使用了open函数进行文件打开,查找rtt文档,发现在uio这个库中有open函数,所以加入uio这个库。 仔细对比发现wx_post_req函数会调用requests.post(url, params=params, data=ret)函数,但是rtt的request.post函数中没有params参数,这可咋办啊? 我们先将请求更给为自己的服务器,看看它往服务器发送了什么吧。这里使用花生壳申请一个域名,并映射到电脑上,通过网络调试助手就可以看到他发送的消息了。 哦哦,参数被放到了这里。再看看ruequests文件里面的requeest函数,s是发送消息的嵌套字,通过s.write函数发送数据,好吧我们来自己修改这个函数吧
def request(method, url, data=None,params=None, json=None, headers={}, stream=None): try: proto, dummy, host, path = url.split("/", 3) except ValueError: proto, dummy, host = url.split("/", 2) path = "" if proto == "http:": port = 80 elif proto == "https:": import ussl port = 443 else: raise ValueError("Unsupported protocol: " + proto)
if ":" in host: host, port = host.split(":", 1) port = int(port)
ai = usocket.getaddrinfo(host, port, 0, usocket.SOCK_STREAM) ai = ai[0]
s= usocket.socket(ai[0], ai[1], ai[2]) try: s.connect(ai[-1]) if proto == "https:": s = ussl.wrap_socket(s, server_hostname=host) s.write(b"%s /%s" %(method, path)) if params is not None: s.write(urlencode(params)) s.write(b" HTTP/1.0\r\n") if not "Host" in headers: s.write(b"Host: %s\r\n" % host) # Iterate over keys to avoid tuple alloc for k in headers: s.write(k) s.write(b": ") s.write(str(headers[k])) s.write(b"\r\n") if json is not None: assert data is None import ujson data = ujson.dumps(json) s.write(b"Content-Type: application/json\r\n") if data: s.write(b"Content-Length: %d\r\n" % len(data)) s.write(b"\r\n") if data: s.write(data)
l = s.readline() #print(l) l = l.split(None, 2) status = int(l[1]) reason = "" if len(l) > 2: reason = l[2].rstrip() while True: l = s.readline() if not l or l == b"\r\n": break #print(l) if l.startswith(b"Transfer-Encoding:"): if b"chunked" in l: raiseValueError("Unsupported " + l) elif l.startswith(b"Location:") and not 200 <= status <=299: raiseNotImplementedError("Redirects not yet supported") except OSError: s.close() raise
resp = Response(s) resp.status_code = status resp.reason = reason return resp
def urlencode(query): conversion = "?" for key, val in query.items(): conversion += "%s=%s&" %(key,val) return conversion[:-1]
欧对了参数里面的{"autoend":false,"encode":{"channel":1,"format":"wav","sample_rate":16000},"platform":"Linux","version":"0.0.0.1"}还需要转码,我暂时还不知道怎么转,因为这些信息是不变的直接使用图中转码之后的了,所以我的 params = { 'Domain' : 'general', 'Application-Id' : 'search-app', 'Request-Id' : '56a847e6-84c0-4c01-bf4b-d566f2d2dd11', 'Sequence-Id' : '-1', 'Asr-Protocol' : '1', 'Net-State' : '2', 'Applicator' : '0', 'Property' :'%7B%22autoend%22%3Afalse%2C%22encode%22%3A%7B%22channel%22%3A1%2C%22format%22%3A%22wav%22%2C%22sample_rate%22%3A16000%7D%2C%22platform%22%3A%22Linux%22%2C%22version%22%3A%220.0.0.1%22%7D',2ca1e20761013f17f6c6721f59a47436', 'secretkey' : ' } 更改完成之后我们来测试一下 电脑上成功的接收到了,看到参数格式没问题了只是顺序不对。
|