@things-factory/integration-headless 8.0.0-beta.6 → 8.0.0-beta.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,57 +1,172 @@
1
- ### ヘッドレスプールコネクタ (Headless Pool Connector)
1
+ ### 🏆 ヘッドレスコネクター (Headless Connector)
2
2
 
3
- **ヘッドレスプールコネクタ**は、ヘッドレスブラウザインスタンスのプールを管理するために設計されています。このコネクタは、PDFの生成やウェブスクレイピングのように、複数のヘッドレスブラウザセッションを同時に実行する必要がある作業に便利です。このコネクタは、これらのヘッドレスブラウザインスタンスの作成、使用、および破棄を効率的に管理します。
3
+ **ヘッドレスコネクター**は、ヘッドレスブラウザを使用して **自動ログイン**、**ウェブスクレイピング**、**PDF生成**、**フォーム送信** などのタスクを実行する強力なツールです。
4
+ 複数のブラウザセッションを管理し、セッションの維持、クッキーの処理、APIベースのログインなどに対応しています。
4
5
 
5
- #### エンドポイント
6
+ ---
6
7
 
7
- `ヘッドレスプールコネクタ`は特定のエンドポイントを要求しませんが、接続設定の一環としてURIを提供できます。このURIは通常プレースホルダーとして使用され、プールが内部的に実際の接続を処理します。つまり、エンドポイントには任意の文字列を入力することができます。
8
+ ## 🚀 1. エンドポイント (Endpoint)
8
9
 
9
- #### パラメータ
10
+ **ヘッドレスコネクター**のエンドポイントは、**対象となるウェブサイトのURL** を入力します。
11
+ 例えば、`https://example.com` を入力すると、そのウェブサイトのコンテンツを取得できます。
12
+ 内部コンテンツからPDFを生成する場合は、`localhost` も使用できます。
10
13
 
11
- - **min** (数字):
12
- - プール内で維持する最小のヘッドレスブラウザインスタンスの数を指定します。
13
- - デフォルト値: `2`
14
- - **max** (数字):
15
- - プールが処理できる最大のヘッドレスブラウザインスタンスの数を指定します。
16
- - デフォルト値: `10`
14
+ ---
17
15
 
18
- これらのパラメータは、予想される作業負荷に応じてプールのサイズを調整できるようにします。例えば、アプリケーションが同時に複数のブラウザインスタンスを頻繁に必要とする場合、`max`値を増やすことができます。
16
+ ## 🔧 2. パラメーター (Parameters)
19
17
 
20
- #### 設定例
18
+ ### ✅ ログイン関連設定
19
+
20
+ | パラメーター | タイプ | 説明 | デフォルト値 |
21
+ | -------------------- | -------- | ----------------------------------------------- | ------------- |
22
+ | `username` | `string` | ログインID (ユーザー名) | `""` |
23
+ | `password` | `string` | ログイン用パスワード | `""` |
24
+ | `loginPagePath` | `string` | ログインページのパス (例: `/login`) | `"/login"` |
25
+ | `loginApiUrl` | `string` | ログインAPIのエンドポイント (必要な場合のみ) | `null` |
26
+ | `usernameSelector` | `string` | ユーザー名入力欄のCSSセレクター | `"#username"` |
27
+ | `passwordSelector` | `string` | パスワード入力欄のCSSセレクター | `"#password"` |
28
+ | `submitSelector` | `string` | ログインボタンのCSSセレクター | `"#submit"` |
29
+ | `successSelector` | `string` | ログイン成功を確認するための要素のCSSセレクター | `null` |
30
+ | `shadowDomSelectors` | `string` | Shadow DOM 内の要素を指定 (カンマ区切り) | `""` |
31
+ | `timeout` | `number` | ログインやページ読み込みのタイムアウト時間 (ms) | `15000` |
32
+ | `retries` | `number` | ログインの試行回数 | `3` |
33
+
34
+ ---
35
+
36
+ ## 🔍 3. `loginApiUrl` の詳細説明
37
+
38
+ ### 🔹 `loginApiUrl`とは?
39
+
40
+ `loginApiUrl` は、ウェブサイトが **APIベースのログイン** を使用する場合に設定するパラメーターです。
41
+ サイトによっては、ログインページでフォーム送信する代わりに、バックエンドのAPIを直接呼び出してログインする仕組みを持っています。
42
+
43
+ ---
44
+
45
+ ### ✅ `loginApiUrl` を **設定しない場合 (`null`)**
46
+
47
+ この場合、**HTMLフォームを使用したログイン方式** を採用します。
48
+ ヘッドレスブラウザが自動的にユーザー名とパスワードを入力し、フォームを送信します。
49
+
50
+ #### 📌 例 (HTMLフォームログイン)
51
+
52
+ ```json
53
+ {
54
+ "endpoint": "https://example.com",
55
+ "params": {
56
+ "username": "user123",
57
+ "password": "securepassword",
58
+ "loginPagePath": "/login",
59
+ "usernameSelector": "#username",
60
+ "passwordSelector": "#password",
61
+ "submitSelector": "#submit-button",
62
+ "successSelector": ".dashboard"
63
+ }
64
+ }
65
+ ```
66
+
67
+ #### 🛠 動作の流れ:
68
+
69
+ 1. `https://example.com/login` に移動
70
+ 2. `#username` と `#password` にログイン情報を入力
71
+ 3. `#submit-button` をクリックしてフォーム送信
72
+ 4. `.dashboard` 要素の有無でログイン成功を判断
73
+
74
+ ---
75
+
76
+ ### ✅ `loginApiUrl` を **設定する場合**
77
+
78
+ この場合、サイトが **APIベースの認証** を使用しているため、`loginApiUrl` を明示的に設定する必要があります。
79
+ 例えば、ログインAPIが `/api/auth/login` の場合、このURLを指定します。
80
+
81
+ #### 📌 例 (APIベースのログイン)
82
+
83
+ ```json
84
+ {
85
+ "endpoint": "https://example.com",
86
+ "params": {
87
+ "username": "user123",
88
+ "password": "securepassword",
89
+ "loginPagePath": "/login",
90
+ "loginApiUrl": "/api/auth/login",
91
+ "usernameSelector": "#username",
92
+ "passwordSelector": "#password",
93
+ "submitSelector": "#submit-button",
94
+ "successSelector": ".dashboard"
95
+ }
96
+ }
97
+ ```
98
+
99
+ #### 🛠 動作の流れ:
100
+
101
+ 1. `https://example.com/api/auth/login` に **POSTリクエスト** を送信
102
+ 2. サーバーからレスポンスを受け取り、セッションのクッキーを保存
103
+ 3. メインページへ移動し、`.dashboard` の存在を確認
104
+
105
+ ---
106
+
107
+ ## 🏗 4. 設定例
21
108
 
22
109
  ```json
23
110
  {
24
- "name": "headless-browser-pool",
111
+ "name": "headless-browser-connector",
25
112
  "connector": "headless-connector",
26
- "endpoint": "1",
113
+ "endpoint": "https://example.com",
27
114
  "params": {
28
- "min": 5,
29
- "max": 20
115
+ "username": "user123",
116
+ "password": "securepassword",
117
+ "loginPagePath": "/login",
118
+ "loginApiUrl": "/api/auth/login",
119
+ "usernameSelector": "#username",
120
+ "passwordSelector": "#password",
121
+ "submitSelector": "#submit",
122
+ "successSelector": ".dashboard",
123
+ "timeout": 20000,
124
+ "retries": 5
30
125
  }
31
126
  }
32
127
  ```
33
128
 
34
- 上記の例では、プールは少なくとも5つのヘッドレスブラウザインスタンスを維持し、必要に応じて最大20インスタンスまで拡張することができます。
129
+ ---
130
+
131
+ ## 🔄 5. 接続のライフサイクル (Connection Lifecycle)
35
132
 
36
- #### 接続ライフサイクル
133
+ - **connect**
37
134
 
