WPF做12306驗證碼點擊效果

来源:http://www.cnblogs.com/ZXdeveloper/archive/2016/12/30/6238484.html
-Advertisement-
Play Games

一、效果 和12306是一樣的,運行一張圖上點擊多個位置,橫線以上和左邊框還有有邊框位置不允許點擊,點擊按鈕輸出坐標集合,也就是12306登陸的時候,需要向後臺傳遞的參數。 二、實現思路 1、獲取驗證碼圖片 首先,我們看12306登陸頁面,F12,通過如圖的位置,我們可以觀察到,驗證碼的請求URL是 ...


一、效果

和12306是一樣的,運行一張圖上點擊多個位置,橫線以上和左邊框還有有邊框位置不允許點擊,點擊按鈕輸出坐標集合,也就是12306登陸的時候,需要向後臺傳遞的參數。

二、實現思路

1、獲取驗證碼圖片

首先,我們看12306登陸頁面,F12,通過如圖的位置,我們可以觀察到,驗證碼的請求URL是“https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.8291445260649148”,

我不知道0.8291445260649148這一串數字是如何得到的,所以,先把它從裡面去掉,只留下“https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand”,

寫一個Request請求,發現,可以請求到驗證碼圖像,並且每次都不一樣,因此,這段URL就夠了。

圖片的大小一直都是293*190,這是為了方便拿取坐標。

2、分析驗證碼圖片

通過在12306官網的點擊,可以發現,橫線以上的部分是不讓點擊的,左側和右側的空白部分也不讓點擊,那我們在做的時候,就需要選取一個範圍,作為滑鼠可點擊的範圍。

通過GetPosition方法,可以輕鬆的獲取到中心圖片的四個角的坐標為(5,40)(5,180)(288,40)(288,180)也就是說,我們的可點擊區域就是5=<X<=288 && 40=<Y<=180。

這樣的話,我們在觸發滑鼠點擊實踐的時候,判別Position是否在這個範圍。

3、滑鼠點擊,打上鐵老大的Logo

在滑鼠點擊驗證碼的時候,將鐵老大的Logo打上去,其實很簡單,就是給Logo設置一個Canvas的附加屬性,但是需要註意的是,我們預設打上去的時候,並不是Logo的中心位置,而是左上角位置,因此,還要計算中心

比如,我的Logo是32*32的,也就是說Position.X-16,Position.Y-16,這樣,才能保證Logo上去以後,是中心為滑鼠點擊的位置。

當點擊Logo時,Logo從Canvas里移除掉,這樣就可以實現點擊取消的效果。

<Grid>
  <Grid.RowDefinitions>
    <RowDefinition Height="*" />
    <RowDefinition Height="Auto" />
  </Grid.RowDefinitions>
  <Canvas x:Name="cav" Grid.Row="0">
    <Image x:Name="img" Height="190" Width="293" MouseLeftButtonDown="img_MouseLeftButtonDown" />
  </Canvas>
  <Button Grid.Row="1" Content="坐標集合" x:Name="btn" Click="btn_Click" />
</Grid>
private void img_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    BitmapImage imageIcon = new BitmapImage(new Uri(@"pack://application:,,,/12306SecurityCode;component/favicon.ico", UriKind.RelativeOrAbsolute));
    System.Windows.Point pointImg = e.GetPosition(img);
    System.Windows.Point pointCav = e.GetPosition(cav);
    if (pointImg.X >= 5 && pointImg.X <= 288 && pointImg.Y >= 40 && pointImg.Y <= 180)
    {
        System.Windows.Controls.Image imgIco = new System.Windows.Controls.Image()
        {
            Source = imageIcon
        };
        imgIco.MouseLeftButtonDown += ImgIco_MouseLeftButtonDown;
        Canvas.SetLeft(imgIco, pointCav.X - 16);
        Canvas.SetTop(imgIco, pointCav.Y - 16);
        cav.Children.Add(imgIco);
        ImgicoList.Add(imgIco);
    }
}
private void ImgIco_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    System.Windows.Controls.Image imgico = (System.Windows.Controls.Image)sender;
    cav.Children.Remove(imgico);
    ImgicoList.Remove(imgico);
}

4、獲取剩下的Logo位置

