fca-riyad 37.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.
Files changed (242) hide show
  1. package/CHANGELOG.md +325 -0
  2. package/DOCS.md +2712 -0
  3. package/README.md +410 -0
  4. package/func/checkUpdate.js +7 -0
  5. package/func/logAdapter.js +33 -0
  6. package/func/logger.js +48 -0
  7. package/index.d.ts +751 -0
  8. package/index.js +22 -0
  9. package/module/config.js +40 -0
  10. package/module/login.js +133 -0
  11. package/module/loginHelper.js +1359 -0
  12. package/module/options.js +44 -0
  13. package/package.json +95 -0
  14. package/src/api/action/addExternalModule.js +25 -0
  15. package/src/api/action/changeAvatar.js +137 -0
  16. package/src/api/action/changeBio.js +75 -0
  17. package/src/api/action/enableAutoSaveAppState.js +73 -0
  18. package/src/api/action/getCurrentUserID.js +7 -0
  19. package/src/api/action/handleFriendRequest.js +57 -0
  20. package/src/api/action/logout.js +76 -0
  21. package/src/api/action/refreshFb_dtsg.js +48 -0
  22. package/src/api/action/setPostReaction.js +106 -0
  23. package/src/api/action/unfriend.js +54 -0
  24. package/src/api/http/httpGet.js +46 -0
  25. package/src/api/http/httpPost.js +52 -0
  26. package/src/api/http/postFormData.js +47 -0
  27. package/src/api/messaging/addUserToGroup.js +68 -0
  28. package/src/api/messaging/changeAdminStatus.js +126 -0
  29. package/src/api/messaging/changeArchivedStatus.js +55 -0
  30. package/src/api/messaging/changeBlockedStatus.js +48 -0
  31. package/src/api/messaging/changeGroupImage.js +91 -0
  32. package/src/api/messaging/changeNickname.js +70 -0
  33. package/src/api/messaging/changeThreadColor.js +79 -0
  34. package/src/api/messaging/changeThreadEmoji.js +111 -0
  35. package/src/api/messaging/createNewGroup.js +88 -0
  36. package/src/api/messaging/createPoll.js +46 -0
  37. package/src/api/messaging/createThemeAI.js +98 -0
  38. package/src/api/messaging/deleteMessage.js +136 -0
  39. package/src/api/messaging/deleteThread.js +56 -0
  40. package/src/api/messaging/editMessage.js +90 -0
  41. package/src/api/messaging/forwardAttachment.js +57 -0
  42. package/src/api/messaging/forwardMessage.js +134 -0
  43. package/src/api/messaging/getEmojiUrl.js +29 -0
  44. package/src/api/messaging/getFriendsList.js +82 -0
  45. package/src/api/messaging/getMessage.js +829 -0
  46. package/src/api/messaging/getThemePictures.js +62 -0
  47. package/src/api/messaging/handleMessageRequest.js +65 -0
  48. package/src/api/messaging/markAsDelivered.js +57 -0
  49. package/src/api/messaging/markAsRead.js +88 -0
  50. package/src/api/messaging/markAsReadAll.js +49 -0
  51. package/src/api/messaging/markAsSeen.js +61 -0
  52. package/src/api/messaging/muteThread.js +50 -0
  53. package/src/api/messaging/pinMessage.js +115 -0
  54. package/src/api/messaging/removeUserFromGroup.js +62 -0
  55. package/src/api/messaging/resolvePhotoUrl.js +43 -0
  56. package/src/api/messaging/scheduler.js +264 -0
  57. package/src/api/messaging/searchForThread.js +53 -0
  58. package/src/api/messaging/sendBroadcast.js +93 -0
  59. package/src/api/messaging/sendMessage.js +269 -0
  60. package/src/api/messaging/sendTypingIndicator.js +74 -0
  61. package/src/api/messaging/sessionGuard.js +130 -0
  62. package/src/api/messaging/setMessageReaction.js +95 -0
  63. package/src/api/messaging/setTitle.js +124 -0
  64. package/src/api/messaging/shareContact.js +49 -0
  65. package/src/api/messaging/threadColors.js +128 -0
  66. package/src/api/messaging/unsendMessage.js +81 -0
  67. package/src/api/messaging/uploadAttachment.js +492 -0
  68. package/src/api/socket/OldMessage.js +186 -0
  69. package/src/api/socket/core/connectMqtt.js +269 -0
  70. package/src/api/socket/core/emitAuth.js +103 -0
  71. package/src/api/socket/core/getSeqID.js +321 -0
  72. package/src/api/socket/core/getTaskResponseData.js +25 -0
  73. package/src/api/socket/core/parseDelta.js +387 -0
  74. package/src/api/socket/detail/buildStream.js +215 -0
  75. package/src/api/socket/detail/constants.js +28 -0
  76. package/src/api/socket/e2ee/crypto.js +173 -0
  77. package/src/api/socket/e2ee/e2ee/crypto.js +173 -0
  78. package/src/api/socket/e2ee/e2ee/index.js +421 -0
  79. package/src/api/socket/e2ee/e2ee/proto/ArmadilloApplication.proto +281 -0
  80. package/src/api/socket/e2ee/e2ee/proto/ArmadilloICDC.proto +14 -0
  81. package/src/api/socket/e2ee/e2ee/proto/ConsumerApplication.proto +232 -0
  82. package/src/api/socket/e2ee/e2ee/proto/MessageApplication.proto +82 -0
  83. package/src/api/socket/e2ee/e2ee/proto/MessageTransport.proto +77 -0
  84. package/src/api/socket/e2ee/e2ee/proto/WACommon.proto +66 -0
  85. package/src/api/socket/e2ee/e2ee/proto/WAMediaTransport.proto +176 -0
  86. package/src/api/socket/e2ee/e2ee/proto/proto-writer.ts +76 -0
  87. package/src/api/socket/e2ee/e2ee/protocol.js +196 -0
  88. package/src/api/socket/e2ee/e2ee/ratchet.js +219 -0
  89. package/src/api/socket/e2ee/e2ee/store.js +182 -0
  90. package/src/api/socket/e2ee/e2ee/vendor/fb-e2ee.cjs +9162 -0
  91. package/src/api/socket/e2ee/e2ee/vendor/proto/ArmadilloApplication.proto +281 -0
  92. package/src/api/socket/e2ee/e2ee/vendor/proto/ArmadilloICDC.proto +14 -0
  93. package/src/api/socket/e2ee/e2ee/vendor/proto/ConsumerApplication.proto +232 -0
  94. package/src/api/socket/e2ee/e2ee/vendor/proto/MessageApplication.proto +82 -0
  95. package/src/api/socket/e2ee/e2ee/vendor/proto/MessageTransport.proto +77 -0
  96. package/src/api/socket/e2ee/e2ee/vendor/proto/WACommon.proto +66 -0
  97. package/src/api/socket/e2ee/e2ee/vendor/proto/WAMediaTransport.proto +176 -0
  98. package/src/api/socket/e2ee/e2ee/vendor/proto/proto-writer.ts +76 -0
  99. package/src/api/socket/e2ee/index.js +437 -0
  100. package/src/api/socket/e2ee/proto/ArmadilloApplication.proto +281 -0
  101. package/src/api/socket/e2ee/proto/ArmadilloICDC.proto +14 -0
  102. package/src/api/socket/e2ee/proto/ConsumerApplication.proto +232 -0
  103. package/src/api/socket/e2ee/proto/MessageApplication.proto +82 -0
  104. package/src/api/socket/e2ee/proto/MessageTransport.proto +77 -0
  105. package/src/api/socket/e2ee/proto/WACommon.proto +66 -0
  106. package/src/api/socket/e2ee/proto/WAMediaTransport.proto +176 -0
  107. package/src/api/socket/e2ee/proto/proto-writer.ts +76 -0
  108. package/src/api/socket/e2ee/protocol.js +196 -0
  109. package/src/api/socket/e2ee/ratchet.js +219 -0
  110. package/src/api/socket/e2ee/store.js +182 -0
  111. package/src/api/socket/e2ee/vendor/fb-e2ee.cjs +9162 -0
  112. package/src/api/socket/e2ee/vendor/proto/ArmadilloApplication.proto +281 -0
  113. package/src/api/socket/e2ee/vendor/proto/ArmadilloICDC.proto +14 -0
  114. package/src/api/socket/e2ee/vendor/proto/ConsumerApplication.proto +232 -0
  115. package/src/api/socket/e2ee/vendor/proto/MessageApplication.proto +82 -0
  116. package/src/api/socket/e2ee/vendor/proto/MessageTransport.proto +77 -0
  117. package/src/api/socket/e2ee/vendor/proto/WACommon.proto +66 -0
  118. package/src/api/socket/e2ee/vendor/proto/WAMediaTransport.proto +176 -0
  119. package/src/api/socket/e2ee/vendor/proto/proto-writer.ts +76 -0
  120. package/src/api/socket/listenE2EE.js +75 -0
  121. package/src/api/socket/listenMqtt.js +388 -0
  122. package/src/api/socket/middleware/index.js +216 -0
  123. package/src/api/socket/sendMessage.js +309 -0
  124. package/src/api/socket/sendMessageMqtt.js +69 -0
  125. package/src/api/threads/getThreadHistory.js +664 -0
  126. package/src/api/threads/getThreadInfo.js +296 -0
  127. package/src/api/threads/getThreadList.js +293 -0
  128. package/src/api/threads/getThreadPictures.js +78 -0
  129. package/src/api/users/getUserID.js +65 -0
  130. package/src/api/users/getUserInfo.js +402 -0
  131. package/src/api/users/getUserInfoV2.js +134 -0
  132. package/src/app/MessengerBot.js +209 -0
  133. package/src/app/MessengerContext.js +32 -0
  134. package/src/app/createFcaClient.js +136 -0
  135. package/src/app/threadInfoRealtimeSync.js +284 -0
  136. package/src/core/sendReqMqtt.js +96 -0
  137. package/src/database/helpers.js +53 -0
  138. package/src/database/models/index.js +88 -0
  139. package/src/database/models/thread.js +50 -0
  140. package/src/database/models/user.js +46 -0
  141. package/src/database/threadData.js +94 -0
  142. package/src/database/userData.js +98 -0
  143. package/src/remote/remoteClient.js +123 -0
  144. package/src/utils/broadcast.js +51 -0
  145. package/src/utils/client.js +10 -0
  146. package/src/utils/constants.js +23 -0
  147. package/src/utils/cookies.js +68 -0
  148. package/src/utils/format/attachment.js +357 -0
  149. package/src/utils/format/cookie.js +9 -0
  150. package/src/utils/format/date.js +50 -0
  151. package/src/utils/format/decode.js +44 -0
  152. package/src/utils/format/delta.js +194 -0
  153. package/src/utils/format/ids.js +64 -0
  154. package/src/utils/format/index.js +64 -0
  155. package/src/utils/format/message.js +88 -0
  156. package/src/utils/format/presence.js +132 -0
  157. package/src/utils/format/readTyp.js +44 -0
  158. package/src/utils/format/thread.js +42 -0
  159. package/src/utils/format/utils.js +141 -0
  160. package/src/utils/headers.js +115 -0
  161. package/src/utils/loginParser/autoLogin.js +125 -0
  162. package/src/utils/loginParser/helpers.js +43 -0
  163. package/src/utils/loginParser/index.js +10 -0
  164. package/src/utils/loginParser/parseAndCheckLogin.js +220 -0
  165. package/src/utils/loginParser/textUtils.js +28 -0
  166. package/src/utils/nexca-logger.js +144 -0
  167. package/src/utils/nexca-utils.js +686 -0
  168. package/src/utils/request/client.js +26 -0
  169. package/src/utils/request/config.js +23 -0
  170. package/src/utils/request/defaults.js +46 -0
  171. package/src/utils/request/helpers.js +46 -0
  172. package/src/utils/request/index.js +17 -0
  173. package/src/utils/request/methods.js +163 -0
  174. package/src/utils/request/proxy.js +21 -0
  175. package/src/utils/request/retry.js +77 -0
  176. package/src/utils/request/sanitize.js +49 -0
  177. package/src/utils/versionCheck.js +47 -0
  178. package/src/vendor/fca-unofficial/.github/workflows/nodejs.yml +26 -0
  179. package/src/vendor/fca-unofficial/.github/workflows/npmpublish.yml +30 -0
  180. package/src/vendor/fca-unofficial/.travis.yml +6 -0
  181. package/src/vendor/fca-unofficial/DOCS.md +1731 -0
  182. package/src/vendor/fca-unofficial/LICENSE-MIT +21 -0
  183. package/src/vendor/fca-unofficial/README.md +225 -0
  184. package/src/vendor/fca-unofficial/index.js +619 -0
  185. package/src/vendor/fca-unofficial/package.json +76 -0
  186. package/src/vendor/fca-unofficial/src/addExternalModule.js +19 -0
  187. package/src/vendor/fca-unofficial/src/addUserToGroup.js +113 -0
  188. package/src/vendor/fca-unofficial/src/changeAdminStatus.js +79 -0
  189. package/src/vendor/fca-unofficial/src/changeArchivedStatus.js +55 -0
  190. package/src/vendor/fca-unofficial/src/changeBio.js +77 -0
  191. package/src/vendor/fca-unofficial/src/changeBlockedStatus.js +47 -0
  192. package/src/vendor/fca-unofficial/src/changeGroupImage.js +129 -0
  193. package/src/vendor/fca-unofficial/src/changeNickname.js +59 -0
  194. package/src/vendor/fca-unofficial/src/changeThreadColor.js +71 -0
  195. package/src/vendor/fca-unofficial/src/changeThreadEmoji.js +55 -0
  196. package/src/vendor/fca-unofficial/src/createNewGroup.js +86 -0
  197. package/src/vendor/fca-unofficial/src/createPoll.js +71 -0
  198. package/src/vendor/fca-unofficial/src/deleteMessage.js +56 -0
  199. package/src/vendor/fca-unofficial/src/deleteThread.js +56 -0
  200. package/src/vendor/fca-unofficial/src/forwardAttachment.js +60 -0
  201. package/src/vendor/fca-unofficial/src/getCurrentUserID.js +7 -0
  202. package/src/vendor/fca-unofficial/src/getEmojiUrl.js +29 -0
  203. package/src/vendor/fca-unofficial/src/getFriendsList.js +84 -0
  204. package/src/vendor/fca-unofficial/src/getThreadHistory.js +645 -0
  205. package/src/vendor/fca-unofficial/src/getThreadHistoryDeprecated.js +93 -0
  206. package/src/vendor/fca-unofficial/src/getThreadInfo.js +201 -0
  207. package/src/vendor/fca-unofficial/src/getThreadInfoDeprecated.js +80 -0
  208. package/src/vendor/fca-unofficial/src/getThreadList.js +238 -0
  209. package/src/vendor/fca-unofficial/src/getThreadListDeprecated.js +75 -0
  210. package/src/vendor/fca-unofficial/src/getThreadPictures.js +79 -0
  211. package/src/vendor/fca-unofficial/src/getUserID.js +66 -0
  212. package/src/vendor/fca-unofficial/src/getUserInfo.js +72 -0
  213. package/src/vendor/fca-unofficial/src/handleFriendRequest.js +61 -0
  214. package/src/vendor/fca-unofficial/src/handleMessageRequest.js +65 -0
  215. package/src/vendor/fca-unofficial/src/httpGet.js +52 -0
  216. package/src/vendor/fca-unofficial/src/httpPost.js +52 -0
  217. package/src/vendor/fca-unofficial/src/listenMqtt.js +788 -0
  218. package/src/vendor/fca-unofficial/src/logout.js +75 -0
  219. package/src/vendor/fca-unofficial/src/markAsDelivered.js +58 -0
  220. package/src/vendor/fca-unofficial/src/markAsRead.js +80 -0
  221. package/src/vendor/fca-unofficial/src/markAsReadAll.js +50 -0
  222. package/src/vendor/fca-unofficial/src/markAsSeen.js +59 -0
  223. package/src/vendor/fca-unofficial/src/muteThread.js +52 -0
  224. package/src/vendor/fca-unofficial/src/removeUserFromGroup.js +79 -0
  225. package/src/vendor/fca-unofficial/src/resolvePhotoUrl.js +45 -0
  226. package/src/vendor/fca-unofficial/src/searchForThread.js +53 -0
  227. package/src/vendor/fca-unofficial/src/sendMessage.js +459 -0
  228. package/src/vendor/fca-unofficial/src/sendTypingIndicator.js +103 -0
  229. package/src/vendor/fca-unofficial/src/setMessageReaction.js +117 -0
  230. package/src/vendor/fca-unofficial/src/setPostReaction.js +76 -0
  231. package/src/vendor/fca-unofficial/src/setTitle.js +86 -0
  232. package/src/vendor/fca-unofficial/src/threadColors.js +57 -0
  233. package/src/vendor/fca-unofficial/src/unfriend.js +52 -0
  234. package/src/vendor/fca-unofficial/src/unsendMessage.js +49 -0
  235. package/src/vendor/fca-unofficial/test/data/shareAttach.js +146 -0
  236. package/src/vendor/fca-unofficial/test/data/something.mov +0 -0
  237. package/src/vendor/fca-unofficial/test/data/test.png +0 -0
  238. package/src/vendor/fca-unofficial/test/data/test.txt +7 -0
  239. package/src/vendor/fca-unofficial/test/example-config.json +18 -0
  240. package/src/vendor/fca-unofficial/test/test-page.js +140 -0
  241. package/src/vendor/fca-unofficial/test/test.js +385 -0
  242. package/src/vendor/fca-unofficial/utils.js +1358 -0
