有个用 Requests 的脚本,访问
https://dictation.nuancemobility.net 这个 URL 。但是奇怪的是在 CentOS 可以正常工作,从服务器获得 200 响应,放到 Debian/Ubuntu 上就只能从服务器获得 500 响应。
这个代码如下:
<pre><code>
class Nuance_api():
def __init__(self, appid, appkey, n_id):
self.appid = appid
self.appkey = appkey
self.id = n_id
def recogenize(self, language, voicefile):
nuance_url = '
https://dictation.nuancemobility.net/NMDPAsrCmdServlet/dictation' n_params = {'appId':self.appid, 'appKey':self.appkey, 'id':
self.id}
voice_file = {'file': open(voicefile, 'rb')}
n_headers = {'Accept-Language':language, 'Content-Type':'audio/amr;codec=amr;bit=4.75;rate=8000', 'Accept':'text/plain', 'Accept-Topic':'Dictation'}
r =
requests.post(url=nuance_url, params=n_params, headers=n_headers, files=voice_file, verify=False)
if r.status_code == 200 :
return r.text
</code></pre>
由于涉及到隐私的 key 等信息,单用这段代码测试比较麻烦。可以说明的是,这段代码在 CentOS 没有任何问题,可以返回识别的 text.
那么,事情就集中到: Debian/Ubuntu 上的 requests 为什么就不能像 CentOS 一样工作?
经过一些 debug ,这个服务器使用 TLS v1.2 或 v1 来进行握手,那么我甚至将代码改写为强制使用 TLS v1.2 ,在 Debian/Ubuntu 上同样失败。抓包显示,握手后服务端连续发来 4 个 hello ,但是在 CentOS 上的抓包显示为握手后就开始传输数据了。这表明握手并不成功(至少我这么认为)。
有些文章说 Debian/Ubuntu 上的 openssl 默认不设定任何 CA bundle ,但是 Requests 使用的是自己的 CA bundle ,为了测试,特意在代码中将 verify='我的 cacert.pem',当我的 cacert.pem 里没有任何 root certificate 的时候,确实是 ssl verify failure ,加上该网站证书链里的顶级 VeriSign Class 3 证书,就可以通过验证。所以, CA bundle 不是症结。
那么,究竟为什么。到底 Debian/Ubuntu 上使用 Requests 的正确姿势是什么呢?
盼望这里有大神有些许经验。 Stackoverflow, GitHub 在这个问题上都阵亡了。满世界都是 ssl 验证不通过的问题,但是能有效解决的很少。涉及 requests ,那就更少了。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/224900
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.