38
- - **connect**:
135
+ - 設定に従ってログインを試みます。
136
+ - セッションを維持し、クッキーを保存して後続のリクエストで再利用します。
39
137
 
40
- - 接続を初期化し、設定されたパラメータ(`min`および`max`)に従ってヘッドレスブラウザインスタンスのプールを作成します。
41
- - プールはこれらのインスタンスのライフサイクルを自動的に管理し、必要に応じて新しいインスタンスを作成し、既存のインスタンスを再利用します。
138
+ - **disconnect**
139
+ - ヘッドレスブラウザのセッションを終了し、クッキーをクリアします。
42
140
 
43
- - **disconnect**:
44
- - ヘッドレスブラウザプールを破棄し、すべてのインスタンスが適切に終了し、リソースが解放されるようにします。
141
+ ---
45
142
 
46
- #### 使用シナリオ
143
+ ## ⚡ 6. 対応するタスク (Supported Tasks)
47
144
 
48
- `ヘッドレスプールコネクタ`は、ヘッドレスブラウザ環境で作業を実行する必要があるシナリオで主に使用されます。例えば、HTMLコンテンツからPDFを生成したり、ウェブページのスクリーンショットをキャプチャしたり、ウェブサイトからデータをスクレイピングする際に便利です。
145
+ | タスクタイプ | 説明 |
146
+ | ---------------------- | -------------------------------------- |
147
+ | `headless-pdf-capture` | HTMLをPDFに変換する |
148
+ | `headless-scrap` | ウェブページから特定データを抽出する |
149
+ | `headless-post` | フォーム入力を自動化し、送信を実行する |
49
150
 
50
- #### サポートするタスク
151
+ #### 📌 タスク例
51
152
 
52
- `ヘッドレスプールコネクタ`は `headless-pdf` プレフィックスの付いたタスクをサポートします。これらのタスクは、このコネクタが管理するヘッドレスブラウザインスタンスを使用します。
153
+ ### 1️⃣ ウェブスクレイピング (`headless-scrap`)
154
+
155
+ ```json
156
+ {
157
+ "name": "scrape-data",
158
+ "taskType": "headless-scrap",
159
+ "params": {
160
+ "path": "/products",
161
+ "selectors": [
162
+ { "text": "商品名", "value": ".product-title" },
163
+ { "text": "価格", "value": ".product-price" }
164
+ ]
165
+ }
166
+ }
167
+ ```
53
168
 
54
- #### タスクでの使用例
169
+ ### 2️⃣ PDF生成 (`headless-pdf-capture`)
55
170
 
56
171
  ```json
57
172
  {
@@ -66,6 +181,43 @@
66
181
  }
67
182
  ```
68
183
 
69
- #### 説明
184
+ ### 3️⃣ フォーム送信 (`headless-post`)
185
+
186
+ ```json
187
+ {
188
+ "name": "submit-form",
189
+ "taskType": "headless-post",
190
+ "params": {
191
+ "formPath": "/contact",
192
+ "fields": {
193
+ "#name": "田中 太郎",
194
+ "#email": "tanaka@example.com",
195
+ "#message": "こんにちは、これはテストメッセージです!"
196
+ },
197
+ "submitSelector": "#submit-button"
198
+ }
199
+ }
200
+ ```
201
+
202
+ ---
203
+
204
+ ## 📢 7. 説明 (Description)
205
+
206
+ **ヘッドレスコネクター** は **ウェブスクレイピング、自動ログイン、PDF生成、フォーム送信** などを
207
+ 効率的に実行するための強力なツールです。
208
+ **HTMLベースのログイン** と **APIベースのログイン** の両方に対応し、さまざまなサイトでの認証処理が可能です。
209
+
210
+ ---
211
+
212
+ ### 📌 まとめ
213
+
214
+ | 機能 | 説明 |
215
+ | ------------------------ | -------------------------------------- |
216
+ | **HTMLフォームログイン** | ユーザー操作をシミュレートしてログイン |
217
+ | **APIログイン** | APIリクエストで直接ログイン (高速) |
218
+ | **セッション管理** | クッキーを保存し、セッションを維持 |
219
+ | **ウェブスクレイピング** | 指定したコンテンツを抽出して取得 |
220
+ | **PDF変換** | HTMLページをPDFに変換 |
221
+ | **フォーム送信** | 自動的にフォーム入力&送信を実行 |
70
222
 
71
- **ヘッドレスプールコネクタ**は、PDF生成やウェブスクレイピングなどの作業を効率的に実行するために、ヘッドレスブラウザインスタンスのプールを管理し、高負荷なシナリオでのリソース利用の最適化と拡張性を保証します。
223
+ 📌 **ヘッドレスコネクターを使えば、さまざまなウェブサイトのタスクを自動化できます!** 🚀
@@ -1,58 +1,166 @@
1
- ### 헤드리스 커넥터 (Headless Pool Connector)
1
+ ### 🏆 헤드리스 커넥터 (Headless Connector)
2
2
 
3
- **헤드리스 커넥터**는 헤드리스 브라우저 인스턴스의 풀(pool)을 관리하기 위해 설계되었습니다. 이 커넥터는 PDF 생성이나 스크래핑과 같이 여러 개의 헤드리스 브라우저 세션이 동시에 필요한 작업을 수행할 유용합니다. 이 커넥터는 이 헤드리스 브라우저 인스턴스의 생성, 사용 및 파기를 효율적으로 관리합니다.
3
+ **헤드리스 커넥터**는 헤드리스 브라우저를 활용하여 **로그인 자동화**, **웹 스크래핑**, **PDF 생성**, **폼 제출** 등의 작업을 수행하는 강력한 커넥터입니다.
4
+ 여러 개의 브라우저 세션을 관리하며, 세션 유지, 쿠키 활용, API 기반 로그인 등 다양한 기능을 제공합니다.
4
5
 
5
- #### 엔드포인트
6
+ ---
6
7
 
7
- `헤드리스 커넥터`는 특정 엔드포인트를 요구하지 않지만, 연결 설정의 일환으로 URI를 제공할 수 있습니다. 이 URI는 일반적으로 플레이스홀더로 사용되며, 풀은 내부적으로 실제 연결을 처리합니다.
8
- 즉, 엔트포인트는 임의의 문자열을 입력하시면 됩니다.
8
+ ## 🚀 1. 엔드포인트 (Endpoint)
9
9
 
10
- #### 매개변수
10
+ 헤드리스 커넥터의 엔드포인트는 **스크래핑 대상 웹사이트의 URL**을 입력합니다.
11
+ 예를 들어, `https://example.com`과 같은 웹사이트의 내용을 가져오거나 내부 컨텐츠로 PDF 파일을 생성하려면 `localhost`를 사용할 수도 있습니다.
11
12
 
12
- - **min** (숫자):
13
- - 풀에서 유지할 최소 헤드리스 브라우저 인스턴스 수를 지정합니다.
14
- - 기본값: `2`
15
- - **max** (숫자):
16
- - 풀이 처리할 수 있는 최대 헤드리스 브라우저 인스턴스 수를 지정합니다.
17
- - 기본값: `10`
13
+ ---
18
14
 
19
- 매개변수들은 예상되는 작업 부하에 맞춰 풀 크기를 조정할 수 있게 해줍니다. 예를 들어, 애플리케이션에서 여러 브라우저 인스턴스를 자주 동시에 필요로 하는 경우 `max` 값을 늘릴 수 있습니다.
15
+ ## 🔧 2. 매개변수 (Parameters)
20
16
 
