热门标签 | 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道理一样。

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


推荐阅读
  • 通过优化模板消息机制,本研究提出了一种高效的信息化推送方案。该方案利用获取的访问令牌(access token)和指定的模板ID,实现了精准且快速的信息推送,显著提升了用户体验和信息传递效率。具体实现中,通过调用相关API接口,确保了消息的准确性和及时性,为用户提供更加便捷的服务。 ... [详细]
  • 本文介绍了如何利用Struts1框架构建一个简易的四则运算计算器。通过采用DispatchAction来处理不同类型的计算请求,并使用动态Form来优化开发流程,确保代码的简洁性和可维护性。同时,系统提供了用户友好的错误提示,以增强用户体验。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • 本文探讨了使用JavaScript在不同页面间传递参数的技术方法。具体而言,从a.html页面跳转至b.html时,如何携带参数并使b.html替代当前页面显示,而非新开窗口。文中详细介绍了实现这一功能的代码及注释,帮助开发者更好地理解和应用该技术。 ... [详细]
  • 本文详细探讨了 jQuery 中 `ajaxSubmit` 方法的使用技巧及其应用场景。首先,介绍了如何正确引入必要的脚本文件,如 `jquery.form.js` 和 `jquery-1.8.0.min.js`。接着,通过具体示例展示了如何利用 `ajaxSubmit` 方法实现表单的异步提交,包括数据的发送、接收和处理。此外,还讨论了该方法在不同场景下的应用,如文件上传、表单验证和动态更新页面内容等,提供了丰富的代码示例和最佳实践建议。 ... [详细]
  • 作为软件工程专业的学生,我深知课堂上教师讲解速度之快,很多时候需要课后自行消化和巩固。因此,撰写这篇Java Web开发入门教程,旨在帮助初学者更好地理解和掌握基础知识。通过详细记录学习过程,希望能为更多像我一样在基础方面还有待提升的学员提供有益的参考。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 深入探讨 JavaScript 中 async/await 的常见问题及解决方案 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 本文详细探讨了JavaScript中数组去重的各种方法,并通过实际代码示例进行了深入解析。文章首先介绍了几种常见的去重技术,包括使用Set对象、过滤方法和双重循环等。每种方法都附有具体的实现代码,帮助读者更好地理解和应用这些技术。此外,文中还讨论了不同方法在性能上的优劣,为开发者提供了实用的参考。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 如何在页面底部添加倾斜样式效果? ... [详细]
  • Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用
    Vue 实战基础教程第9讲:深入理解计算属性与侦听器的高效使用 ... [详细]
  • 在ASP.NET中,实现页面间数据传递有多种技术方案。其中一种常见方法是通过URL链接地址传递参数,例如在 `send.aspx` 页面中,可以通过点击按钮将数据附加到URL中,然后在目标页面 `receive.aspx` 中解析这些参数。此外,还可以利用Session、ViewState、Cookie等机制来实现跨页面的数据共享,每种方法都有其适用场景和优缺点。 ... [详细]
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社区 版权所有