2010-05-26 64 views
1

我正在尝试创建一个C#Winforms应用程序,该应用程序将自动将我登录到网站并下载数据。具体来说,我想让我的应用程序自动登录到我的网上银行网站,登录并下载我的交易记录。我可以通过Web浏览器登录并下载它来手动执行此操作。我正试图自动化这一点。我知道我可能需要使用HttpWebRequest和HttpWebResponse。有没有人有这样的例子或我需要采取的步骤框架来完成这个?请记住它将是安全的站点(https),我将以某种方式收集会话信息并在会话期间保留会话信息。有什么想法吗?以编程方式自动化Web登录

+1

我对这些愿望没有很高的期望。银行在防止利用方面非常积极,而且他们拥有世界上所有的钱都可以投资。你应该拿起针织什么的。试图通过银行网站安全性会更好地利用你的时间。 ;-) – 2010-05-26 22:07:47

+1

我不是想做非法或破解或任何事情。我只是想将我自己的金融交易下载到我的电脑上,这样我就可以制作一个跟踪我的支出的计划。没有什么不同,那么Microsoft Money或Quicken的功能 – Icemanind 2010-05-26 22:10:16

+0

我并不是暗示你是。我在说银行不喜欢并且不管意图如何积极地阻止这种用法。你不会在这里找到快乐。无论如何,祝你好运。 – 2010-05-26 22:14:44

回答

3

看一看Selenium,与您可以自动化用户和浏览器之间的交互序列。

虽然很多银行正在转向基于JavaScript的登录表单来混淆密码以防止木马,但您可能很幸运能够使用Web请求和登录响应。见Citibank (AU)Westpac (AU)。可能很难规避您可能不得不手动登录并使GreaseMonkey脚本自动执行下载。

出于利益的考虑,也值得对银行木马以及他们如何代表用户处理自动操作进行研究。请参阅Zeus Banking Trojan

+0

Quicken等程序如何做?在加快时,我所要做的就是选择我的银行名称,并以某种方式自动进行并提取我所有的交易历史数据? – Icemanind 2010-05-26 22:19:09

+0

Quicken必须使用API​​,检查你的银行,看看这个API是公开的,还是只允许被可信任的软件使用(这是付费的软件开发许可证) – blissapp 2010-05-26 22:21:31

+1

快速Google搜索后我没有看到。我的猜测是,Quicken和银行必须有某种谈判协议,允许他们通过他们的软件访问银行账户。 – Icemanind 2010-05-26 22:24:52

3
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(); 
    } 
} 

}

+0

与代码很好的接触。我只是想提一下,这是假设一个特定的登录机制,而不是一个通用的解决方案。从NetworkCredential文档http://msdn.microsoft.com/en-us/library/system.net.networkcredential.aspx:“NetworkCredential类是提供基于密码的身份验证方案(例如basic,摘要,NTLM和Kerberos。[...]该类不支持基于公共密钥的身份验证方法,如安全套接字层(SSL)客户端身份验证。“ – Triynko 2010-05-26 22:17:48

+0

那么,我用它来通过SSL进行通信...... – 2010-05-26 22:46:51

+0

这里要注意的关键是使用WebClient而不是HttpWebRequest和HttpWebResponse。如果Selenium出来了,我宁愿WebClient通过HttpWebRequest/Response。 – 2010-05-28 21:52:36

0

浏览器自动化(请参阅下面的链接)可能会有用。

但请记住...登录页面实际上是一个复杂的客户端应用程序,能够形成一个复杂的,甚至加密的Web请求。所以,通过规避你可能认为只是一个接口,你实际上绕过了整个客户端应用程序(它可以制定一个简单的HTTP POST,或者可以执行一些复杂的JavaScript操作,然后连接到Flash播放器,然后直接连接到登录服务器,但你明白了)。登录界面(现在可能是一个小应用程序)可以在任何时候大幅更新,使自动登录软件失效。

因此,您可能想要使用可以在高级别上自动运行的东西,使用可用的接口(而不是绕过它并尝试制定自己的HTTP请求),并且类似http://seleniumhq.org/可能会有所帮助。

只要小心编写软件,将您的凭证盲目地发送到网页。当页面被劫持或者页面由于某种原因突然未加密时,您不在那里监控它。只是一个想法。

0

好吧,如果这是不可能连接到一个银行网站和下载交易程序(我可以向你保证这不是 - 几乎任何可以由用户来完成可以有足够的聪明才智代码来完成)是如何它存在的iOS应用程序可以做到这一点吗?我知道,因为我经常使用这些应用程序之一。此外,我认为Quickbooks Enterprise能够做到这一点(但不要在此引用我)。

我能想到的唯一一件事就表明,如果iOS应用程序创建者与所有不同的银行和信用卡公司达成某种协议,您可能无法做到这一点。不知何故,我怀疑它,但我想这是可能的。

+0

它不是不可能的。它通过Web服务工作。这些网络服务由银行创建。假设您在富国银行有一个账户。您可以在手机上下载Wells Fargo银行应用程序。手机上的应用程序使用其Web服务API与Wells Fargo进行通信。问题是,并非所有银行都公开他们的API。所以你必须使用Fiddler这样的东西来试图弄清楚他们的API是如何工作的。 – Icemanind 2014-07-05 21:17:48