Siri协议
Siri采用https(默认端口443)协议与服务器进行通信,Siri官方服务器地址是https://guzzoni.apple.com
http请求头
ACE /ace HTTP/1.0
Host: guzzoni.apple.com
User-Agent: Assistant(iPhone/iPhone4,1; iPhone OS/5.0/9A334) Ace/1.0
Content-Length: 2000000000
X-Ace-Host: 4620a9aa-88f4-4ac1-a49d-e2012910921
iPhone/iPhone4,1表示4s,iPhone/iPhone3,1表示4。
截获Siri请求数据包
利用nodejs建立了一个Siri 服务器,可以获取到iphone上Siri发送过来的数据,把所有数据记录到文件后,用Winhex打开
0x0D 0x0A 0x0D 0x0A 是https请求头结束 请求头是类似http协议,但采用的是ACE方法而不是常用的GET/POST
![](http://www.sirinode.com/Pic/siri_2.jpg)
0xAA 0xCC 0xEE 0x02 这4个字节是数据开始,后面紧跟着的是zlib压缩的数据(Deflate/Inflate)
![](http://www.sirinode.com/Pic/siri_3.jpg)
通过Inflate解压后,得出以下的二进制数据
![](http://www.sirinode.com/Pic/siri_4.jpg)
数据包头是5个字节
03 00 00 00 01 => 03是客户端的ping包,后面的1是包序列,如果客户端发送了大约4-5个包后没收到服务端返回的数据包(04开头),则Siri提示Sorry了。
02 00 00 02 43 => 02表示二进制的plist数据,02 43转换成10进制后是579,表示后面接着的长度为579字节的数据是一个完整的二进制plist。我们把这段数据复制出来保存到一个plist文件,就可以用plist文件编辑器查看到里面的内容。
![](http://www.sirinode.com/Pic/siri_5.jpg)
class => 包类型 LoadAssistant一般为tls连接后第一个包,向服务器加载Siri Assistant
aceId => 这个是客户端生成的一个标识,服务端返回的数据包以refId来匹配
iphone4上采用Spire直连guzzoni.apple.com,就要取sessionValidationData
如果验证通过,服务器就会返回AssistantLoaded。Siri往服务器发送语音,服务器识别后就返回识别后的文本
![](http://www.sirinode.com/Pic/siri_6.jpg)
用Nodejs写了一个取4s siri key的服务器程序,详细教程请到http://www.sirinode.com/ 下载