21
- #### 설정 예시
17
+ ### ✅ 로그인 관련 설정
18
+
19
+ | 매개변수 | 타입 | 설명 | 기본값 |
20
+ | -------------------- | -------- | --------------------------------------------------------------- | ------------- |
21
+ | `username` | `string` | 로그인할 사용자 이름 (아이디) | `""` |
22
+ | `password` | `string` | 로그인 비밀번호 | `""` |
23
+ | `loginPagePath` | `string` | 로그인 페이지의 경로 (예: `/login`) | `"/login"` |
24
+ | `loginApiUrl` | `string` | 로그인 API 엔드포인트 (없으면 `null`) | `null` |
25
+ | `usernameSelector` | `string` | 로그인 폼의 사용자명 입력 필드 CSS 선택자 | `"#username"` |
26
+ | `passwordSelector` | `string` | 로그인 폼의 비밀번호 입력 필드 CSS 선택자 | `"#password"` |
27
+ | `submitSelector` | `string` | 로그인 버튼의 CSS 선택자 | `"#submit"` |
28
+ | `successSelector` | `string` | 로그인 성공을 판별할 수 있는 요소의 CSS 선택자 | `null` |
29
+ | `shadowDomSelectors` | `string` | Shadow DOM 내부 요소를 찾을 때 사용 (쉼표로 구분된 선택자 목록) | `""` |
30
+ | `timeout` | `number` | 로그인 및 페이지 로딩 대기 시간 (ms) | `15000` |
31
+ | `retries` | `number` | 로그인 시도 횟수 | `3` |
32
+
33
+ ---
34
+
35
+ ## 🔍 3. `loginApiUrl` 매개변수에 대한 상세 설명
36
+
37
+ ### 🔹 `loginApiUrl`란?
38
+
39
+ `loginApiUrl`은 웹사이트에서 구현한 로그인 방식에 따라 로그인 시도 결과를 확인하기 위해 참고하는 설정 정보입니다.
40
+
41
+ ### ✅ `loginApiUrl`이 **설정되지 않은 경우 (`null`)**
42
+
43
+ **HTML 폼을 통한 로그인 방식**을 사용하는 웹사이트에서는 별도로 설정하지 않아도 됩니다. 이 경우는 페이지내의 form action을 직접 참조합니다.
44
+
45
+ 1. `loginPagePath`에 지정된 로그인 페이지로 이동합니다.
46
+ 2. 사용자명 및 비밀번호 입력 필드에 값을 입력합니다.
47
+ 3. 로그인 버튼을 클릭하여 로그인을 시도합니다.
48
+ 4. `successSelector`를 사용해 로그인 성공 여부를 판별합니다.
49
+
50
+ #### 📌 예제 설정 (HTML 폼 로그인)
51
+
52
+ ```json
53
+ {
54
+ "endpoint": "https://example.com",
55
+ "params": {
56
+ "username": "user123",
57
+ "password": "securepassword",
58
+ "loginPagePath": "/login",
59
+ "usernameSelector": "#username",
60
+ "passwordSelector": "#password",
61
+ "submitSelector": "#submit-button",
62
+ "successSelector": ".dashboard"
63
+ }
64
+ }
65
+ ```
66
+
67
+ #### 🛠 동작 과정
68
+
69
+ 1. `https://example.com/login` 페이지로 이동
70
+ 2. `#username`, `#password` 입력 필드에 값을 입력
71
+ 3. `#submit-button`을 클릭하여 로그인 요청 전송
72
+ 4. `.dashboard` 요소가 나타나면 로그인 성공으로 판단
73
+
74
+ ---
75
+
76
+ ### ✅ `loginApiUrl`을 **설정하는 경우**
77
+
78
+ 웹사이트가 **API 기반 로그인 방식**을 사용하는 경우입니다. 이 경우 로그인을 위해서 호출되는 `loginApiUrl`을 직접 파악해서 설정해주어야 합니다.
79
+ Origin 서버가 아닌 별도의 SSO 서버의 API를 호출하는 경우에는 전체 API URL을 설정해주면 됩니다.
80
+
81
+ #### 📌 예제 설정 (API 로그인 방식의 웹사이트)
82
+
83
+ ```json
84
+ {
85
+ "endpoint": "https://example.com",
86
+ "params": {
87
+ "username": "user123",
88
+ "password": "securepassword",
89
+ "loginPagePath": "/login",
90
+ "loginApiUrl": "/api/auth/login",
91
+ "usernameSelector": "#username",
92
+ "passwordSelector": "#password",
93
+ "submitSelector": "#submit-button",
94
+ "successSelector": ".dashboard"
95
+ }
96
+ }
97
+ ```
98
+
99
+ ---
100
+
101
+ ## 🏗 4. 설정 예시
22
102
 
23
103
  ```json
24
104
  {
25
- "name": "headless-browser-pool",
105
+ "name": "headless-browser-connector",
26
106
  "connector": "headless-connector",
27
- "endpoint": "1",
107
+ "endpoint": "https://example.com",
28
108
  "params": {
29
- "min": 5,
30
- "max": 20
109
+ "username": "user123",
110
+ "password": "securepassword",
111
+ "loginPagePath": "/login",
112
+ "loginApiUrl": "/api/auth/login",
113
+ "usernameSelector": "#username",
114
+ "passwordSelector": "#password",
115
+ "submitSelector": "#submit",
116
+ "successSelector": ".dashboard",
117
+ "timeout": 20000,
118
+ "retries": 5
31
119
  }
32
120
  }
33
121
  ```
34
122
 
35
- 위 예시에서 풀은 최소 5개의 헤드리스 브라우저 인스턴스를 유지하며, 필요에 따라 최대 20개의 인스턴스로 확장할 수 있습니다.
123
+ ---
124
+
125
+ ## 🔄 5. 연결 생명주기 (Connection Lifecycle)
126
+
127
+ - **connect**
36
128
 
37
- #### 연결 생명주기
129
+ - 설정된 매개변수에 따라 로그인 프로세스를 수행합니다.
130
+ - 세션이 유지되며, 쿠키를 저장하여 이후 요청에서 재사용합니다.
38
131
 
39
- - **connect**:
132
+ - **disconnect**
133
+ - 헤드리스 브라우저 세션을 종료하고 쿠키를 정리합니다.
40
134
 
41
- - 연결을 초기화하여 설정된 매개변수(`min` 및 `max`)에 따라 헤드리스 브라우저 인스턴스 풀을 생성합니다.
42
- - 풀은 이러한 인스턴스들의 생명주기를 자동으로 관리하며, 필요한 경우 새로운 인스턴스를 생성하고 기존 인스턴스를 재사용합니다.
135
+ ---
43
136
 
44
- - **disconnect**:
45
- - 헤드리스 브라우저 풀을 파기하여 모든 인스턴스가 적절히 종료되고 리소스가 해제되도록 합니다.
137
+ ## ⚡ 6. 지원하는 작업 (Supported Tasks)
46
138
 
47
- #### 사용 시나리오
139
+ | 작업 유형 | 설명 |
140
+ | ---------------------- | -------------------------------------------------------- |
141
+ | `headless-pdf-capture` | HTML을 PDF로 변환하는 작업 |
142
+ | `headless-scrap` | 웹 페이지에서 특정 데이터를 추출하는 스크래핑 작업 |
143
+ | `headless-post` | 웹사이트에서 폼 데이터를 자동으로 입력하고 제출하는 작업 |
48
144
 
49
- `헤드리스 커넥터`는 헤드리스 브라우저 환경에서 작업을 수행해야 하는 시나리오에서 주로 사용됩니다. 예를 들어, HTML 콘텐츠로부터 PDF를 생성하거나, 웹 페이지의 스크린샷을 캡처하거나, 웹사이트에서 데이터를 스크래핑할 때 유용합니다.
145
+ #### 📌 작업 예시
50
146
 
51
- #### 지원하는 작업
147
+ ### 1️⃣ 웹 스크래핑 (`headless-scrap`)
52
148
 
53
- `헤드리스 풀 커넥터`는 `headless-pdf` 접두사가 붙은 작업을 지원합니다. 이러한 작업은 이 커넥터가 관리하는 헤드리스 브라우저 인스턴스를 사용하게 됩니다.
149
+ ```json
150
+ {
151
+ "name": "scrape-data",
152
+ "taskType": "headless-scrap",
153
+ "params": {
154
+ "path": "/products",
155
+ "selectors": [
156
+ { "text": "Product Name", "value": ".product-title" },
157
+ { "text": "Price", "value": ".product-price" }
158
+ ]
159
+ }
160
+ }
161
+ ```
54
162
 
