我想在登录Fidelity网站并在其中导航时获得一些帮助。到目前为止,我的尝试还没有将我带到重要的地方。因此,这是我在与网络上的答案进行大量协商之后编写的代码。这些步骤是:
function loginToFidelity(){
var url = "https://www.fidelity.com";
var payload = {
"username":"*********",
"password":"*********"
};
var opt = {
"payload":payload,"method":"post","followRedirects" : false
};
var response = UrlFetchApp.fetch(encodeURI(url),opt);
if ( response.getResponseCode() == 200 ) {
Logger.log("Couldn't login.");
return
}
else if (response.getResponseCode() == 303 || response.getResponseCode() == 302) {
Logger.log("Logged in successfully. " + response.getResponseCode());
var cookie = response.getAllHeaders()['Set-Cookie']
for (j = 0; j < cookie.length; j++) {
var downloadPage = UrlFetchApp.fetch("https://oltx.fidelity.com/ftgw/fbc/oftop/portfolio#activity",
{"Cookie" : cookie[j],"method" : "post","followRedirects" : false,"payload":payload});
Logger.log(downloadPage.getResponseCode())
Logger.log(downloadPage.getContentText())
}
}
}
对于下标“ j”的每个选择,我对ResponseCode(总是302)得到相同的答案,对ContentText也得到相同的答案。 ContentText的答案显然是错误的,因为它不是应该的。 ContentText如下所示:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://login.fidelity.com/ftgw/Fidelity/RtlCust/Login/Init?AuthRedUrl=https://oltx.fidelity.com/ftgw/fbc/oftop/portfolio">here</a>.</p>
</body></html>
基于此,我有两个问题:
我是否已正确登录Fidelity网站?如果没有,为什么在登录过程中收到响应码302?要正确登录,我需要做些什么?
为什么我得到ContentText这么奇怪且明显不正确的答案,而却获得了完全合理的ResponseCode 302?我需要做些什么不同的操作,以便可以在Fidelity中获得由密码控制的页面,该页面的URL为“ https://oltx.fidelity.com/ftgw/fbc/oftop/portfolio#activity”?
注意:除上述测试外,还进行了其他一些测试。这些测试的结果将在下面的讨论中提供。
答案 0 :(得分:0)
这对我有用。您可能已经找到解决方案,不确定。请记住填写XXXX所在的登录ID和YYYY的密码。
我了解这是python代码,而不是google脚本,但是您对代码流程有所了解。
import requests, sys, lxml.html
s = requests.Session()
r = s.get('https://login.fidelity.com')
payload = {
'DEVICE_PRINT' : 'version%3D3.5.2_2%26pm_fpua%3Dmozilla%2F5.0+(x11%3B+linux+x86_64%3B+rv%3A41.0)+gecko%2F20100101+firefox%2F41.0%7C5.0+(X11)%7CLinux+x86_64',
'SavedIdInd' : 'N',
'SSN' : 'XXXXX',
'PIN' : 'YYYYY'
}
r = s.post(login_url, data=payload, headers=dict(referer='https://login.fidelity.com'))
response = s.get('https://oltx.fidelity.com/ftgw/fbc/oftop/portfolio')
print response.content
答案 1 :(得分:0)
mwahal,您省略了关键表单操作网址(您的login_url未定义)
这有效(如果添加到您的python代码中)
login_url = 'https://login.fidelity.com/ftgw/Fas/Fidelity/RtlCust/Login/Response/dj.chf.ra'
btw这是帖子显示登录成功后的打印结果
{"status":
{
"result": "success",
"nextStep": "Finish",
"context": "RtlCust"
}
}
或添加一些代码:
if r.status_code == requests.codes.ok:
status = r.json().get('status')
print(status["result"])
让您“成功”
答案 2 :(得分:0)
不幸的是,来自@mwahal的答案不再起作用-我一直在试图找出原因,如果可以的话会进行更新。一个问题是登录页面现在需要来自cfa.fidelity.com
域的cookie,该cookie仅在加载链接的JavaScript文件之一时设置。
一种选择是,如果您只想浏览站点,则使用selenium
,或者如果想利用Fidelity的内部API,则使用seleniumrequests
。
交易API带有seleniumreqeusts
的问题。该API要求Content-Type:application/json
和seleniumrequests
似乎不支持请求中的自定义标头。因此,我使用selenium
登录,调用不需要该标头的API之一,然后复制然后编辑响应的请求标头,并使用常规请求来获取事务:
from seleniumrequests import Chrome
import requests
# Log into Fidelity
driver = Chrome()
driver.get("https://www.fidelity.com")
driver.find_element_by_id("userId-input").send_keys(username)
driver.find_element_by_name("PIN").send_keys(password)
driver.find_element_by_id("fs-login-button").click()
r = driver.request('GET', 'https://digital.fidelity.com/ftgw/digital/rsc/api/profile-data')
headers = r.request.headers
headers['accept'] = "application/json, text/plain, */*"
headers['content-type'] = "application/json"
payload = '{"acctDetails":[{"acctNum":"<AcctId>"}],"searchCriteriaDetail":{"txnFromDate":1583639342,"txnToDate":1591411742}}'
api = "https://digital.fidelity.com/ftgw/digital/dc-history/api"
r = requests.post(api, headers=headers, data=payload)
transactions = r.json()