chore: update and merge gitignore
This commit is contained in:
103
twitter_login.py
Normal file
103
twitter_login.py
Normal 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()
|
||||
Reference in New Issue
Block a user