55
- #### 작업에서의 예시 사용
163
+ ### 2️⃣ PDF 생성 (`headless-pdf-capture`)
56
164
 
57
165
  ```json
58
166
  {
@@ -67,6 +175,43 @@
67
175
  }
68
176
  ```
69
177
 
70
- #### 설명
178
+ ### 3️⃣ 폼 제출 (`headless-post`)
179
+
180
+ ```json
181
+ {
182
+ "name": "submit-form",
183
+ "taskType": "headless-post",
184
+ "params": {
185
+ "formPath": "/contact",
186
+ "fields": {
187
+ "#name": "John Doe",
188
+ "#email": "john@example.com",
189
+ "#message": "Hello, this is a test message!"
190
+ },
191
+ "submitSelector": "#submit-button"
192
+ }
193
+ }
194
+ ```
195
+
196
+ ---
197
+
198
+ ## 📢 7. 설명 (Description)
199
+
200
+ **헤드리스 커넥터**는 **웹 자동화 및 스크래핑, PDF 생성, 폼 자동 입력 및 제출** 등을 위해
201
+ 헤드리스 브라우저 세션을 관리하는 강력한 도구입니다.
202
+ 특히 **HTML 로그인 방식**과 **API 로그인 방식**을 모두 지원하여 다양한 웹사이트에서 안정적인 로그인을 수행할 수 있습니다.
203
+
204
+ ---
205
+
206
+ ### 📌 요약
207
+
208
+ | 기능 | 설명 |
209
+ | --------------- | ------------------------------------- |
210
+ | **폼 로그인** | UI를 직접 조작하여 로그인 (HTML 기반) |
211
+ | **API 로그인** | HTTP 요청을 통해 직접 로그인 (빠름) |
212
+ | **세션 유지** | 쿠키를 저장하여 지속적인 세션 유지 |
213
+ | **웹 스크래핑** | 데이터 추출 및 자동화 작업 가능 |
214
+ | **PDF 변환** | HTML을 PDF로 변환 |
215
+ | **폼 제출** | 자동으로 데이터를 입력하고 제출 |
71
216
 
72
- **헤드리스 커넥터**는 PDF 생성 스크래핑과 같은 작업을 수행하기 위해 헤드리스 브라우저 인스턴스 풀을 효율적으로 관리하며, 높은 수요가 있는 시나리오에서 자원 활용의 최적화와 확장성을 보장합니다.
217
+ **이 커넥터를 활용하면 다양한 웹사이트에서 자동 로그인 데이터 수집을 효율적으로 수행할 있습니다.** 🚀
@@ -1,57 +1,168 @@
1
- ### Headless Pool Connector
1
+ ### 🏆 Headless Connector
2
2
 
3
- **Headless Pool Connector** is designed to manage a pool of headless browser instances. This connector is useful when performing tasks that require multiple headless browser sessions simultaneously, such as PDF generation or web scraping. It efficiently manages the creation, use, and destruction of these headless browser instances.
3
+ The **Headless Connector** is a powerful tool that utilizes headless browsers to perform **automated login**, **web scraping**, **PDF generation**, and **form submission** tasks.
4
+ It manages multiple browser sessions, maintains sessions, handles cookies, and supports API-based logins.
4
5
 
5
- #### Endpoint
6
+ ---
6
7
 
7
- `Headless Pool Connector` does not require a specific endpoint, but a URI can be provided as part of the connection setup. This URI is typically used as a placeholder, with the pool handling the actual connection internally. In other words, any string can be entered as the endpoint.
8
+ ## 🚀 1. Endpoint
8
9
 
9
- #### Parameters
10
+ The endpoint for the **Headless Connector** should be the **URL of the target website** that you want to scrape or interact with.
11
+ For example, you can input `https://example.com` to extract content from that website. If you need to generate a PDF from internal content, you can also use `localhost`.
10
12
 
11
- - **min** (number):
12
- - Specifies the minimum number of headless browser instances to maintain in the pool.
13
- - Default value: `2`
14
- - **max** (number):
15
- - Specifies the maximum number of headless browser instances the pool can handle.
16
- - Default value: `10`
13
+ ---
17
14
 
18
- These parameters allow the pool size to be adjusted based on the expected workload. For example, if the application frequently requires multiple browser instances simultaneously, the `max` value can be increased.
15
+ ## 🔧 2. Parameters
19
16
 
20
- #### Example Configuration
17
+ ### Login Configuration
18
+
19
+ | Parameter | Type | Description | Default Value |
20
+ | -------------------- | -------- | ------------------------------------------------- | ------------- |
21
+ | `username` | `string` | Username (login ID) | `""` |
22
+ | `password` | `string` | Password for login | `""` |
23
+ | `loginPagePath` | `string` | Path to the login page (e.g., `/login`) | `"/login"` |
24
+ | `loginApiUrl` | `string` | API endpoint for login (if applicable) | `null` |
25
+ | `usernameSelector` | `string` | CSS selector for the username input field | `"#username"` |
26
+ | `passwordSelector` | `string` | CSS selector for the password input field | `"#password"` |
27
+ | `submitSelector` | `string` | CSS selector for the login button | `"#submit"` |
28
+ | `successSelector` | `string` | CSS selector to verify login success | `null` |
29
+ | `shadowDomSelectors` | `string` | Comma-separated selectors for shadow DOM elements | `""` |
30
+ | `timeout` | `number` | Timeout for login and page loading (ms) | `15000` |
31
+ | `retries` | `number` | Number of login retries | `3` |
32
+
33
+ ---
34
+
35
+ ## 🔍 3. Detailed Explanation of `loginApiUrl`
36
+
37
+ ### 🔹 What is `loginApiUrl`?
38
+
39
+ `loginApiUrl` is used when the website employs **API-based login** instead of traditional HTML form-based login. This parameter helps the connector determine how to handle the login process.
40
+
41
+ ### ✅ If `loginApiUrl` is **NOT set (`null`)**
42
+
43
+ The **HTML form submission method** is used to log in.
44
+ The headless browser will manually enter the username and password into the login form and click the submit button.
45
+
46
+ #### 📌 Example (HTML Form-Based Login)
21
47
 
22
48
  ```json
23
49
  {
24
- "name": "headless-browser-pool",
50
+ "endpoint": "https://example.com",
51
+ "params": {
52
+ "username": "user123",
53
+ "password": "securepassword",
54
+ "loginPagePath": "/login",
55
+ "usernameSelector": "#username",
56
+ "passwordSelector": "#password",
57
+ "submitSelector": "#submit-button",
58
+ "successSelector": ".dashboard"
59
+ }
60
+ }
61
+ ```
62
+
63
+ #### 🛠 How it Works:
64
+
65
+ 1. Navigate to `https://example.com/login`
66
+ 2. Enter credentials into `#username` and `#password`
67
+ 3. Click `#submit-button` to submit the form
68
+ 4. Check if `.dashboard` exists to determine if login was successful
69
+
70
+ ---
71
+
72
+ ### ✅ If `loginApiUrl` **IS set**
73
+
74
+ If the website uses **API-based authentication**, `loginApiUrl` should be explicitly set to the login API's endpoint.
75
+ For example, if the login API is `/api/auth/login`, this value must be configured accordingly.
76
+
77
+ #### 📌 Example (API-Based Login)
78
+
79
+ ```json
80
+ {
81
+ "endpoint": "https://example.com",
82
+ "params": {
83
+ "username": "user123",
84
+ "password": "securepassword",
85
+ "loginPagePath": "/login",
86
+ "loginApiUrl": "/api/auth/login",
87
+ "usernameSelector": "#username",
88
+ "passwordSelector": "#password",
89
+ "submitSelector": "#submit-button",
90
+ "successSelector": ".dashboard"
91
+ }
92
+ }
93
+ ```
94
+
95
+ #### 🛠 How it Works:
96
+
97
+ 1. Sends a **POST request** to `https://example.com/api/auth/login`
98
+ 2. Receives a response from the server and stores the session cookies
99
+ 3. Navigates to the main page and checks for `.dashboard` to verify login success
100
+
101
+ ---
102
+
103
+ ## 🏗 4. Example Configuration
104
+
105
+ ```json
106
+ {
107
+ "name": "headless-browser-connector",
25
108
  "connector": "headless-connector",
26
- "endpoint": "1",
109
+ "endpoint": "https://example.com",
27
110
  "params": {
28
- "min": 5,
29
- "max": 20
111
+ "username": "user123",
112
+ "password": "securepassword",
113
+ "loginPagePath": "/login",
114
+ "loginApiUrl": "/api/auth/login",
115
+ "usernameSelector": "#username",
116
+ "passwordSelector": "#password",
117
+ "submitSelector": "#submit",
118
+ "successSelector": ".dashboard",
119
+ "timeout": 20000,
120
+ "retries": 5
30
121
  }
31
122
  }
32
123
  ```
