我正在尝试创建一个C#Winforms应用程序,该应用程序将自动将我登录到网站并下载数据。具体来说,我想让我的应用程序自动登录到我的网上银行网站,登录并下载我的交易记录。我可以通过Web浏览器登录并下载它来手动执行此操作。我正试图自动化这一点。我知道我可能需要使用HttpWebRequest和HttpWebResponse。有没有人有这样的例子或我需要采取的步骤框架来完成这个?请记住它将是安全的站点(https),我将以某种方式收集会话信息并在会话期间保留会话信息。有什么想法吗?以编程方式自动化Web登录
回答
看一看Selenium,与您可以自动化用户和浏览器之间的交互序列。
虽然很多银行正在转向基于JavaScript的登录表单来混淆密码以防止木马,但您可能很幸运能够使用Web请求和登录响应。见Citibank (AU)和Westpac (AU)。可能很难规避您可能不得不手动登录并使GreaseMonkey脚本自动执行下载。
出于利益的考虑,也值得对银行木马以及他们如何代表用户处理自动操作进行研究。请参阅Zeus Banking Trojan。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
namespace testSSL
{
public partial class FormDownload : Form
{
private bool success;
private const string filename = "file.txt";
private const string url_string = "https://some.url.com";
private Uri url;
public FormDownload()
{
InitializeComponent();
success = false;
url = new Uri(url_string);
}
public bool StartDownload()
{
this.ShowDialog();
return success;
}
private void Form1_Load(object sender, EventArgs e)
{
this.Activate();
progressBar1.Maximum = 100;
label1.Text = "Working";
WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
//possible fix for running on w2k
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
string user="user", pass="pass";
client.Credentials = new NetworkCredential(user, pass);
try
{
client.DownloadFileAsync(url, filename);
}
catch (Exception ue)
{
writeException(ue.Message);
}
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
writeException(e.Error.Message);
success = false;
}
else
{
label1.Text = "Done";
System.Threading.Thread.Sleep(100);
success = true;
}
this.Close();
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void writeException(string ex)
{
ex = "Date: " + DateTime.Now.ToString() + " Exception: " + ex + "\r\n";
File.AppendAllText("downloadLog.txt", ex);
MessageBox.Show("An error has occurred; it has been logged");
this.Close();
}
}
}
与代码很好的接触。我只是想提一下,这是假设一个特定的登录机制,而不是一个通用的解决方案。从NetworkCredential文档http://msdn.microsoft.com/en-us/library/system.net.networkcredential.aspx:“NetworkCredential类是提供基于密码的身份验证方案(例如basic,摘要,NTLM和Kerberos。[...]该类不支持基于公共密钥的身份验证方法,如安全套接字层(SSL)客户端身份验证。“ – Triynko 2010-05-26 22:17:48
那么,我用它来通过SSL进行通信...... – 2010-05-26 22:46:51
这里要注意的关键是使用WebClient而不是HttpWebRequest和HttpWebResponse。如果Selenium出来了,我宁愿WebClient通过HttpWebRequest/Response。 – 2010-05-28 21:52:36
浏览器自动化(请参阅下面的链接)可能会有用。
但请记住...登录页面实际上是一个复杂的客户端应用程序,能够形成一个复杂的,甚至加密的Web请求。所以,通过规避你可能认为只是一个接口,你实际上绕过了整个客户端应用程序(它可以制定一个简单的HTTP POST,或者可以执行一些复杂的JavaScript操作,然后连接到Flash播放器,然后直接连接到登录服务器,但你明白了)。登录界面(现在可能是一个小应用程序)可以在任何时候大幅更新,使自动登录软件失效。
因此,您可能想要使用可以在高级别上自动运行的东西,使用可用的接口(而不是绕过它并尝试制定自己的HTTP请求),并且类似http://seleniumhq.org/可能会有所帮助。
只要小心编写软件,将您的凭证盲目地发送到网页。当页面被劫持或者页面由于某种原因突然未加密时,您不在那里监控它。只是一个想法。
调查Open Financial Exchange规范。这就是Quicken/Money等从您的金融机构下载交易的方式。
好吧,如果这是不可能连接到一个银行网站和下载交易程序(我可以向你保证这不是 - 几乎任何可以由用户来完成可以有足够的聪明才智代码来完成)是如何它存在的iOS应用程序可以做到这一点吗?我知道,因为我经常使用这些应用程序之一。此外,我认为Quickbooks Enterprise能够做到这一点(但不要在此引用我)。
我能想到的唯一一件事就表明,如果iOS应用程序创建者与所有不同的银行和信用卡公司达成某种协议,您可能无法做到这一点。不知何故,我怀疑它,但我想这是可能的。
它不是不可能的。它通过Web服务工作。这些网络服务由银行创建。假设您在富国银行有一个账户。您可以在手机上下载Wells Fargo银行应用程序。手机上的应用程序使用其Web服务API与Wells Fargo进行通信。问题是,并非所有银行都公开他们的API。所以你必须使用Fiddler这样的东西来试图弄清楚他们的API是如何工作的。 – Icemanind 2014-07-05 21:17:48
我对这些愿望没有很高的期望。银行在防止利用方面非常积极,而且他们拥有世界上所有的钱都可以投资。你应该拿起针织什么的。试图通过银行网站安全性会更好地利用你的时间。 ;-) – 2010-05-26 22:07:47
我不是想做非法或破解或任何事情。我只是想将我自己的金融交易下载到我的电脑上,这样我就可以制作一个跟踪我的支出的计划。没有什么不同,那么Microsoft Money或Quicken的功能 – Icemanind 2010-05-26 22:10:16
我并不是暗示你是。我在说银行不喜欢并且不管意图如何积极地阻止这种用法。你不会在这里找到快乐。无论如何,祝你好运。 – 2010-05-26 22:14:44