@dongdev/fca-unofficial 1.0.20 → 2.0.1
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/.gitattributes +1 -0
- package/CHANGELOG.md +32 -29
- package/DOCS.md +727 -592
- package/README.md +94 -97
- package/func/logger.js +112 -0
- package/html.html +474 -0
- package/index.js +1 -379
- package/module/config.js +26 -0
- package/module/login.js +45 -0
- package/module/loginHelper.js +634 -0
- package/module/options.js +49 -0
- package/package.json +6 -39
- package/src/api/action/addExternalModule.js +25 -0
- package/src/api/action/changeAvatar.js +136 -0
- package/src/api/action/changeBio.js +76 -0
- package/src/api/action/getCurrentUserID.js +7 -0
- package/src/api/action/handleFriendRequest.js +57 -0
- package/src/api/action/logout.js +75 -0
- package/src/{refreshFb_dtsg.js → api/action/refreshFb_dtsg.js} +8 -8
- package/src/api/action/setPostReaction.js +107 -0
- package/src/api/action/unfriend.js +55 -0
- package/src/api/http/httpGet.js +65 -0
- package/src/api/http/httpPost.js +65 -0
- package/src/{postFormData.js → api/http/postFormData.js} +10 -10
- package/src/api/messaging/addUserToGroup.js +69 -0
- package/src/api/messaging/changeAdminStatus.js +103 -0
- package/src/api/messaging/changeArchivedStatus.js +55 -0
- package/src/api/messaging/changeBlockedStatus.js +49 -0
- package/src/api/messaging/changeGroupImage.js +135 -0
- package/src/api/messaging/changeNickname.js +59 -0
- package/src/api/messaging/changeThreadColor.js +65 -0
- package/src/api/messaging/createNewGroup.js +88 -0
- package/src/api/messaging/createPoll.js +70 -0
- package/src/api/messaging/deleteMessage.js +56 -0
- package/src/api/messaging/deleteThread.js +56 -0
- package/src/api/messaging/forwardAttachment.js +60 -0
- package/src/api/messaging/getEmojiUrl.js +29 -0
- package/src/api/messaging/getFriendsList.js +83 -0
- package/src/api/messaging/getMessage.js +834 -0
- package/src/api/messaging/getThreadHistory.js +681 -0
- package/src/api/messaging/handleMessageRequest.js +65 -0
- package/src/api/messaging/markAsDelivered.js +57 -0
- package/src/api/messaging/markAsRead.js +88 -0
- package/src/api/messaging/markAsReadAll.js +50 -0
- package/src/api/messaging/markAsSeen.js +61 -0
- package/src/api/messaging/muteThread.js +51 -0
- package/src/api/messaging/removeUserFromGroup.js +79 -0
- package/src/api/messaging/resolvePhotoUrl.js +44 -0
- package/src/api/messaging/searchForThread.js +53 -0
- package/src/api/messaging/sendMessage.js +306 -0
- package/src/api/messaging/sendMessageMqtt.js +321 -0
- package/src/api/messaging/sendTypingIndicator.js +110 -0
- package/src/{setMessageReaction.js → api/messaging/setMessageReaction.js} +20 -20
- package/src/api/messaging/setTitle.js +90 -0
- package/src/api/messaging/shareContact.js +51 -0
- package/src/api/messaging/threadColors.js +131 -0
- package/src/api/messaging/unsendMessage.js +44 -0
- package/src/api/messaging/uploadAttachment.js +93 -0
- package/src/api/socket/detail/buildStream.js +100 -0
- package/src/{listenMqtt.js → api/socket/listenMqtt.js} +122 -206
- package/src/api/threads/changeThreadEmoji.js +55 -0
- package/src/api/threads/getThreadInfo.js +572 -0
- package/src/{getThreadList.js → api/threads/getThreadList.js} +110 -54
- package/src/api/threads/getThreadPictures.js +79 -0
- package/src/api/users/getUserID.js +66 -0
- package/src/api/users/getUserInfo.js +88 -0
- package/src/core/sendReqMqtt.js +63 -0
- package/{lib → src}/database/models/index.js +12 -10
- package/{lib → src}/database/models/thread.js +5 -5
- package/{lib → src}/database/threadData.js +19 -14
- package/src/utils/client.js +159 -0
- package/src/utils/constants.js +13 -0
- package/src/utils/format.js +60 -0
- package/src/utils/headers.js +41 -0
- package/src/utils/index.js +1497 -0
- package/src/utils/request.js +147 -0
- package/lib/logger.js +0 -96
- package/src/addExternalModule.js +0 -19
- package/src/addUserToGroup.js +0 -113
- package/src/changeAdminStatus.js +0 -79
- package/src/changeArchivedStatus.js +0 -55
- package/src/changeAvatar.js +0 -126
- package/src/changeBio.js +0 -77
- package/src/changeBlockedStatus.js +0 -47
- package/src/changeGroupImage.js +0 -132
- package/src/changeNickname.js +0 -59
- package/src/changeThreadColor.js +0 -65
- package/src/changeThreadEmoji.js +0 -55
- package/src/createNewGroup.js +0 -86
- package/src/createPoll.js +0 -71
- package/src/deleteMessage.js +0 -56
- package/src/deleteThread.js +0 -56
- package/src/forwardAttachment.js +0 -60
- package/src/getCurrentUserID.js +0 -7
- package/src/getEmojiUrl.js +0 -29
- package/src/getFriendsList.js +0 -83
- package/src/getMessage.js +0 -796
- package/src/getThreadHistory.js +0 -666
- package/src/getThreadInfo.js +0 -535
- package/src/getThreadPictures.js +0 -79
- package/src/getUserID.js +0 -66
- package/src/getUserInfo.js +0 -80
- package/src/handleFriendRequest.js +0 -61
- package/src/handleMessageRequest.js +0 -65
- package/src/httpGet.js +0 -57
- package/src/httpPost.js +0 -57
- package/src/httpPostFormData.js +0 -63
- package/src/logout.js +0 -75
- package/src/markAsDelivered.js +0 -58
- package/src/markAsRead.js +0 -80
- package/src/markAsReadAll.js +0 -50
- package/src/markAsSeen.js +0 -59
- package/src/muteThread.js +0 -52
- package/src/removeUserFromGroup.js +0 -79
- package/src/resolvePhotoUrl.js +0 -45
- package/src/searchForThread.js +0 -53
- package/src/sendMessage.js +0 -328
- package/src/sendMessageMqtt.js +0 -316
- package/src/sendTypingIndicator.js +0 -103
- package/src/setPostReaction.js +0 -109
- package/src/setTitle.js +0 -86
- package/src/shareContact.js +0 -49
- package/src/threadColors.js +0 -131
- package/src/unfriend.js +0 -52
- package/src/unsendMessage.js +0 -49
- package/src/uploadAttachment.js +0 -95
- package/utils.js +0 -1387
- /package/{lib → func}/login.js +0 -0
package/README.md
CHANGED
@@ -29,19 +29,17 @@ It will download @dongdev/fca-unofficial from NPM repositories
|
|
29
29
|
## Example Usage
|
30
30
|
|
31
31
|
```javascript
|
32
|
-
|
33
32
|
const login = require("@dongdev/fca-unofficial");
|
34
33
|
|
35
34
|
login({ appState: [] }, (err, api) => {
|
36
|
-
|
35
|
+
if (err) return console.error(err);
|
37
36
|
|
38
|
-
|
39
|
-
|
37
|
+
api.listenMqtt((err, event) => {
|
38
|
+
if (err) return console.error(err);
|
40
39
|
|
41
|
-
|
42
|
-
|
40
|
+
api.sendMessage(event.body, event.threadID);
|
41
|
+
});
|
43
42
|
});
|
44
|
-
|
45
43
|
```
|
46
44
|
|
47
45
|
Result:
|
@@ -52,74 +50,72 @@ Result:
|
|
52
50
|
|
53
51
|
### Sending a message
|
54
52
|
|
55
|
-
#### api.sendMessage(message, threadID[, callback][,
|
53
|
+
#### api.sendMessage(message, threadID[, callback][, messageid])
|
56
54
|
|
57
55
|
Various types of message can be sent:
|
58
56
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
57
|
+
- _Regular:_ set field `body` to the desired message as a string.
|
58
|
+
- _Sticker:_ set a field `sticker` to the desired sticker ID.
|
59
|
+
- _File or image:_ Set field `attachment` to a readable stream or an array of readable streams.
|
60
|
+
- _URL:_ set a field `url` to the desired URL.
|
61
|
+
- _Emoji:_ set field `emoji` to the desired emoji as a string and set field `emojiSize` with size of the emoji (`small`, `medium`, `large`)
|
64
62
|
|
65
63
|
Note that a message can only be a regular message (which can be empty) and optionally one of the following: a sticker, an attachment or a url.
|
66
64
|
|
67
|
-
|
65
|
+
**Tip**: to find your own ID, you can look inside the cookies. The `userID` is under the name `c_user`.
|
68
66
|
|
69
|
-
|
67
|
+
**Example (Basic Message)**
|
70
68
|
|
71
69
|
```js
|
72
70
|
const login = require("@dongdev/fca-unofficial");
|
73
71
|
|
74
72
|
login({ appState: [] }, (err, api) => {
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
73
|
+
if (err) {
|
74
|
+
console.error("Login Error:", err);
|
75
|
+
return;
|
76
|
+
}
|
77
|
+
|
78
|
+
let yourID = "000000000000000"; // Replace with actual Facebook ID
|
79
|
+
let msg = "Hey!";
|
80
|
+
|
81
|
+
api.sendMessage(msg, yourID, err => {
|
82
|
+
if (err) console.error("Message Sending Error:", err);
|
83
|
+
else console.log("Message sent successfully!");
|
84
|
+
});
|
87
85
|
});
|
88
|
-
|
89
86
|
```
|
90
87
|
|
91
|
-
|
88
|
+
**Example (File upload)**
|
92
89
|
|
93
90
|
```js
|
94
91
|
const login = require("@dongdev/fca-unofficial");
|
95
92
|
const fs = require("fs"); // ✅ Required the fs module
|
96
93
|
|
97
94
|
login({ appState: [] }, (err, api) => {
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
95
|
+
if (err) {
|
96
|
+
console.error("Login Error:", err);
|
97
|
+
return;
|
98
|
+
}
|
99
|
+
|
100
|
+
let yourID = "000000000000000"; // Replace with actual Facebook ID
|
101
|
+
let imagePath = __dirname + "/image.jpg";
|
102
|
+
|
103
|
+
// Check if the file exists before sending
|
104
|
+
if (!fs.existsSync(imagePath)) {
|
105
|
+
console.error("Error: Image file not found!");
|
106
|
+
return;
|
107
|
+
}
|
108
|
+
|
109
|
+
let msg = {
|
110
|
+
body: "Hey!",
|
111
|
+
attachment: fs.createReadStream(imagePath)
|
112
|
+
};
|
113
|
+
|
114
|
+
api.sendMessage(msg, yourID, err => {
|
115
|
+
if (err) console.error("Message Sending Error:", err);
|
116
|
+
else console.log("Message sent successfully!");
|
117
|
+
});
|
121
118
|
});
|
122
|
-
|
123
119
|
```
|
124
120
|
|
125
121
|
---
|
@@ -128,7 +124,7 @@ login({ appState: [] }, (err, api) => {
|
|
128
124
|
|
129
125
|
To avoid logging in every time you should save AppState (cookies etc.) to a file, then you can use it without having password in your scripts.
|
130
126
|
|
131
|
-
|
127
|
+
**Example**
|
132
128
|
|
133
129
|
```js
|
134
130
|
const fs = require("fs");
|
@@ -137,20 +133,19 @@ const login = require("@dongdev/fca-unofficial");
|
|
137
133
|
const credentials = { appState: [] };
|
138
134
|
|
139
135
|
login(credentials, (err, api) => {
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
136
|
+
if (err) {
|
137
|
+
console.error("Login Error:", err);
|
138
|
+
return;
|
139
|
+
}
|
140
|
+
|
141
|
+
try {
|
142
|
+
const appState = JSON.stringify(api.getAppState(), null, 2); // Pretty print for readability
|
143
|
+
fs.writeFileSync("appstate.json", appState);
|
144
|
+
console.log("✅ AppState saved successfully!");
|
145
|
+
} catch (error) {
|
146
|
+
console.error("Error saving AppState:", error);
|
147
|
+
}
|
152
148
|
});
|
153
|
-
|
154
149
|
```
|
155
150
|
|
156
151
|
Alternative: Use [c3c-fbstate](https://github.com/c3cbot/c3c-fbstate) to get fbstate.json (appstate.json)
|
@@ -163,50 +158,52 @@ Alternative: Use [c3c-fbstate](https://github.com/c3cbot/c3c-fbstate) to get fbs
|
|
163
158
|
|
164
159
|
Listen watches for messages sent in a chat. By default this won't receive events (joining/leaving a chat, title change etc…) but it can be activated with `api.setOptions({listenEvents: true})`. This will by default ignore messages sent by the current account, you can enable listening to your own messages with `api.setOptions({selfListen: true})`.
|
165
160
|
|
166
|
-
|
161
|
+
**Example**
|
167
162
|
|
168
163
|
```js
|
169
164
|
const fs = require("fs");
|
170
165
|
const login = require("@dongdev/fca-unofficial");
|
171
166
|
|
172
167
|
// Simple echo bot: Repeats everything you say. Stops when you say "/stop".
|
173
|
-
login(
|
168
|
+
login(
|
169
|
+
{ appState: JSON.parse(fs.readFileSync("appstate.json", "utf8")) },
|
170
|
+
(err, api) => {
|
174
171
|
if (err) {
|
175
|
-
|
176
|
-
|
172
|
+
console.error("Login Error:", err);
|
173
|
+
return;
|
177
174
|
}
|
178
175
|
|
179
176
|
api.setOptions({ listenEvents: true });
|
180
177
|
|
181
178
|
const stopListening = api.listenMqtt((err, event) => {
|
182
|
-
|
183
|
-
|
179
|
+
if (err) {
|
180
|
+
console.error("Listen Error:", err);
|
181
|
+
return;
|
182
|
+
}
|
183
|
+
|
184
|
+
// Mark message as read
|
185
|
+
api.markAsRead(event.threadID, err => {
|
186
|
+
if (err) console.error("Mark as read error:", err);
|
187
|
+
});
|
188
|
+
|
189
|
+
// Handle different event types
|
190
|
+
switch (event.type) {
|
191
|
+
case "message":
|
192
|
+
if (event.body && event.body.trim().toLowerCase() === "/stop") {
|
193
|
+
api.sendMessage("Goodbye…", event.threadID);
|
194
|
+
stopListening();
|
184
195
|
return;
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
switch (event.type) {
|
194
|
-
case "message":
|
195
|
-
if (event.body && event.body.trim().toLowerCase() === "/stop") {
|
196
|
-
api.sendMessage("Goodbye…", event.threadID);
|
197
|
-
stopListening();
|
198
|
-
return;
|
199
|
-
}
|
200
|
-
api.sendMessage(`TEST BOT: ${event.body}`, event.threadID);
|
201
|
-
break;
|
202
|
-
|
203
|
-
case "event":
|
204
|
-
console.log("Event Received:", event);
|
205
|
-
break;
|
206
|
-
}
|
196
|
+
}
|
197
|
+
api.sendMessage(`TEST BOT: ${event.body}`, event.threadID);
|
198
|
+
break;
|
199
|
+
|
200
|
+
case "event":
|
201
|
+
console.log("Event Received:", event);
|
202
|
+
break;
|
203
|
+
}
|
207
204
|
});
|
208
|
-
}
|
209
|
-
|
205
|
+
}
|
206
|
+
);
|
210
207
|
```
|
211
208
|
|
212
209
|
`<a name="projects-using-this-api"></a>`
|
package/func/logger.js
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
const chalk = require("chalk");
|
2
|
+
const gradient = require("gradient-string");
|
3
|
+
const themes = [
|
4
|
+
"blue",
|
5
|
+
"dream2",
|
6
|
+
"dream",
|
7
|
+
"test",
|
8
|
+
"fiery",
|
9
|
+
"rainbow",
|
10
|
+
"pastel",
|
11
|
+
"cristal",
|
12
|
+
"red",
|
13
|
+
"aqua",
|
14
|
+
"pink",
|
15
|
+
"retro",
|
16
|
+
"sunlight",
|
17
|
+
"teen",
|
18
|
+
"summer",
|
19
|
+
"flower",
|
20
|
+
"ghost",
|
21
|
+
"hacker"
|
22
|
+
];
|
23
|
+
const theme = themes[Math.floor(Math.random() * themes.length)];
|
24
|
+
let co;
|
25
|
+
let error;
|
26
|
+
if (theme.toLowerCase() === "blue") {
|
27
|
+
co = gradient([
|
28
|
+
{ color: "#1affa3", pos: 0.2 },
|
29
|
+
{ color: "cyan", pos: 0.4 },
|
30
|
+
{ color: "pink", pos: 0.6 },
|
31
|
+
{ color: "cyan", pos: 0.8 },
|
32
|
+
{ color: "#1affa3", pos: 1 }
|
33
|
+
]);
|
34
|
+
error = chalk.red.bold;
|
35
|
+
} else if (theme == "dream2") {
|
36
|
+
cra = gradient("blue", "pink");
|
37
|
+
co = gradient("#a200ff", "#21b5ff", "#a200ff");
|
38
|
+
} else if (theme.toLowerCase() === "dream") {
|
39
|
+
co = gradient([
|
40
|
+
{ color: "blue", pos: 0.2 },
|
41
|
+
{ color: "pink", pos: 0.3 },
|
42
|
+
{ color: "gold", pos: 0.6 },
|
43
|
+
{ color: "pink", pos: 0.8 },
|
44
|
+
{ color: "blue", pos: 1 }
|
45
|
+
]);
|
46
|
+
error = chalk.red.bold;
|
47
|
+
} else if (theme.toLowerCase() === "fiery") {
|
48
|
+
co = gradient("#fc2803", "#fc6f03", "#fcba03");
|
49
|
+
error = chalk.red.bold;
|
50
|
+
} else if (theme.toLowerCase() === "rainbow") {
|
51
|
+
co = gradient.rainbow;
|
52
|
+
error = chalk.red.bold;
|
53
|
+
} else if (theme.toLowerCase() === "pastel") {
|
54
|
+
co = gradient.pastel;
|
55
|
+
error = chalk.red.bold;
|
56
|
+
} else if (theme.toLowerCase() === "cristal") {
|
57
|
+
co = gradient.cristal;
|
58
|
+
error = chalk.red.bold;
|
59
|
+
} else if (theme.toLowerCase() === "red") {
|
60
|
+
co = gradient("red", "orange");
|
61
|
+
error = chalk.red.bold;
|
62
|
+
} else if (theme.toLowerCase() === "aqua") {
|
63
|
+
co = gradient("#0030ff", "#4e6cf2");
|
64
|
+
error = chalk.blueBright;
|
65
|
+
} else if (theme.toLowerCase() === "pink") {
|
66
|
+
cra = gradient("purple", "pink");
|
67
|
+
co = gradient("#d94fff", "purple");
|
68
|
+
} else if (theme.toLowerCase() === "retro") {
|
69
|
+
cra = gradient("#d94fff", "purple");
|
70
|
+
co = gradient.retro;
|
71
|
+
} else if (theme.toLowerCase() === "sunlight") {
|
72
|
+
cra = gradient("#f5bd31", "#f5e131");
|
73
|
+
co = gradient("orange", "#ffff00", "#ffe600");
|
74
|
+
} else if (theme.toLowerCase() === "teen") {
|
75
|
+
cra = gradient("#00a9c7", "#853858", "#853858", "#00a9c7");
|
76
|
+
co = gradient.teen;
|
77
|
+
} else if (theme.toLowerCase() === "summer") {
|
78
|
+
cra = gradient("#fcff4d", "#4de1ff");
|
79
|
+
co = gradient.summer;
|
80
|
+
} else if (theme.toLowerCase() === "flower") {
|
81
|
+
cra = gradient("blue", "purple", "yellow", "#81ff6e");
|
82
|
+
co = gradient.pastel;
|
83
|
+
} else if (theme.toLowerCase() === "ghost") {
|
84
|
+
cra = gradient("#0a658a", "#0a7f8a", "#0db5aa");
|
85
|
+
co = gradient.mind;
|
86
|
+
} else if (theme === "hacker") {
|
87
|
+
cra = chalk.hex("#4be813");
|
88
|
+
co = gradient("#47a127", "#0eed19", "#27f231");
|
89
|
+
} else {
|
90
|
+
co = gradient("#243aff", "#4687f0", "#5800d4");
|
91
|
+
error = chalk.red.bold;
|
92
|
+
}
|
93
|
+
module.exports = (text, type) => {
|
94
|
+
switch (type) {
|
95
|
+
case "warn":
|
96
|
+
process.stderr.write(co(`\r[ FCA-WARN ] > ${text}`) + "\n");
|
97
|
+
break;
|
98
|
+
case "error":
|
99
|
+
process.stderr.write(
|
100
|
+
chalk.bold.hex("#ff0000").bold(`\r[ FCA-ERROR ]`) + ` > ${text}` + "\n"
|
101
|
+
);
|
102
|
+
break;
|
103
|
+
case "info":
|
104
|
+
process.stderr.write(chalk.bold(co(`\r[ FCA-UNO ] > ${text}`) + "\n"));
|
105
|
+
break;
|
106
|
+
default:
|
107
|
+
process.stderr.write(
|
108
|
+
chalk.bold(co(`\r${String(type).toUpperCase()} ${text}`) + "\n")
|
109
|
+
);
|
110
|
+
break;
|
111
|
+
}
|
112
|
+
};
|