33
124
 
34
- In the example above, the pool maintains at least 5 headless browser instances and can scale up to 20 instances as needed.
125
+ ---
126
+
127
+ ## 🔄 5. Connection Lifecycle
128
+
129
+ - **connect**
35
130
 
36
- #### Connection Lifecycle
131
+ - Performs the login process according to the provided parameters.
132
+ - Maintains the session and stores cookies for future requests.
37
133
 
38
- - **connect**:
134
+ - **disconnect**
135
+ - Terminates the browser session and clears cookies.
39
136
 
40
- - Initializes the connection and creates the pool of headless browser instances based on the configured parameters (`min` and `max`).
41
- - The pool automatically manages the lifecycle of these instances, creating new ones as needed and reusing existing ones.
137
+ ---
42
138
 
43
- - **disconnect**:
44
- - Destroys the headless browser pool, ensuring all instances are properly terminated and resources are released.
139
+ ## ⚡ 6. Supported Tasks
45
140
 
46
- #### Usage Scenarios
141
+ | Task Type | Description |
142
+ | ---------------------- | -------------------------------------- |
143
+ | `headless-pdf-capture` | Converts HTML to a PDF |
144
+ | `headless-scrap` | Extracts specific data from a web page |
145
+ | `headless-post` | Automates form filling and submission |
47
146
 
48
- `Headless Pool Connector` is primarily used in scenarios where tasks need to be executed in a headless browser environment. For example, it is useful for generating PDFs from HTML content, capturing screenshots of web pages, or scraping data from websites.
147
+ #### 📌 Task Examples
49
148
 
50
- #### Supported Tasks
149
+ ### 1️⃣ Web Scraping (`headless-scrap`)
51
150
 
52
- `Headless Pool Connector` supports tasks prefixed with `headless-pdf`. These tasks will utilize the headless browser instances managed by this connector.
151
+ ```json
152
+ {
153
+ "name": "scrape-data",
154
+ "taskType": "headless-scrap",
155
+ "params": {
156
+ "path": "/products",
157
+ "selectors": [
158
+ { "text": "Product Name", "value": ".product-title" },
159
+ { "text": "Price", "value": ".product-price" }
160
+ ]
161
+ }
162
+ }
163
+ ```
53
164
 
54
- #### Example Usage in Tasks
165
+ ### 2️⃣ PDF Generation (`headless-pdf-capture`)
55
166
 
56
167
  ```json
57
168
  {
@@ -66,6 +177,42 @@ In the example above, the pool maintains at least 5 headless browser instances a
66
177
  }
67
178
  ```
68
179
 
69
- #### Description
180
+ ### 3️⃣ Form Submission (`headless-post`)
181
+
182
+ ```json
183
+ {
184
+ "name": "submit-form",
185
+ "taskType": "headless-post",
186
+ "params": {
187
+ "formPath": "/contact",
188
+ "fields": {
189
+ "#name": "John Doe",
190
+ "#email": "john@example.com",
191
+ "#message": "Hello, this is a test message!"
192
+ },
193
+ "submitSelector": "#submit-button"
194
+ }
195
+ }
196
+ ```
197
+
198
+ ---
199
+
200
+ ## 📢 7. Description
201
+
202
+ The **Headless Connector** is a powerful tool for **automated web scraping, PDF generation, and form submission** tasks.
203
+ It supports both **HTML-based logins** and **API-based logins**, making it suitable for a variety of website authentication methods.
204
+
205
+ ---
206
+
207
+ ### 📌 Summary
208
+
209
+ | Feature | Description |
210
+ | ---------------------- | ----------------------------------------- |
211
+ | **HTML Form Login** | Simulates user interaction for login |
212
+ | **API Login** | Sends login requests via API (faster) |
213
+ | **Session Management** | Stores cookies for session persistence |
214
+ | **Web Scraping** | Extracts specific content from websites |
215
+ | **PDF Generation** | Converts HTML pages to PDF |
216
+ | **Form Submission** | Fills out and submits forms automatically |
70
217
 
71
- **Headless Pool Connector** efficiently manages the pool of headless browser instances to execute tasks like PDF generation and web scraping, ensuring optimization and scalability of resources in high-demand scenarios.
218
+ 📌 **With the Headless Connector, you can easily automate various tasks across different websites!** 🚀
@@ -1,59 +1,171 @@
1
- ### Penyambung Kolam Tanpa Kepala (Headless Pool Connector)
1
+ ### 🏆 **Penyambung Headless (Headless Connector)**
2
2
 
3
- **Penyambung Kolam Tanpa Kepala** direka untuk menguruskan kolam contoh pelayar tanpa kepala. Penyambung ini berguna apabila menjalankan tugas yang memerlukan beberapa sesi pelayar tanpa kepala secara serentak seperti penjanaan PDF atau pengikisan web. Penyambung ini menguruskan penciptaan, penggunaan, dan pemusnahan contoh pelayar tanpa kepala dengan cekap.
3
+ **Penyambung Headless** ialah alat yang kuat yang menggunakan pelayar headless untuk melaksanakan **log masuk automatik**, **pengikisan web (web scraping)**, **penjanaan PDF**, dan **penghantaran borang**.
4
+ Ia menguruskan berbilang sesi pelayar, mengekalkan sesi, mengendalikan kuki, serta menyokong log masuk berdasarkan API.
4
5
 
5
- #### Titik Akhir
6
+ ---
6
7
 
7
- `Penyambung Kolam Tanpa Kepala` tidak memerlukan titik akhir tertentu, tetapi URI boleh disediakan sebagai sebahagian daripada tetapan sambungan. URI ini biasanya digunakan sebagai tempat letak sementara, dan kolam akan mengendalikan sambungan sebenar secara dalaman. Dengan kata lain, sebarang rentetan boleh dimasukkan sebagai titik akhir.
8
+ ## 🚀 **1. Titik Akhir (Endpoint)**
8
9
 
9
- #### Parameter
10
+ Titik akhir untuk **Penyambung Headless** ialah **URL laman web sasaran** yang ingin dikikis (scraping) atau berinteraksi dengannya.
11
+ Sebagai contoh, `https://example.com` boleh digunakan untuk mengekstrak data daripada laman web, atau `localhost` boleh digunakan jika anda ingin menjana fail PDF dari kandungan dalaman.
10
12
 
11
- - **min** (nombor):
12
- - Menentukan bilangan minimum contoh pelayar tanpa kepala yang dikekalkan dalam kolam.
13
- - Nilai lalai: `2`
14
- - **max** (nombor):
15
- - Menentukan bilangan maksimum contoh pelayar tanpa kepala yang boleh diuruskan oleh kolam.
16
- - Nilai lalai: `10`
13
+ ---
17
14
 
