chore: update and merge gitignore

This commit is contained in:
Guillem Hernandez Sola
2026-03-29 17:44:14 +02:00
commit 57bf1aab81
57 changed files with 3124 additions and 0 deletions

103
twitter_login.py Normal file
View File

@@ -0,0 +1,103 @@
import argparse
from playwright.sync_api import sync_playwright
from tweety import Twitter
import time
def get_twitter_auth_token(username, password):
with sync_playwright() as p:
print("🚀 Launching headless browser...")
# Add arguments to bypass basic bot detection
browser = p.chromium.launch(headless=True, args=["--disable-blink-features=AutomationControlled"])
context = browser.new_context(
user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)
page = context.new_page()
try:
print("🌐 Navigating to X login...")
page.goto("https://x.com/i/flow/login")
# 1. Fill with username
print(f"👤 Entering username: {username}...")
# Using the exact autocomplete attribute from your HTML
page.wait_for_selector('input[autocomplete="username"]', timeout=25000)
time.sleep(10) # Wait a bit for any potential animations or dynamic content to load
# CLICK ON THE INPUT BEFORE POPULATING THE USERNAME
page.click('input[autocomplete="username"]')
time.sleep(10)
page.fill('input[autocomplete="username"]', username)
# Enter and wait for the next screen
print("➡️ Pressing Enter to proceed...")
page.keyboard.press("Enter")
# Wait a moment for the screen transition animation
time.sleep(10)
# 2. Fill with the password
print("🔑 Entering password...")
# Using the exact name attribute from your HTML
page.wait_for_selector('input[name="password"]', timeout=25000)
time.sleep(10) # Wait a bit for any potential animations or dynamic content to load
# CLICK ON THE INPUT BEFORE POPULATING THE PASSWORD
page.click('input[name="password"]')
page.fill('input[name="password"]', password)
# 3. Click on Login
print("🖱️ Clicking 'Log in'...")
# Targeting the exact span text you provided
page.locator('span:has-text("Log in")').first.click()
print("⏳ Waiting for login to complete...")
# Wait for the redirect to the home page
page.wait_for_url("**/home", timeout=25000)
# 4. Extract Cookies
cookies = context.cookies()
auth_token = None
for cookie in cookies:
if cookie['name'] == 'auth_token':
auth_token = cookie['value']
break
browser.close()
return auth_token
except Exception as e:
# IF IT FAILS, TAKE A SCREENSHOT!
print(f"❌ Error encountered. Taking a screenshot...")
page.screenshot(path="error_screenshot.png")
browser.close()
raise e
def main():
# Set up argument parsing
parser = argparse.ArgumentParser(description="Automate Twitter login and save session token.")
parser.add_argument("username", help="Your Twitter username")
parser.add_argument("password", help="Your Twitter password")
args = parser.parse_args()
try:
# Pass the arguments from the terminal to the function
token = get_twitter_auth_token(args.username, args.password)
if token:
print("🔑 Successfully extracted auth_token!")
# Initialize the tweety session file
app = Twitter("my_account_session")
print("💾 Saving session to tweety-ns...")
app.load_auth_token(token)
print("✅ Success! Your session has been saved.")
else:
print("❌ Failed to find auth_token cookie.")
except Exception as e:
print(f"❌ An error occurred: {e}")
print("📸 Check the 'error_screenshot.png' file in your folder to see what X showed the bot!")
if __name__ == "__main__":
main()