bb-fca 2.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 (253) hide show
  1. package/LICENSE-MIT +21 -0
  2. package/README.md +0 -0
  3. package/dist/core/client.js +50 -0
  4. package/dist/core/client.js.map +1 -0
  5. package/dist/core/models/buildAPI.js +103 -0
  6. package/dist/core/models/buildAPI.js.map +1 -0
  7. package/dist/core/models/loginHelper.js +209 -0
  8. package/dist/core/models/loginHelper.js.map +1 -0
  9. package/dist/core/models/setOptions.js +47 -0
  10. package/dist/core/models/setOptions.js.map +1 -0
  11. package/dist/deltas/apis/create.js +30 -0
  12. package/dist/deltas/apis/create.js.map +1 -0
  13. package/dist/deltas/apis/extra/addExternalModule.js +23 -0
  14. package/dist/deltas/apis/extra/addExternalModule.js.map +1 -0
  15. package/dist/deltas/apis/extra/getAccess.js +110 -0
  16. package/dist/deltas/apis/extra/getAccess.js.map +1 -0
  17. package/dist/deltas/apis/http/httpGet.js +57 -0
  18. package/dist/deltas/apis/http/httpGet.js.map +1 -0
  19. package/dist/deltas/apis/http/httpPost.js +57 -0
  20. package/dist/deltas/apis/http/httpPost.js.map +1 -0
  21. package/dist/deltas/apis/http/httpPostFormData.js +61 -0
  22. package/dist/deltas/apis/http/httpPostFormData.js.map +1 -0
  23. package/dist/deltas/apis/login/GetBotInfo.js +83 -0
  24. package/dist/deltas/apis/login/GetBotInfo.js.map +1 -0
  25. package/dist/deltas/apis/login/getBotInitialData.js +46 -0
  26. package/dist/deltas/apis/login/getBotInitialData.js.map +1 -0
  27. package/dist/deltas/apis/login/logout.js +54 -0
  28. package/dist/deltas/apis/login/logout.js.map +1 -0
  29. package/dist/deltas/apis/messaging/editMessage.js +64 -0
  30. package/dist/deltas/apis/messaging/editMessage.js.map +1 -0
  31. package/dist/deltas/apis/messaging/emoji.js +120 -0
  32. package/dist/deltas/apis/messaging/emoji.js.map +1 -0
  33. package/dist/deltas/apis/messaging/gcmember.js +164 -0
  34. package/dist/deltas/apis/messaging/gcmember.js.map +1 -0
  35. package/dist/deltas/apis/messaging/gcname.js +119 -0
  36. package/dist/deltas/apis/messaging/gcname.js.map +1 -0
  37. package/dist/deltas/apis/messaging/gcrule.js +144 -0
  38. package/dist/deltas/apis/messaging/gcrule.js.map +1 -0
  39. package/dist/deltas/apis/messaging/markAsDelivered.js +44 -0
  40. package/dist/deltas/apis/messaging/markAsDelivered.js.map +1 -0
  41. package/dist/deltas/apis/messaging/markAsRead.js +84 -0
  42. package/dist/deltas/apis/messaging/markAsRead.js.map +1 -0
  43. package/dist/deltas/apis/messaging/markAsReadAll.js +34 -0
  44. package/dist/deltas/apis/messaging/markAsReadAll.js.map +1 -0
  45. package/dist/deltas/apis/messaging/markAsSeen.js +64 -0
  46. package/dist/deltas/apis/messaging/markAsSeen.js.map +1 -0
  47. package/dist/deltas/apis/messaging/nickname.js +129 -0
  48. package/dist/deltas/apis/messaging/nickname.js.map +1 -0
  49. package/dist/deltas/apis/messaging/notes.js +156 -0
  50. package/dist/deltas/apis/messaging/notes.js.map +1 -0
  51. package/dist/deltas/apis/messaging/resolvePhotoUrl.js +55 -0
  52. package/dist/deltas/apis/messaging/resolvePhotoUrl.js.map +1 -0
  53. package/dist/deltas/apis/messaging/sendMessage.js +239 -0
  54. package/dist/deltas/apis/messaging/sendMessage.js.map +1 -0
  55. package/dist/deltas/apis/messaging/sendTypingIndicator.js +41 -0
  56. package/dist/deltas/apis/messaging/sendTypingIndicator.js.map +1 -0
  57. package/dist/deltas/apis/messaging/setMessageReaction.js +30 -0
  58. package/dist/deltas/apis/messaging/setMessageReaction.js.map +1 -0
  59. package/dist/deltas/apis/messaging/shareContact.js +59 -0
  60. package/dist/deltas/apis/messaging/shareContact.js.map +1 -0
  61. package/dist/deltas/apis/messaging/stickers.js +246 -0
  62. package/dist/deltas/apis/messaging/stickers.js.map +1 -0
  63. package/dist/deltas/apis/messaging/theme.js +227 -0
  64. package/dist/deltas/apis/messaging/theme.js.map +1 -0
  65. package/dist/deltas/apis/messaging/unsendMessage.js +19 -0
  66. package/dist/deltas/apis/messaging/unsendMessage.js.map +1 -0
  67. package/dist/deltas/apis/mqtt/deltas/value.js +193 -0
  68. package/dist/deltas/apis/mqtt/deltas/value.js.map +1 -0
  69. package/dist/deltas/apis/mqtt/listenMqtt.js +306 -0
  70. package/dist/deltas/apis/mqtt/listenMqtt.js.map +1 -0
  71. package/dist/deltas/apis/mqtt/listenSpeed.js +166 -0
  72. package/dist/deltas/apis/mqtt/listenSpeed.js.map +1 -0
  73. package/dist/deltas/apis/mqtt/pinMessage.js +166 -0
  74. package/dist/deltas/apis/mqtt/pinMessage.js.map +1 -0
  75. package/dist/deltas/apis/mqtt/realtime.js +160 -0
  76. package/dist/deltas/apis/mqtt/realtime.js.map +1 -0
  77. package/dist/deltas/apis/mqtt/sendMessageMqtt.js +184 -0
  78. package/dist/deltas/apis/mqtt/sendMessageMqtt.js.map +1 -0
  79. package/dist/deltas/apis/mqtt/setMessageReactionMqtt.js +57 -0
  80. package/dist/deltas/apis/mqtt/setMessageReactionMqtt.js.map +1 -0
  81. package/dist/deltas/apis/posting/comment.js +195 -0
  82. package/dist/deltas/apis/posting/comment.js.map +1 -0
  83. package/dist/deltas/apis/posting/follow.js +82 -0
  84. package/dist/deltas/apis/posting/follow.js.map +1 -0
  85. package/dist/deltas/apis/posting/friend.js +253 -0
  86. package/dist/deltas/apis/posting/friend.js.map +1 -0
  87. package/dist/deltas/apis/posting/post.js +551 -0
  88. package/dist/deltas/apis/posting/post.js.map +1 -0
  89. package/dist/deltas/apis/posting/share.js +59 -0
  90. package/dist/deltas/apis/posting/share.js.map +1 -0
  91. package/dist/deltas/apis/posting/story.js +176 -0
  92. package/dist/deltas/apis/posting/story.js.map +1 -0
  93. package/dist/deltas/apis/threads/getThreadHistory.js +233 -0
  94. package/dist/deltas/apis/threads/getThreadHistory.js.map +1 -0
  95. package/dist/deltas/apis/threads/getThreadInfo.js +197 -0
  96. package/dist/deltas/apis/threads/getThreadInfo.js.map +1 -0
  97. package/dist/deltas/apis/threads/getThreadList.js +201 -0
  98. package/dist/deltas/apis/threads/getThreadList.js.map +1 -0
  99. package/dist/deltas/apis/users/getUserInfo.js +254 -0
  100. package/dist/deltas/apis/users/getUserInfo.js.map +1 -0
  101. package/dist/index.d.ts +696 -0
  102. package/dist/types/core/client.d.ts +2 -0
  103. package/dist/types/core/models/buildAPI.d.ts +13 -0
  104. package/dist/types/core/models/loginHelper.d.ts +15 -0
  105. package/dist/types/core/models/setOptions.d.ts +2 -0
  106. package/dist/types/deltas/apis/create.d.ts +23 -0
  107. package/dist/types/deltas/apis/extra/addExternalModule.d.ts +1 -0
  108. package/dist/types/deltas/apis/extra/getAccess.d.ts +1 -0
  109. package/dist/types/deltas/apis/http/httpGet.d.ts +1 -0
  110. package/dist/types/deltas/apis/http/httpPost.d.ts +1 -0
  111. package/dist/types/deltas/apis/http/httpPostFormData.d.ts +1 -0
  112. package/dist/types/deltas/apis/login/GetBotInfo.d.ts +32 -0
  113. package/dist/types/deltas/apis/login/getBotInitialData.d.ts +1 -0
  114. package/dist/types/deltas/apis/login/logout.d.ts +7 -0
  115. package/dist/types/deltas/apis/messaging/editMessage.d.ts +7 -0
  116. package/dist/types/deltas/apis/messaging/emoji.d.ts +1 -0
  117. package/dist/types/deltas/apis/messaging/gcmember.d.ts +1 -0
  118. package/dist/types/deltas/apis/messaging/gcname.d.ts +1 -0
  119. package/dist/types/deltas/apis/messaging/gcrule.d.ts +1 -0
  120. package/dist/types/deltas/apis/messaging/markAsDelivered.d.ts +7 -0
  121. package/dist/types/deltas/apis/messaging/markAsRead.d.ts +6 -0
  122. package/dist/types/deltas/apis/messaging/markAsReadAll.d.ts +7 -0
  123. package/dist/types/deltas/apis/messaging/markAsSeen.d.ts +6 -0
  124. package/dist/types/deltas/apis/messaging/nickname.d.ts +1 -0
  125. package/dist/types/deltas/apis/messaging/notes.d.ts +14 -0
  126. package/dist/types/deltas/apis/messaging/resolvePhotoUrl.d.ts +9 -0
  127. package/dist/types/deltas/apis/messaging/sendMessage.d.ts +1 -0
  128. package/dist/types/deltas/apis/messaging/sendTypingIndicator.d.ts +6 -0
  129. package/dist/types/deltas/apis/messaging/setMessageReaction.d.ts +1 -0
  130. package/dist/types/deltas/apis/messaging/shareContact.d.ts +8 -0
  131. package/dist/types/deltas/apis/messaging/stickers.d.ts +48 -0
  132. package/dist/types/deltas/apis/messaging/theme.d.ts +1 -0
  133. package/dist/types/deltas/apis/messaging/unsendMessage.d.ts +1 -0
  134. package/dist/types/deltas/apis/mqtt/deltas/value.d.ts +2 -0
  135. package/dist/types/deltas/apis/mqtt/listenMqtt.d.ts +20 -0
  136. package/dist/types/deltas/apis/mqtt/listenSpeed.d.ts +21 -0
  137. package/dist/types/deltas/apis/mqtt/pinMessage.d.ts +1 -0
  138. package/dist/types/deltas/apis/mqtt/realtime.d.ts +1 -0
  139. package/dist/types/deltas/apis/mqtt/sendMessageMqtt.d.ts +1 -0
  140. package/dist/types/deltas/apis/mqtt/setMessageReactionMqtt.d.ts +1 -0
  141. package/dist/types/deltas/apis/posting/comment.d.ts +9 -0
  142. package/dist/types/deltas/apis/posting/follow.d.ts +14 -0
  143. package/dist/types/deltas/apis/posting/friend.d.ts +61 -0
  144. package/dist/types/deltas/apis/posting/post.d.ts +20 -0
  145. package/dist/types/deltas/apis/posting/share.d.ts +1 -0
  146. package/dist/types/deltas/apis/posting/story.d.ts +39 -0
  147. package/dist/types/deltas/apis/threads/getThreadHistory.d.ts +7 -0
  148. package/dist/types/deltas/apis/threads/getThreadInfo.d.ts +7 -0
  149. package/dist/types/deltas/apis/threads/getThreadList.d.ts +7 -0
  150. package/dist/types/deltas/apis/users/getUserInfo.d.ts +1 -0
  151. package/dist/types/utils/axios.d.ts +7 -0
  152. package/dist/types/utils/clients.d.ts +4 -0
  153. package/dist/types/utils/constants.d.ts +24 -0
  154. package/dist/types/utils/formatters/data/formatAttachment.d.ts +2 -0
  155. package/dist/types/utils/formatters/data/formatDelta.d.ts +4 -0
  156. package/dist/types/utils/formatters/index.d.ts +17 -0
  157. package/dist/types/utils/formatters/value/formatCookie.d.ts +8 -0
  158. package/dist/types/utils/formatters/value/formatDate.d.ts +6 -0
  159. package/dist/types/utils/formatters/value/formatID.d.ts +7 -0
  160. package/dist/types/utils/headers.d.ts +2 -0
  161. package/dist/types/utils/index.d.ts +75 -0
  162. package/dist/types/utils/user-agents.d.ts +9 -0
  163. package/dist/utils/axios.js +148 -0
  164. package/dist/utils/axios.js.map +1 -0
  165. package/dist/utils/clients.js +120 -0
  166. package/dist/utils/clients.js.map +1 -0
  167. package/dist/utils/constants.js +249 -0
  168. package/dist/utils/constants.js.map +1 -0
  169. package/dist/utils/formatters/data/formatAttachment.js +61 -0
  170. package/dist/utils/formatters/data/formatAttachment.js.map +1 -0
  171. package/dist/utils/formatters/data/formatDelta.js +67 -0
  172. package/dist/utils/formatters/data/formatDelta.js.map +1 -0
  173. package/dist/utils/formatters/index.js +132 -0
  174. package/dist/utils/formatters/index.js.map +1 -0
  175. package/dist/utils/formatters/value/formatCookie.js +13 -0
  176. package/dist/utils/formatters/value/formatCookie.js.map +1 -0
  177. package/dist/utils/formatters/value/formatDate.js +33 -0
  178. package/dist/utils/formatters/value/formatDate.js.map +1 -0
  179. package/dist/utils/formatters/value/formatID.js +17 -0
  180. package/dist/utils/formatters/value/formatID.js.map +1 -0
  181. package/dist/utils/headers.js +61 -0
  182. package/dist/utils/headers.js.map +1 -0
  183. package/dist/utils/index.js +105 -0
  184. package/dist/utils/index.js.map +1 -0
  185. package/dist/utils/user-agents.js +41 -0
  186. package/dist/utils/user-agents.js.map +1 -0
  187. package/examples/post.example.js +149 -0
  188. package/module/index.js +5 -0
  189. package/package.json +56 -0
  190. package/src/core/client.ts +66 -0
  191. package/src/core/models/buildAPI.ts +131 -0
  192. package/src/core/models/loginHelper.ts +226 -0
  193. package/src/core/models/setOptions.ts +48 -0
  194. package/src/deltas/apis/create.ts +28 -0
  195. package/src/deltas/apis/extra/addExternalModule.ts +23 -0
  196. package/src/deltas/apis/extra/getAccess.ts +141 -0
  197. package/src/deltas/apis/http/httpGet.ts +61 -0
  198. package/src/deltas/apis/http/httpPost.ts +61 -0
  199. package/src/deltas/apis/http/httpPostFormData.ts +67 -0
  200. package/src/deltas/apis/login/GetBotInfo.ts +88 -0
  201. package/src/deltas/apis/login/getBotInitialData.ts +42 -0
  202. package/src/deltas/apis/login/logout.ts +62 -0
  203. package/src/deltas/apis/messaging/editMessage.ts +69 -0
  204. package/src/deltas/apis/messaging/emoji.ts +135 -0
  205. package/src/deltas/apis/messaging/gcmember.ts +175 -0
  206. package/src/deltas/apis/messaging/gcname.ts +136 -0
  207. package/src/deltas/apis/messaging/gcrule.ts +152 -0
  208. package/src/deltas/apis/messaging/markAsDelivered.ts +47 -0
  209. package/src/deltas/apis/messaging/markAsRead.ts +94 -0
  210. package/src/deltas/apis/messaging/markAsReadAll.ts +38 -0
  211. package/src/deltas/apis/messaging/markAsSeen.ts +69 -0
  212. package/src/deltas/apis/messaging/nickname.ts +153 -0
  213. package/src/deltas/apis/messaging/notes.ts +165 -0
  214. package/src/deltas/apis/messaging/resolvePhotoUrl.ts +56 -0
  215. package/src/deltas/apis/messaging/sendMessage.ts +286 -0
  216. package/src/deltas/apis/messaging/sendTypingIndicator.ts +48 -0
  217. package/src/deltas/apis/messaging/setMessageReaction.ts +25 -0
  218. package/src/deltas/apis/messaging/shareContact.ts +63 -0
  219. package/src/deltas/apis/messaging/stickers.ts +255 -0
  220. package/src/deltas/apis/messaging/theme.ts +280 -0
  221. package/src/deltas/apis/messaging/unsendMessage.ts +15 -0
  222. package/src/deltas/apis/mqtt/deltas/value.ts +224 -0
  223. package/src/deltas/apis/mqtt/listenMqtt.ts +332 -0
  224. package/src/deltas/apis/mqtt/listenSpeed.ts +179 -0
  225. package/src/deltas/apis/mqtt/pinMessage.ts +135 -0
  226. package/src/deltas/apis/mqtt/realtime.ts +169 -0
  227. package/src/deltas/apis/mqtt/sendMessageMqtt.ts +206 -0
  228. package/src/deltas/apis/mqtt/setMessageReactionMqtt.ts +61 -0
  229. package/src/deltas/apis/posting/comment.ts +205 -0
  230. package/src/deltas/apis/posting/follow.ts +79 -0
  231. package/src/deltas/apis/posting/friend.ts +241 -0
  232. package/src/deltas/apis/posting/post.ts +599 -0
  233. package/src/deltas/apis/posting/share.ts +60 -0
  234. package/src/deltas/apis/posting/story.ts +207 -0
  235. package/src/deltas/apis/threads/getThreadHistory.ts +237 -0
  236. package/src/deltas/apis/threads/getThreadInfo.ts +210 -0
  237. package/src/deltas/apis/threads/getThreadList.ts +224 -0
  238. package/src/deltas/apis/users/getUserInfo.ts +244 -0
  239. package/src/types/index.d.ts +696 -0
  240. package/src/utils/axios.ts +178 -0
  241. package/src/utils/clients.ts +125 -0
  242. package/src/utils/constants.ts +281 -0
  243. package/src/utils/formatters/data/formatAttachment.ts +58 -0
  244. package/src/utils/formatters/data/formatDelta.ts +45 -0
  245. package/src/utils/formatters/index.ts +82 -0
  246. package/src/utils/formatters/value/formatCookie.ts +13 -0
  247. package/src/utils/formatters/value/formatDate.ts +34 -0
  248. package/src/utils/formatters/value/formatID.ts +14 -0
  249. package/src/utils/formatters.old.ts +1049 -0
  250. package/src/utils/headers.ts +65 -0
  251. package/src/utils/index.ts +65 -0
  252. package/src/utils/user-agents.ts +49 -0
  253. package/tsconfig.json +37 -0