18
- Parameter ini membolehkan saiz kolam disesuaikan berdasarkan beban kerja yang dijangkakan. Sebagai contoh, jika aplikasi sering memerlukan beberapa contoh pelayar serentak, nilai `max` boleh ditingkatkan.
15
+ ## 🔧 **2. Parameter (Parameters)**
19
16
 
20
- #### Contoh Tetapan
17
+ ### **Tetapan Berkaitan Log Masuk**
18
+
19
+ | Parameter | Jenis | Penerangan | Nilai Lalai |
20
+ | -------------------- | -------- | ------------------------------------------------------------ | ------------- |
21
+ | `username` | `string` | ID pengguna untuk log masuk | `""` |
22
+ | `password` | `string` | Kata laluan untuk log masuk | `""` |
23
+ | `loginPagePath` | `string` | Laluan ke halaman log masuk (contoh: `/login`) | `"/login"` |
24
+ | `loginApiUrl` | `string` | URL API untuk log masuk (jika diperlukan) | `null` |
25
+ | `usernameSelector` | `string` | Pemilih CSS untuk medan input nama pengguna | `"#username"` |
26
+ | `passwordSelector` | `string` | Pemilih CSS untuk medan input kata laluan | `"#password"` |
27
+ | `submitSelector` | `string` | Pemilih CSS untuk butang log masuk | `"#submit"` |
28
+ | `successSelector` | `string` | Pemilih CSS untuk elemen yang menunjukkan kejayaan log masuk | `null` |
29
+ | `shadowDomSelectors` | `string` | Pemilih untuk elemen dalam Shadow DOM (dipisahkan koma) | `""` |
30
+ | `timeout` | `number` | Had masa menunggu untuk log masuk dan pemuatan halaman (ms) | `15000` |
31
+ | `retries` | `number` | Bilangan percubaan untuk log masuk | `3` |
32
+
33
+ ---
34
+
35
+ ## 🔍 **3. Penjelasan Terperinci Mengenai `loginApiUrl`**
36
+
37
+ ### 🔹 **Apa itu `loginApiUrl`?**
38
+
39
+ `loginApiUrl` ialah parameter yang digunakan untuk **log masuk berdasarkan API**.
40
+ Sesetengah laman web tidak menggunakan borang HTML biasa untuk log masuk tetapi menggunakan API backend untuk mengesahkan pengguna.
41
+
42
+ ---
43
+
44
+ ### ✅ **Jika `loginApiUrl` Tidak Ditetapkan (`null`)**
45
+
46
+ Dalam kes ini, **borang HTML biasa** digunakan untuk log masuk.
47
+ Pelayar headless akan mengisi nama pengguna dan kata laluan secara automatik, kemudian menghantar borang tersebut.
48
+
49
+ #### 📌 **Contoh (Log Masuk Borang HTML)**
21
50
 
22
51
  ```json
23
52
  {
24
- "name": "headless-browser-pool",
53
+ "endpoint": "https://example.com",
54
+ "params": {
55
+ "username": "user123",
56
+ "password": "securepassword",
57
+ "loginPagePath": "/login",
58
+ "usernameSelector": "#username",
59
+ "passwordSelector": "#password",
60
+ "submitSelector": "#submit-button",
61
+ "successSelector": ".dashboard"
62
+ }
63
+ }
64
+ ```
65
+
66
+ #### 🛠 **Proses Operasi**:
67
+
68
+ 1. Pergi ke `https://example.com/login`.
69
+ 2. Isi medan `#username` dan `#password`.
70
+ 3. Klik butang `#submit-button` untuk menghantar borang.
71
+ 4. Jika `.dashboard` wujud, log masuk dianggap berjaya.
72
+
73
+ ---
74
+
75
+ ### ✅ **Jika `loginApiUrl` Ditentukan**
76
+
77
+ Dalam kes ini, laman web menggunakan **log masuk berdasarkan API**, jadi URL API perlu dinyatakan secara eksplisit.
78
+ Sebagai contoh, jika API log masuk ialah `/api/auth/login`, ia mesti dinyatakan dalam parameter.
79
+
80
+ #### 📌 **Contoh (Log Masuk Berdasarkan API)**
81
+
82
+ ```json
83
+ {
84
+ "endpoint": "https://example.com",
85
+ "params": {
86
+ "username": "user123",
87
+ "password": "securepassword",
88
+ "loginPagePath": "/login",
89
+ "loginApiUrl": "/api/auth/login",
90
+ "usernameSelector": "#username",
91
+ "passwordSelector": "#password",
92
+ "submitSelector": "#submit-button",
93
+ "successSelector": ".dashboard"
94
+ }
95
+ }
96
+ ```
97
+
98
+ #### 🛠 **Proses Operasi**:
99
+
100
+ 1. Hantar **permintaan POST** ke `https://example.com/api/auth/login`.
101
+ 2. Simpan kuki sesi selepas menerima respons.
102
+ 3. Navigasi ke halaman utama dan periksa `.dashboard` untuk memastikan log masuk berjaya.
103
+
104
+ ---
105
+
106
+ ## 🏗 **4. Contoh Konfigurasi**
107
+
108
+ ```json
109
+ {
110
+ "name": "headless-browser-connector",
25
111
  "connector": "headless-connector",
26
- "endpoint": "1",
112
+ "endpoint": "https://example.com",
27
113
  "params": {
28
- "min": 5,
29
- "max": 20
114
+ "username": "user123",
115
+ "password": "securepassword",
116
+ "loginPagePath": "/login",
117
+ "loginApiUrl": "/api/auth/login",
118
+ "usernameSelector": "#username",
119
+ "passwordSelector": "#password",
120
+ "submitSelector": "#submit",
121
+ "successSelector": ".dashboard",
122
+ "timeout": 20000,
123
+ "retries": 5
30
124
  }
31
125
  }
32
126
  ```
33
127
 
34
- Dalam contoh di atas, kolam akan mengekalkan sekurang-kurangnya 5 contoh pelayar tanpa kepala dan boleh berkembang kepada maksimum 20 contoh
128
+ ---
129
+
130
+ ## 🔄 **5. Kitaran Hayat Sambungan (Connection Lifecycle)**
35
131
 
36
- apabila diperlukan.
132
+ - **connect**
37
133
 
38
- #### Kitaran Hidup Sambungan
134
+ - Mencuba log masuk berdasarkan parameter yang dikonfigurasi.
135
+ - Mengekalkan sesi dan menyimpan kuki untuk permintaan seterusnya.
39
136
 
40
- - **connect**:
137
+ - **disconnect**
138
+ - Menamatkan sesi pelayar headless dan memadamkan kuki.
41
139
 
42
- - Menginisialisasi sambungan dan mencipta kolam contoh pelayar tanpa kepala mengikut parameter yang ditetapkan (`min` dan `max`).
43
- - Kolam akan menguruskan kitaran hidup contoh-contoh ini secara automatik, mencipta contoh baru jika diperlukan, dan menggunakan semula contoh sedia ada.
140
+ ---
44
141
 
45
- - **disconnect**:
46
- - Menghancurkan kolam pelayar tanpa kepala dan memastikan semua contoh ditutup dengan betul dan sumber dilepaskan.
142
+ ## **6. Tugas yang Disokong (Supported Tasks)**
47
143
 
48
- #### Senario Penggunaan
144
+ | Jenis Tugas | Penerangan |
145
+ | ---------------------- | ---------------------------------------------- |
146
+ | `headless-pdf-capture` | Menukar HTML kepada PDF |
147
+ | `headless-scrap` | Mengekstrak data tertentu dari laman web |
148
+ | `headless-post` | Mengisi dan menghantar borang secara automatik |
49
149
 
50
- `Penyambung Kolam Tanpa Kepala` terutamanya digunakan dalam senario di mana tugas perlu dijalankan dalam persekitaran pelayar tanpa kepala. Contohnya, ia berguna untuk menjana PDF daripada kandungan HTML, menangkap tangkapan skrin halaman web, atau mengikis data daripada laman web.
150
+ #### 📌 **Contoh Penggunaan Tugas**
51
151
 
