import time
import easyocr
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
from PIL import Image, ImageEnhance
import numpy as np
from ultralytics import YOLO
import os
import cv2
# Yolov8 Modelini Yükleme
model = YOLO('yolov8x.pt') # Yolov8x modelini yükleyin
# EasyOCR okuyucusunu oluşturun
reader = easyocr.Reader(['en'], gpu=False) # 'en' sadece İngilizce için, GPU kullanmıyoruz
# WebDriver otomatik olarak en uygun sürümü indirir
service = Service(ChromeDriverManager().install())
# Chrome options ile dil ayarını yapalım
chrome_options = Options()
chrome_options.add_argument("--lang=en") # Tarayıcının dilini İngilizce yap
# WebDriver'ı başlatıyoruz
driver = webdriver.Chrome(service=service, options=chrome_options)
# reCAPTCHA sayfasına git
driver.get("https://portmap.io/register")
# Sayfanın yüklenmesini bekleyin
time.sleep(2)
# "Ben robot değilim" butonunu bul ve tıkla
captcha_button = driver.find_element(By.CLASS_NAME, 'g-recaptcha')
captcha_button.click()
# Sayfanın yüklenmesini bekleyin
time.sleep(3)
# Sayfanın anlık görüntüsünü alıyoruz
screenshot_path = "C:/Users/x/Desktop/recaptcha_full_screenshot.png"
driver.save_screenshot(screenshot_path)
print(f"reCAPTCHA tam ekran görüntüsü kaydedildi: {screenshot_path}")
# Ekran görüntüsünü okuyoruz
image = Image.open(screenshot_path)
# Kırpma işlemi (eğer gerekliyse)
crop_top = 0
crop_bottom = 0
crop_right = 200
crop_left = 475
image_width, image_height = image.size
left = crop_left
top = crop_top
right = image_width - crop_right
bottom = image_height - crop_bottom
cropped_image = image.crop((left, top, right, bottom))
cropped_image_path = "C:/Users/x/Desktop/recaptcha_cropped_screenshot.png"
cropped_image.save(cropped_image_path)
print(f"Kırpılmış reCAPTCHA ekran görüntüsü kaydedildi: {cropped_image_path}")
# OCR işlemine başla
ocr_results = []
clickable_text = ""
image = Image.open(cropped_image_path)
enhancer = ImageEnhance.Contrast(image)
image = enhancer.enhance(2.0) # Kontrast artırma
image_cv = np.array(image)
# Görüntüyü gri tonlama ve ikili eşikleme işlemi yapalım
gray_image = cv2.cvtColor(image_cv, cv2.COLOR_RGB2GRAY)
_, thresh_image = cv2.threshold(gray_image, 150, 255, cv2.THRESH_BINARY)
preprocessed_image = Image.fromarray(thresh_image)
# OCR işlemi
result = reader.readtext(np.array(preprocessed_image))
# OCR sonuçlarını yazdırıyoruz ve tıklanacak metni belirliyoruz
for detection in result:
print(f"Metin: {detection[1]}")
ocr_results.append(detection[1])
if detection[1].lower() in ["skip", "verify"]: # OCR sonucunun küçük harfe çevrilmesi
clickable_text = detection[1].lower()
# Eğer OCR'den ikinci bir metin varsa, bunu tıklanacak metin olarak kabul edelim
if len(ocr_results) > 1:
clickable_text = ocr_results[1].lower()
print(f"Tıklanacak obje: {clickable_text}")
# Log dosyasına yazıyoruz
with open('log.txt', 'a') as log_file:
log_file.write(f"Tekrar 1:\n") # Burada döngü numarasını dinamik yapabiliriz
for text in ocr_results:
log_file.write(f"Metin: {text}\n")
log_file.write(f"Tıklanacak metin: {clickable_text}\n\n")
# YOLOv8 modelini çalıştırarak nesneleri tespit et
results = model(cropped_image_path) # Modeli çalıştırıyoruz ve sonuçları alıyoruz
# Tespit edilen nesneleri kontrol et
found_clickable = False
for result in results: # Yolov8 modelinden alınan her sonucu döngü ile işliyoruz
for box in result.boxes: # Her kutu için tespit edilen sınıfı alıyoruz
class_name = result.names[int(box.cls)] # Tespit edilen nesnenin sınıf ismini alıyoruz
print(f"Yolov8 - Tespit Edilen Nesne: {class_name} (Box: {box.xyxy})")
# OCR metni ile karşılaştırma ve benzer nesneyi bulma
if clickable_text and clickable_text in class_name.lower():
print(f"Tıklanacak nesne: {class_name} ({box.xyxy})")
# Öğenin koordinatları (box.xyxy formatında)
x1, y1, x2, y2 = box.xyxy.tolist()
# Nesnenin ortasına tıklama
click_x = (x1 + x2) / 2
click_y = (y1 + y2) / 2
# Sayfa boyutunu hesaplayalım
page_width = driver.execute_script("return document.documentElement.scrollWidth")
page_height = driver.execute_script("return document.documentElement.scrollHeight")
# Tarayıcıda tıklama işlemini simüle etme
try:
# Sayfa kaydırması için tıklama pozisyonunu normalize edelim
driver.execute_script(f"window.scrollTo({click_x - page_width / 2}, {click_y - page_height / 2});")
time.sleep(0.5) # Kaydırma işlemi için kısa bir süre bekleyelim
# Öğeyi tıklamak için JavaScript kullanıyoruz
driver.execute_script(f"window.scrollTo({click_x}, {click_y});")
print(f"Tıklama pozisyonu: ({click_x}, {click_y})")
# Mouse simülasyonu: öğenin üzerine geliyoruz ve tıklıyoruz
element = driver.execute_script(
f"var elem = document.elementFromPoint({click_x}, {click_y});"
"elem.click();"
)
found_clickable = True
print(f"{class_name} öğesi tıklandı!")
break
except Exception as e:
print(f"Tıklama işlemi başarısız oldu: {str(e)}")
if found_clickable:
break
# Tarayıcıyı kapatmıyoruz, kullanıcı manuel olarak kapatana kadar açık kalacak
input("Tarayıcıyı manuel olarak kapatın ve devam etmek için Enter'a basın...")