Cách tự động đăng nhập vào trang web
Giả sử bạn muốn tự động hóa quy trình làm việc với trang web. Thông thường, bạn sẽ đăng nhập vào trang web trước khi làm bất cứ việc gì khác. Bạn cũng có thể tự động hóa thao tác đó! Trong bài viết này, bạn sẽ học cách tạo một tập lệnh tự động hóa đơn giản để đăng nhập vào trang web.
Bài viết này hướng dẫn bạn từng bước tạo kịch bản. Nếu bạn muốn tham khảo toàn bộ kịch bản, vui lòng kéo xuống cuối bài.
Bước 1: Chuẩn bị IDE hoặc phần mềm tương tự
Bạn sẽ cần bất cứ thứ gì để viết tập lệnh. Việc sử dụng cái nào là tùy bạn, nhưng chúng tôi khuyên bạn nên sử dụng IDE. Hãy làm theo 4 bước đầu tiên trong bài viết sau: Bắt đầu với tập lệnh tự động hóa.
Bước 2: Tạo tập lệnh kết nối với API và xác định các hàm
Ở bước này, bạn cần làm cho tập lệnh hoạt động với API. Tập lệnh sẽ bao gồm:
- API Endpoints
- Biến cho thông tin xác thực
- Các chức năng được xác định để đăng nhập, mở và đóng hồ sơ
- Các mô-đun được nạp vào, bao gồm
requests,hashlib,time. Một số mô-đun liên quan đến Selenium cũng sẽ được bao gồm - Yêu cầu đăng nhập
Sử dụng mẫu sau đây:
import requests
import hashlib
import time
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
MLX_BASE = "https://api.multilogin.com"
MLX_LAUNCHER = "https://launcher.mlx.yt:45001/api/v1"
MLX_LAUNCHER_V2 = (
"https://launcher.mlx.yt:45001/api/v2" # recommended for launching profiles
)
LOCALHOST = "http://127.0.0.1"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
# TODO: Insert your account information in both variables below
USERNAME = ""
PASSWORD = ""
# TODO: Insert the Folder ID and the Profile ID below
FOLDER_ID = ""
PROFILE_ID = ""
def signin() -> str:
payload = {
"email": USERNAME,
"password": hashlib.md5(PASSWORD.encode()).hexdigest(),
}
r = requests.post(f"{MLX_BASE}/user/signin", json=payload)
if r.status_code != 200:
print(f"\nError during login: {r.text}\n")
else:
response = r.json()["data"]
token = response["token"]
return token
def start_profile() -> webdriver:
r = requests.get(
f"{MLX_LAUNCHER_V2}/profile/f/{FOLDER_ID}/p/{PROFILE_ID}/start?automation_type=selenium",
headers=HEADERS,
)
response = r.json()
if r.status_code != 200:
print(f"\nError while starting profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} started.\n")
selenium_port = response["data"]["port"]
driver = webdriver.Remote(
command_executor=f"{LOCALHOST}:{selenium_port}", options=ChromiumOptions()
)
# For Stealthfox profiles use: options=Options()
# For Mimic profiles use: options=ChromiumOptions()
return driver
def stop_profile() -> None:
r = requests.get(f"{MLX_LAUNCHER}/profile/stop/p/{PROFILE_ID}", headers=HEADERS)
if r.status_code != 200:
print(f"\nError while stopping profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} stopped.\n")
token = signin()
HEADERS.update({"Authorization": f"Bearer {token}"})Mẫu này tương tự như ví dụ tự động hóa Selenium, ngoại trừ việc nó có mô-đun được nhập sau đây ở phần đầu (chúng ta sẽ cần để thu thập dữ liệu):
from selenium.webdriver.common.by import By
Bước 3: chọn trang web để tự động hóa quá trình đăng nhập
Bạn có thể sử dụng bất kỳ trang web nào có trang đăng nhập. Tuy nhiên, với hướng dẫn này, chúng tôi khuyên bạn nên thử trang này – rất hữu ích để thực hành các tác vụ tự động hóa: Login Page.
Bước 4: tìm kiếm thông tin mục tiêu
Trong trường hợp của chúng tôi, đó sẽ là thanh văn bản cho thông tin xác thực và nút đăng nhập:

Chúng ta sẽ có cả 3 thành phần trên trang này. Sau đây là những gì bạn có thể làm:
- Mở DevTools trên trình duyệt của bạn. Sau đây là cách thực hiện đối với trình duyệt dựa trên Chromium và Firefox:
- Windows và Linux: nhấn
Ctrl + Shift + I - macOS: nhấn
Cmd + Option + I
- Windows và Linux: nhấn
- Hãy đảm bảo rằng bạn đang ở trên tab “Elements”
- Sử dụng phím nóng tìm kiếm để tìm giá trị mục tiêu
- Windows và Linux :
CTRL + F - macOS :
Cmd + F
- Windows và Linux :
- Tìm giá trị bạn cần sử dụng để thu thập. Trong trường hợp của chúng tôi, giá trị đó sẽ như sau:
-
id="username"cho trường văn bản Tên người dùng -
id="password"cho trường văn bản Mật khẩu -
class="radius"cho nút Đăng nhập
-
- Chọn các phần tử có thẻ trong tab “Phần tử”
- Nhấp vào giá trị đã chọn và sao chép giá trị của thuộc tính
idhoặcclass. Ví dụ: nếu bạn thấyid="username", bạn cần sao chépusername - Viết giá trị ở đâu đó – bạn sẽ cần nó sau

Bước 5: quay lại IDE và thêm chuỗi mã mới
- Quay lại IDE theo lựa chọn của bạn (ví dụ: VS Code)
- Nhấp vào trường mã và thêm một biến để mở và thực hiện các hành động trong hồ sơ:
driver = start_profile() - Thêm
driver.get(“<trang web của bạn>”). Trong trường hợp này, lệnh sẽ là:driver.get("https://the-internet.herokuapp.com/login") - Bây giờ chúng ta cần một số độ trễ cho tập lệnh để nó sẽ cố gắng thực hiện các lệnh khác sau 5 giây kể từ khi mở trang web:
time.sleep(5)
Bước 6: tạo tập lệnh để tìm phần tử
Sử dụng lệnh này để tìm phần tử: driver.find_element(By.<thuộc tính trên trang>, "<phần tử>") . Lệnh này cho tập lệnh biết chính xác những gì cần tìm trên trang. Chúng tôi đã sao chép một số giá trị cho thuộc tính id và class trong trường hợp sử dụng của mình. Thêm các chuỗi tương ứng từ danh sách bên dưới:
- Thêm chuỗi sau vào trường văn bản tên người dùng:
driver.find_element(By.ID, "username") - Thêm chuỗi sau vào trường văn bản mật khẩu:
password = driver.find_element(By.ID, "password") - Thêm chuỗi sau vào nút đăng nhập:
button = driver.find_element(By.CLASS_NAME, "radius")
Chúng ta sẽ cần sử dụng những giá trị đó sau, vì vậy chúng ta cần tạo biến cho các lệnh. Bạn có thể đặt tên chúng theo bất kỳ cách nào bạn muốn, sau đây là các ví dụ:
login = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
button = driver.find_element(By.CLASS_NAME, "radius")Bước 7: cho kịch bản biết phải làm gì
Chúng ta đã cho script biết nó cần phát hiện những gì trên trang. Bây giờ, chúng ta sẽ yêu cầu script thêm thông tin đăng nhập và đăng nhập vào trang. Bạn sẽ sử dụng các hàm sau cho việc này:
-
send_keys()để cung cấp các ký hiệu cần nhập vào các trường văn bản -
click()để mô phỏng cú nhấp chuột trái
Trong trường hợp sử dụng của chúng tôi, bạn có thể nhận thấy rằng trang web đã nêu các giá trị sau cho thông tin đăng nhập:
-
tomsmithcho tên người dùng -
SuperSecretPassword!cho mật khẩu
Chúng ta cần yêu cầu tập lệnh nhập các giá trị đó và nhấp vào nút đăng nhập. Dưới đây là các chuỗi mã:
login.send_keys("tomsmith")
password.send_keys("SuperSecretPassword!")
button.click()Bước 8: hoàn thiện kịch bản bằng thông báo văn bản
Tập lệnh của chúng ta đã sẵn sàng. Bạn có thể tiếp tục chuẩn bị và chạy tập lệnh, nhưng chúng tôi khuyên bạn nên thêm hàm print() để thông báo cho bạn biết tập lệnh đã hoàn tất thành công. Hãy nghĩ ra nội dung cho hàm và thêm vào cuối tập lệnh:
print("Signed in")Đây là tùy chọn, nhưng bạn cũng có thể thêm hàm stop_profile() sau print(). Chúng tôi khuyên bạn không nên sử dụng hàm này vì chuỗi đó không phù hợp với mục đích của tập lệnh.
Bước 9: Chuẩn bị tập lệnh trước khi chạy nó
- Cài đặt các thư viện Python sau (tìm tài liệu của ID E của bạn để biết thêm chi tiết):
requestsselenium
- Chèn các giá trị của bạn vào các biến bên dưới trong tập lệnh:
Bước 10: chạy tập lệnh
- Mở ứng dụng trên máy tính (hoặc kết nối với tác nhân nếu bạn đang sử dụng giao diện web)
- Theo mặc định, tập lệnh bên dưới hoạt động với Mimic. Để sử dụng cho Stealthfox, hãy thay
options=ChromiumOptions()bằngoptions=Options()trong dòng sau:driver = webdriver.Remote(command_executor=f'{LOCALHOST}:{selenium_port}', options=ChromiumOptions()) - Chạy tệp
.pyvới mã tự động hóa của bạn
Để chạy tập lệnh trong VS Code, hãy nhấp vào “Chạy” → “Chạy mà không cần gỡ lỗi” (hoặc “Bắt đầu gỡ lỗi”).
Nếu bạn đã làm đúng mọi bước, bạn sẽ thấy kết quả trong terminal. Bạn cũng sẽ thấy một tài khoản đã đăng nhập trong hồ sơ.