52
- #### Tugas yang Disokong
152
+ ### 1️⃣ **Pengikisan Web (`headless-scrap`)**
53
153
 
54
- `Penyambung Kolam Tanpa Kepala` menyokong tugas yang bermula dengan awalan `headless-pdf`. Tugas-tugas ini akan menggunakan contoh pelayar tanpa kepala yang diuruskan oleh penyambung ini.
154
+ ```json
155
+ {
156
+ "name": "scrape-data",
157
+ "taskType": "headless-scrap",
158
+ "params": {
159
+ "path": "/products",
160
+ "selectors": [
161
+ { "text": "Nama Produk", "value": ".product-title" },
162
+ { "text": "Harga", "value": ".product-price" }
163
+ ]
164
+ }
165
+ }
166
+ ```
55
167
 
56
- #### Contoh Penggunaan dalam Tugas
168
+ ### 2️⃣ **Penjanaan PDF (`headless-pdf-capture`)**
57
169
 
58
170
  ```json
59
171
  {
@@ -68,6 +180,42 @@ apabila diperlukan.
68
180
  }
69
181
  ```
70
182
 
71
- #### Penjelasan
183
+ ### 3️⃣ **Penghantaran Borang (`headless-post`)**
184
+
185
+ ```json
186
+ {
187
+ "name": "submit-form",
188
+ "taskType": "headless-post",
189
+ "params": {
190
+ "formPath": "/contact",
191
+ "fields": {
192
+ "#name": "Ali Bin Ahmad",
193
+ "#email": "ali@example.com",
194
+ "#message": "Salam, ini adalah mesej ujian!"
195
+ },
196
+ "submitSelector": "#submit-button"
197
+ }
198
+ }
199
+ ```
200
+
201
+ ---
202
+
203
+ ## 📢 **7. Penerangan (Description)**
204
+
205
+ **Penyambung Headless** membolehkan **pengikisan web, log masuk automatik, penjanaan PDF, dan penghantaran borang** dilakukan secara automatik.
206
+ Ia menyokong kedua-dua **log masuk berdasarkan borang HTML** dan **log masuk API**, membolehkan sambungan yang stabil di pelbagai laman web.
207
+
208
+ ---
209
+
210
+ ### 📌 **Ringkasan**
211
+
212
+ | Fungsi | Penerangan |
213
+ | ------------------------- | --------------------------------------------------------- |
214
+ | **Log Masuk Borang HTML** | Mensimulasikan interaksi pengguna untuk log masuk |
215
+ | **Log Masuk API** | Menggunakan permintaan API untuk log masuk (lebih pantas) |
216
+ | **Penyelenggaraan Sesi** | Menyimpan kuki untuk memastikan sesi kekal aktif |
217
+ | **Pengikisan Web** | Mengekstrak data yang ditentukan secara automatik |
218
+ | **Penukaran PDF** | Menukar halaman HTML kepada format PDF |
219
+ | **Penghantaran Borang** | Mengisi dan menghantar borang secara automatik |
72
220
 
73
- **Penyambung Kolam Tanpa Kepala** menguruskan kolam contoh pelayar tanpa kepala secara cekap untuk melaksanakan tugas seperti penjanaan PDF dan pengikisan web, memastikan pengoptimuman dan kebolehskalaan sumber dalam senario permintaan tinggi.
221
+ 📌 **Gunakan Penyambung Headless untuk mengautomasikan pelbagai tugas web dengan lebih mudah dan cekap!** 🚀
@@ -1,57 +1,168 @@
1
- ### 无头浏览器池连接器 (Headless Pool Connector)
1
+ ### 🏆 无头连接器 (Headless Connector)
2
2
 
3
- **无头浏览器池连接器**旨在管理无头浏览器实例的池。该连接器在执行需要多个无头浏览器会话同时运行的任务时非常有用,例如生成PDF或进行网页抓取。它能够有效地管理这些无头浏览器实例的创建、使用和销毁。
3
+ **无头连接器** 利用无头浏览器执行 **自动登录**、**网页爬取**、**PDF 生成**、**表单提交**等任务。
4
+ 它可以管理多个浏览器会话,支持会话保持、Cookie 处理、基于 API 的登录等功能。
4
5
 
5
- #### 端点
6
+ ---
6
7
 
7
- `无头浏览器池连接器`不要求特定的端点,但可以作为连接设置的一部分提供URI。此URI通常作为占位符使用,池在内部处理实际连接。也就是说,端点可以输入任意字符串。
8
+ ## 🚀 1. 端点(Endpoint)
8
9
 
9
- #### 参数
10
+ 无头连接器的端点需要填写 **目标网页的 URL**。
11
+ 例如,可以输入 `https://example.com` 以抓取该网站的内容,或者使用 `localhost` 生成 PDF。
10
12
 
11
- - **min** (数字):
12
- - 指定池中维持的最少无头浏览器实例数量。
13
- - 默认值: `2`
14
- - **max** (数字):
15
- - 指定池中可以处理的最大无头浏览器实例数量。
16
- - 默认值: `10`
13
+ ---
17
14
 
18
- 这些参数允许根据预期的工作负载调整池的大小。例如,如果应用程序经常同时需要多个浏览器实例,则可以增加`max`值。
15
+ ## 🔧 2. 参数(Parameters)
19
16
 
20
- #### 设置示例
17
+ ### ✅ 登录相关配置
18
+
19
+ | 参数 | 类型 | 描述 | 默认值 |
20
+ | -------------------- | -------- | -------------------------------------------- | ------------- |
21
+ | `username` | `string` | 登录用户名(账户名) | `""` |
22
+ | `password` | `string` | 登录密码 | `""` |
23
+ | `loginPagePath` | `string` | 登录页面路径(如 `/login`) | `"/login"` |
24
+ | `loginApiUrl` | `string` | 登录 API 端点(如果没有则 `null`) | `null` |
25
+ | `usernameSelector` | `string` | 登录表单的用户名输入框 CSS 选择器 | `"#username"` |
26
+ | `passwordSelector` | `string` | 登录表单的密码输入框 CSS 选择器 | `"#password"` |
27
+ | `submitSelector` | `string` | 登录按钮的 CSS 选择器 | `"#submit"` |
28
+ | `successSelector` | `string` | 用于判断登录成功的元素 CSS 选择器 | `null` |
29
+ | `shadowDomSelectors` | `string` | 处理 Shadow DOM 内部元素的选择器(逗号分隔) | `""` |
30
+ | `timeout` | `number` | 登录及页面加载的超时时间(毫秒) | `15000` |
31
+ | `retries` | `number` | 登录重试次数 | `3` |
32
+
33
+ ---
34
+
35
+ ## 🔍 3. `loginApiUrl` 参数的详细说明
36
+
37
+ ### 🔹 `loginApiUrl` 是什么?
38
+
39
+ `loginApiUrl` 是指用于网站 **API 登录** 的接口地址。如果网站不使用 API 方式登录,则不需要设置此参数。
40
+
41
+ ### ✅ `loginApiUrl` 为空 (`null`)
42
+
43
+ 此时 **使用 HTML 表单提交的方式进行登录**。
44
+ 无头浏览器会直接模拟用户操作,如填写用户名和密码,并点击提交按钮。
45
+
46
+ #### 📌 示例(HTML 表单登录)
21
47
 
