从零开始编写农场助手-2
分类: Python, 代码, 笔记 | 标签: Python, 代码 | 日期:2010-04-01 | 218 views
紧接上篇,接下来亟待解决的两个问题是
- cookie的问题
- 解码json对象的问题
问题1我还没有做好准备,因为涉及到验证码,考虑到可能比较复杂。所以先考虑问题2
假设从http://nc.qzone.qq.com/cgi-bin/cgi_farm_getFriendList返回了如下的数据(是从我的数据中截取了前面几行,让这些好友露脸了:-D )
[{"exp":126002,"headPic":http://imgcache.qq.com/qzone_v4/client/userinfo_icon/5001.gif,
"money":1201447,"pf":1,"uId":3553136,"uin":3002001,"userName":"ひ叮叮oヤo","yellowlevel":0,"yellowstatus":0},
{"exp":14507,"headPic":http://imgcache.qq.com/qzone_v4/client/userinfo_icon/5001.gif,
"money":96399,"pf":1,"uId":3715337,"uin":3587474,"userName":"虫虫","yellowlevel":0,"yellowstatus":0},
{"exp":126838,"headPic":http://qlogo3.store.qq.com/qzonelogo/4442082/1/1268403916,
"money":355675,"pf":1,"uId":4077185,"uin":4442082,"userName":"莎莎~~","yellowlevel":1,"yellowstatus":0},
{"exp":23003,"headPic":http://imgcache.qq.com/qzone_v4/client/userinfo_icon/5001.gif,
"money":59697,"pf":1,"uId":4227287,"uin":4605039,"userName":"〓泡♀泡〓","yellowlevel":0,"yellowstatus":0},
{"exp":178808,"headPic":http://qlogo2.store.qq.com/qzonelogo/5397737/1/1235768146,
"money":2966760,"pf":1,"uId":5153097,"uin":5397737,"userName":" _蒾夨.","yellowlevel":7,"yellowstatus":1},
{"exp":2884,"headPic":http://qlogo1.store.qq.com/qzonelogo/6279656/1/1261987155,
"money":83017,"pf":1,"uId":6063691,"uin":6279656,"userName":" 末末ˇ","yellowlevel":7,"yellowstatus":1},
{"exp":40909,"headPic":http://qlogo3.store.qq.com/qzonelogo/6375998/1/1255055476,
"money":5026,"pf":1,"uId":6195193,"uin":6375998,"userName":" 释咒 伊叶","yellowlevel":3,"yellowstatus":1}]
python 3 带有json模块,因此如果有一个变量long保存了上面的字符串的话,那么下面的代码就能够使用json解析出一个完整的结构。本例中,整个变量是List类型,每个List的item是Dict类型。这正是我们所需要的。
>>>import json
>>>js=json.loads(long)
>>>type(js)
<class ‘list’>
>>>type(js[0])
<class ‘dict’>
>>>js[0].keys()
dict_keys(['userName', 'yellowstatus', 'uId', 'headPic', 'uin', 'yellowlevel', 'pf', 'exp', 'money'])
>>> for k,v in js[0].items():
… print (k,’:',v)
…
userName : ひ叮叮oヤo
yellowstatus : 0
uId : 3553136
headPic : http://imgcache.qq.com/qzone_v4/client/userinfo_icon/5001.gif
uin : 3002001
yellowlevel : 0
pf : 1
exp : 126002
money : 1201447
>>>
腾讯在网页验证用户名和密码的时候是预先对用户密码进行了md5加密的。因此,还要预先准备好python对字符串的加密算法。
而这比较简单,python有现成的模块hashlib。下面是python 3.1中运行的结果
>>> import hashlib
>>> m=hashlib.md5(‘abc’)
Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
TypeError: Unicode-objects must be encoded before hashing
>>> m=hashlib.md5(‘abc’.encode(‘utf-8′))
>>> m.digest()
b’\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr’
>>> m.hexdigest()
’900150983cd24fb0d6963f7d28e17f72′
下面是python 2.6中运行的结果
>>> import hashlib
>>> m=hashlib.md5(‘abc’)
>>> m.hexdigest()
’900150983cd24fb0d6963f7d28e17f72′
>>> m.digest()
‘\x90\x01P\x98<\xd2O\xb0\xd6\x96?}(\xe1\x7fr’
可见,python 2.6 和python 3.1 在字符串编码是不同的。并且上面两个对字符串’abc’的md5加密结果与这个帖子中腾讯的算法结果一致。

