以编程方式自动化Web登录

时间:2010-05-26 21:59:18

标签: c# winforms httpwebrequest httpwebresponse

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

5 个答案:

答案 0 :(得分:4)

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

}

答案 1 :(得分:3)

查看Selenium,您可以自动执行用户和浏览器之间的一系列交互。

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

为了利益,还值得对银行特洛伊木马以及他们如何代表用户处理自动化操作进行一些研究。请参阅Zeus Banking Trojan

答案 2 :(得分:2)

查看Open Financial Exchange规范。这就是Quicken / Money等从您的金融机构下载交易的方式。

答案 3 :(得分:0)

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

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

所以...你可能想要使用能够在高级别自动化它的东西,使用可用的接口(而不是绕过它并尝试制定你自己的HTTP请求),以及http://seleniumhq.org/之类的东西。可能有所帮助。

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

答案 4 :(得分:0)

好的,如果无法连接到银行网站并以编程方式下载交易(我可以向你保证 - 几乎任何可以通过用户可以用足够聪明的代码来完成)iOS应用程序是如何存在的呢?我知道,因为我经常使用其中一个应用程序。此外,我认为Quickbooks Enterprise能够做到这一点(但不要引用我的话)。

我唯一可以想到的是,如果iOS应用程序创建者与所有不同的银行和信用卡公司达成某种协议,那么您可能无法做到这一点。不知怎的,我对此表示怀疑,但我认为这是可能的。