22
48
  ```json
23
49
  {
24
- "name": "headless-browser-pool",
50
+ "endpoint": "https://example.com",
51
+ "params": {
52
+ "username": "user123",
53
+ "password": "securepassword",
54
+ "loginPagePath": "/login",
55
+ "usernameSelector": "#username",
56
+ "passwordSelector": "#password",
57
+ "submitSelector": "#submit-button",
58
+ "successSelector": ".dashboard"
59
+ }
60
+ }
61
+ ```
62
+
63
+ #### 🛠 处理过程:
64
+
65
+ 1. 访问 `https://example.com/login`
66
+ 2. 在 `#username` 和 `#password` 输入框中填入账户信息
67
+ 3. 点击 `#submit-button` 提交表单
68
+ 4. 通过 `.dashboard` 元素是否存在来判断是否登录成功
69
+
70
+ ---
71
+
72
+ ### ✅ `loginApiUrl` 设定时
73
+
74
+ 如果目标网站使用 **API 方式登录**,则 `loginApiUrl` 需要设置为该 API 的地址。
75
+ 例如,如果 API 登录地址是 `/api/auth/login`,则需要手动设置该参数。
76
+
77
+ #### 📌 示例(API 登录方式)
78
+
79
+ ```json
80
+ {
81
+ "endpoint": "https://example.com",
82
+ "params": {
83
+ "username": "user123",
84
+ "password": "securepassword",
85
+ "loginPagePath": "/login",
86
+ "loginApiUrl": "/api/auth/login",
87
+ "usernameSelector": "#username",
88
+ "passwordSelector": "#password",
89
+ "submitSelector": "#submit-button",
90
+ "successSelector": ".dashboard"
91
+ }
92
+ }
93
+ ```
94
+
95
+ #### 🛠 处理过程:
96
+
97
+ 1. 发送 **HTTP POST 请求** 到 `https://example.com/api/auth/login`
98
+ 2. 服务器返回成功响应,浏览器存储会话 Cookie
99
+ 3. 访问主页面并检查 `.dashboard` 是否存在,以确认登录成功
100
+
101
+ ---
102
+
103
+ ## 🏗 4. 配置示例
104
+
105
+ ```json
106
+ {
107
+ "name": "headless-browser-connector",
25
108
  "connector": "headless-connector",
26
- "endpoint": "1",
109
+ "endpoint": "https://example.com",
27
110
  "params": {
28
- "min": 5,
29
- "max": 20
111
+ "username": "user123",
112
+ "password": "securepassword",
113
+ "loginPagePath": "/login",
114
+ "loginApiUrl": "/api/auth/login",
115
+ "usernameSelector": "#username",
116
+ "passwordSelector": "#password",
117
+ "submitSelector": "#submit",
118
+ "successSelector": ".dashboard",
119
+ "timeout": 20000,
120
+ "retries": 5
30
121
  }
31
122
  }
32
123
  ```
33
124
 
34
- 在上述示例中,池至少保持5个无头浏览器实例,并且在需要时可以扩展到最多20个实例。
125
+ ---
126
+
127
+ ## 🔄 5. 连接生命周期(Connection Lifecycle)
128
+
129
+ - **connect**
35
130
 
36
- #### 连接生命周期
131
+ - 根据参数执行登录流程,并保持会话。
132
+ - 存储 Cookie,以便后续请求使用。
37
133
 
38
- - **connect**:
134
+ - **disconnect**
135
+ - 关闭浏览器会话,并清除 Cookie。
39
136
 
40
- - 初始化连接,根据设定的参数(`min` 和 `max`)创建无头浏览器实例池。
41
- - 池会自动管理这些实例的生命周期,必要时创建新的实例并重用现有的实例。
137
+ ---
42
138
 
43
- - **disconnect**:
44
- - 销毁无头浏览器池,确保所有实例都被适当关闭并释放资源。
139
+ ## ⚡ 6. 支持的任务(Supported Tasks)
45
140
 
46
- #### 使用场景
141
+ | 任务类型 | 描述 |
142
+ | ---------------------- | ---------------------- |
143
+ | `headless-pdf-capture` | 将 HTML 转换为 PDF |
144
+ | `headless-scrap` | 网页爬取,提取特定数据 |
145
+ | `headless-post` | 自动填写表单并提交 |
47
146
 
48
- `无头浏览器池连接器`主要用于需要在无头浏览器环境中执行任务的场景。例如,生成HTML内容的PDF、捕获网页截图或从网站抓取数据。
147
+ #### 📌 任务示例
49
148
 
50
- #### 支持的任务
149
+ ### 1️⃣ 网页爬取(`headless-scrap`)
51
150
 
52
- `无头浏览器池连接器`支持以 `headless-pdf` 为前缀的任务。这些任务将使用由此连接器管理的无头浏览器实例。
151
+ ```json
152
+ {
153
+ "name": "scrape-data",
154
+ "taskType": "headless-scrap",
155
+ "params": {
156
+ "path": "/products",
157
+ "selectors": [
158
+ { "text": "商品名称", "value": ".product-title" },
159
+ { "text": "价格", "value": ".product-price" }
160
+ ]
161
+ }
162
+ }
163
+ ```
53
164
 
54
- #### 任务示例使用
165
+ ### 2️⃣ PDF 生成(`headless-pdf-capture`)
55
166
 
56
167
  ```json
57
168
  {
@@ -66,6 +177,42 @@
66
177
  }
67
178
  ```
68
179
 
69
- #### 说明
180
+ ### 3️⃣ 表单提交(`headless-post`)
181
+
182
+ ```json
183
+ {
184
+ "name": "submit-form",
185
+ "taskType": "headless-post",
186
+ "params": {
187
+ "formPath": "/contact",
188
+ "fields": {
189
+ "#name": "张三",
190
+ "#email": "zhangsan@example.com",
191
+ "#message": "你好,我想咨询一下!"
192
+ },
193
+ "submitSelector": "#submit-button"
194
+ }
195
+ }
196
+ ```
197
+
198
+ ---
199
+
200
+ ## 📢 7. 说明(Description)
201
+
202
+ **无头连接器** 可用于 **自动化网页爬取、PDF 生成、表单提交** 等任务。
203
+ 它支持 **HTML 登录** 和 **API 登录**,适用于各种不同的网页登录方式。
204
+
205
+ ---
206
+
207
+ ### 📌 功能总结
208
+
209
+ | 功能 | 说明 |
210
+ | ----------------- | ------------------------------------ |
211
+ | **HTML 表单登录** | 直接模拟用户操作(适用于大部分网页) |
212
+ | **API 登录** | 通过 API 发送登录请求(更快) |
213
+ | **会话保持** | 存储 Cookie 并维持登录状态 |
214
+ | **网页爬取** | 提取页面中的特定数据 |
215
+ | **PDF 生成** | 将 HTML 页面转换为 PDF |
216
+ | **表单提交** | 自动填充并提交表单 |
70
217
 
71
- **无头浏览器池连接器**通过高效管理无头浏览器实例池,确保在高需求场景下执行PDF生成和网页抓取等任务时,资源利用的优化和可扩展性。
218
+ 📌 **通过无头连接器,你可以轻松地在不同网站上实现自动化操作!** 🚀
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/integration-headless",
3
- "version": "8.0.0-beta.6",
3
+ "version": "8.0.0-beta.8",
4
4
  "main": "dist-server/index.js",
5
5
  "things-factory": true,
6
6
  "author": "heartyoh <heartyoh@hatiolab.com>",
@@ -22,12 +22,12 @@
22
22
  "clean": "npm run clean:server"
23
23
  },
24
24
  "dependencies": {
25
- "@things-factory/attachment-base": "^8.0.0-beta.5",
26
- "@things-factory/board-service": "^8.0.0-beta.6",
27
- "@things-factory/integration-base": "^8.0.0-beta.6",
25
+ "@things-factory/attachment-base": "^8.0.0-beta.8",
26
+ "@things-factory/board-service": "^8.0.0-beta.8",
27
+ "@things-factory/integration-base": "^8.0.0-beta.8",
28
28
  "@things-factory/shell": "^8.0.0-beta.5",
29
29
  "ejs": "^3.1.10",
30
30
  "pdf-lib": "^1.17.1"
31
31
  },
32
- "gitHead": "4b07596c7ccb0dd903a67aa0bf1d80e608e1ed70"
32
+ "gitHead": "bf5206511b2d84dfb95edc3dae7f54f6cbb9bcca"
33
33
  }