@@ -0,0 +1,44 @@
1
+ const { getType } = require("../src/utils/format");
2
+ const { setProxy } = require("../src/utils/request");
3
+ const logger = require("../func/logger");
4
+ const Boolean_Option = [
5
+ "online",
6
+ "selfListen",
7
+ "listenEvents",
8
+ "updatePresence",
9
+ "forceLogin",
10
+ "autoMarkRead",
11
+ "listenTyping",
12
+ "autoReconnect",
13
+ "emitReady",
14
+ "selfListenEvent"
15
+ ];
16
+ function setOptions(globalOptions, options) {
17
+ for (const key of Object.keys(options || {})) {
18
+ if (Boolean_Option.includes(key)) {
19
+ globalOptions[key] = Boolean(options[key]);
20
+ continue;
21
+ }
22
+ switch (key) {
23
+ case "userAgent": {
24
+ globalOptions.userAgent = options.userAgent || "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36";
25
+ break;
26
+ }
27
+ case "proxy": {
28
+ if (typeof options.proxy !== "string") {
29
+ delete globalOptions.proxy;
30
+ setProxy();
31
+ } else {
32
+ globalOptions.proxy = options.proxy;
33
+ setProxy(globalOptions.proxy);
34
+ }
35
+ break;
36
+ }
37
+ default: {
38
+ logger("setOptions Unrecognized option given to setOptions: " + key, "warn");
39
+ break;
40
+ }
41
+ }
42
+ }
43
+ }
44
+ module.exports = { setOptions, Boolean_Option };
package/package.json ADDED
@@ -0,0 +1,95 @@
1
+ {
2
+ "name": "fca-riyad",
3
+ "version": "37.0.0",
4
+ "description": "Facebook Chat API - Modified by Riyad | Stable, Auto Re-login, Fixed setMessageReaction",
5
+ "main": "index.js",
6
+ "types": "index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "require": "./index.js",
10
+ "default": "./index.js",
11
+ "types": "./index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "index.js",
16
+ "index.d.ts",
17
+ "module/",
18
+ "func/",
19
+ "src/",
20
+ "DOCS.md",
21
+ "README.md",
22
+ "LICENSE",
23
+ "CHANGELOG.md",
24
+ "src/app/"
25
+ ],
26
+ "scripts": {
27
+ "test": "mocha",
28
+ "lint": "eslint ."
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/Riyad/fca-riyad.git"
33
+ },
34
+ "keywords": [
35
+ "facebook",
36
+ "chat",
37
+ "api",
38
+ "messenger",
39
+ "bot",
40
+ "unofficial",
41
+ "fca",
42
+ "fca-riyad",
43
+ "riyad"
44
+ ],
45
+ "author": {
46
+ "name": "Riyad",
47
+ "url": "https://github.com/Riyad"
48
+ },
49
+ "contributors": [
50
+ {
51
+ "name": "Riyad",
52
+ "url": "https://github.com/Riyad"
53
+ },
54
+ {
55
+ "name": "DongDev (Original)",
56
+ "url": "https://github.com/dongp06"
57
+ }
58
+ ],
59
+ "license": "MIT",
60
+ "bugs": {
61
+ "url": "https://github.com/Riyad/fca-riyad/issues"
62
+ },
63
+ "homepage": "https://github.com/Riyad/fca-riyad#readme",
64
+ "engines": {
65
+ "node": ">=12.0.0"
66
+ },
67
+ "dependencies": {
68
+ "axios": "^1.13.5",
69
+ "axios-cookiejar-support": "^5.0.5",
70
+ "bluebird": "^3.7.2",
71
+ "chalk": "^4.1.2",
72
+ "cheerio": "1.0.0-rc.12",
73
+ "duplexify": "^4.1.3",
74
+ "gradient-string": "^2.0.2",
75
+ "https-proxy-agent": "^4.0.0",
76
+ "mqtt": "^5.10.1",
77
+ "sequelize": "^6.37.6",
78
+ "sqlite3": "^5.1.7",
79
+ "totp-generator": "^1.0.0",
80
+ "ws": "^8.18.0",
81
+ "@noble/curves": "^2.2.0",
82
+ "@noble/hashes": "^2.2.0",
83
+ "@signalapp/libsignal-client": "0.70.0",
84
+ "mime": "^3.0.0",
85
+ "protobufjs": "^8.4.0"
86
+ },
87
+ "devDependencies": {
88
+ "eslint": "^8.50.0",
89
+ "mocha": "^10.2.0"
90
+ },
91
+ "publishConfig": {
92
+ "access": "public",
93
+ "registry": "https://registry.npmjs.org/"
94
+ }
95
+ }
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+
3
+ const { getType } = require("../../utils/format");
4
+
5
+ module.exports = function(defaultFuncs, api, ctx) {
6
+ return function addExternalModule(moduleObj) {
7
+ if (getType(moduleObj) == "Object") {
8
+ for (const apiName in moduleObj) {
9
+ if (getType(moduleObj[apiName]) == "Function") {
10
+ api[apiName] = moduleObj[apiName](defaultFuncs, api, ctx);
11
+ } else {
12
+ throw new Error(
13
+ `Item "${apiName}" in moduleObj must be a function, not ${getType(
14
+ moduleObj[apiName]
15
+ )}!`
16
+ );
17
+ }
18
+ }
19
+ } else {
20
+ throw new Error(
21
+ `moduleObj must be an object, not ${getType(moduleObj)}!`
22
+ );
23
+ }
24
+ };
25
+ };
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { isReadableStream } = require("../../utils/constants");
5
+ const { parseAndCheckLogin } = require("../../utils/client");
6
+ const { formatID, getType } = require("../../utils/format");
7
+ module.exports = function(defaultFuncs, api, ctx) {
8
+ function handleUpload(image, callback) {
9
+ const uploads = [];
10
+
11
+ const form = {
12
+ profile_id: ctx.userID,
13
+ photo_source: 57,
14
+ av: ctx.userID,
15
+ file: image
16
+ };
17
+
18
+ uploads.push(
19
+ defaultFuncs
20
+ .postFormData(
21
+ "https://www.facebook.com/profile/picture/upload/",
22
+ ctx.jar,
23
+ form,
24
+ {}
25
+ )
26
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
27
+ .then(function(resData) {
28
+ if (resData.error) {
29
+ throw resData;
30
+ }
31
+ return resData;
32
+ })
33
+ );
34
+
35
+ // resolve all promises
36
+ Promise.all(uploads)
37
+ .then(function(resData) {
38
+ callback(null, resData);
39
+ })
40
+ .catch(function(err) {
41
+ log.error("handleUpload", err);
42
+ return callback(err);
43
+ });
44
+ }
45
+
46
+ return function changeAvatar(
47
+ image,
48
+ caption = "",
49
+ timestamp = null,
50
+ callback
51
+ ) {
52
+ let resolveFunc = function() {};
53
+ let rejectFunc = function() {};
54
+ const returnPromise = new Promise(function(resolve, reject) {
55
+ resolveFunc = resolve;
56
+ rejectFunc = reject;
57
+ });
58
+
59
+ if (!timestamp && getType(caption) === "Number") {
60
+ timestamp = caption;
61
+ caption = "";
62
+ }
63
+
64
+ if (
65
+ !timestamp &&
66
+ !callback &&
67
+ (getType(caption) == "Function" ||
68
+ getType(caption) == "AsyncFunction")
69
+ ) {
70
+ callback = caption;
71
+ caption = "";
72
+ timestamp = null;
73
+ }
74
+
75
+ if (!callback)
76
+ callback = function(err, data) {
77
+ if (err) {
78
+ return rejectFunc(err);
79
+ }
80
+ resolveFunc(data);
81
+ };
82
+
83
+ if (!isReadableStream(image))
84
+ return callback("Image is not a readable stream");
85
+
86
+ handleUpload(image, function(err, payload) {
87
+ if (err) {
88
+ return callback(err);
89
+ }
90
+
91
+ const form = {
92
+ av: ctx.i_userID || ctx.userID,
93
+ fb_api_req_friendly_name: "ProfileCometProfilePictureSetMutation",
94
+ fb_api_caller_class: "RelayModern",
95
+ doc_id: "5066134240065849",
96
+ variables: JSON.stringify({
97
+ input: {
98
+ caption,
99
+ existing_photo_id: payload[0].payload.fbid,
100
+ expiration_time: timestamp,
101
+ profile_id: ctx.i_userID || ctx.userID,
102
+ profile_pic_method: "EXISTING",
103
+ profile_pic_source: "TIMELINE",
104
+ scaled_crop_rect: {
105
+ height: 1,
106
+ width: 1,
107
+ x: 0,
108
+ y: 0
109
+ },
110
+ skip_cropping: true,
111
+ actor_id: ctx.i_userID || ctx.userID,
112
+ client_mutation_id: Math.round(Math.random() * 19).toString()
113
+ },
114
+ isPage: false,
115
+ isProfile: true,
116
+ scale: 3
117
+ })
118
+ };
119
+
120
+ defaultFuncs
121
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
122
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
123
+ .then(function(resData) {
124
+ if (resData.errors) {
125
+ throw resData;
126
+ }
127
+ return callback(null, resData[0].data.profile_picture_set);
128
+ })
129
+ .catch(function(err) {
130
+ log.error("changeAvatar", err);
131
+ return callback(err);
132
+ });
133
+ });
134
+
135
+ return returnPromise;
136
+ };
137
+ };
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ const { getType } = require("../../utils/format");
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function changeBio(bio, publish, callback) {
8
+ let resolveFunc = function() {};
9
+ let rejectFunc = function() {};
10
+ const returnPromise = new Promise(function(resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ if (
17
+ getType(publish) == "Function" ||
18
+ getType(publish) == "AsyncFunction"
19
+ ) {
20
+ callback = publish;
21
+ } else {
22
+ callback = function(err) {
23
+ if (err) {
24
+ return rejectFunc(err);
25
+ }
26
+ resolveFunc();
27
+ };
28
+ }
29
+ }
30
+
31
+ if (getType(publish) != "Boolean") {
32
+ publish = false;
33
+ }
34
+
35
+ if (getType(bio) != "String") {
36
+ bio = "";
37
+ publish = false;
38
+ }
39
+
40
+ const form = {
41
+ fb_api_caller_class: "RelayModern",
42
+ fb_api_req_friendly_name: "ProfileCometSetBioMutation",
43
+ doc_id: "2725043627607610",
44
+ variables: JSON.stringify({
45
+ input: {
46
+ bio: bio,
47
+ publish_bio_feed_story: publish,
48
+ actor_id: ctx.i_userID || ctx.userID,
49
+ client_mutation_id: Math.round(Math.random() * 1024).toString()
50
+ },
51
+ hasProfileTileViewID: false,
52
+ profileTileViewID: null,
53
+ scale: 1
54
+ }),
55
+ av: ctx.i_userID || ctx.userID
56
+ };
57
+
58
+ defaultFuncs
59
+ .post("https://www.facebook.com/api/graphql/", ctx.jar, form)
60
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
61
+ .then(function(resData) {
62
+ if (resData.errors) {
63
+ throw resData;
64
+ }
65
+
66
+ return callback();
67
+ })
68
+ .catch(function(err) {
69
+ log.error("changeBio", err);
70
+ return callback(err);
71
+ });
72
+
73
+ return returnPromise;
74
+ };
75
+ };
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ const fs = require("fs");
3
+ const path = require("path");
4
+ const logger = require("../../../func/logger");
5
+
6
+ /**
7
+ * Enable automatic AppState saving
8
+ * @param {Object} options - Options for auto-save
9
+ * @param {string} [options.filePath] - Path to save AppState (default: "appstate.json")
10
+ * @param {number} [options.interval] - Save interval in milliseconds (default: 10 minutes)
11
+ * @param {boolean} [options.saveOnLogin] - Save immediately on login (default: true)
12
+ * @returns {Function} Function to disable auto-save
13
+ */
14
+ module.exports = function (defaultFuncs, api, ctx) {
15
+ return function enableAutoSaveAppState(options = {}) {
16
+ const filePath = options.filePath || path.join(process.cwd(), "appstate.json");
17
+ const interval = options.interval || 10 * 60 * 1000; // 10 minutes default
18
+ const saveOnLogin = options.saveOnLogin !== false; // default true
19
+
20
+ // Save function
21
+ function saveAppState() {
22
+ try {
23
+ const appState = api.getAppState();
24
+ if (!appState || !appState.appState || appState.appState.length === 0) {
25
+ logger("AppState is empty, skipping save", "warn");
26
+ return;
27
+ }
28
+
29
+ const data = JSON.stringify(appState, null, 2);
30
+ fs.writeFileSync(filePath, data, "utf8");
31
+ logger(`AppState saved to ${filePath}`, "info");
32
+ } catch (error) {
33
+ logger(`Error saving AppState: ${error && error.message ? error.message : String(error)}`, "error");
34
+ }
35
+ }
36
+
37
+ // Save immediately if requested
38
+ let immediateSaveTimer = null;
39
+ if (saveOnLogin) {
40
+ // Delay a bit to ensure login is complete
41
+ immediateSaveTimer = setTimeout(() => {
42
+ saveAppState();
43
+ immediateSaveTimer = null;
44
+ }, 2000);
45
+ }
46
+
47
+ // Set up interval
48
+ const intervalId = setInterval(saveAppState, interval);
49
+ logger(`Auto-save AppState enabled: ${filePath} (every ${Math.round(interval / 1000 / 60)} minutes)`, "info");
50
+
51
+ // Store interval ID for cleanup
52
+ if (!ctx._autoSaveInterval) {
53
+ ctx._autoSaveInterval = [];
54
+ }
55
+ ctx._autoSaveInterval.push(intervalId);
56
+
57
+ // Return disable function
58
+ return function disableAutoSaveAppState() {
59
+ // Clear immediate save timer if still pending
60
+ if (immediateSaveTimer) {
61
+ clearTimeout(immediateSaveTimer);
62
+ immediateSaveTimer = null;
63
+ }
64
+ // Clear interval
65
+ clearInterval(intervalId);
66
+ const index = ctx._autoSaveInterval ? ctx._autoSaveInterval.indexOf(intervalId) : -1;
67
+ if (index !== -1) {
68
+ ctx._autoSaveInterval.splice(index, 1);
69
+ }
70
+ logger("Auto-save AppState disabled", "info");
71
+ };
72
+ };
73
+ };
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ module.exports = function(defaultFuncs, api, ctx) {
4
+ return function getCurrentUserID() {
5
+ return ctx.userID;
6
+ };
7
+ };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ const { getType } = require("../../utils/format");
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function handleFriendRequest(userID, accept, callback) {
8
+ if (getType(accept) !== "Boolean") {
9
+ throw {
10
+ error: "Please pass a boolean as a second argument."
11
+ };
12
+ }
13
+
14
+ let resolveFunc = function() {};
15
+ let rejectFunc = function() {};
16
+ const returnPromise = new Promise(function(resolve, reject) {
17
+ resolveFunc = resolve;
18
+ rejectFunc = reject;
19
+ });
20
+
21
+ if (!callback) {
22
+ callback = function(err, friendList) {
23
+ if (err) {
24
+ return rejectFunc(err);
25
+ }
26
+ resolveFunc(friendList);
27
+ };
28
+ }
29
+
30
+ const form = {
31
+ viewer_id: ctx.userID,
32
+ "frefs[0]": "jwl",
33
+ floc: "friend_center_requests",
34
+ ref: "/reqs.php",
35
+ action: accept ? "confirm" : "reject"
36
+ };
37
+
38
+ defaultFuncs
39
+ .post("https://www.facebook.com/requests/friends/ajax/", ctx.jar, form)
40
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
41
+ .then(function(resData) {
42
+ if (resData.payload.err) {
43
+ throw {
44
+ err: resData.payload.err
45
+ };
46
+ }
47
+
48
+ return callback();
49
+ })
50
+ .catch(function(err) {
51
+ log.error("handleFriendRequest", err);
52
+ return callback(err);
53
+ });
54
+
55
+ return returnPromise;
56
+ };
57
+ };
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { parseAndCheckLogin } = require("../../utils/client");
5
+ const { getFrom } = require("../../utils/constants");
6
+ const { saveCookies } = require("../../utils/client");
7
+ module.exports = function(defaultFuncs, api, ctx) {
8
+ return function logout(callback) {
9
+ let resolveFunc = function() {};
10
+ let rejectFunc = function() {};
11
+ const returnPromise = new Promise(function(resolve, reject) {
12
+ resolveFunc = resolve;
13
+ rejectFunc = reject;
14
+ });
15
+
16
+ if (!callback) {
17
+ callback = function(err, friendList) {
18
+ if (err) {
19
+ return rejectFunc(err);
20
+ }
21
+ resolveFunc(friendList);
22
+ };
23
+ }
24
+
25
+ const form = {
26
+ pmid: "0"
27
+ };
28
+
29
+ defaultFuncs
30
+ .post(
31
+ "https://www.facebook.com/bluebar/modern_settings_menu/?help_type=364455653583099&show_contextual_help=1",
32
+ ctx.jar,
33
+ form
34
+ )
35
+ .then(parseAndCheckLogin(ctx, defaultFuncs))
36
+ .then(function(resData) {
37
+ const elem = resData.jsmods.instances[0][2][0].filter(function(v) {
38
+ return v.value === "logout";
39
+ })[0];
40
+
41
+ const html = resData.jsmods.markup.filter(function(v) {
42
+ return v[0] === elem.markup.__m;
43
+ })[0][1].__html;
44
+
45
+ const form = {
46
+ fb_dtsg: getFrom(html, '"fb_dtsg" value="', '"'),
47
+ ref: getFrom(html, '"ref" value="', '"'),
48
+ h: getFrom(html, '"h" value="', '"')
49
+ };
50
+
51
+ return defaultFuncs
52
+ .post("https://www.facebook.com/logout.php", ctx.jar, form)
53
+ .then(saveCookies(ctx.jar));
54
+ })
55
+ .then(function(res) {
56
+ if (!res.headers) {
57
+ throw { error: "An error occurred when logging out." };
58
+ }
59
+
60
+ return defaultFuncs
61
+ .get(res.headers.location, ctx.jar)
62
+ .then(saveCookies(ctx.jar));
63
+ })
64
+ .then(function() {
65
+ ctx.loggedIn = false;
66
+ log.info("logout", "Logged out successfully.");
67
+ callback();
68
+ })
69
+ .catch(function(err) {
70
+ log.error("logout", err);
71
+ return callback(err);
72
+ });
73
+
74
+ return returnPromise;
75
+ };
76
+ };
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+
3
+ const log = require("../../../func/logAdapter");
4
+ const { getFrom } = require("../../utils/constants");
5
+ const { get } = require("../../utils/request")
6
+ const { getType } = require("../../utils/format");
7
+ module.exports = function (defaultFuncs, api, ctx) {
8
+ return function refreshFb_dtsg(obj, callback) {
9
+ if (typeof obj === "function") {
10
+ callback = obj;
11
+ obj = {};
12
+ }
13
+ if (!obj) obj = {};
14
+ if (getType(obj) !== "Object") {
15
+ throw new CustomError("The first parameter must be an object or a callback function");
16
+ }
17
+ let resolveFunc, rejectFunc;
18
+ const returnPromise = new Promise((resolve, reject) => {
19
+ resolveFunc = resolve;
20
+ rejectFunc = reject;
21
+ });
22
+ if (!callback) {
23
+ callback = (err, data) => err ? rejectFunc(err) : resolveFunc(data);
24
+ }
25
+ if (Object.keys(obj).length === 0) {
26
+ get("https://www.facebook.com/", ctx.jar, null, ctx.globalOptions, { noRef: true }).then(({ data }) => {
27
+ const fb_dtsg = getFrom(data, '["DTSGInitData",[],{"token":"', '","');
28
+ const jazoest = getFrom(data, "jazoest=", '",');
29
+ if (!fb_dtsg) throw new Error("Could not find fb_dtsg in HTML after requesting Facebook.");
30
+ Object.assign(ctx, { fb_dtsg, jazoest });
31
+ callback(null, {
32
+ data: { fb_dtsg, jazoest },
33
+ message: "Refreshed fb_dtsg and jazoest",
34
+ });
35
+ }).catch(err => {
36
+ console.error("refreshFb_dtsg", err);
37
+ callback(err);
38
+ });
39
+ } else {
40
+ Object.assign(ctx, obj);
41
+ callback(null, {
42
+ data: obj,
43
+ message: `Refreshed ${Object.keys(obj).join(", ")}`,
44
+ });
45
+ }
46
+ return returnPromise;
47
+ };
48
+ };