隨記-點選驗證碼

文字驗證碼(點擊文字)

  • 模板匹配(從一張圖片中尋找 icon),放棄,目前準確率不高,且處理過程復雜

    • 灰度處理
    • 將 complete_image_path 截取并另存為 target_image_path, verify_image_path
    • 將 target_image_path 截取并另存為 icon
    • 從 verify_image_path 中找到 icon
  • 借助 ddddocr

    • ddddocr
    • 直接將 complete_image_path,target_image_path,verify_image_path 丟給 ddddocr 獲取結果

主要代碼

save_image

def save_image(style_value):"""保存圖片(目標圖片 和 驗證圖片)"""# 獲取驗證圖片bg_img_url = re.search(r"""url\("(?P<url>.*?)"\);""", style_value)bg_img_width = re.search(r""".*width:.*?(?P<width>.*?)px;""", style_value)bg_img_height = re.search(r""".*height:.*?(?P<height>.*?)px;""", style_value)bg_img_right = re.search(r""".*right:.*?(?P<right>.*?)px;""", style_value)bg_img_top = re.search(r""".*top:.*?(?P<top>.*?)px;""", style_value)complete_image_path = Noneimage_name = ""size_info = {}if bg_img_url:url = bg_img_url.groupdict().get("url", "")re_image_name = re.search(r""".*/(?P<image_name>.*?).jpg\?""", url)if re_image_name:temp_key = "image_name"image_name = re_image_name.groupdict().get(temp_key, "")size_info.update(bg_img_width.groupdict())size_info.update(bg_img_height.groupdict())size_info.update(bg_img_right.groupdict())size_info.update(bg_img_top.groupdict())data = requests.get(url, verify=False)complete_image_path = f"{base_path}{image_name}_complete.jpg"# 保存驗證圖片(原圖)with open(complete_image_path, "wb") as wbf:wbf.write(data.content)image_obj = cv2.imread(complete_image_path)height, width, channel = image_obj.shapefor element_key, element_value in size_info.items():size_info[element_key] = int(element_value)point = (0, height-size_info["height"], size_info["width"], height)image_crop_target = image_obj[height-size_info["height"]:height, 0:size_info["width"]]image_crop_verify = image_obj[0:height-size_info["height"], 0:width]# 保存目標圖片target_image = f"{image_name}_target.jpg"target_image_path = f"{base_path}{target_image}"# cv2.imshow("image_crop", image_crop_target)# cv2.waitKey(0)cv2.imwrite(target_image_path, image_crop_target)# 保存verify圖片verify_image = f"{image_name}_verify.jpg"verify_image_path = f"{base_path}{verify_image}"# cv2.imshow("image_crop", image_crop_target)# cv2.waitKey(0)cv2.imwrite(verify_image_path, image_crop_verify)return complete_image_path, target_image_path, verify_image_path

save_image_crop


def save_image_crop(image_path, width_size = 26):"""裁切目標圖片"""image_obj = Image.open(image_path)width, height = image_obj.width, image_obj.height left_top_point = [] # 左上for i in range(0, width, width_size):left_top_point.append((i, 0))right_bottom_point = [] # 右下for i in range(width_size, width, width_size):right_bottom_point.append((i, height))crop_target_list = []min_len = min(len(left_top_point), len(right_bottom_point))for i in range(min_len):temp_list = []temp_list.extend(left_top_point[i])temp_list.extend(right_bottom_point[i])point = tuple(temp_list) image_crop = image_obj.crop(point)re_image_name = re.search(r""".*/(?P<image_name>.*?).jpg""", image_path)image_name = ""if re_image_name:temp_dict = re_image_name.groupdict()image_name = temp_dict["image_name"] image_name_list = image_name.split("_")image_name_list.append(str(i))new_image_name = "_".join(image_name_list)new_image_path = f"{base_path}/{new_image_name}.jpg"image_crop.save(new_image_path)crop_target_list.append(new_image_path)return crop_target_list, height

object_detection


def object_detection(complete_image_path):det = ddddocr.DdddOcr(det=True, show_ad=False)with open(complete_image_path, 'rb') as f:image = f.read()poses = det.detection(image)print(poses) im = cv2.imread(complete_image_path)for box in poses:x1, y1, x2, y2 = boxim = cv2.rectangle(im, (x1, y1), (x2, y2), color=(0, 0, 255), thickness=2)cv2.imshow("object_detection", im)cv2.waitKey(0)

main


