記一次【模擬點擊】,WinForm小軟體開發過程

来源:http://www.cnblogs.com/BenAndWang/archive/2017/09/21/7567982.html
-Advertisement-
Play Games

前言 年初四月份的時候,有朋友找到我,說想開發一個模擬點擊的軟體。最終軟體做完後,發現效果不理想。唯一開發的我是認為最好是放棄了,做運營的他,堅持說這個沒問題,說是改變合作方式。最終也是不了了之了。 不過,在這中間經歷了一次重寫,三次核心方法的變更,無數次的查資料,找解決辦法至凌晨。中間穿插了無數次 ...


前言

       年初四月份的時候,有朋友找到我,說想開發一個模擬點擊的軟體。最終軟體做完後,發現效果不理想。唯一開發的我是認為最好是放棄了,做運營的他,堅持說這個沒問題,說是改變合作方式。最終也是不了了之了。

        不過,在這中間經歷了一次重寫,三次核心方法的變更,無數次的查資料,找解決辦法至凌晨。中間穿插了無數次的討論修改,修改討論。雖然功能很簡單,但是也花費了三個月的心血。心想,還是想好好總結一下。最後的軟體界面如下:

 

實現思路&使用控制項

       首先,在內置瀏覽器裡面打開網頁,通過Javascript 獲取需要的點擊的坐標位置;計算網頁中的坐標,在屏幕中的坐標位置;通過模擬滑鼠的操作(滾動滑輪,移動,點擊);以及隨機的二次點擊。最後再清除緩存,更換IP,更換解析度,以及User-Agent。來達到欺騙網站,認為是不同的人來點擊的目的。

       使用的具體方法,如下:

  1. 內置瀏覽器,CefSharp 49.0 為了相容.NET 4.0,大部分Win7可以直接使用;
  2. 滑鼠,鍵盤模擬輸入,InputSimulator , 最早之前是直接調用Windows API的,沒有這個好用;
  3. 切換IP,兩種ADSL切換 和 IP精靈軟體(ADSL 這個目前沒有使用的,DotRas.dll);
  4. 切換解析度,是直接拿Github上面代碼直接用。ScreenResolutionChanger;
  5. License 使用 EasyLicense;
  6. 本地資料庫SQLite;
  7. 代碼混淆 .NET Reactor;

小小的記錄

       殺毒軟體的坑使用模擬輸入的時候,一直提示 User Interface Privilege Isolation(用戶界面特權隔離) 的問題,許可權不夠。試了關閉Windows的UAC,用超級管理員啟動,給軟體加數字證書,放到C盤系統目錄等等。各種方法都試了就是無法模擬操作。實在沒辦法了,然後在豬八戒上面發佈任務,放上Demo。萬萬沒想到,一個大學生給我解決了,是因為360等殺毒軟體導致的。。。。

       IP精靈DLL版本的坑:最開始用的他們官網提供的dll,發現他們那個dll基本用不起來,好像是許久不更新了。另外,狀態編碼也會隨意改變,也不發更新通知。造成也結果就是,明明以前好好的,怎麼今天就突然用不起來了。

      ADSL測試的坑:代碼寫好後無法測試,或者測試起來很麻煩。現在這年代用ADSL撥號上網的越來越少了,同樣想測試也麻煩。好不容易找了個遠程的ADSL主機,結果一測試就斷網,尷尬。。。

      獲取網路時間:為了避免用戶直接修改系統時間,來達到突破License 。獲取到 大門戶網站 http header 中的 date 來檢驗本地時間是否準確。在這中間,我發現大陸封殺了好多的時間同步的網站,只有一兩個能用,又極度不穩定,並且中科院的又用不起。坑貨!!

      SQLite小巧玲瓏:之前第一個版本用 純文本來存放配置文件,記錄日誌信息。極度不方便,容易出現數組越界這樣的bug。後來採用sqlite後,才發現了開發的美好。sqlite擁有完整的sql那一套東西,並且體積又小,不用安裝,非常適合做本地少量信息的存儲。

       屏幕解析度:最開始是手動實現windows api 來獲取列表,改變解析度的,bug又多又不完善。某天靈光一閃,在github上面找了一下真還有這個代碼,省了不少事情。另外,我還發現wiki上面寫的,顯示解析度列表 總共只有那麼幾十個,可見解析度的大小,不是隨意寫的。但是通過windows api 獲取到的列表 就一大堆有幾百個。我分析,是因為解析度,色深,赫茲。這三個參數排列組合導致的。

        Cefsharp文檔的重要性:清除緩存,清除cookie,Storage。設置彈出方式,重寫http header,執行javascript等等。一系列的內置瀏覽器的操作,都是看github上面的wiki,以及google看英文文檔(baidu就是坑爹貨,同樣的文章,轉來轉去;一般第一頁80%廣告,前三頁都是同樣的內容,剩下的風馬牛不相及)。沒有別人幫助,只有硬著頭皮翻譯一點看一點,然後寫代碼試。如果找不到實現方法,也要去看看為什麼不能實現。記錄一些,我認為比較重要的地方:

  • ILifeSpanHandler  控制Cefsharp彈出的視窗 事件。(DoClose,OnAfterCreated,OnBeforeClose,OnBeforePopup)
  • IRequestHandler 控制Cefsharp發送請求的事件,太多了不一一列舉。
  • Cef.Initialize 只能初始化一次,如果想徹底清除緩存,必須關閉宿主程式。 如果在主程式內,調用Cef.Shutdown 後再次初始化會報錯的。49.0版本有這個問題,後續的版本修複了這個問題。
  • 執行 js 的時候,要註意鎖的問題,使用 Monitor 更加精細的控制。
  • 重新翻譯了github上部分Cefsharp文檔。

       WinForm開發:第一次寫winform程式,認為是小程式,各種粗製濫造。尤其是到後期,主窗體代碼到達一兩千行,邏輯調用混亂,真心看不下去了,修改起來的很費勁。乾脆重新寫吧。重新設計文檔目錄,窗體拆分,代碼分類,左搞右搞,總算勉強能看,但是今天又把代碼翻出來看了看,總感覺什麼地方不對,又說不出是哪裡不對。。。

  • 線程的重要性,寫慣了web,極少情況考慮線程的問題。但是在桌面程式裡面,線程是非常重要的問題,尤其是非主線程操作UI界面的時候。
  • 事件的運用,同樣,在桌面程式裡面,事件使用起來非常舒服。以前對代理,事件也僅僅知道概念。實踐之後,才知道這個是多麼優秀的設計。
  • VS 所見即所得的窗體設計界面,由於 Cefsharp 運行時載入控制項的,也就是開發時設計界面打不開。這也算一點小麻煩。
  • 通過句柄的操作。 主要獲得主界面句柄,獲取按鈕句柄,然後SendMessage,來觸發按鈕事件。還有就是,win7 之前和之後的SendMessage 大有不同,要註意。

       輔助進程啟動:由於Cef必須完全關掉宿主進程,才可以徹底清除緩存。所以,當時就採用了,輔助進程來重啟主進程。這個比較簡單,涉及到Process的一些操作,為了方便易用,同時還設計了熱鍵功能。

       License 註冊:這個比較簡單,參照demo。我獲取的是本機的CPU序列號,主板序列號,硬碟的ID(為什麼不是序列號,因為硬碟市場參差不齊,還有的廠家不存在序列號)。為了防止被猜到,我隨便加了點料(當時的真實感受)。最後MD5加密,提取哈希值。如下圖:

 

