@@ -1629,6 +1629,152 @@ def gui_click_element(self, selector, timeframe=0.25):
16291629 self .__slow_mode_pause_if_set ()
16301630 self .loop .run_until_complete (self .page .wait ())
16311631
1632+ def _on_a_cf_turnstile_page (self ):
1633+ source = self .get_page_source ()
1634+ if (
1635+ 'data-callback="onCaptchaSuccess"' in source
1636+ or "/challenge-platform/scripts/" in source
1637+ or 'id="challenge-widget-' in source
1638+ or "cf-turnstile-" in source
1639+ ):
1640+ return True
1641+ return False
1642+
1643+ def gui_click_captcha (self ):
1644+ if not self ._on_a_cf_turnstile_page ():
1645+ return
1646+ selector = None
1647+ if (
1648+ self .is_element_present ('[name*="cf-turnstile-"]' )
1649+ and self .is_element_present ("#challenge-form div > div" )
1650+ ):
1651+ selector = "#challenge-form div > div"
1652+ elif (
1653+ self .is_element_present ('[name*="cf-turnstile-"]' )
1654+ and self .is_element_present (
1655+ '[style="display: grid;"] div div'
1656+ )
1657+ ):
1658+ selector = '[style="display: grid;"] div div'
1659+ elif (
1660+ self .is_element_present ('[name*="cf-turnstile-"]' )
1661+ and self .is_element_present ("[class*=spacer] + div div" )
1662+ ):
1663+ selector = '[class*=spacer] + div div'
1664+ elif (
1665+ self .is_element_present ('[name*="cf-turnstile-"]' )
1666+ and self .is_element_present ("div.spacer div" )
1667+ ):
1668+ selector = "div.spacer div"
1669+ elif (
1670+ self .is_element_present ('script[src*="challenges.c"]' )
1671+ and self .is_element_present (
1672+ '[data-testid*="challenge-"] div'
1673+ )
1674+ ):
1675+ selector = '[data-testid*="challenge-"] div'
1676+ elif self .is_element_present (
1677+ "div#turnstile-widget div:not([class])"
1678+ ):
1679+ selector = "div#turnstile-widget div:not([class])"
1680+ elif self .is_element_present (
1681+ 'form div:not([class]):has(input[name*="cf-turn"])'
1682+ ):
1683+ selector = 'form div:not([class]):has(input[name*="cf-turn"])'
1684+ elif (
1685+ self .is_element_present ('[src*="/turnstile/"]' )
1686+ and self .is_element_present ("form div:not(:has(*))" )
1687+ ):
1688+ selector = "form div:not(:has(*))"
1689+ elif (
1690+ self .is_element_present ('[src*="/turnstile/"]' )
1691+ and self .is_element_present (
1692+ "body > div#check > div:not([class])"
1693+ )
1694+ ):
1695+ selector = "body > div#check > div:not([class])"
1696+ elif self .is_element_present (".cf-turnstile-wrapper" ):
1697+ selector = ".cf-turnstile-wrapper"
1698+ elif self .is_element_present ('[class="cf-turnstile"]' ):
1699+ selector = '[class="cf-turnstile"]'
1700+ elif self .is_element_present (
1701+ '[data-callback="onCaptchaSuccess"]'
1702+ ):
1703+ selector = '[data-callback="onCaptchaSuccess"]'
1704+ else :
1705+ return
1706+ if not selector :
1707+ return
1708+ if (
1709+ self .is_element_present ("form" )
1710+ and (
1711+ self .is_element_present ('form[class*="center"]' )
1712+ or self .is_element_present ('form[class*="right"]' )
1713+ or self .is_element_present ('form div[class*="center"]' )
1714+ or self .is_element_present ('form div[class*="right"]' )
1715+ )
1716+ ):
1717+ script = (
1718+ """var $elements = document.querySelectorAll(
1719+ 'form[class], form div[class]');
1720+ var index = 0, length = $elements.length;
1721+ for(; index < length; index++){
1722+ the_class = $elements[index].getAttribute('class');
1723+ new_class = the_class.replaceAll('center', 'left');
1724+ new_class = new_class.replaceAll('right', 'left');
1725+ $elements[index].setAttribute('class', new_class);}"""
1726+ )
1727+ with suppress (Exception ):
1728+ self .loop .run_until_complete (self .page .evaluate (script ))
1729+ self .loop .run_until_complete (self .page .wait ())
1730+ elif (
1731+ self .is_element_present ("form" )
1732+ and (
1733+ self .is_element_present ('form div[style*="center"]' )
1734+ or self .is_element_present ('form div[style*="right"]' )
1735+ )
1736+ ):
1737+ script = (
1738+ """var $elements = document.querySelectorAll(
1739+ 'form[style], form div[style]');
1740+ var index = 0, length = $elements.length;
1741+ for(; index < length; index++){
1742+ the_style = $elements[index].getAttribute('style');
1743+ new_style = the_style.replaceAll('center', 'left');
1744+ new_style = new_style.replaceAll('right', 'left');
1745+ $elements[index].setAttribute('style', new_style);}"""
1746+ )
1747+ with suppress (Exception ):
1748+ self .loop .run_until_complete (self .page .evaluate (script ))
1749+ self .loop .run_until_complete (self .page .wait ())
1750+ elif (
1751+ self .is_element_present ("form" )
1752+ and self .is_element_present (
1753+ 'form [id*="turnstile"] > div:not([class])'
1754+ )
1755+ ):
1756+ script = (
1757+ """var $elements = document.querySelectorAll(
1758+ 'form [id*="turnstile"]');
1759+ var index = 0, length = $elements.length;
1760+ for(; index < length; index++){
1761+ $elements[index].setAttribute('align', 'left');}"""
1762+ )
1763+ with suppress (Exception ):
1764+ self .loop .run_until_complete (self .page .evaluate (script ))
1765+ self .loop .run_until_complete (self .page .wait ())
1766+ with suppress (Exception ):
1767+ element_rect = self .get_gui_element_rect (selector , timeout = 1 )
1768+ e_x = element_rect ["x" ]
1769+ e_y = element_rect ["y" ]
1770+ x = e_x + 32
1771+ if not shared_utils .is_windows ():
1772+ y = e_y + 32
1773+ else :
1774+ y = e_y + 22
1775+ sb_config ._saved_cf_x_y = (x , y )
1776+ self .gui_click_x_y (x , y )
1777+
16321778 def __gui_drag_drop (self , x1 , y1 , x2 , y2 , timeframe = 0.25 , uc_lock = False ):
16331779 self .__install_pyautogui_if_missing ()
16341780 import pyautogui
0 commit comments