用Python提取一些OFX数据

3 投票
2 回答
3246 浏览
提问于 2025-04-15 15:34

我试着用这个链接来获取我在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&amp;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&amp;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&amp;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

这可能只是身份验证的问题?(或者说没有进行身份验证?)

撰写回答