我正在尝试创建一个 C# Winforms 应用程序,它会自动将我登录到站点并下载数据。具体来说,我想让我的应用程序自动登录我的网上银行网站、登录并下载我的交易历史记录。我可以通过网络浏览器登录并下载它来手动执行此操作。我正在尝试自动化这个。我知道我可能需要使用 HttpWebRequest 和 HttpWebResponse。有没有人有这方面的例子或我需要采取的步骤框架?请记住,这将是安全站点 (https),我将不得不以某种方式收集会话信息并在会话期间保留会话信息。有什么想法吗?
5 回答
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();
}
}
}
看看Selenium,你可以自动化用户和浏览器之间的一系列交互。
您可能很幸运能够使用 Web 请求和响应登录,尽管许多银行正在转向基于 javascript 的登录表单来混淆密码以防止木马。请参阅花旗银行(澳大利亚)和西太平洋银行(澳大利亚)。可能很难避免您可能不得不手动登录并让GreaseMonkey脚本自动下载。
出于利益考虑,还值得对银行木马以及它们如何代表用户处理自动化操作进行一些研究。请参阅Zeus 银行木马。
查看Open Financial Exchange规范。这就是 Quicken/Money 等从您的金融机构下载交易的方式。
浏览器自动化(见下面的链接)可能有用。
但请记住……登录页面实际上是一个复杂的客户端应用程序,能够形成一个复杂的、甚至加密的 Web 请求。因此,通过规避您可能认为只是一个界面的东西,您实际上是在规避整个客户端应用程序(它可以制定一个简单的 HTTP POST 或可以执行一些复杂的 JavaScript 操作,然后连接到 Flash 播放器,然后直接连接到登录服务器,但你明白了)。登录界面(现在真的可能是一个小应用程序)可以随时大幅更新,从而使您的自动登录软件失效。
所以......您可能想要使用可以在较高级别上自动化它的东西,使用可用的接口(而不是绕过它并尝试制定自己的 HTTP 请求),以及类似http://seleniumhq.org/可能会有所帮助。
请小心编写盲目地将您的凭据发送到网页的软件。当页面被劫持或页面由于某种原因突然未加密时,您无法监视它。只是一个想法。
好的,如果无法以编程方式连接到银行网站并下载交易(我可以向您保证,这不可能——用户可以完成的几乎所有事情都可以通过足够聪明的代码来完成)iOS 应用程序是如何存在的?能做到吗?我知道是因为我经常使用这些应用程序之一。此外,我认为 Quickbooks Enterprise 能够做到这一点(但不要引用我的话)。
我能想到的唯一一件事就是如果 iOS 应用程序创建者与所有不同的银行和信用卡公司达成某种协议,你可能无法做到这一点。不知怎的,我对此表示怀疑,但我想这是可能的。