Ghi chú
Giờ thì bạn đã sẵn sàng rồi đấy! Bạn không bị giới hạn bởi những lựa chọn đó nữa. Python và Selenium là những công cụ khá linh hoạt và còn nhiều tiềm năng hơn nữa. Dưới đây là một vài mẹo:
- Bạn có thể buộc tập lệnh chờ dựa trên các điều kiện cụ thể (ví dụ: tập lệnh sẽ chờ cho đến khi một phần tử cụ thể xuất hiện trên trang). Bạn có thể tìm hiểu thêm về điều này trong tài liệu Selenium tương ứng: Waiting Strategies
- Bạn có thể kết hợp điều này và tập lệnh từ bài viết sau: Web scraping with Selenium 101. Nó sẽ tạo ra điểm khởi đầu tuyệt vời cho dự án tự động hóa của bạn!
- Có nhiều cách triển khai Selenium hơn. Hãy xem trung tâm trợ giúp của họ để biết thêm chi tiết: Selenium Documentation
Toàn bộ Script
import requests
import hashlib
import time
from selenium import webdriver
from selenium.webdriver.chromium.options import ChromiumOptions
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.common.by import By
MLX_BASE = "https://api.multilogin.com"
MLX_LAUNCHER = "https://launcher.mlx.yt:45001/api/v1"
MLX_LAUNCHER_V2 = (
"https://launcher.mlx.yt:45001/api/v2" # recommended for launching profiles
)
LOCALHOST = "http://127.0.0.1"
HEADERS = {"Accept": "application/json", "Content-Type": "application/json"}
# TODO: Insert your account information in both variables below
USERNAME = ""
PASSWORD = ""
# TODO: Insert the Folder ID and the Profile ID below
FOLDER_ID = ""
PROFILE_ID = ""
def signin() -> str:
payload = {
"email": USERNAME,
"password": hashlib.md5(PASSWORD.encode()).hexdigest(),
}
r = requests.post(f"{MLX_BASE}/user/signin", json=payload)
if r.status_code != 200:
print(f"\nError during login: {r.text}\n")
else:
response = r.json()["data"]
token = response["token"]
return token
def start_profile() -> webdriver:
r = requests.get(
f"{MLX_LAUNCHER_V2}/profile/f/{FOLDER_ID}/p/{PROFILE_ID}/start?automation_type=selenium",
headers=HEADERS,
)
response = r.json()
if r.status_code != 200:
print(f"\nError while starting profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} started.\n")
selenium_port = response["data"]["port"]
driver = webdriver.Remote(
command_executor=f"{LOCALHOST}:{selenium_port}", options=ChromiumOptions()
)
# For Stealthfox profiles use: options=Options()
# For Mimic profiles use: options=ChromiumOptions()
return driver
def stop_profile() -> None:
r = requests.get(f"{MLX_LAUNCHER}/profile/stop/p/{PROFILE_ID}", headers=HEADERS)
if r.status_code != 200:
print(f"\nError while stopping profile: {r.text}\n")
else:
print(f"\nProfile {PROFILE_ID} stopped.\n")
token = signin()
HEADERS.update({"Authorization": f"Bearer {token}"})
driver = start_profile()
driver.get("https://the-internet.herokuapp.com/login")
time.sleep(5)
login = driver.find_element(By.ID, "username")
password = driver.find_element(By.ID, "password")
button = driver.find_element(By.CLASS_NAME, "radius")
login.send_keys("tomsmith")
password.send_keys("SuperSecretPassword!")
button.click()
print("Signed in")Bài viết này có chứa các liên kết của bên thứ ba mà chúng tôi không chính thức xác nhận.