如何在没有浏览器的情况下与网站交互? [关闭]

2023-12-08

假设我正在构建一个 C# 应用程序。 申请目的:

  1. 从用户处获取用户名和密码。
  2. 并显示网站上存在的一些信息。

在后台,获取用户名和密码后,它应该:

  1. 使用这些凭据登录网站。
  2. 并单击登录后出现的锚链接。
  3. 找出保存信息的跨度。
  4. 获取信息。

这是一个例子。我实际上正在构建一个应用程序来显示带宽使用信息。 服务器不会为此公开任何 API。

是否有任何教程/信息/文章可用于类似目的?我只是不知道要搜索什么?


HttpWebRequest 的基本介绍

首先,您需要合适的工具来完成这项工作。去下载实时 HTTP 标头火狐浏览器插件。这将允许您实时查看 HTTP 标头,以便您可以查看与网站交互时发送的 POST 数据。了解发送到网站的数据后,您可以通过以编程方式创建自己的 HTTP Web 请求来模拟该过程。工具 > 实时 HTTP 标头

通过导航到加载实时 HTTP 标头工具 > 实时 HTTP 标头。一旦你加载了 GUI,导航到你想要登录的网站,我将使用Facebook出于演示目的。输入您的凭据以准备登录,但在此之前请清除 GUI 文本窗口并确保标记为复选框Capture已检查。点击登录后,您将看到文本窗口充斥着有关请求的各种信息,包括您需要的 POST 数据。

我发现最好点击保存全部...然后在文本文档中搜索您的用户名,以便您可以轻松识别 POST 数据。对于我的请求,POST 数据如下所示:

lsd=AVp-UAbD&display=&legacy_return=1&return_session=0&trynum=1&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C %D0%94%2C%D0%84&timezone=0&lgnrnd=214119_mDgc&lgnjs=1356154880&email=%myfacebookemail40outlook.com&pass=myfacebookpassword&default_persistent=0

然后可以在 C# 中定义如下:

StringBuilder postData = new StringBuilder();
postData.Append("lsd=AVqRGVie&display=");
postData.Append("&legacy_return=1");
postData.Append("&return_session=0");
postData.Append("&trynum=1");
postData.Append("&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84");
postData.Append("&timezone=0");
postData.Append("&lgnrnd=153743_eO6D");
postData.Append("&lgnjs=1355614667");
postData.Append(String.Format("&email={0}", "CUSTOM_EMAIL"));
postData.Append(String.Format("&pass={0}", "CUSTOM_PASSWORD"));
postData.Append("&default_persistent=0");