總結

  1. 經過這麼一折騰,深深得感覺到,程式員主要作用是在組裝代碼的:把不相干的代碼有機的拼裝在一起,組成一個可以使用的軟體。
  2. 善於利用google,github,stack overflow,基本能解決99%的技術問題。
  3. 英語非常非常重要,百度非常非常坑。
  4. 實在頭疼腦熱的時候,不舒服的時候,不如去休息。
  5. 需求的確認,這是非常重要的事情。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 為什麼不用FiddlerCore? 說到FiddlerCore大家可能會比較陌生,那麼它哥Fiddler就比較熟悉了;抓包、模擬低帶寬、修改請求我平時比較常用。Fiddler的本質就是一個HTTP代理伺服器。 FiddlerCore是Fiddler去除了UI的核心組件,可以用於二次開發。如下圖所示: ...
  • 我在別的網站上下載了一個mp4格式的視頻,加到video標簽里可以正常播放, 然後我用FLV自己轉成mp4,卻提示不支持的格式和mine類型, 後來找到一篇文章 http://jingyan.baidu.com/article/49711c617a940cfa441b7cc6.html 發現了一個關 ...
  • 對非同步CTP感興趣有很多原因。非同步CTP使非同步編程比以前更加容易了。它雖然沒有Rx強大,但是更容易學。非同步CTP介紹了兩個新的關鍵字,async和await。非同步方法(或Lambda表達式)必須返回void,Task或Task<TResult>。這篇文章不是介紹非同步CTP的,因為網上有很多這樣的文章 ...
  • 關於Visio Studio 2012使用Nuget獲取Sqlite驅動包報錯:“System.Data.SQLite.EF6”的架構版本與 NuGet 的版本 2.0.30625.9003 不相容 ...
  • 1、IIS(Internet Information Services)網站本機可以訪問,區域網其他機器無法訪問 導致這個問題之一是防火牆規則,解決辦法如下: 【開始】打開【控制面板】,選擇【WINDOWS 防火牆】,進入 在防火牆界面,選擇左側邊欄的【高級設置】 在彈出的高級安全Windows防火 ...
  • 封裝了一個選擇年月的控制項,XAML代碼: <UserControl x:Class="SunCreate.CombatPlatform.Client.DateMonthPicker" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presen ...
  • VB是古老的編程語言,雖然微軟已經宣佈放棄了它,但是它依然是快速開發,簡單易用,投入少,收效快的一門語言,令我驚奇的是它竟然是面向對象的編程語言,現如今面向對象的語言比較流行的就是java和C#了,但是要想去更深層次的去學習C#,學習和瞭解VB是必不可少的,由於本人之前對java非常熟悉,但是對於V ...
  • 頁面的索引主要是運用了MsSql的全文索引,如果你還不瞭解全文索引,可以使用以下鏈接來瞭解全文索引的相關知識 https://docs.microsoft.com/zh-cn/sql/relational-databases/search/full-text-search ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...