@@ -0,0 +1,149 @@
1
+ /**
2
+ * Example usage of post API functions
3
+ * This demonstrates how to create, delete posts, upload photos, and get comments
4
+ */
5
+
6
+ const login = require('../module');
7
+
8
+ // Your Facebook credentials
9
+ const credentials = {
10
+ appState: [] // Add your appState here
11
+ };
12
+
13
+ login(credentials, (err, api) => {
14
+ if (err) {
15
+ console.error('Login failed:', err);
16
+ return;
17
+ }
18
+
19
+ console.log('Logged in successfully!');
20
+
21
+ // Example 1: Create a post
22
+ api.post.create({
23
+ message: 'Hello from bb-fca!',
24
+ privacy: 'SELF' // Options: 'EVERYONE', 'FRIENDS', 'SELF'
25
+ }, (err, result) => {
26
+ if (err) {
27
+ console.error('Error creating post:', err);
28
+ return;
29
+ }
30
+
31
+ console.log('Post created successfully!');
32
+ console.log('Post ID:', result.postID);
33
+ console.log('Success:', result.success);
34
+ });
35
+
36
+ // Example 2: Upload a photo
37
+ api.post.uploadPhoto('./path/to/your/photo.png', (err, result) => {
38
+ if (err) {
39
+ console.error('Error uploading photo:', err);
40
+ return;
41
+ }
42
+
43
+ console.log('Photo uploaded successfully!');
44
+ console.log('Photo ID:', result.photoID);
45
+ console.log('Upload ID:', result.uploadID);
46
+ console.log('Success:', result.success);
47
+ });
48
+
49
+ // Example 3: Upload photo with Promise
50
+ api.post.uploadPhoto('./path/to/your/photo.jpg')
51
+ .then(result => {
52
+ console.log('Photo uploaded:', result.photoID);
53
+ })
54
+ .catch(err => {
55
+ console.error('Upload failed:', err);
56
+ });
57
+
58
+ // Example 3.1: Create a post with photo attachments
59
+ // First upload the photo, then create post with photo ID
60
+ api.post.uploadPhoto('./path/to/your/photo.png')
61
+ .then(uploadResult => {
62
+ return api.post.create({
63
+ message: 'Check out this photo!',
64
+ privacy: 'SELF',
65
+ photos: [uploadResult.photoID] // Attach the uploaded photo
66
+ });
67
+ })
68
+ .then(createResult => {
69
+ console.log('Post with photo created successfully!');
70
+ console.log('Post ID:', createResult.postID);
71
+ })
72
+ .catch(err => {
73
+ console.error('Error:', err);
74
+ });
75
+
76
+ // Example 3.2: Create a post with multiple photos
77
+ Promise.all([
78
+ api.post.uploadPhoto('./photo1.jpg'),
79
+ api.post.uploadPhoto('./photo2.jpg'),
80
+ api.post.uploadPhoto('./photo3.jpg')
81
+ ])
82
+ .then(results => {
83
+ const photoIDs = results.map(r => r.photoID);
84
+ return api.post.create({
85
+ message: 'Multiple photos!',
86
+ privacy: 'FRIENDS',
87
+ photos: photoIDs
88
+ });
89
+ })
90
+ .then(result => {
91
+ console.log('Post with multiple photos created!');
92
+ console.log('Post ID:', result.postID);
93
+ })
94
+ .catch(err => {
95
+ console.error('Error:', err);
96
+ });
97
+
98
+ // Example 4: Get comments from a post
99
+ // URL: https://www.facebook.com/permalink.php?story_fbid=pfbid02WHHgPgDR9VuDfXiUR5KCseuh9f2NVmfwddGEgUuYKxrkJpFtqfUKbwcCBV7qAJxel&id=61588408996667
100
+ api.post.getComments({
101
+ story_fbid: 'pfbid02WHHgPgDR9VuDfXiUR5KCseuh9f2NVmfwddGEgUuYKxrkJpFtqfUKbwcCBV7qAJxel',
102
+ id: '61588408996667'
103
+ }, (err, comments) => {
104
+ if (err) {
105
+ console.error('Error getting comments:', err);
106
+ return;
107
+ }
108
+
109
+ console.log(`Found ${comments.length} comments:`);
110
+ comments.forEach((comment, index) => {
111
+ console.log(`\n--- Comment ${index + 1} ---`);
112
+ console.log(`ID: ${comment.id}`);
113
+ console.log(`GraphQL ID: ${comment.graphql_id}`);
114
+ console.log(`Text: ${comment.text}`);
115
+ console.log(`Author: ${comment.author.name} (ID: ${comment.author.id})`);
116
+ console.log(`Created: ${new Date(comment.created_time * 1000).toLocaleString('vi-VN')}`);
117
+ console.log(`Replies: ${comment.reply_count}/${comment.total_reply_count}`);
118
+ console.log(`Depth: ${comment.depth}`);
119
+
120
+ if (comment.replies && comment.replies.length > 0) {
121
+ console.log(` Nested replies:`);
122
+ comment.replies.forEach((reply, i) => {
123
+ console.log(` └─ [${i + 1}] ${reply.author.name}: ${reply.text}`);
124
+ });
125
+ }
126
+ });
127
+ });
128
+
129
+ // Example 5: Get comments using just the story_fbid (will use current user's ID)
130
+ api.post.getComments('pfbid02WHHgPgDR9VuDfXiUR5KCseuh9f2NVmfwddGEgUuYKxrkJpFtqfUKbwcCBV7qAJxel')
131
+ .then(comments => {
132
+ console.log(`\nUsing Promise: Found ${comments.length} comments`);
133
+ })
134
+ .catch(err => {
135
+ console.error('Error:', err);
136
+ });
137
+
138
+ // Example 6: Delete a post
139
+ api.post.delete('post_id_here', (err, result) => {
140
+ if (err) {
141
+ console.error('Error deleting post:', err);
142
+ return;
143
+ }
144
+
145
+ console.log('Post deleted successfully!');
146
+ console.log('Deleted Post ID:', result.postID);
147
+ console.log('Success:', result.success);
148
+ });
149
+ });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ const { login } = require('../dist/core/client');
4
+
5
+ module.exports = { login };
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "bb-fca",
3
+ "version": "2.0.0",
4
+ "description": "BB-FCA is a powerful and user-friendly Facebook Chat API wrapper for Node.js, designed to simplify the process of creating chatbots and automating interactions on Facebook Messenger. With BB-FCA, developers can easily send messages, manage conversations, and interact with the Facebook Messenger platform using a simple and intuitive API.",
5
+ "main": "dist/core/client.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc && cp src/types/index.d.ts dist/index.d.ts",
9
+ "dev": "tsc --watch",
10
+ "prepublishOnly": "npm run build",
11
+ "test": "echo \"No tests yet\""
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": ""
16
+ },
17
+ "author": "bb",
18
+ "license": "MIT",
19
+ "keywords": [
20
+ "bb"
21
+ ],
22
+ "dependencies": {
23
+ "axios": "^1.9.0",
24
+ "axios-cookiejar-support": "^4.0.7",
25
+ "chalk": "^3.0.0",
26
+ "cheerio": "^0.22.0",
27
+ "deepdash": "^5.3.9",
28
+ "express": "^4.19.2",
29
+ "form-data": "^4.0.3",
30
+ "freeport": "^1.0.5",
31
+ "gradient-string": "^1.1.0",
32
+ "https-proxy-agent": "^4.0.0",
33
+ "jsonpath-plus": "^10.3.0",
34
+ "lodash": "^4.17.21",
35
+ "mqtt": "^3.0.0",
36
+ "node-cron": "^3.0.3",
37
+ "tough-cookie": "^5.1.2",
38
+ "undici": "^5.29.0",
39
+ "websocket-stream": "^5.5.0"
40
+ },
41
+ "devDependencies": {
42
+ "@types/axios": "^0.9.36",
43
+ "@types/express": "^4.17.21",
44
+ "@types/form-data": "^2.2.1",
45
+ "@types/node": "^22.13.11",
46
+ "@types/tough-cookie": "^4.0.5",
47
+ "eslint": "^7.5.0",
48
+ "mocha": "^7.0.1",
49
+ "prettier": "^1.11.1",
50
+ "ts-node": "^10.9.2",
51
+ "typescript": "^5.4.5"
52
+ },
53
+ "engines": {
54
+ "node": ">=22.x"
55
+ }
56
+ }
@@ -0,0 +1,66 @@
1
+ import utils = require('../utils');
2
+ import buildAPIModel from './models/buildAPI';
3
+ import loginHelperModel from './models/loginHelper';
4
+ import setOptionsModel from './models/setOptions';
5
+
6
+ let globalOptions: any = {};
7
+ let ctx: any = null;
8
+ let defaultFuncs: any = null;
9
+ let api: any = null;
10
+
11
+ const fbLink = (ext?: string): string =>
12
+ 'https://www.facebook.com' + (ext ? '/' + ext : '');
13
+ const ERROR_RETRIEVING =
14
+ 'Error retrieving userID. This can be caused by many factors, including being blocked by Facebook for logging in from an unknown location. Try logging in with a browser to verify.';
15
+
16
+ async function login(
17
+ credentials: any,
18
+ options: any,
19
+ callback?: (...args: any[]) => any,
20
+ ): Promise<void> {
21
+ if (typeof options === 'function') {
22
+ callback = options;
23
+ options = {};
24
+ }
25
+ if ('logging' in options) {
26
+ utils.logOptions(options.logging);
27
+ }
28
+ const defaultOptions = {
29
+ selfListen: false,
30
+ listenEvents: true,
31
+ listenTyping: false,
32
+ updatePresence: false,
33
+ forceLogin: false,
34
+ autoMarkDelivery: false,
35
+ autoMarkRead: true,
36
+ autoReconnect: true,
37
+ online: true,
38
+ emitReady: false,
39
+ userAgent:
40
+ 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
41
+ };
42
+ Object.assign(globalOptions, defaultOptions, options);
43
+
44
+ await setOptionsModel(globalOptions, options);
45
+
46
+ loginHelperModel(
47
+ credentials,
48
+ globalOptions,
49
+ (loginError, loginApi) => {
50
+ if (loginError) {
51
+ return callback(loginError);
52
+ }
53
+ api = loginApi;
54
+ ctx = loginApi.ctx;
55
+ defaultFuncs = loginApi.defaultFuncs;
56
+ return callback(null, loginApi);
57
+ },
58
+ setOptionsModel,
59
+ buildAPIModel,
60
+ api,
61
+ fbLink,
62
+ ERROR_RETRIEVING,
63
+ );
64
+ }
65
+
66
+ export { login };
@@ -0,0 +1,131 @@
1
+ import utils = require('../../utils');
2
+
3
+ /**
4
+ * Builds the core API context and default functions after successful login.
5
+ *
6
+ * @param {string} html The HTML body from the initial Facebook page.
7
+ * @param {object} jar The cookie jar.
8
+ * @param {Array<object>} netData Network data extracted from the HTML.
9
+ * @param {object} globalOptions The global options object.
10
+ * @param {function} fbLinkFunc A function to generate Facebook links.
11
+ * @param {string} errorRetrievingMsg The error message for retrieving user ID.
12
+ * @returns {Array<object>} An array containing [ctx, defaultFuncs, {}].
13
+ */
14
+ async function buildAPI(
15
+ html: string,
16
+ jar: any,
17
+ netData: any[],
18
+ globalOptions: any,
19
+ fbLinkFunc: (...args: any[]) => string,
20
+ errorRetrievingMsg: string,
21
+ ): Promise<[any, any, any]> {
22
+ let userID: string;
23
+ const cookies = jar.getCookiesSync(fbLinkFunc()); // Use passed fbLinkFunc
24
+ const primaryProfile = cookies.find((val) =>
25
+ val.cookieString().startsWith('c_user='),
26
+ );
27
+ const secondaryProfile = cookies.find((val) =>
28
+ val.cookieString().startsWith('i_user='),
29
+ );
30
+ if (!primaryProfile && !secondaryProfile) {
31
+ throw new Error(errorRetrievingMsg); // Use passed error message
32
+ }
33
+ userID =
34
+ secondaryProfile?.cookieString().split('=')[1] ||
35
+ primaryProfile.cookieString().split('=')[1];
36
+
37
+ const findConfig = (key) => {
38
+ for (const scriptData of netData) {
39
+ if (scriptData.require) {
40
+ for (const req of scriptData.require) {
41
+ if (Array.isArray(req) && req[0] === key && req[2]) {
42
+ return req[2];
43
+ }
44
+ if (
45
+ Array.isArray(req) &&
46
+ req[3] &&
47
+ req[3][0] &&
48
+ req[3][0].__bbox &&
49
+ req[3][0].__bbox.define
50
+ ) {
51
+ for (const def of req[3][0].__bbox.define) {
52
+ if (Array.isArray(def) && def[0].endsWith(key) && def[2]) {
53
+ return def[2];
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ return null;
61
+ };
62
+
63
+ const dtsgData = findConfig('DTSGInitialData');
64
+ const dtsg: any = dtsgData
65
+ ? dtsgData.token
66
+ : utils.getFrom(html, '"token":"', '"');
67
+ const dtsgResult = {
68
+ fb_dtsg: dtsg,
69
+ jazoest: `2${Array.from(dtsg as string).reduce(
70
+ (a, b) => a + b.charCodeAt(0),
71
+ '',
72
+ )}`,
73
+ };
74
+
75
+ const clientIDData = findConfig('MqttWebDeviceID');
76
+ const clientID = clientIDData ? clientIDData.clientID : undefined;
77
+
78
+ const mqttConfigData = findConfig('MqttWebConfig');
79
+ const mqttAppID = mqttConfigData ? mqttConfigData.appID : undefined;
80
+
81
+ const currentUserData = findConfig('CurrentUserInitialData');
82
+ const userAppID = currentUserData ? currentUserData.APP_ID : undefined;
83
+
84
+ let primaryAppID = userAppID || mqttAppID;
85
+
86
+ let mqttEndpoint = mqttConfigData ? mqttConfigData.endpoint : undefined;
87
+
88
+ let region = mqttEndpoint
89
+ ? new URL(mqttEndpoint).searchParams.get('region')?.toUpperCase()
90
+ : undefined;
91
+ const irisSeqIDMatch = html.match(/irisSeqID:"(.+?)"/);
92
+ const irisSeqID = irisSeqIDMatch ? irisSeqIDMatch[1] : null;
93
+ if (globalOptions.bypassRegion && mqttEndpoint) {
94
+ const currentEndpoint = new URL(mqttEndpoint);
95
+ currentEndpoint.searchParams.set(
96
+ 'region',
97
+ globalOptions.bypassRegion.toLowerCase(),
98
+ );
99
+ mqttEndpoint = currentEndpoint.toString();
100
+ region = globalOptions.bypassRegion.toUpperCase();
101
+ }
102
+
103
+ const ctx = {
104
+ userID,
105
+ jar,
106
+ clientID,
107
+ appID: primaryAppID,
108
+ mqttAppID: mqttAppID,
109
+ userAppID: userAppID,
110
+ globalOptions,
111
+ loggedIn: true,
112
+ access_token: 'NONE',
113
+ clientMutationId: 0,
114
+ mqttClient: undefined,
115
+ lastSeqId: irisSeqID,
116
+ syncToken: undefined,
117
+ mqttEndpoint,
118
+ wsReqNumber: 0,
119
+ wsTaskNumber: 0,
120
+ reqCallbacks: {},
121
+ callback_Task: {},
122
+ region,
123
+ firstListen: true,
124
+ ...dtsgResult,
125
+ };
126
+ const defaultFuncs = utils.makeDefaults(html, userID, ctx);
127
+
128
+ return [ctx, defaultFuncs, {}];
129
+ }
130
+
131
+ export default buildAPI;
@@ -0,0 +1,226 @@
1
+ import utils = require('../../utils');
2
+ import axios from 'axios';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import * as qs from 'querystring';
6
+
7
+ /**
8
+ * The main login helper function, orchestrating the login process.
9
+ *
10
+ * @param {object} credentials User credentials or appState.
11
+ * @param {object} globalOptions Global options for the API.
12
+ * @param {function} callback The final callback function.
13
+ * @param {function} setOptionsFunc Reference to the setOptions function from models.
14
+ * @param {function} buildAPIFunc Reference to the buildAPI function from models.
15
+ * @param {object} initialApi The initial API object to extend.
16
+ * @param {function} fbLinkFunc A function to generate Facebook links.
17
+ * @param {string} errorRetrievingMsg The error message for retrieving user ID.
18
+ * @returns {Promise<void>}
19
+ */
20
+ async function loginHelper(
21
+ credentials: any,
22
+ globalOptions: any,
23
+ callback,
24
+ setOptionsFunc: any,
25
+ buildAPIFunc: any,
26
+ initialApi: any,
27
+ fbLinkFunc: (...args: any[]) => string,
28
+ errorRetrievingMsg: string,
29
+ ): Promise<void> {
30
+ let ctx: any = null;
31
+ let defaultFuncs: any = null;
32
+ let api: any = initialApi;
33
+
34
+ try {
35
+ const jar = utils.getJar();
36
+ utils.log('Logging in...');
37
+
38
+ const appState = credentials.appState;
39
+
40
+ if (appState) {
41
+ let cookieStrings = [];
42
+ if (Array.isArray(appState)) {
43
+ cookieStrings = appState.map((c) =>
44
+ [c.name || c.key, c.value].join('='),
45
+ );
46
+ } else if (typeof appState === 'string') {
47
+ cookieStrings = appState
48
+ .split(';')
49
+ .map((s) => s.trim())
50
+ .filter(Boolean);
51
+ } else {
52
+ throw new Error(
53
+ 'Invalid appState format. Please provide an array of cookie objects or a cookie string.',
54
+ );
55
+ }
56
+
57
+ cookieStrings.forEach((cookieString) => {
58
+ const domain = '.facebook.com';
59
+ const expires = new Date().getTime() + 1000 * 60 * 60 * 24 * 365;
60
+ const str = `${cookieString}; expires=${expires}; domain=${domain}; path=/;`;
61
+ jar.setCookie(str, `https://${domain}`);
62
+ });
63
+ } else if (credentials.email && credentials.password) {
64
+ // Rui
65
+ const url = 'https://api.facebook.com/method/auth.login';
66
+ const params = {
67
+ access_token: '350685531728|62f8ce9f74b12f84c123cc23437a4a32',
68
+ format: 'json',
69
+ sdk_version: 2,
70
+ email: credentials.email,
71
+ locale: 'en_US',
72
+ password: credentials.password,
73
+ generate_session_cookies: 1,
74
+ sig: 'c1c640010993db92e5afd11634ced864',
75
+ };
76
+ const query = qs.stringify(params);
77
+ const xurl = `${url}?${query}`;
78
+ try {
79
+ const resp = await axios.get(xurl);
80
+ if (resp.status !== 200) {
81
+ throw new Error('Wrong password / email');
82
+ }
83
+ let cstrs = resp.data['session_cookies'].map(
84
+ (c) => `${c.name}=${c.value}`,
85
+ );
86
+ cstrs.forEach((cstr) => {
87
+ const domain = '.facebook.com';
88
+ const expires = new Date().getTime() + 1000 * 60 * 60 * 24 * 365;
89
+ const str = `${cstr}; expires=${expires}; domain=${domain}; path=/;`;
90
+ jar.setCookie(str, `https://${domain}`);
91
+ });
92
+ } catch (e) {
93
+ throw new Error('Wrong password / email');
94
+ }
95
+ } else {
96
+ throw new Error(
97
+ 'No cookie or credentials found. Please provide cookies or credentials.',
98
+ );
99
+ }
100
+
101
+ if (!api) {
102
+ api = {
103
+ setOptions: setOptionsFunc.bind(null, globalOptions),
104
+ getAppState() {
105
+ const appState = utils.getAppState(jar);
106
+ if (!Array.isArray(appState)) return [];
107
+ const uniqueAppState = appState.filter(
108
+ (item, index, self) =>
109
+ self.findIndex((t) => t.key === item.key) === index,
110
+ );
111
+ return uniqueAppState.length > 0 ? uniqueAppState : appState;
112
+ },
113
+ };
114
+ }
115
+
116
+ const resp = await utils
117
+ .get(fbLinkFunc(), jar, null, globalOptions, { noRef: true })
118
+ .then(utils.saveCookies(jar));
119
+ const extractNetData = (html) => {
120
+ const allScriptsData = [];
121
+ const scriptRegex = /<script type="application\/json"[^>]*>(.*?)<\/script>/g;
122
+ let match;
123
+ while ((match = scriptRegex.exec(html)) !== null) {
124
+ try {
125
+ allScriptsData.push(JSON.parse(match[1]));
126
+ } catch (e) {
127
+ utils.error(`Failed to parse a JSON blob from HTML`, e.message);
128
+ }
129
+ }
130
+ return allScriptsData;
131
+ };
132
+
133
+ const netData = extractNetData(resp.body);
134
+
135
+ const [newCtx, newDefaultFuncs] = await buildAPIFunc(
136
+ resp.body,
137
+ jar,
138
+ netData,
139
+ globalOptions,
140
+ fbLinkFunc,
141
+ errorRetrievingMsg,
142
+ );
143
+ ctx = newCtx;
144
+ defaultFuncs = newDefaultFuncs;
145
+ api.message = new Map();
146
+ api.timestamp = {};
147
+
148
+ /**
149
+ * Loads API modules from the deltas/apis directory.
150
+ *
151
+ * @returns {void}
152
+ */
153
+ const loadApiModules = (): void => {
154
+ const apiPath = path.join(__dirname, '..', '..', 'deltas', 'apis');
155
+ const ext = __filename.endsWith('.ts') ? '.ts' : '.js';
156
+ const apiFolders = fs
157
+ .readdirSync(apiPath)
158
+ .filter((name: string) =>
159
+ fs.lstatSync(path.join(apiPath, name)).isDirectory(),
160
+ );
161
+
162
+ apiFolders.forEach((folder: string) => {
163
+ const modulePath = path.join(apiPath, folder);
164
+ fs.readdirSync(modulePath)
165
+ .filter(
166
+ (file: string) => file.endsWith(ext) && !file.endsWith('.d.ts'),
167
+ )
168
+ .forEach((file: string) => {
169
+ const moduleName = path.basename(file, ext);
170
+ const fullPath = path.join(modulePath, file);
171
+ try {
172
+ api[moduleName] = require(fullPath).default
173
+ ? require(fullPath).default(defaultFuncs, api, ctx)
174
+ : require(fullPath)(defaultFuncs, api, ctx);
175
+ } catch (e) {
176
+ utils.error(
177
+ `Failed to load module ${moduleName} from ${folder}:`,
178
+ e,
179
+ );
180
+ }
181
+ });
182
+ });
183
+ const listenPath = path.join(
184
+ __dirname,
185
+ '..',
186
+ '..',
187
+ 'deltas',
188
+ 'apis',
189
+ 'mqtt',
190
+ 'listenMqtt' + ext,
191
+ );
192
+ const realtimePath = path.join(
193
+ __dirname,
194
+ '..',
195
+ '..',
196
+ 'deltas',
197
+ 'apis',
198
+ 'mqtt',
199
+ 'realtime' + ext,
200
+ );
201
+
202
+ if (fs.existsSync(realtimePath)) {
203
+ const mod = require(realtimePath);
204
+ api['realtime'] = (mod.default || mod)(defaultFuncs, api, ctx);
205
+ }
206
+ if (fs.existsSync(listenPath)) {
207
+ const mod = require(listenPath);
208
+ api['listenMqtt'] = (mod.default || mod)(defaultFuncs, api, ctx);
209
+ }
210
+ };
211
+
212
+ api.getCurrentUserID = () => ctx.userID;
213
+ api.getOptions = (key) => (key ? globalOptions[key] : globalOptions);
214
+ loadApiModules();
215
+ api.ctx = ctx;
216
+ api.defaultFuncs = defaultFuncs;
217
+ api.globalOptions = globalOptions;
218
+
219
+ return callback(null, api);
220
+ } catch (error) {
221
+ utils.error('loginHelper', error.error || error);
222
+ return callback(error);
223
+ }
224
+ }
225
+
226
+ export default loginHelper;
@@ -0,0 +1,48 @@
1
+ import utils = require('../../utils');
2
+
3
+ async function setOptions(
4
+ globalOptions: any,
5
+ options: any = {},
6
+ ): Promise<void> {
7
+ const optionHandlers = {
8
+ online: (value) => (globalOptions.online = Boolean(value)),
9
+ selfListen: (value) => (globalOptions.selfListen = Boolean(value)),
10
+ selfListenEvent: (value) => (globalOptions.selfListenEvent = value),
11
+ listenEvents: (value) => (globalOptions.listenEvents = Boolean(value)),
12
+ updatePresence: (value) => (globalOptions.updatePresence = Boolean(value)),
13
+ forceLogin: (value) => (globalOptions.forceLogin = Boolean(value)),
14
+ userAgent: (value) => (globalOptions.userAgent = value),
15
+ autoMarkDelivery: (value) =>
16
+ (globalOptions.autoMarkDelivery = Boolean(value)),
17
+ autoMarkRead: (value) => (globalOptions.autoMarkRead = Boolean(value)),
18
+ listenTyping: (value) => (globalOptions.listenTyping = Boolean(value)),
19
+ proxy(value) {
20
+ if (typeof value !== 'string') {
21
+ delete globalOptions.proxy;
22
+ utils.setProxy();
23
+ } else {
24
+ globalOptions.proxy = value;
25
+ utils.setProxy(value);
26
+ }
27
+ },
28
+ autoReconnect: (value) => (globalOptions.autoReconnect = Boolean(value)),
29
+ emitReady: (value) => (globalOptions.emitReady = Boolean(value)),
30
+ randomUserAgent(value) {
31
+ globalOptions.randomUserAgent = Boolean(value);
32
+ if (value) {
33
+ globalOptions.userAgent = utils.randomUserAgent();
34
+ }
35
+ },
36
+ bypassRegion(value) {
37
+ if (value) {
38
+ value = value.toUpperCase();
39
+ }
40
+ globalOptions.bypassRegion = value;
41
+ },
42
+ };
43
+ Object.entries(options).forEach(([key, value]) => {
44
+ if (optionHandlers[key]) optionHandlers[key](value);
45
+ });
46
+ }
47
+
48
+ export default setOptions;