我的目的是向您展示我们可以通过 Web 浏览器“手动”发送的 POST 数据之间的关系,以及我们如何使用所述数据来模拟 C# 中的请求。了解发送 POST 数据远非确定性的。不同的网站以不同的方式工作,并且可以为您提供各种信息。下面是我整理的一个函数,用于验证 Facebook 凭据是否正确。我不能也不应该在这里深入探讨,因为课程及其成员都有很好的自我记录。关于所使用的方法,您可以找到比我能提供的更好的信息MSDN例如,WebRequest.Method 属性

    private bool ValidateFacebookCredentials(string email, string password)
    {
        CookieContainer cookies = new CookieContainer();
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        string returnData = string.Empty;

        //Need to retrieve cookies first
        request = (HttpWebRequest)WebRequest.Create(new Uri("https://www.facebook.com/login.php?login_attempt=1"));
        request.Method = "GET";
        request.CookieContainer = cookies;
        response = (HttpWebResponse)request.GetResponse();

        //Set up the request
        request = (HttpWebRequest)WebRequest.Create(new Uri("https://www.facebook.com/login.php?login_attempt=1"));
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
        request.Referer = "https://www.facebook.com/login.php?login_attempt=1";
        request.AllowAutoRedirect = true;
        request.KeepAlive = true;
        request.CookieContainer = cookies;

        //Format the POST data
        StringBuilder postData = new StringBuilder();
        postData.Append("lsd=AVqRGVie&display=");
        postData.Append("&legacy_return=1");
        postData.Append("&return_session=0");
        postData.Append("&trynum=1");
        postData.Append("&charset_test=%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84");
        postData.Append("&timezone=0");
        postData.Append("&lgnrnd=153743_eO6D");
        postData.Append("&lgnjs=1355614667");
        postData.Append(String.Format("&email={0}", email));
        postData.Append(String.Format("&pass={0}", password));
        postData.Append("&default_persistent=0");

        //write the POST data to the stream
        using(StreamWriter writer = new StreamWriter(request.GetRequestStream()))
            writer.Write(postData.ToString());

        response = (HttpWebResponse)request.GetResponse();

        //Read the web page (HTML) that we retrieve after sending the request
        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
            returnData = reader.ReadToEnd();

        return !returnData.Contains("Please re-enter your password");
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在没有浏览器的情况下与网站交互? [关闭] 的相关文章

随机推荐

  • 错误 - 输入最多 1 个参数,但得到 3 个

    我设置了以下 for 循环来接受 5 个测试分数 我希望循环提示用户输入 5 个不同的分数 现在 我可以通过编写输入 请输入您的下一个测试分数 来做到这一点 但我宁愿让每个输入的分数提示其关联的数字 因此 对于第一个输入 我希望它显示 请输
  • 计算属性和闭包属性集之间的区别

    我是斯威夫特的新手 计算属性和设置为闭包的属性有什么区别 我知道计算属性每次都会重新计算 关闭时有什么不同吗 IE Closure var pushBehavior UIPushBehavior let lazilyCreatedPush
  • 如何在 C# 中创建上下文菜单

    我想使用 C 创建一个上下文菜单 该菜单将显示在节点旁边 类似于 Visual Studio 中发生的情况 我现在的代码导致主窗体闪烁 private void treeView1 MouseDown object sender Mouse
  • 将(长尾数)和(sbyte 指数)转换为十进制

    upd将我的版本放在最后的描述中 我需要将尾数和指数转换为十进制 这就是我的编码方式 long field Decimal Mantissa sbyte field Decimal Exponent decimal MDEntryPx fi
  • 如何获取当前视图 HTML 源并将其作为字符串传递 JSF ManagedBean

    我想获取当前视图 HTML 源并将其作为参数传递给 JSF 托管 bean 无论如何 JSF 我可以做到这一点吗 您无法在 JSF 中执行此操作 因为它根本不在 Web 浏览器中运行 最好的选择是使用 JavaScript 下面的示例在单击
  • 三星 Galaxy 蓝牙驱动程序

    我已经为 Android 编写了一个应用程序 主要部分是它通过蓝牙进行通信 我有四台设备 1 三星Galaxy S22 三星Galaxy Gio3 Netsurfer touch 南非本地生产的低端安卓平板电脑 4 摩托罗拉 ET1 现在我
  • 在 Angular 2 中调用组件刷新

    我正在尝试实现一个导航栏 根据用户是否登录显示不同的链接 我正在使用angular2 jwt图书馆提供了tokenNotExpired 功能 我有2条路线 home and login 我有一个导航栏组件 位于
  • 在 ClearCase UCM 中创建的两个基线

    我正在使用复合基线设置一个项目 当我创建发送到 主线 项目的基线时 它总是创建两个基线 一个称为 COMP BL 另一个称为 COMP BL 发生这种情况有原因吗 我的设置可能有问题吗 不 你的设置是正确的 它将始终按已更改的组件创建一个基
  • 同一行上多次按位移位导致的意外行为[重复]

    这个问题在这里已经有答案了 根据我是否将多个按位移位组合在一行上或将它们放在单独的行上 我会得到不同的结果 unsigned char a 73 a a lt lt 6 gt gt 2 printf d n a 当我期望 16 时打印 14
  • 通过用户脚本删除网站标题的一部分

    我尝试编写一个用户脚本这会删除网站标题 Flash 浏览器游戏 中的所有内容 但会删除开始操作时出现的倒计时 我是 Javascript 新手 需要一些帮助 UPDATE 正则表达式问题已解决 但我仍然需要一些帮助来让此脚本 监视 标题 以
  • 如何发出产生与 Firefox 相同的响应标头的 cURL 请求

    当我使用 Firefox 浏览页面并单击下载链接时 在网络检查器中检查请求时会显示以下标头 Connection keep alive Content Disposition attachment filename example file
  • 如何在 SwiftUI 或无限列表视图中实现列表分页?

    我需要有关如何在 SwiftUI 中实现无限列表滚动或分页列表的帮助 提前致谢 你最好的选择是使用 onAppear并计算是否该获取下一页 这是一个人为的示例 因为通常您访问的网络或磁盘比这慢得多 但它会给您一个想法 调getNextPag
  • Valgrind 在 pthread_spin_lock 中挂起,消耗 100% CPU

    我的 C 多线程应用程序在 valgrind 版本 3 8 0 及最新版本的 pthread spin lock 中挂起 但在 3 6 0 3 6 1 和 3 7 0 中并没有发生这种情况 有人知道这个问题有什么解决方法吗 这是导致 val
  • hadoop和spark现在支持IPv6吗?

    我想在纯IPv6环境上构建Hadoop和Spark集群 我已经通过 IPv4 构建了它 如何配置在 IPv6 环境下运行它们 hadoop 和 Spark 现在支持 IPv6 吗 它不是 截至今日HADOOP 11890跟踪 IPv6 支持
  • MongoDB中如何在对象级别进行匹配?

    输入文件 data abc Id 100 xyz Id 123 解释 我想做 match on data i i is parameter 如果我给 abc as a parameter我得到以下输出 我想将多个参数传递给 i abc xy
  • 如何指定求解微分方程的最终值(而不是初始值)

    我想求解 R 中的微分方程 deSolve 我没有初始条件 只有状态变量的最终条件 如何才能做到这一点 典型的代码是 ode times y parameters function where y是初始条件并且function定义微分方程
  • 使用 IEnumerable 和 Linq-To-Sql 时如何防止内存溢出?

    这个问题与我之前的一个问题 这是我当前的代码 IEnumerable
  • 如何解码 HTTP 中 Content-Disposition 标头的文件名参数?

    This question提供了这方面的背景filename范围 我需要编写一个脚本来访问网络服务器上的一些文件 文件名包含无法用 ASCII 编码的 CJK 字符 curl I http bj baidupcs com file f6f2
  • JasperReport 参数在 iReport 中有效,但在 JasperServer 上失败

    我在 iReport 中创建了一份报告 使用 isForPrompting true 设置参数 当我用预览来测试它时 一切正常 Parameter Symbol SQL Query select from table where colum
  • 如何在没有浏览器的情况下与网站交互? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 假设我正在构建一个 C 应用程序 申请目的 从用户处获取用户名和密码 并显示网站上存在的