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

來源:互聯網
上載者:User

標籤:配置   info   分類   軟體   日誌資訊   sql   shutdown   img   不用   

前言

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

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

 

實現思路&使用控制項

       首先,在內建瀏覽器裡面開啟網頁,通過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 所見即所得 (WYSIWYG)的表單設計介面,由於 Cefsharp 運行時載入控制項的,也就是開發時設計介面打不開。這也算一點小麻煩。
  • 通過控制代碼的操作。 主要獲得主介面控制代碼,擷取按鈕控制代碼,然後SendMessage,來觸發按鈕事件。還有就是,win7 之前和之後的SendMessage 大有不同,要注意。

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

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

 

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.