0
0
Lập trình
Admin Team
Admin Teamtechmely

Xây Dựng Bot Tự Động Thông Minh với Playwright và OpenAI

Đăng vào 8 tháng trước

• 7 phút đọc

Xây Dựng Bot Tự Động Thông Minh với Playwright và OpenAI

Hướng dẫn thực hành để tạo ra các bot thông minh có khả năng hiểu và tương tác với các trang web.

Mục Lục

Giới thiệu

Khi làm việc với các công nghệ web hiện đại, tôi đã phát hiện ra rằng việc kết hợp khả năng tự động hóa trình duyệt mạnh mẽ của Playwright với trí tuệ nhân tạo của OpenAI tạo ra những bot vô cùng linh hoạt. Trong hướng dẫn này, tôi sẽ hướng dẫn bạn cách xây dựng một bot AI có khả năng điều hướng trang web, trích xuất thông tin và đưa ra quyết định thông minh dựa trên những gì nó "nhìn thấy."

Chúng ta sẽ xây dựng gì?

Cuối cùng của hướng dẫn này, bạn sẽ tạo ra một bot có khả năng:

  • Tự động điều hướng đến bất kỳ trang web nào
  • Chụp ảnh màn hình và phân tích nội dung trang
  • Sử dụng AI để hiểu những gì có trên trang
  • Đưa ra quyết định về các hành động tiếp theo
  • Trích xuất thông tin cụ thể một cách thông minh

Điều kiện tiên quyết

  • Kiến thức cơ bản về JavaScript/Node.js
  • Quen thuộc với async/await
  • Một khóa API OpenAI (bậc miễn phí là đủ)

Thiết lập dự án

1. Khởi tạo dự án

bash Copy
mkdir ai-playwright-bot
cd ai-playwright-bot
npm init -y

2. Cài đặt các phụ thuộc

bash Copy
npm install playwright openai dotenv
npx playwright install

3. Tạo biến môi trường

Tạo một tệp .env:

bash Copy
OPENAI_API_KEY=your_openai_api_key_here

Xây dựng Bot cốt lõi

Bước 1: Thiết lập cơ bản

Tạo tệp bot.js:

javascript Copy
const { chromium } = require('playwright');
const OpenAI = require('openai');
require('dotenv').config();

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY
});

class AIBot {
  constructor() {
    this.browser = null;
    this.page = null;
  }

  async initialize() {
    this.browser = await chromium.launch({ headless: false });
    this.page = await this.browser.newPage();
    console.log('🤖 Bot đã được khởi tạo');
  }

  async close() {
    if (this.browser) {
      await this.browser.close();
      console.log('🔴 Bot đã đóng');
    }
  }
}

Bước 2: Thêm khả năng AI

javascript Copy
async analyzePageContent(instruction) {
  // Chụp ảnh màn hình
  const screenshot = await this.page.screenshot({ 
    fullPage: true,
    type: 'png'
  });

  // Lấy nội dung văn bản của trang
  const textContent = await this.page.evaluate(() => {
    return document.body.innerText.substring(0, 2000); // Giới hạn cho API
  });

  // Gửi đến OpenAI để phân tích
  const response = await openai.chat.completions.create({
    model: "gpt-4-vision-preview",
    messages: [
      {
        role: "user",
        content: [
          {
            type: "text",
            text: `Phân tích trang web này và ${instruction}. 
                   Đây là nội dung văn bản: ${textContent}`
          },
          {
            type: "image_url",
            image_url: {
              url: `data:image/png;base64,${screenshot.toString('base64')}`
            }
          }
        ]
      }
    ],
    max_tokens: 500
  });

  return response.choices[0].message.content;
}

Bước 3: Điều hướng thông minh

javascript Copy
async navigateAndAnalyze(url, task) {
  await this.page.goto(url);
  console.log(`📍 Đã điều hướng đến: ${url}`);

  // Chờ trang tải
  await this.page.waitForLoadState('networkidle');

  // Phân tích trang
  const analysis = await this.analyzePageContent(task);
  console.log('🧠 Phân tích AI:', analysis);

  return analysis;
}

async smartClick(description) {
  // Lấy tất cả các phần tử có thể nhấp
  const elements = await this.page.$$('button, a, [onclick], input[type="submit"]');

  let bestMatch = null;
  let highestScore = 0;

  for (const element of elements) {
    const text = await element.textContent();
    const elementInfo = `Văn bản: "${text}" Thẻ: ${await element.tagName()}`;

    // Hỏi AI để chấm điểm phần tử này
    const prompt = `Đánh giá từ 0-10 mức độ phù hợp của phần tử này với "${description}": ${elementInfo}. Trả lời chỉ với con số.`;

    const response = await openai.chat.completions.create({
      model: "gpt-3.5-turbo",
      messages: [{ role: "user", content: prompt }],
      max_tokens: 5
    });

    const score = parseInt(response.choices[0].message.content);

    if (score > highestScore) {
      highestScore = score;
      bestMatch = element;
    }
  }

  if (bestMatch && highestScore > 6) {
    await bestMatch.click();
    console.log(`✅ Nhấp vào phần tử với điểm số: ${highestScore}`);
    return true;
  }

  console.log('❌ Không tìm thấy phần tử phù hợp');
  return false;
}

Bước 4: Kết hợp mọi thứ lại

javascript Copy
async runBot() {
  try {
    await this.initialize();

    // Ví dụ: Phân tích một trang tin tức
    const analysis = await this.navigateAndAnalyze(
      'https://news.ycombinator.com',
      'tìm câu chuyện công nghệ thú vị nhất và tóm tắt nó'
    );

    console.log('Phân tích cuối cùng:', analysis);

  } catch (error) {
    console.error('Lỗi bot:', error);
  } finally {
    await this.close();
  }
}

// Cách sử dụng
const bot = new AIBot();
bot.runBot();

Trường hợp sử dụng thực tế

1. Bot giám sát nội dung

Giám sát các trang web của đối thủ để theo dõi thay đổi:

javascript Copy
async monitorCompetitor(url) {
  const analysis = await this.navigateAndAnalyze(url, 
    'xác định bất kỳ sản phẩm mới nào, thay đổi giá cả hoặc thông báo quan trọng'
  );

  // Lưu trữ kết quả, gửi cảnh báo, v.v.
  return analysis;
}

2. Bot điền biểu mẫu

Điền biểu mẫu một cách thông minh:

javascript Copy
async smartFillForm(formData) {
  const fields = await this.page.$$('input, select, textarea');

  for (const field of fields) {
    const fieldInfo = await field.getAttribute('name') || 
                     await field.getAttribute('placeholder') ||
                     await field.getAttribute('id');

    // Hỏi AI dữ liệu nào phù hợp với trường biểu mẫu này
    const matchingData = await this.findMatchingData(fieldInfo, formData);

    if (matchingData) {
      await field.fill(matchingData);
    }
  }
}

Mẹo tối ưu hiệu suất

  1. Lưu trữ phản hồi AI cho các phần tử trang tương tự.
  2. Sử dụng phân tích văn bản trước khi phân tích hình ảnh khi có thể.
  3. Triển khai logic thử lại cho các lỗi mạng.
  4. Đặt thời gian chờ hợp lý cho các thao tác trên trang.

Thực hành xử lý lỗi

javascript Copy
async safeExecute(operation, maxRetries = 3) {
  for (let i = 0; i < maxRetries; i++) {
    try {
      return await operation();
    } catch (error) {
      console.log(`Lần thử ${i + 1} thất bại:`, error.message);
      if (i === maxRetries - 1) throw error;
      await this.page.waitForTimeout(1000 * (i + 1)); // Lùi lại theo cấp số nhân
    }
  }
}

Cân nhắc đạo đức

  • Luôn tôn trọng tệp robots.txt
  • Triển khai độ trễ hợp lý giữa các yêu cầu
  • Không làm quá tải máy chủ với các yêu cầu nhanh chóng
  • Tôn trọng các điều khoản dịch vụ của trang web
  • Sử dụng cho tự động hóa hợp pháp, không vì mục đích xấu

Bước tiếp theo

  • Thêm hỗ trợ cho nhiều mô hình AI
  • Triển khai các cây quyết định phức tạp hơn
  • Tạo một bảng điều khiển web để giám sát các bot
  • Thêm tích hợp cơ sở dữ liệu để lưu trữ kết quả
  • Xây dựng khả năng xử lý lệnh bằng ngôn ngữ tự nhiên

Kết luận

Kết hợp Playwright với AI mở ra những khả năng tự động hóa mạnh mẽ. Cách tiếp cận này mở ra những phương pháp mới để tương tác với web một cách lập trình, tạo ra những bot có khả năng thích nghi và suy nghĩ thay vì chỉ làm theo các kịch bản cứng nhắc.

Chìa khóa là bắt đầu đơn giản và dần dần thêm trí thông minh. Khi bạn xây dựng nhiều bot hơn, bạn sẽ phát hiện ra các mẫu có thể được trừu tượng hóa thành các thành phần tái sử dụng.


Bạn hào hứng xây dựng loại tự động hóa nào với AI? Chia sẻ ý tưởng của bạn trong phần bình luận!

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào