背景
ETrade 身份验证系统让我创建一个 RequestToken,然后执行一个授权 URL,这将打开一个 ETrade 页面。
用户登录以授权其帐户上的事件。
他们会收到一个 PIN 码,并将其输入到我的应用程序中。
我使用 RequestToken 和 Pin 调用 ExchangeRequestTokenForAccessToken。
然后我们就出发并运行。
问题
问题是我正在创建一个在后台持续运行的服务。不会有任何用户登录。相反,我不会进行任何交易。只是处理数字,寻找符合特定标准的股票。
我不知道如何让它在无人值守的情况下工作。
谢谢布拉德。
最佳答案
之前,我使用了一系列WebRequest并手动添加 header 来模拟授权页面。这种方法一直有效,直到大约一年前,当时 ETrade 用一些看似跟踪信息的东西复杂化了他们的标题。我现在用http://watin.org/登录并删除授权码。
草率的代码如下所示:
using WatiN.Core; // IE Automation
...
// verify current thread in STA.
Settings.Instance.MakeNewIeInstanceVisible = false;
var ieStaticInstanceHelper = new IEStaticInstanceHelper();
Settings.AutoStartDialogWatcher = false;
using (ieStaticInstanceHelper.IE = new IE())
{
string authCode = "";
ieStaticInstanceHelper.IE.GoTo(GetAuthorizationLink());
if (ieStaticInstanceHelper.IE.ContainsText("Scheduled System Maintenance"))
{
throw new ApplicationException("eTrade down for maintenance.");
}
TextField user = ieStaticInstanceHelper.IE.TextField(Find.ByName("USER"));
TextField pass = ieStaticInstanceHelper.IE.TextField(Find.ById("txtPassword"));
TextField pass2 = ieStaticInstanceHelper.IE.TextField(Find.ByName("PASSWORD"));
Button btn = ieStaticInstanceHelper.IE.Button(Find.ByClass("log-on-btn"));
Button btnAccept = ieStaticInstanceHelper.IE.Button(Find.ByValue("Accept"));
TextField authCodeBox = ieStaticInstanceHelper.IE.TextField(Find.First());
if (user != null && pass != null && btn != null &&
user.Exists && pass2.Exists && btn.Exists)
{
user.Value = username;
pass2.Value = password;
btn.Click();
}
btnAccept.WaitUntilExists(30);
btnAccept.Click();
authCodeBox.WaitUntilExists(30);
authCode = authCodeBox.Value;
SavePin(authCode);
}
关于api - ETrade API无人值守认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40316556/