如何提取这组不标准的 JSON 数据( RSA 公钥)?愁了三天两夜了

2016-08-28 22:15:07 +08:00
 Antigen

请求 URL 返回这些数据, Firebug 能解析出 JSON 。但是我用 Python 的 JSON 却行不通。我想提取 pubkey 。

import requests

html = requests.get('https://passport.baidu.com/v2/getpublickey?token=60421c54ebc1272b71e17aa61df10f6a&tpl=tb&apiver=v3&tt=1472291018527&gid=D644D04-1F08-4018-B0E7-6BE79F5C62A6&callback=bd__pcbs__8og8ph', cookies=cookie)

返回:

bd__pcbs__8og8ph({"errno":'0',"msg":'',"pubkey":'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCssku00Ol\/q0t8V8sG\/5oAU76B\n2MXvGWOtmSHDFMK9PwWRLWgTbzynbTbLBvlueRuZX0hhNfGhi1JLrX9lW0HlxWkV\nnSkRAjHAHc7S9JzIEk86+ejWTS0cHHMqhk5\/16d2fuVYXNTDwGD8Hsf62JX2HXhe\nbgoJVhE3ZsVeoyxrowIDAQAB\n-----END PUBLIC KEY-----\n',"key":'QLEP4TeXLB236TtwcSSvHYk0aC24hAWF'})

于是我用正则表达式:

pubkey = re.findall(r'-----BEGIN PUBLIC KEY-----.+-----END PUBLIC KEY-----', html.text)[0]

拿到了:

-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCssku00Ol\/q0t8V8sG\/5oAU76B\n2MXvGWOtmSHDFMK9PwWRLWgTbzynbTbLBvlueRuZX0hhNfGhi1JLrX9lW0HlxWkV\nnSkRAjHAHc7S9JzIEk86+ejWTS0cHHMqhk5\/16d2fuVYXNTDwGD8Hsf62JX2HXhe\nbgoJVhE3ZsVeoyxrowIDAQAB\n-----END PUBLIC KEY-----

然后用来 RSA 加密,可是 RSA 要求是 b'',我就把 pubkey 转化成 bytes 。

pubkey_bytes = bytes(pubkey, encoding='utf-8')

可是里面的\n/转化成了\\n\\/,这样不行啊!

b'-----BEGIN PUBLIC KEY-----\\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxhuZTzdfRidIwKBYj8ziTd0rC\\ngNuZFxzdBStw8UYOtD+BKNJ4ccKgrkfAkRW4LlAB8MuNecoW8X0Cb\\/kvauobSa5r\\nM7DwIOQWtN9fCFCIe1Xa9gSdXYrL\\/0X57Dtmw\\/DXmzfMFGsbHnB9zCmgVAM9IGXo\\nZr9skrfXx\\/sRMtBZ5QIDAQAB\\n-----END PUBLIC KEY-----'

RSA 公钥必须是这样的格式:

#字符串:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCssku00Ol/q0t8V8sG/5oAU76B
2MXvGWOtmSHDFMK9PwWRLWgTbzynbTbLBvlueRuZX0hhNfGhi1JLrX9lW0HlxWkV
nSkRAjHAHc7S9JzIEk86+ejWTS0cHHMqhk5/16d2fuVYXNTDwGD8Hsf62JX2HXhe
bgoJVhE3ZsVeoyxrowIDAQAB
-----END PUBLIC KEY-----

#二进制:
b'-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDX1kWowXZuatDRaPkjTNFA2hJ7\n857jM8oWgBJmS9JXZdJxFK70Th2cWsL8/cvLDzxs0lBaPtZwK7XvphipFXvCLDCn\naz58KJyrqiDrmNpDMPjIFzf6n+Bk0SQlW4KuNJoy3VS18AlS7v5gV7OvscQHPgNU\nGtUxUPdgKT5zsCT0+QIDAQAB\n-----END PUBLIC KEY-----'

三天两夜了,实在是找不到解决办法了。最后搜肠刮肚用了这么个办法:

re.sub(r'\\/', r'/', re.sub(r'\\n', r'\n', pubkey))    #把 pubkey 里面的\\n 和\/替换成\n 和 /

有没有更好的办法?

2367 次点击
所在节点    Python
4 条回复
maowu
2016-08-29 01:00:31 +08:00
好奇 py 的 json 报了什么错误
0x5e
2016-08-29 09:05:54 +08:00
bd__pcbs__8og8ph()括号里的提取出来,然后 json.loads()?
0x5e
2016-08-29 09:07:20 +08:00
Antigen
2016-08-29 11:57:32 +08:00
@0x5e 太感谢了,十分感谢,万分感谢,谢谢你,鸡动的无法言表。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/302335

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX