Перейти до змісту

Hooks & Authentication

Час читання: 10 хвилин
Рівень: Senior

Hooks та авторизація для захищених сайтів.


Огляд Hooks

GraphCrawler підтримує 6 типів hooks:

Hook Етап Опис
ON_NODE_CREATED URL При створенні ноди
ON_BEFORE_SCAN URL Перед завантаженням
ON_HTML_PARSED HTML Після парсингу HTML
ON_AFTER_SCAN HTML Після обробки
BEFORE_CRAWL Crawl Перед початком
AFTER_CRAWL Crawl Після завершення

Basic Auth

import graph_crawler as gc

graph = gc.crawl(
    "https://protected.example.com",
    driver_config={
        "auth": {
            "type": "basic",
            "username": "user",
            "password": "pass",
        }
    }
)

Bearer Token

graph = gc.crawl(
    "https://api.example.com",
    driver_config={
        "headers": {
            "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9..."
        }
    }
)

Form Login (Playwright)

Приклад логіну

from graph_crawler import BaseNodePlugin, NodePluginType

class LoginPlugin(BaseNodePlugin):
    """Плагін для логіну."""

    def __init__(self, username, password):
        self.username = username
        self.password = password
        self.logged_in = False

    @property
    def name(self):
        return "login"

    @property
    def plugin_type(self):
        return NodePluginType.ON_BEFORE_SCAN

    def execute(self, context):
        if not self.logged_in and '/login' not in context.url:
            # Перенаправити на логін
            context.redirect_url = "https://example.com/login"

        return context

# Використання з Playwright
graph = gc.crawl(
    "https://example.com",
    driver="playwright",
    driver_config={
        "before_navigation": """
            async (page) => {
                // Перевірити чи потрібен логін
                if (await page.$('.login-form')) {
                    await page.fill('#username', 'user');
                    await page.fill('#password', 'pass');
                    await page.click('#login-button');
                    await page.waitForNavigation();
                }
            }
        """
    }
)

OAuth2

import requests

# Отримати токен
token_response = requests.post(
    "https://auth.example.com/oauth/token",
    data={
        "grant_type": "client_credentials",
        "client_id": "your_client_id",
        "client_secret": "your_client_secret",
    }
)
access_token = token_response.json()["access_token"]

# Використати токен
graph = gc.crawl(
    "https://api.example.com",
    driver_config={
        "headers": {
            "Authorization": f"Bearer {access_token}"
        }
    }
)

Custom Hook для Auth

from graph_crawler import BaseNodePlugin, NodePluginType
from graph_crawler.extensions.middleware import BaseMiddleware, MiddlewareType

class AuthMiddleware(BaseMiddleware):
    """Додає авторизацію до запитів."""

    def __init__(self, token):
        super().__init__()
        self.token = token

    @property
    def name(self):
        return "auth"

    @property
    def middleware_type(self):
        return MiddlewareType.PRE_REQUEST

    def process(self, context):
        context.headers['Authorization'] = f'Bearer {self.token}'
        return context

# Використання
graph = gc.crawl(
    "https://api.example.com",
    driver_config={
        "middleware": [AuthMiddleware("your_token")]
    }
)

Session Persistence

import json

# Зберегти сесію після логіну
graph = gc.crawl(
    "https://example.com",
    driver="playwright",
    driver_config={
        "storage_state": "./auth_state.json",
        "save_state": True,
    }
)

# Потім використати збережену сесію
graph2 = gc.crawl(
    "https://example.com/protected",
    driver="playwright",
    driver_config={
        "storage_state": "./auth_state.json",
    }
)

Наступні кроки