组装http报文调用小黄鸡网页端消息接口
2013-11-12 11:51
288 查看
之前看过一篇博文(http://www.cnblogs.com/txw1958/archive/2013/02/07/weixin-if8-simsimi.html)也是调用小黄鸡网页端的消息接口,但是他的做法是直接用GET请求调用,但这样会被检测出来,导致不会返回正确的数据,只会返回{"response":"SimSimi is tired, I only can speak 200 time a day.
Please visit again tomorrow. See ya~ ","id":1,"result":100,"msg":"OK."},原因应该是调用这个接口有限制。虽然直接用GET请求不行,但可以组装完整的http报文后在发送GET请求。
但在这之前需要做些准备工作——用wireshark这款软件抓取在小黄鸡网页端发送消息时的数据包。抓包情况如下:
发送消息的包
主要是看cookie的内容,因为太长了贴图看不到,后来经过试验得出cookie要包括这几个变量:sagree、selected_nc、JSESSIONID、AWSELB
接收消息的包
可以看出返回的数据是一个json数据
做到这里就可以组装一个完整的http报文调用小黄鸡的消息接口了,不过在这之前最好了解下http报文的格式。我是用php的curl功能进行调用,整个流程代码如下:
其中simsimiHttp是组装报文调用小黄鸡消息接口的函数,其中最主要的是仿造上面抓取的发送消息包的格式构造正确的http请求报文头。值得注意的是因为我们是用GET请求调用接口,需要把我们发送的消息添加到请求的url中,因此需要发送的消息中的特殊字符(例如空格,<,>这些字符)转义成正确的形式,所以要有changeSpecialCharacter这个函数。以上代码调用的结果为{"response":"侬好","id":24444807,"result":100,"msg":"OK."}。一开始还担心cookie的有效期的问题,但后来总结出不用担心这个问题,甚至不用担心cookie变量的值是否正确,只需要cookie包含那几个变量。
不过这个做法的效率不是很高,可能是因为小黄鸡的服务器在国外的原因,平均一次调用需要1秒左右的时间(在新浪SAE估计更慢)。因此,如果将这个代码部署到新浪的SAE上的话,会出现502错误,因为SAE对curl的使用有连接时间上的限制。(PS:我心都碎了,之前是想把这个部署到SAE上做一个微信公众平台的,花了两天时间缺得到这个结果...TAT~~)
效率测试——使用Apache的ab功能,用10个并发完成30请求, 命令行为“ab -n 30 -c 10 http://localhost/test.php”,结果如下
因此,对响应速度要求比较高的应用不推荐使用这种做法。不过也可以尝试使用国外的服务器,这样的话响应速度应该会提高不少。
http://www.cnblogs.com/hdl1992/p/3264135.html
Please visit again tomorrow. See ya~ ","id":1,"result":100,"msg":"OK."},原因应该是调用这个接口有限制。虽然直接用GET请求不行,但可以组装完整的http报文后在发送GET请求。
但在这之前需要做些准备工作——用wireshark这款软件抓取在小黄鸡网页端发送消息时的数据包。抓包情况如下:
发送消息的包
主要是看cookie的内容,因为太长了贴图看不到,后来经过试验得出cookie要包括这几个变量:sagree、selected_nc、JSESSIONID、AWSELB
接收消息的包
可以看出返回的数据是一个json数据
做到这里就可以组装一个完整的http报文调用小黄鸡的消息接口了,不过在这之前最好了解下http报文的格式。我是用php的curl功能进行调用,整个流程代码如下:
<?php function simsimiHttp($keyword) { $JSESSIONID = 'JSESSIONID=B86064A18BB84AB21DF283963671E42C'; $AWSELB = 'AWSELB=15E16D030EBAAAB8ACFf4BD9BB7E0CA8FB501388662941563CCCE3FBA00C1966E7EFC7E79C02 70B337A9EB2DC66B3E19A07708673470FDFA0B2C01AB735E6CC2ABE3DC5F3AF'; //模拟http报文发送消息 $ch = curl_init('http://www.simsimi.com/func/req?lc=ch&msg='.$keyword); $header = array("Accept: application/json, text/javascript, */*; q=0.01", "X-Requested-With: XMLHttpRequest", "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36", "Content-Type: application/json; charset=utf-8", "Referer: http://www.simsimi.com/talk.htm", "Accept-Encoding: gzip,deflate,sdch", "Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3", "Cookie: sagree=true; ".$AWSELB."; selected_nc=ch; ".$JSESSIONID, "Connection: keep-alive" ); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); $data = curl_exec($ch); curl_close($ch); return $data; } //转义特殊字符 function changeSpecialCharacter($str) { $str = str_replace(' ', '%20', $str); $str = str_replace('@', '%40', $str); $str = str_replace('#', '%23', $str); $str = str_replace('%', '%25', $str); $str = str_replace('&', '%26', $str); $str = str_replace('(', '%28', $str); $str = str_replace(')', '%29', $str); $str = str_replace('+', '%2B', $str); $str = str_replace('=', '%3D', $str); $str = str_replace('<', '%3C', $str); $str = str_replace('>', '%3E', $str); $str = str_replace('"', '%22', $str); $str = str_replace(',', '%2C', $str); $str = str_replace('/', '%2F', $str); $str = str_replace(':', '%3A', $str); $str = str_replace(';', '%3B', $str); $str = str_replace('?', '%3F', $str); $str = str_replace('\\', '%5C', $str); $str = str_replace('|', '%7C', $str); return $str; } $keyword = 'hello world'; echo simsimiHttp(changeSpecialCharacter($keyword)); ?>
其中simsimiHttp是组装报文调用小黄鸡消息接口的函数,其中最主要的是仿造上面抓取的发送消息包的格式构造正确的http请求报文头。值得注意的是因为我们是用GET请求调用接口,需要把我们发送的消息添加到请求的url中,因此需要发送的消息中的特殊字符(例如空格,<,>这些字符)转义成正确的形式,所以要有changeSpecialCharacter这个函数。以上代码调用的结果为{"response":"侬好","id":24444807,"result":100,"msg":"OK."}。一开始还担心cookie的有效期的问题,但后来总结出不用担心这个问题,甚至不用担心cookie变量的值是否正确,只需要cookie包含那几个变量。
不过这个做法的效率不是很高,可能是因为小黄鸡的服务器在国外的原因,平均一次调用需要1秒左右的时间(在新浪SAE估计更慢)。因此,如果将这个代码部署到新浪的SAE上的话,会出现502错误,因为SAE对curl的使用有连接时间上的限制。(PS:我心都碎了,之前是想把这个部署到SAE上做一个微信公众平台的,花了两天时间缺得到这个结果...TAT~~)
效率测试——使用Apache的ab功能,用10个并发完成30请求, 命令行为“ab -n 30 -c 10 http://localhost/test.php”,结果如下
因此,对响应速度要求比较高的应用不推荐使用这种做法。不过也可以尝试使用国外的服务器,这样的话响应速度应该会提高不少。
http://www.cnblogs.com/hdl1992/p/3264135.html
相关文章推荐
- python通过http请求发送soap报文进行webservice接口调用
- C# 调用钉钉接口进行发送企业通知消息,适应于网页版
- HttpURLConnection 直接发送soap消息调用webservice
- httpClient发送get请求调用接口
- 调用http接口耗时过长。
- java后台通过HttpClient调用第三方接口
- 微信公众平台消息接口开发(31)微信浏览器HTTP_USER_AGENT判断
- HttpClient调用第三方接口 底层代码的封装 方便以后使用
- C#调用HTTP接口
- dubbo泛化调用 http接口 随意调用dubbo服务
- angularjs $http调用接口的方式详解
- HttpInvoker SSL双向认证远程接口调用
- get/post方式调用http接口
- 短信http接口的java代码调用示例
- get/post方式调用http接口
- 微信公众平台消息接口开发之微信浏览器HTTP_USER_AGENT判断
- 如何调用一个http接口
- 调用微信OAuth2.0网页授权接口实现用户信息的绑定
- python3.4.3 调用http接口 解析response xml后插入数据库
- C#后台调用Http外网接口(GET, POST)