@things-factory/integration-headless 8.0.0-beta.8 → 8.0.0
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.
- package/dist-server/engine/connector/headless-connector.d.ts +14 -0
- package/dist-server/engine/connector/headless-connector.js +54 -0
- package/dist-server/engine/connector/headless-connector.js.map +1 -0
- package/dist-server/engine/connector/headless-pool.d.ts +3 -0
- package/dist-server/engine/connector/headless-pool.js +63 -0
- package/dist-server/engine/connector/headless-pool.js.map +1 -0
- package/dist-server/engine/connector/index.d.ts +1 -0
- package/dist-server/engine/connector/index.js +4 -0
- package/dist-server/engine/connector/index.js.map +1 -0
- package/dist-server/engine/index.d.ts +1 -0
- package/dist-server/engine/index.js +1 -0
- package/dist-server/engine/index.js.map +1 -1
- package/dist-server/engine/task/pdf-capture-util.d.ts +1 -1
- package/dist-server/engine/task/pdf-capture-util.js +3 -3
- package/dist-server/engine/task/pdf-capture-util.js.map +1 -1
- package/dist-server/tsconfig.tsbuildinfo +1 -1
- package/helps/integration/connector/headless-connector.ja.md +31 -183
- package/helps/integration/connector/headless-connector.ko.md +32 -177
- package/helps/integration/connector/headless-connector.md +31 -178
- package/helps/integration/connector/headless-connector.ms.md +32 -180
- package/helps/integration/connector/headless-connector.zh.md +31 -178
- package/package.json +6 -6
- package/server/engine/connector/headless-connector.ts +68 -0
- package/server/engine/connector/headless-pool.ts +69 -0
- package/server/engine/connector/index.ts +1 -0
- package/server/engine/index.ts +2 -0
- package/server/engine/task/headless-pdf-capture-board.ts +182 -0
- package/server/engine/task/headless-pdf-capture-markdown.ts +47 -0
- package/server/engine/task/headless-pdf-capture.ts +39 -0
- package/server/engine/task/headless-pdf-open.ts +98 -0
- package/server/engine/task/headless-pdf-save.ts +88 -0
- package/server/engine/task/index.ts +9 -0
- package/server/engine/task/pdf-capture-util.ts +331 -0
- package/server/index.ts +3 -0
- package/server/tsconfig.json +10 -0
|
@@ -1,168 +1,57 @@
|
|
|
1
|
-
###
|
|
1
|
+
### Headless Pool Connector
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
It manages multiple browser sessions, maintains sessions, handles cookies, and supports API-based logins.
|
|
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.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
#### Endpoint
|
|
7
6
|
|
|
8
|
-
|
|
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.
|
|
9
8
|
|
|
10
|
-
|
|
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`.
|
|
9
|
+
#### Parameters
|
|
12
10
|
|
|
13
|
-
|
|
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`
|
|
14
17
|
|
|
15
|
-
|
|
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.
|
|
16
19
|
|
|
17
|
-
|
|
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)
|
|
20
|
+
#### Example Configuration
|
|
47
21
|
|
|
48
22
|
```json
|
|
49
23
|
{
|
|
50
|
-
"
|
|
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",
|
|
24
|
+
"name": "headless-browser-pool",
|
|
108
25
|
"connector": "headless-connector",
|
|
109
|
-
"endpoint": "
|
|
26
|
+
"endpoint": "1",
|
|
110
27
|
"params": {
|
|
111
|
-
"
|
|
112
|
-
"
|
|
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
|
|
28
|
+
"min": 5,
|
|
29
|
+
"max": 20
|
|
121
30
|
}
|
|
122
31
|
}
|
|
123
32
|
```
|
|
124
33
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
## 🔄 5. Connection Lifecycle
|
|
128
|
-
|
|
129
|
-
- **connect**
|
|
34
|
+
In the example above, the pool maintains at least 5 headless browser instances and can scale up to 20 instances as needed.
|
|
130
35
|
|
|
131
|
-
|
|
132
|
-
- Maintains the session and stores cookies for future requests.
|
|
36
|
+
#### Connection Lifecycle
|
|
133
37
|
|
|
134
|
-
- **
|
|
135
|
-
- Terminates the browser session and clears cookies.
|
|
38
|
+
- **connect**:
|
|
136
39
|
|
|
137
|
-
|
|
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.
|
|
138
42
|
|
|
139
|
-
|
|
43
|
+
- **disconnect**:
|
|
44
|
+
- Destroys the headless browser pool, ensuring all instances are properly terminated and resources are released.
|
|
140
45
|
|
|
141
|
-
|
|
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 |
|
|
46
|
+
#### Usage Scenarios
|
|
146
47
|
|
|
147
|
-
|
|
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.
|
|
148
49
|
|
|
149
|
-
|
|
50
|
+
#### Supported Tasks
|
|
150
51
|
|
|
151
|
-
|
|
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
|
-
```
|
|
52
|
+
`Headless Pool Connector` supports tasks prefixed with `headless-pdf`. These tasks will utilize the headless browser instances managed by this connector.
|
|
164
53
|
|
|
165
|
-
|
|
54
|
+
#### Example Usage in Tasks
|
|
166
55
|
|
|
167
56
|
```json
|
|
168
57
|
{
|
|
@@ -177,42 +66,6 @@ For example, if the login API is `/api/auth/login`, this value must be configure
|
|
|
177
66
|
}
|
|
178
67
|
```
|
|
179
68
|
|
|
180
|
-
|
|
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 |
|
|
69
|
+
#### Description
|
|
217
70
|
|
|
218
|
-
|
|
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.
|
|
@@ -1,171 +1,59 @@
|
|
|
1
|
-
###
|
|
1
|
+
### Penyambung Kolam Tanpa Kepala (Headless Pool Connector)
|
|
2
2
|
|
|
3
|
-
**Penyambung
|
|
4
|
-
Ia menguruskan berbilang sesi pelayar, mengekalkan sesi, mengendalikan kuki, serta menyokong log masuk berdasarkan API.
|
|
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.
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
#### Titik Akhir
|
|
7
6
|
|
|
8
|
-
|
|
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.
|
|
9
8
|
|
|
10
|
-
|
|
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.
|
|
9
|
+
#### Parameter
|
|
12
10
|
|
|
13
|
-
|
|
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`
|
|
14
17
|
|
|
15
|
-
|
|
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.
|
|
16
19
|
|
|
17
|
-
|
|
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)**
|
|
20
|
+
#### Contoh Tetapan
|
|
50
21
|
|
|
51
22
|
```json
|
|
52
23
|
{
|
|
53
|
-
"
|
|
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",
|
|
24
|
+
"name": "headless-browser-pool",
|
|
111
25
|
"connector": "headless-connector",
|
|
112
|
-
"endpoint": "
|
|
26
|
+
"endpoint": "1",
|
|
113
27
|
"params": {
|
|
114
|
-
"
|
|
115
|
-
"
|
|
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
|
|
28
|
+
"min": 5,
|
|
29
|
+
"max": 20
|
|
124
30
|
}
|
|
125
31
|
}
|
|
126
32
|
```
|
|
127
33
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
## 🔄 **5. Kitaran Hayat Sambungan (Connection Lifecycle)**
|
|
34
|
+
Dalam contoh di atas, kolam akan mengekalkan sekurang-kurangnya 5 contoh pelayar tanpa kepala dan boleh berkembang kepada maksimum 20 contoh
|
|
131
35
|
|
|
132
|
-
|
|
36
|
+
apabila diperlukan.
|
|
133
37
|
|
|
134
|
-
|
|
135
|
-
- Mengekalkan sesi dan menyimpan kuki untuk permintaan seterusnya.
|
|
38
|
+
#### Kitaran Hidup Sambungan
|
|
136
39
|
|
|
137
|
-
- **
|
|
138
|
-
- Menamatkan sesi pelayar headless dan memadamkan kuki.
|
|
40
|
+
- **connect**:
|
|
139
41
|
|
|
140
|
-
|
|
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.
|
|
141
44
|
|
|
142
|
-
|
|
45
|
+
- **disconnect**:
|
|
46
|
+
- Menghancurkan kolam pelayar tanpa kepala dan memastikan semua contoh ditutup dengan betul dan sumber dilepaskan.
|
|
143
47
|
|
|
144
|
-
|
|
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 |
|
|
48
|
+
#### Senario Penggunaan
|
|
149
49
|
|
|
150
|
-
|
|
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.
|
|
151
51
|
|
|
152
|
-
|
|
52
|
+
#### Tugas yang Disokong
|
|
153
53
|
|
|
154
|
-
|
|
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
|
-
```
|
|
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.
|
|
167
55
|
|
|
168
|
-
|
|
56
|
+
#### Contoh Penggunaan dalam Tugas
|
|
169
57
|
|
|
170
58
|
```json
|
|
171
59
|
{
|
|
@@ -180,42 +68,6 @@ Sebagai contoh, jika API log masuk ialah `/api/auth/login`, ia mesti dinyatakan
|
|
|
180
68
|
}
|
|
181
69
|
```
|
|
182
70
|
|
|
183
|
-
|
|
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 |
|
|
71
|
+
#### Penjelasan
|
|
220
72
|
|
|
221
|
-
|
|
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.
|