不斷的增加Logo,不斷的減少Logo,獲取最後留下的Logo,其實,就是一個用一個List集合來保存,最開始是想保存坐標的,但是發現如果保存坐標的話,控制起來會很費事,因此,就保存Logo的集合,最後,讀取Logo的坐標

private System.Windows.Point GetIcoPoint(System.Windows.Controls.Image image)
{
    System.Windows.Point point = new System.Windows.Point();
    point.X = Canvas.GetLeft(image) + 16;
    point.Y = Canvas.GetTop(image) + 16 - 40;
    return point;
}

因為,這部分坐標是要傳回給12306,用來解析的,因此,我們首先需要還原,原來點擊時的坐標,也就是需要加上Logo的半徑大小16。

然後,我們看12306接收的坐標信息 7%2C11%2C282%2C10,(2,11)(282,10),這裡的Y是11或者是10,也就是減去了橫線以上的高度,為了方便,我們減掉40。

5、拼接字元串

因為圖片中寫的是“所有的”,因此是不需要判別先後循序的,只需要取得所有留下點的坐標就OK了,增加“%2C”作為標誌,拼接所有的X和Y值

private void btn_Click(object sender, RoutedEventArgs e)
{
    string s = string.Empty;
    foreach (var item in ImgicoList)
    {
        System.Windows.Point point = GetIcoPoint(item);
        s += point.X + "%2C" + point.Y + "%2C";
    }
    s = s.Substring(0, s.Length - 3);
    MessageBox.Show(s);
}

 


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

-Advertisement-
Play Games
更多相關文章
  • 1、Bin 目錄 用來存放編譯的結果,bin是二進位binary的英文縮寫,因為最初C編譯的程式文件都是二進位文件,它有Debug和Release兩個版本,分別對應的文件夾為bin/Debug和bin/Release,這個文件夾是預設的輸出路徑,我們可以通過:項目屬性—>配置屬性—>輸出路徑來修改。 ...
  • 1、在程式最前面加: #define _CRT_SECURE_NO_DEPRECATE 2、在程式最前面加: #pragma warning(disable:4996) 3、把scanf改為scanf_s; 4、無需在程式最前面加那行代碼,只需在新建項目時取消勾選“SDL檢查”即可; 5、若項目已建 ...
  • 一、下麵是在創建一個新的項目是我最常用的,現在對他們一一做一個詳細的介紹: 1、Win32控制台應用程式我平時編寫小的C/C++程式都用它,它應該是用的最多的。 2、名稱和解決方案名稱的區別:名稱是項目的名稱,一個解決方案中可以包含多個項目,所以解決方案名稱包含項目名稱。 3、新建Git存儲庫(G) ...
  • 應用場景 應用場景 angular2(下文中標註位NG2)項目和.net mvc項目分別開發,前期採用跨域訪問進行並行開發,後期只需要將NG2項目的生產版本合併到.net項目。 NG2項目概述 NG2項目概述 ng2項目採用的是angular-cli搭建的框架。 使用type script、rxjs ...
  • 在我上篇隨筆《在DevExpress程式中使用Winform分頁控制項直接錄入數據並保存》中介紹了在GridView以及在其封裝的分頁控制項上做數據的直接錄入的處理,介紹情況下數據的保存和校驗等操作,不過還沒有涉及到數據列表選擇的這種方式,而這種在項目應用也是比較廣泛的一種輸入方式。本篇隨筆繼續探討在G... ...
  • //我的C#是跟著猛哥(劉鐵猛)(算是我的正式老師)《C#語言入門詳解》學習的,微信上猛哥也給我講解了一些不懂得地方,對於我來說簡直是一筆巨額財富,難得良師! 這次與大家一起學習C#中的值參數 傳值參數(也叫值參數) 值參數 (value parameter) 什麼是值參數? 這是從《C#語言規範5 ...
  • 看下組織結構: System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.Mutex System.Threading.Semaphore System.Threading.EventWa ...
  • 恢復內容開始 第一次發表博文,發表博文的目的是鞏固自己的技術,也能夠共用給大家。寫的不好的地方,希望大家多給給意見。老司機勿噴 數據結構() NewsTypeId 新聞ID, NewsTypeName 新聞名稱 NewsTypeParentId 父級ID 後臺語言:ASP.NET MVC4 後臺代碼 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...