if __name__ == "__main__":driver = get_driver()  driver.get('https://www.bixxxxli.com/')click_element(driver, """ //div[@class="header-login-entry"] """)click_element(driver, """ //div[@class="login-tab-item"] """)input_element(driver, """ //div[@class="login-sms-wp__cid"]/../input """, "15266666666")click_element(driver, """ //div[@class="login-sms-wp__cid"]/../div[@class="login-sms-send clickable "] """)style_value = get_element_value(driver, """ //div[@class="geetest_widget"]//div[@class="geetest_tip_img"] """, "style")complete_image_path, target_image_path, verify_image_path = save_image(style_value)object_detection(complete_image_path)object_detection(target_image_path)object_detection(verify_image_path)print

Source Code


到此結? DragonFangQy 2024.03.02

本博文僅供學習參考之用,不得用于其他任何目的。如有任何內容侵犯到您的隱私或權益,敬請立即聯系我,我將及時刪除或修正相關內容。感謝您的理解與支持,期待與您共同維護一個友善、尊重知識產權的網絡環境。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713698.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713698.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713698.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WPF真入門教程30--順風物流單據管理系統

1、教程回顧 到現在為止&#xff0c;真入門系列教程已完成了29刺由淺入深地講解&#xff0c;當然不可能講到了WPF的所有技能點&#xff0c;但讀者看到了wpf的內部各種功能及之間的聯系&#xff0c;在此基礎上&#xff0c;提供一個完整有效的綜合項目&#xff0c;本項目采用的是…

c++知識點之 --this

在成員函數中存在。struct和class每個成員函數都隱含一個名為this的指針形參&#xff0c;并且它是該成員函數的第一個參數&#xff0c;當某個對象調用成員函數時&#xff0c;就會把該對象的地址傳給被調用成員函數的隱式形參this。 this是一個指針 &#xff0c;存放的是當前對象…

加密與安全_深入了解Hmac算法(消息認證碼)

文章目錄 PreHMAC概述常見的Hmac算法Code隨機的key的生成 KeyGeneratorHmacMD5用Hmac算法取代原有的自定義的加鹽算法 HmacMD5 VS MD5HmacSHA256 Pre 加密與安全_深入了解哈希算法中我們提到&#xff0c; 存儲用戶的哈希口令時&#xff0c;要加鹽存儲&#xff0c;目的就在于抵…

操作系統系列學習——CPU管理的直觀想法

文章目錄 前言CPU管理的直觀想法 前言 一個本碩雙非的小菜雞&#xff0c;備戰24年秋招&#xff0c;計劃學習操作系統并完成6.0S81&#xff0c;加油&#xff01; 本文總結自B站【哈工大】操作系統 李治軍&#xff08;全32講&#xff09; 老師課程講的非常好&#xff0c;感謝 【…

OpenLayers線性漸變和中心漸變(徑向漸變)

目錄 1.前言2.添加一個面要素3.線性漸變3.1 第一個注意點3.2 第二個注意點 4.中心漸變&#xff08;徑向漸變&#xff09;5.總結 1.前言 OpenLayers官網有整個圖層的漸變示例&#xff0c;但是沒有單個要素的漸變示例&#xff0c;我們這里來補充一下。OpenLayers中的漸變是通過fi…

python defaultdict

python中的dict是一個重要的數據類型&#xff0c;知道如何使用這個數據類型很簡單&#xff0c;但是這個類型使用過程中容易進入一些誤區&#xff0c;這篇文章主要對defaultdict方法的講解&#xff0c;深入的了解dict數據類型。 字典&#xff08;dictionary&#xff09;數據類型…

編譯鏈接實戰(22)C/C++代碼覆蓋率統計報告生成

文章目錄 GCOV 工具簡介gcov 使用lcov相關編譯選項 GCOV 工具簡介 gcov是一個測試代碼覆蓋率的工具&#xff0c;它是 gcc 自帶的查看代碼覆蓋率的工具。 與GCC結合使用&#xff0c;可以分析您的程序以幫助創建更高效、運行更快的代碼&#xff0c;并發現程序中未經測試的部分。…

PCIE 4.0 L0s/L1/L2

L0是PCIE設備正常工作的狀態&#xff0c;當設備鏈路處于非工作狀態可以跳轉大相應的低功耗狀態&#xff0c;L0s是一種可以快速恢復到L0的低功耗狀態&#xff1b;L1必須經過Reovery狀態才可以恢復到L0狀態&#xff1b;L2需要從Detect開始逐步進入到L0狀態。它們的恢復時間依次延…

麒麟銀河操作系統V10部署ffmpeg(也能用于Linux系統)

麒麟銀河操作系統V10部署ffmpeg(也能用于Linux系統) 部署ffmpeg用來處理視頻的各種操作 想使用ffmpeg&#xff0c;要先安裝nasm&#xff0c;yasm&#xff0c;x264之后&#xff0c;否則會報錯 nkvers 查看麒麟操作系統版本 cat /proc/version #查看linux版本信息 uname -a …

