@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.
- package/helps/integration/connector/headless-connector.ja.md +183 -31
- package/helps/integration/connector/headless-connector.ko.md +177 -32
- package/helps/integration/connector/headless-connector.md +178 -31
- package/helps/integration/connector/headless-connector.ms.md +180 -32
- package/helps/integration/connector/headless-connector.zh.md +178 -31
- package/package.json +5 -5
|
@@ -1,57 +1,172 @@
|
|
|
1
|
-
###
|
|
1
|
+
### 🏆 ヘッドレスコネクター (Headless Connector)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**ヘッドレスコネクター**は、ヘッドレスブラウザを使用して **自動ログイン**、**ウェブスクレイピング**、**PDF生成**、**フォーム送信** などのタスクを実行する強力なツールです。
|
|
4
|
+
複数のブラウザセッションを管理し、セッションの維持、クッキーの処理、APIベースのログインなどに対応しています。
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
---
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## 🚀 1. エンドポイント (Endpoint)
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
**ヘッドレスコネクター**のエンドポイントは、**対象となるウェブサイトのURL** を入力します。
|
|
11
|
+
例えば、`https://example.com` を入力すると、そのウェブサイトのコンテンツを取得できます。
|
|
12
|
+
内部コンテンツからPDFを生成する場合は、`localhost` も使用できます。
|
|
10
13
|
|
|
11
|
-
|
|
12
|
-
- プール内で維持する最小のヘッドレスブラウザインスタンスの数を指定します。
|
|
13
|
-
- デフォルト値: `2`
|
|
14
|
-
- **max** (数字):
|
|
15
|
-
- プールが処理できる最大のヘッドレスブラウザインスタンスの数を指定します。
|
|
16
|
-
- デフォルト値: `10`
|
|
14
|
+
---
|
|
17
15
|
|
|
18
|
-
|
|
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-
|
|
111
|
+
"name": "headless-browser-connector",
|
|
25
112
|
"connector": "headless-connector",
|
|
26
|
-
"endpoint": "
|
|
113
|
+
"endpoint": "https://example.com",
|
|
27
114
|
"params": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
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
|
-
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 🔄 5. 接続のライフサイクル (Connection Lifecycle)
|
|
35
132
|
|
|
36
|
-
|
|
133
|
+
- **connect**
|
|
37
134
|
|
|
38
|
-
-
|
|
135
|
+
- 設定に従ってログインを試みます。
|
|
136
|
+
- セッションを維持し、クッキーを保存して後続のリクエストで再利用します。
|
|
39
137
|
|
|
40
|
-
|
|
41
|
-
-
|
|
138
|
+
- **disconnect**
|
|
139
|
+
- ヘッドレスブラウザのセッションを終了し、クッキーをクリアします。
|
|
42
140
|
|
|
43
|
-
|
|
44
|
-
- ヘッドレスブラウザプールを破棄し、すべてのインスタンスが適切に終了し、リソースが解放されるようにします。
|
|
141
|
+
---
|
|
45
142
|
|
|
46
|
-
|
|
143
|
+
## ⚡ 6. 対応するタスク (Supported Tasks)
|
|
47
144
|
|
|
48
|
-
|
|
145
|
+
| タスクタイプ | 説明 |
|
|
146
|
+
| ---------------------- | -------------------------------------- |
|
|
147
|
+
| `headless-pdf-capture` | HTMLをPDFに変換する |
|
|
148
|
+
| `headless-scrap` | ウェブページから特定データを抽出する |
|
|
149
|
+
| `headless-post` | フォーム入力を自動化し、送信を実行する |
|
|
49
150
|
|
|
50
|
-
####
|
|
151
|
+
#### 📌 タスク例
|
|
51
152
|
|
|
52
|
-
|
|
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
|
-
|
|
223
|
+
📌 **ヘッドレスコネクターを使えば、さまざまなウェブサイトのタスクを自動化できます!** 🚀
|
|
@@ -1,58 +1,166 @@
|
|
|
1
|
-
### 헤드리스
|
|
1
|
+
### 🏆 헤드리스 커넥터 (Headless Connector)
|
|
2
2
|
|
|
3
|
-
**헤드리스
|
|
3
|
+
**헤드리스 커넥터**는 헤드리스 브라우저를 활용하여 **로그인 자동화**, **웹 스크래핑**, **PDF 생성**, **폼 제출** 등의 작업을 수행하는 강력한 커넥터입니다.
|
|
4
|
+
여러 개의 브라우저 세션을 관리하며, 세션 유지, 쿠키 활용, API 기반 로그인 등 다양한 기능을 제공합니다.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
---
|
|
6
7
|
|
|
7
|
-
|
|
8
|
-
즉, 엔트포인트는 임의의 문자열을 입력하시면 됩니다.
|
|
8
|
+
## 🚀 1. 엔드포인트 (Endpoint)
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
헤드리스 커넥터의 엔드포인트는 **스크래핑 대상 웹사이트의 URL**을 입력합니다.
|
|
11
|
+
예를 들어, `https://example.com`과 같은 웹사이트의 내용을 가져오거나 내부 컨텐츠로 PDF 파일을 생성하려면 `localhost`를 사용할 수도 있습니다.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
- 풀에서 유지할 최소 헤드리스 브라우저 인스턴스 수를 지정합니다.
|
|
14
|
-
- 기본값: `2`
|
|
15
|
-
- **max** (숫자):
|
|
16
|
-
- 풀이 처리할 수 있는 최대 헤드리스 브라우저 인스턴스 수를 지정합니다.
|
|
17
|
-
- 기본값: `10`
|
|
13
|
+
---
|
|
18
14
|
|
|
19
|
-
|
|
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-
|
|
105
|
+
"name": "headless-browser-connector",
|
|
26
106
|
"connector": "headless-connector",
|
|
27
|
-
"endpoint": "
|
|
107
|
+
"endpoint": "https://example.com",
|
|
28
108
|
"params": {
|
|
29
|
-
"
|
|
30
|
-
"
|
|
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
|
-
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## 🔄 5. 연결 생명주기 (Connection Lifecycle)
|
|
126
|
+
|
|
127
|
+
- **connect**
|
|
36
128
|
|
|
37
|
-
|
|
129
|
+
- 설정된 매개변수에 따라 로그인 프로세스를 수행합니다.
|
|
130
|
+
- 세션이 유지되며, 쿠키를 저장하여 이후 요청에서 재사용합니다.
|
|
38
131
|
|
|
39
|
-
- **
|
|
132
|
+
- **disconnect**
|
|
133
|
+
- 헤드리스 브라우저 세션을 종료하고 쿠키를 정리합니다.
|
|
40
134
|
|
|
41
|
-
|
|
42
|
-
- 풀은 이러한 인스턴스들의 생명주기를 자동으로 관리하며, 필요한 경우 새로운 인스턴스를 생성하고 기존 인스턴스를 재사용합니다.
|
|
135
|
+
---
|
|
43
136
|
|
|
44
|
-
|
|
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
|
-
|
|
145
|
+
#### 📌 작업 예시
|
|
50
146
|
|
|
51
|
-
|
|
147
|
+
### 1️⃣ 웹 스크래핑 (`headless-scrap`)
|
|
52
148
|
|
|
53
|
-
|
|
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
|
-
|
|
217
|
+
**이 커넥터를 활용하면 다양한 웹사이트에서 자동 로그인 및 데이터 수집을 효율적으로 수행할 수 있습니다.** 🚀
|
|
@@ -1,57 +1,168 @@
|
|
|
1
|
-
### Headless
|
|
1
|
+
### 🏆 Headless Connector
|
|
2
2
|
|
|
3
|
-
**Headless
|
|
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
|
-
|
|
6
|
+
---
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## 🚀 1. Endpoint
|
|
8
9
|
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15
|
+
## 🔧 2. Parameters
|
|
19
16
|
|
|
20
|
-
|
|
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
|
-
"
|
|
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": "
|
|
109
|
+
"endpoint": "https://example.com",
|
|
27
110
|
"params": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
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
|
-
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 🔄 5. Connection Lifecycle
|
|
128
|
+
|
|
129
|
+
- **connect**
|
|
35
130
|
|
|
36
|
-
|
|
131
|
+
- Performs the login process according to the provided parameters.
|
|
132
|
+
- Maintains the session and stores cookies for future requests.
|
|
37
133
|
|
|
38
|
-
- **
|
|
134
|
+
- **disconnect**
|
|
135
|
+
- Terminates the browser session and clears cookies.
|
|
39
136
|
|
|
40
|
-
|
|
41
|
-
- The pool automatically manages the lifecycle of these instances, creating new ones as needed and reusing existing ones.
|
|
137
|
+
---
|
|
42
138
|
|
|
43
|
-
|
|
44
|
-
- Destroys the headless browser pool, ensuring all instances are properly terminated and resources are released.
|
|
139
|
+
## ⚡ 6. Supported Tasks
|
|
45
140
|
|
|
46
|
-
|
|
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
|
-
|
|
147
|
+
#### 📌 Task Examples
|
|
49
148
|
|
|
50
|
-
|
|
149
|
+
### 1️⃣ Web Scraping (`headless-scrap`)
|
|
51
150
|
|
|
52
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
218
|
+
📌 **With the Headless Connector, you can easily automate various tasks across different websites!** 🚀
|
|
@@ -1,59 +1,171 @@
|
|
|
1
|
-
### Penyambung
|
|
1
|
+
### 🏆 **Penyambung Headless (Headless Connector)**
|
|
2
2
|
|
|
3
|
-
**Penyambung
|
|
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
|
-
|
|
6
|
+
---
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## 🚀 **1. Titik Akhir (Endpoint)**
|
|
8
9
|
|
|
9
|
-
|
|
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
|
-
|
|
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
|
-
|
|
15
|
+
## 🔧 **2. Parameter (Parameters)**
|
|
19
16
|
|
|
20
|
-
|
|
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
|
-
"
|
|
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": "
|
|
112
|
+
"endpoint": "https://example.com",
|
|
27
113
|
"params": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
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
|
-
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 🔄 **5. Kitaran Hayat Sambungan (Connection Lifecycle)**
|
|
35
131
|
|
|
36
|
-
|
|
132
|
+
- **connect**
|
|
37
133
|
|
|
38
|
-
|
|
134
|
+
- Mencuba log masuk berdasarkan parameter yang dikonfigurasi.
|
|
135
|
+
- Mengekalkan sesi dan menyimpan kuki untuk permintaan seterusnya.
|
|
39
136
|
|
|
40
|
-
- **
|
|
137
|
+
- **disconnect**
|
|
138
|
+
- Menamatkan sesi pelayar headless dan memadamkan kuki.
|
|
41
139
|
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
150
|
+
#### 📌 **Contoh Penggunaan Tugas**
|
|
51
151
|
|
|
52
|
-
|
|
152
|
+
### 1️⃣ **Pengikisan Web (`headless-scrap`)**
|
|
53
153
|
|
|
54
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
221
|
+
📌 **Gunakan Penyambung Headless untuk mengautomasikan pelbagai tugas web dengan lebih mudah dan cekap!** 🚀
|
|
@@ -1,57 +1,168 @@
|
|
|
1
|
-
###
|
|
1
|
+
### 🏆 无头连接器 (Headless Connector)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**无头连接器** 利用无头浏览器执行 **自动登录**、**网页爬取**、**PDF 生成**、**表单提交**等任务。
|
|
4
|
+
它可以管理多个浏览器会话,支持会话保持、Cookie 处理、基于 API 的登录等功能。
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
---
|
|
6
7
|
|
|
7
|
-
|
|
8
|
+
## 🚀 1. 端点(Endpoint)
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
无头连接器的端点需要填写 **目标网页的 URL**。
|
|
11
|
+
例如,可以输入 `https://example.com` 以抓取该网站的内容,或者使用 `localhost` 生成 PDF。
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
- 指定池中维持的最少无头浏览器实例数量。
|
|
13
|
-
- 默认值: `2`
|
|
14
|
-
- **max** (数字):
|
|
15
|
-
- 指定池中可以处理的最大无头浏览器实例数量。
|
|
16
|
-
- 默认值: `10`
|
|
13
|
+
---
|
|
17
14
|
|
|
18
|
-
|
|
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
|
-
"
|
|
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": "
|
|
109
|
+
"endpoint": "https://example.com",
|
|
27
110
|
"params": {
|
|
28
|
-
"
|
|
29
|
-
"
|
|
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
|
-
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## 🔄 5. 连接生命周期(Connection Lifecycle)
|
|
128
|
+
|
|
129
|
+
- **connect**
|
|
35
130
|
|
|
36
|
-
|
|
131
|
+
- 根据参数执行登录流程,并保持会话。
|
|
132
|
+
- 存储 Cookie,以便后续请求使用。
|
|
37
133
|
|
|
38
|
-
- **
|
|
134
|
+
- **disconnect**
|
|
135
|
+
- 关闭浏览器会话,并清除 Cookie。
|
|
39
136
|
|
|
40
|
-
|
|
41
|
-
- 池会自动管理这些实例的生命周期,必要时创建新的实例并重用现有的实例。
|
|
137
|
+
---
|
|
42
138
|
|
|
43
|
-
|
|
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
|
-
|
|
147
|
+
#### 📌 任务示例
|
|
49
148
|
|
|
50
|
-
|
|
149
|
+
### 1️⃣ 网页爬取(`headless-scrap`)
|
|
51
150
|
|
|
52
|
-
|
|
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
|
-
|
|
218
|
+
📌 **通过无头连接器,你可以轻松地在不同网站上实现自动化操作!** 🚀
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@things-factory/integration-headless",
|
|
3
|
-
"version": "8.0.0-beta.
|
|
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.
|
|
26
|
-
"@things-factory/board-service": "^8.0.0-beta.
|
|
27
|
-
"@things-factory/integration-base": "^8.0.0-beta.
|
|
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": "
|
|
32
|
+
"gitHead": "bf5206511b2d84dfb95edc3dae7f54f6cbb9bcca"
|
|
33
33
|
}
|