用Python提取一些OFX数据
我试着用这个链接来获取我在Wachovia银行的账户信息,但一直没成功。于是我决定手动构造一些请求数据,参考这个例子。
我有一个文件,想用它作为请求数据。我们叫它req.ofxsgml:
FXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE
<OFX>
<SIGNONMSGSRQV1>
<SONRQ>
<DTCLIENT>20071015021529.000[-8:PST]
<USERID>TheNameIuseForOnlineBanking
<USERPASS>MySecretPassword
<LANGUAGE>ENG
<FI>
<ORG>Wachovia
<FID>4309
</FI>
<APPID>Money
<APPVER>1700
</SONRQ>
</SIGNONMSGSRQV1>
<BANKMSGSRQV1>
<STMTTRNRQ>
<TRNUID>438BD6F4-2106-4C88-8DE5-7625915A2FC0
<STMTRQ>
<BANKACCTFROM>
<BANKID>061000227
<ACCTID>101555555555
<ACCTTYPE>CHECKING
</BANKACCTFROM>
<INCTRAN>
<INCLUDE>Y
</INCTRAN>
</STMTRQ>
</STMTTRNRQ>
</BANKMSGSRQV1>
</OFX>
然后,我在Python中尝试:
>>> import urllib2
>>> query = open('req.ofxsgml').read()
>>> request = urllib2.Request('https://pfmpw.wachovia.com/cgi-forte/fortecgi?servicename=ofx&pagename=PFM',
query,
{ "Content-type": "application/x-ofx",
"Accept": "*/*, application/x-ofx"
})
>>> f = urllib2.urlopen(request)
这个命令返回了500错误,并且这个追踪信息也出来了。我在想我的请求哪里出了问题。
如果我访问这个网址,不带任何数据,也不关心请求头,
>>> f = urllib2.urlopen('https://pfmpw.wachovia.com/cgi-forte/fortecgi?servicename=ofx&pagename=PFM')
结果和直接访问这个网址是一样的,
HTTPError: HTTP Error 403: <BODY><H1>Request not allowed</H1></BODY>.
这点很明显,不过只是个观察。关于这个话题的资料似乎都比较过时。我希望能写一个简单的Python OFX模块开源。也许已经有类似的东西,但我还没找到?
编辑 - 如果我把上面的信息做个简单的映射:
d = {'ACCTID': '10555555',
'ACCTTYPE': 'CHECKING',
'APPID': 'Money',
'APPVER': '1700',
'BANKID': '061000227',
'DTCLIENT': '20071015021529.000[-8:PST]',
'FID': '4309',
'INCLUDE': 'Y',
'LANGUAGE': 'ENG',
'ORG': 'Wachovia',
'TRNUID': 'I18BD6F4-2006-4C88-8DE5-7625915A2FC0',
'USERID': 'm48m40',
'USERPASS': '12397'}
然后对它进行URL编码,并用这个作为请求数据发出请求
query=urllib.urlencode(d)
request = urllib2.Request('https://pfmpw.wachovia.com/cgi-forte/fortecgi?servicename=ofx&pagename=PFM',
query,
{ "Content-type": "application/x-ofx",
"Accept": "*/*, application/x-ofx"
})
f = urllib2.urlopen(request)
HTTP Error 403: <BODY><H1>Request not allowed</H1></BODY>
2 个回答
2
问题在于,你之前是直接把文件里的数据作为参数传给了Request
。你读取的文件里面同时包含了请求头和你要发送的数据。现在你需要把请求头和数据分开提供,就像你现在做的那样。
HTTP错误403意味着请求是正确的,但服务器拒绝响应。你是否已经注册并获得了使用你想访问的网络服务的权限?如果是的话,你在发请求之前是否需要进行一些身份验证?
0
这可能只是身份验证的问题?(或者说没有进行身份验证?)