热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C#使用WebBrowser制作网页游戏辅助工具关键技术分析

使用WebBrowser控件,实现起来确实很方便,但灵活性差,比不上直接组包发包。对三国风云这款网页游戏来说,WebBrowser用的好的话理论上可以实现想要的功能(我只实现了整点自动举荐名士,

使用WebBrowser控件,实现起来确实很方便,但灵活性差,比不上直接组包发包。对三国风云这款网页游戏来说,WebBrowser用的好的话理论上可以实现想要的功能(我只实现了整点自动"举荐名士",

其他就没兴趣实现了,原理都是一样)。
使用抓包工具,可以查看游戏过程中都有哪些包,自己大概有些了解。
有些网页游戏是Flash界面的,如校内的开心农场.WebBrowser就不适合做这个游戏的辅助工具。.NET中也有Flash的控件,但这个控件功能很弱,Flash中的很多东西都得不到。现在想到的办法也只

有原始的组包发包。

WebBrowser有个缺点,它只能存在主线程中。在webBrowser处理数据过程中,整个程序处在繁忙状态,点击程序会没反应(未响应)。在程序运行过程中尽量减少webBrowser处理数据时间,除了

webBrowser更新数据,其他的都在其他线程中实现。

webBrowser.Navigate(strURL);

通过webBrowser可以得到其字符串内容:
webBrowser.Document.Body.InnerHtml;

“游戏指南”其实就是一个链接:
游戏指南
只要在代码中执行“Javascript:MM_iframePost('guide.nation');”这个脚本,就相当于用鼠标点击游戏中的“游戏指南”。
执行脚本可以用HtmlElement.InvokeMember。

...
HtmlElementCollection aHtml = webBrowser.Document.GetElementsByTagName("a");
DoClick("游戏指南");

 private void DoClick(string name)
{
    foreach (HtmlElement h in aHtml)
    {
        if (h.InnerText != null && h.InnerText.Contains(name))
        {
            h.InvokeMember("click");
            //等待webBrowser刷新完成
            WaitForEventCompleted(1000);
            break;
        }
        else
        {
            continue;
        }
    }
}

private void WaitForEventCompleted(int time)
{
    autoResetEvent.Reset();
    while (autoResetEvent.WaitOne(time, false) == false)
    {
        Application.DoEvents();
    }
}

 

每次点击相应的链接后,webBrowser都要相应的刷新数据,因此,在操作后都要等待webBrowser更新数据完成。每次更新数据时,webBrowser_DocumentCompleted event执行的不是一次,
好像是3次,但是找到原因了,现在又忘记了,代码这里还不稳定,可以抓包研究下原因。

定时执行“举荐名士”,不同线程之间同步使用到DoCallback, Invoke:

 private void TimerDoFamous()
{
    while (true)
    {
        if (DateTime.Now.SecOnd== 10 && DateTime.Now.Minute == 2)
        {
            if (webBrowser.InvokeRequired)
            {
                DoCallback d = new DoCallback(DoFamousGeneral);
                this.Invoke(d);
                d = new DoCallback(Wait);
                this.Invoke(d);
                d = new DoCallback(DoAnotherGeneral);
                this.Invoke(d);
            }
            else
            {
                DoCallback d = new DoCallback(DoFamousGeneral);
                this.Invoke(d);
                d = new DoCallback(Wait);
                this.Invoke(d);
                d = new DoCallback(DoAnotherGeneral);
                this.Invoke(d);
            }
        }
    }
}

 

怎样从webBrowser.Document.Body.InnerHtml中得到自己想要的html element,用的是正则表达式。同样用正则表达式可以得到当前城镇的所有数据:资源数,建筑等级等。
得到铁矿数量的正则表达式:
 

//  iron
public   const   string  IronNowPat  =   @" \d* " ;
public   const   string  IronNowHeader  =   @" " ;
public   const   string  IronIncreasePat  =   @" id=iron_increase>\d* " ;
public   const   string  IronIncreaseHeader  =   @" id=iron_increase> " ;

 


我测试的帐号是中有一个代管帐号。
现在程序运行的结果是, 点击“button1”立即执行“举荐名士”,自己的帐号做完之后,自动转到代管的帐号做代管帐号的“举荐名士”。我测试用的2个帐号,其中一个是代管帐号。所以现在的程序只能支

持一个代管帐号,修改成2个原理一样。点击“button2”,在每次电脑时间秒针等于10时,执行“举荐名士”(定时无限次数)。

转到代管帐号时,会弹出一个含有“确定”的对话框,必须点击“确定”后才能真正转到代管帐号的界面。这个“确定”按钮是一个含“input” Tag的html element,这个跟“游戏指南”是一个含“a”

Tag的html element道理一样。

以上谈到的关键点好像能完成三国风云游戏中想要的大部分功能了,只要能想到什么功能。比起组包,发包方便很多,但效率上 就差很多.


推荐阅读
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • 解决Bootstrap DataTable Ajax请求重复问题
    在最近的一个项目中,我们使用了JQuery DataTable进行数据展示,虽然使用起来非常方便,但在测试过程中发现了一个问题:当查询条件改变时,有时查询结果的数据不正确。通过FireBug调试发现,点击搜索按钮时,会发送两次Ajax请求,一次是原条件的请求,一次是新条件的请求。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • 在PHP中如何正确调用JavaScript变量及定义PHP变量的方法详解 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • com.sun.javadoc.PackageDoc.exceptions()方法的使用及代码示例 ... [详细]
  • 使用jqTransform插件美化表单
    jqTransform 是由 DFC Engineering 开发的一款 jQuery 插件,专用于美化表单元素,操作简便,能够美化包括输入框、单选按钮、多行文本域、下拉选择框和复选框在内的所有表单元素。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 在JavaWeb开发中,文件上传是一个常见的需求。无论是通过表单还是其他方式上传文件,都必须使用POST请求。前端部分通常采用HTML表单来实现文件选择和提交功能。后端则利用Apache Commons FileUpload库来处理上传的文件,该库提供了强大的文件解析和存储能力,能够高效地处理各种文件类型。此外,为了提高系统的安全性和稳定性,还需要对上传文件的大小、格式等进行严格的校验和限制。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 本文详细介绍了一种利用 ESP8266 01S 模块构建 Web 服务器的成功实践方案。通过具体的代码示例和详细的步骤说明,帮助读者快速掌握该模块的使用方法。在疫情期间,作者重新审视并研究了这一未被充分利用的模块,最终成功实现了 Web 服务器的功能。本文不仅提供了完整的代码实现,还涵盖了调试过程中遇到的常见问题及其解决方法,为初学者提供了宝贵的参考。 ... [详细]
  • QT框架中事件循环机制及事件分发类详解
    在QT框架中,QCoreApplication类作为事件循环的核心组件,为应用程序提供了基础的事件处理机制。该类继承自QObject,负责管理和调度各种事件,确保程序能够响应用户操作和其他系统事件。通过事件循环,QCoreApplication实现了高效的事件分发和处理,使得应用程序能够保持流畅的运行状态。此外,QCoreApplication还提供了多种方法和信号槽机制,方便开发者进行事件的定制和扩展。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
author-avatar
akun
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有