说话一个GM后台开服信息需要手动在GM后台提交,这个手动做了3个月,终于忍不了重复劳动,手动输入造成漏填及填错的问题。亮出 Python 中的 requests 模块,听说用这个写爬虫不错,palapala
很快脚本可以从文件读取相关配置信息,并能登陆后台获取 session,并提交上数据。但问题出现了,其中有个开服日期(2016-03-08 14:00:00 这种 "yyyy-MM-dd HH:mm:ss"格式)没有保存到数据库中,期间使用各种工具抓包对比浏览器手动提交的post参数均没发现问题,用 Postman 插件提交相同的参数是正常的。询问过php开发、java开发、安卓开发,都觉得拼接的 post 参数没问题。那问题在哪呢?查看后台服务日志,发现有报错,但是日志不完整,只提交有错误,无法得知更多细节问题。
询问后台开发人员,得知后台框架是使用 java 中的 struts2,放 Google 一搜索 “struts2 date 问题”,好家伙果然有很多人进了这个坑。 比如这位贴吧网友 http://tieba.baidu.com/p/2782007443。通过这个网友的日志 http://zengyi.me/blog/2015/02/07/struts-string-to-date-bug/ 得知如下
问题原因在于,Struts2 会对七种时间格式进行自动转换,其中还硬编码了”yyyy-MM-dd’T’HH:mm:ss” 这么一种格式,这是美国语言中使用的日期格式。我的请求参数中,有个日期参数是 yyyy-MM-dd 格式的,而对于yyyy-MM-dd这种日期类型,在英语语言中是没法匹配的,由于Struts2匹配日期时,使用了Locale,因此,如果客户端默认的语言环境是英语,则 Struts 无法匹配需转换的日期格式,自动转换就失败了。用户的机器和我的模拟器的语言环境都是英语,于是日期参数没有转换成功,请求就失败了。
然后我做了个试验,正能正常提交数据的 Firefox 浏览器语言改成只留下 en-us\ en两个,重新提交页面,哈哈哈,日期一样没提交上去,所以 python 脚本里只要加上 headers = {"Accept-Language": "zh-CN,zh;q=0.8"}
就能正常提交日期了。看来还是后台没有完善对多语言环境的支持,不过我在这个排查过程也疏忽了一些问题,比如,只关注了post参数正不正确,而没有好好对比 header 请求头里的相关信息,槽兄在帮我排查这个问题的时候提出了要对比下请求头,但唯独漏了 Accept-Language。
排查中所使用到的工具:
1、Fiddler Web Debugger
2、Postman
3、Wireshark
4、Firebug
5、Chrome Developer Tools
及 PyCharm IDE工具 Debug代码
参考文章:
http://polaris.blog.51cto.com/1146394/315403/
http://zengyi.me/blog/2015/02/07/struts-string-to-date-bug/
http://www.jiancool.com/article/80023377219/
http://docs.python-requests.org/zh_CN/latest/user/advanced.html
文章评论