Android修行手冊-Chaquopy中opencv、numpy的初步應用

Unity3D特效百例案例項目實戰源碼Android-Unity實戰問題匯總游戲腳本-輔助自動化Android控件全解手冊再戰Android系列Scratch編程案例軟考全系列Unity3D學習專欄藍橋系列ChatGPT和AIGC &#x1f449;關于作者 專注于Android/Unity和各種游戲開發技巧&#xff0c;以及各種資源分…

SpringBoot源碼解讀與原理分析(三十八)SpringBoot整合WebFlux(一)WebFlux的自動裝配

文章目錄 前言第13章 SpringBoot整合WebFlux13.1 響應式編程與Reactor13.1.1 命令式與響應式13.1.2 異步非阻塞13.1.3 觀察者模式13.1.4 響應性13.1.5 響應式流13.1.6 背壓13.1.7 Reactor13.1.7.1 Publisher13.1.7.2 Subscriber13.1.7.3 Subscription13.1.7.4 Processor13.1.7.…

BF算法實現(Python,C++)

BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是將目標串S的第一個字符與模式串T的第一個字符進行匹配&#xff0c;若相等&#xff0c;則繼續比較S的第二個字符和 T的第二個字符&#xff1b;若不相等&#xff0c;則比…

Leetcoder Day32| 貪心算法part05

763.劃分字母區間 字符串 S 由小寫字母組成。我們要把這個字符串劃分為盡可能多的片段&#xff0c;同一字母最多出現在一個片段中。返回一個表示每個字符串片段的長度的列表。 示例&#xff1a; 輸入&#xff1a;S "ababcbacadefegdehijhklij"輸出&#xff1a;[9,7…

今日早報 每日精選15條新聞簡報 每天一分鐘 知曉天下事 3月2日,星期六

每天一分鐘&#xff0c;知曉天下事&#xff01; 2024年3月2日 星期六 農歷正月廿二 1、 氣象局&#xff1a;3月份仍有5次冷空氣影響我國&#xff1b;全國多地或提前入春。 2、 央行&#xff1a;將外籍來華人員移動支付單筆交易限額由1000美元提高到5000美元。 3、 神舟十七號航…

全量知識系統問題及SmartChat給出的答復 之8 三套工具之3語法解析器 之1

Q19. 問題 : 解釋單詞解釋單詞occupied 的字典條目 (word-def occupiedinterest 5type EBsubclass SEBtemplate (script $Demonstrateactor nilobject nildemands nilmethod (scene $Occupyactor nillocation nil))fill (((actor) (top-of *actor-s…

【源碼】imx6ull實現觸摸屏單點實驗

一、本實驗實驗的器材&#xff1a; 1.正點原子imx6ull的阿爾法開發板v2.2 2.屏幕ALIENTEK 4.3 RGBLCD 二、實驗已經移植好的文件&#xff1a; 倉庫代碼&#xff1a;https://gitee.com/wangyoujie11/atkboard_-linux_-driver.git 1.文件說明 23_multitouch &#xff1a;驅動代…

aws平臺的ec2實例 GNU/Linux系統安裝docker流程

在AWS EC2實例上安裝Docker的流程與其他GNU/Linux系統基本相同。以下是在AWS EC2實例上安裝Docker的一般步驟&#xff1a; 登錄到AWS EC2實例&#xff1a; 使用SSH或者其他遠程登錄方式登錄到你的GNU/Linux實例。 更新系統包管理器&#xff1a; 對于基于Amazon Linux的系統&am…

常見Prometheus exporter部署

常見Prometheus exporter部署 Prometheus部署Node exporterProcess exporterRedis exporterMySQL exporterOracleDB exporter Prometheus部署 本地部署&#xff1a; wget https://github.com/prometheus/prometheus/releases/download/v*/prometheus-*.*-amd64.tar.gz tar xv…

java的jar打包docker鏡像,啟動加載

測試環境&#xff0c;打包鏡像 1,把jar包復制/data/liu/mssda.jar, cd到這個目錄下 2&#xff0c;創建Dockerfile文件&#xff0c;jdk17版本&#xff0c;內容如下 jdk8版本 FROM openjdk:8-jre-alpine WORKDIR /app COPY . /app CMD ["java", "-jar",…

最大奇約數(c++題解)

內存限制&#xff1a; 128 MiB時間限制&#xff1a; 100 ms標準輸入輸出題目類型&#xff1a; 傳統評測方式&#xff1a; 文本比較 題目描述 定義函數f(x)表示x的最大奇約數&#xff0c;這里x表示正整數。例如&#xff0c;f(20) 5&#xff0c;因為20的約數從小到大分別有&am…