naughty-fb-chatify 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. package/.github/workflows/publish.yml +20 -0
  2. package/README.md +225 -0
  3. package/index.js +602 -0
  4. package/package.json +80 -0
  5. package/src/addExternalModule.js +19 -0
  6. package/src/addUserToGroup.js +113 -0
  7. package/src/changeAdminStatus.js +79 -0
  8. package/src/changeArchivedStatus.js +55 -0
  9. package/src/changeBio.js +77 -0
  10. package/src/changeBlockedStatus.js +47 -0
  11. package/src/changeGroupImage.js +129 -0
  12. package/src/changeNickname.js +59 -0
  13. package/src/changeThreadColor.js +71 -0
  14. package/src/changeThreadEmoji.js +55 -0
  15. package/src/createNewGroup.js +86 -0
  16. package/src/createPoll.js +71 -0
  17. package/src/deleteMessage.js +56 -0
  18. package/src/deleteThread.js +56 -0
  19. package/src/forwardAttachment.js +60 -0
  20. package/src/getCurrentUserID.js +7 -0
  21. package/src/getEmojiUrl.js +29 -0
  22. package/src/getFriendsList.js +84 -0
  23. package/src/getThreadHistory.js +645 -0
  24. package/src/getThreadHistoryDeprecated.js +93 -0
  25. package/src/getThreadInfo.js +201 -0
  26. package/src/getThreadInfoDeprecated.js +80 -0
  27. package/src/getThreadList.js +238 -0
  28. package/src/getThreadListDeprecated.js +75 -0
  29. package/src/getThreadPictures.js +79 -0
  30. package/src/getUserID.js +66 -0
  31. package/src/getUserInfo.js +72 -0
  32. package/src/handleFriendRequest.js +61 -0
  33. package/src/handleMessageRequest.js +65 -0
  34. package/src/httpGet.js +52 -0
  35. package/src/httpPost.js +52 -0
  36. package/src/listenMqtt.js +788 -0
  37. package/src/logout.js +75 -0
  38. package/src/markAsDelivered.js +58 -0
  39. package/src/markAsRead.js +80 -0
  40. package/src/markAsReadAll.js +50 -0
  41. package/src/markAsSeen.js +59 -0
  42. package/src/muteThread.js +52 -0
  43. package/src/removeUserFromGroup.js +79 -0
  44. package/src/resolvePhotoUrl.js +45 -0
  45. package/src/searchForThread.js +53 -0
  46. package/src/sendMessage.js +459 -0
  47. package/src/sendTypingIndicator.js +103 -0
  48. package/src/setMessageReaction.js +117 -0
  49. package/src/setPostReaction.js +76 -0
  50. package/src/setTitle.js +86 -0
  51. package/src/threadColors.js +57 -0
  52. package/src/unfriend.js +52 -0
  53. package/src/unsendMessage.js +49 -0
  54. package/test/data/shareAttach.js +146 -0
  55. package/test/data/something.mov +0 -0
  56. package/test/data/test.png +0 -0
  57. package/test/data/test.txt +1 -0
  58. package/test/test-page.js +140 -0
  59. package/test/test.js +385 -0
  60. package/utils.js +1357 -0
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function unsendMessage(postID, type, callback) {
8
+ var resolveFunc = function(){};
9
+ var rejectFunc = function(){};
10
+ var returnPromise = new Promise(function (resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ callback = function (err, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
21
+ };
22
+ }
23
+
24
+ var map = {
25
+ like: 1,
26
+ heart: 2,
27
+ wow: 3,
28
+ haha: 4,
29
+ sad: 7,
30
+ angry: 8
31
+ };
32
+ if (typeof type != "number") {
33
+ type = map[type.toLocaleLowerCase()];
34
+ if (!type) {
35
+ type = 1;
36
+ }
37
+ }
38
+ var form = {
39
+ av: ctx.userID,
40
+ fb_api_caller_class: "RelayModern",
41
+ fb_api_req_friendly_name: "UFI2FeedbackReactMutation",
42
+ //This doc_id is valid as of January 17th, 2020
43
+ doc_id: "2580813318646067",
44
+ variables: JSON.stringify({
45
+ input: {
46
+ client_mutation_id: "7",
47
+ actor_id: ctx.userID,
48
+ feedback_reaction: type,
49
+
50
+ },
51
+ useDefaultActor: true
52
+ })
53
+ };
54
+
55
+ defaultFuncs
56
+ .post(
57
+ "https://www.facebook.com/api/graphql/",
58
+ ctx.jar,
59
+ form
60
+ )
61
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
62
+ .then(function(resData) {
63
+ if (resData.error) {
64
+ throw resData;
65
+ }
66
+
67
+ return callback();
68
+ })
69
+ .catch(function(err) {
70
+ log.error("setPostReaction", err);
71
+ return callback(err);
72
+ });
73
+
74
+ return returnPromise;
75
+ };
76
+ };
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function setTitle(newTitle, threadID, callback) {
8
+ if (
9
+ !callback &&
10
+ (utils.getType(threadID) === "Function" ||
11
+ utils.getType(threadID) === "AsyncFunction")
12
+ ) {
13
+ throw { error: "please pass a threadID as a second argument." };
14
+ }
15
+
16
+ var resolveFunc = function(){};
17
+ var rejectFunc = function(){};
18
+ var returnPromise = new Promise(function (resolve, reject) {
19
+ resolveFunc = resolve;
20
+ rejectFunc = reject;
21
+ });
22
+
23
+ if (!callback) {
24
+ callback = function (err, friendList) {
25
+ if (err) {
26
+ return rejectFunc(err);
27
+ }
28
+ resolveFunc(friendList);
29
+ };
30
+ }
31
+
32
+ var messageAndOTID = utils.generateOfflineThreadingID();
33
+ var form = {
34
+ client: "mercury",
35
+ action_type: "ma-type:log-message",
36
+ author: "fbid:" + ctx.userID,
37
+ author_email: "",
38
+ coordinates: "",
39
+ timestamp: Date.now(),
40
+ timestamp_absolute: "Today",
41
+ timestamp_relative: utils.generateTimestampRelative(),
42
+ timestamp_time_passed: "0",
43
+ is_unread: false,
44
+ is_cleared: false,
45
+ is_forward: false,
46
+ is_filtered_content: false,
47
+ is_spoof_warning: false,
48
+ source: "source:chat:web",
49
+ "source_tags[0]": "source:chat",
50
+ status: "0",
51
+ offline_threading_id: messageAndOTID,
52
+ message_id: messageAndOTID,
53
+ threading_id: utils.generateThreadingID(ctx.clientID),
54
+ manual_retry_cnt: "0",
55
+ thread_fbid: threadID,
56
+ thread_name: newTitle,
57
+ thread_id: threadID,
58
+ log_message_type: "log:thread-name"
59
+ };
60
+
61
+ defaultFuncs
62
+ .post("https://www.facebook.com/messaging/set_thread_name/", ctx.jar, form)
63
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
64
+ .then(function(resData) {
65
+ if (resData.error && resData.error === 1545012) {
66
+ throw { error: "Cannot change chat title: Not member of chat." };
67
+ }
68
+
69
+ if (resData.error && resData.error === 1545003) {
70
+ throw { error: "Cannot set title of single-user chat." };
71
+ }
72
+
73
+ if (resData.error) {
74
+ throw resData;
75
+ }
76
+
77
+ return callback();
78
+ })
79
+ .catch(function(err) {
80
+ log.error("setTitle", err);
81
+ return callback(err);
82
+ });
83
+
84
+ return returnPromise;
85
+ };
86
+ };
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ module.exports = function(_defaultFuncs, _api, _ctx) {
4
+ // Currently the only colors that can be passed to api.changeThreadColor(); may change if Facebook adds more
5
+ return {
6
+ //Old hex colors.
7
+ ////MessengerBlue: null,
8
+ ////Viking: "#44bec7",
9
+ ////GoldenPoppy: "#ffc300",
10
+ ////RadicalRed: "#fa3c4c",
11
+ ////Shocking: "#d696bb",
12
+ ////PictonBlue: "#6699cc",
13
+ ////FreeSpeechGreen: "#13cf13",
14
+ ////Pumpkin: "#ff7e29",
15
+ ////LightCoral: "#e68585",
16
+ ////MediumSlateBlue: "#7646ff",
17
+ ////DeepSkyBlue: "#20cef5",
18
+ ////Fern: "#67b868",
19
+ ////Cameo: "#d4a88c",
20
+ ////BrilliantRose: "#ff5ca1",
21
+ ////BilobaFlower: "#a695c7"
22
+
23
+ //#region This part is for backward compatibly
24
+ //trying to match the color one-by-one. kill me plz
25
+ MessengerBlue: "196241301102133", //DefaultBlue
26
+ Viking: "1928399724138152", //TealBlue
27
+ GoldenPoppy: "174636906462322", //Yellow
28
+ RadicalRed: "2129984390566328", //Red
29
+ Shocking: "2058653964378557", //LavenderPurple
30
+ FreeSpeechGreen: "2136751179887052", //Green
31
+ Pumpkin: "175615189761153", //Orange
32
+ LightCoral: "980963458735625", //CoralPink
33
+ MediumSlateBlue: "234137870477637", //BrightPurple
34
+ DeepSkyBlue: "2442142322678320", //AquaBlue
35
+ BrilliantRose: "169463077092846", //HotPink
36
+ //i've tried my best, everything else can't be mapped. (or is it?) -UIRI 2020
37
+ //#endregion
38
+
39
+ DefaultBlue: "196241301102133",
40
+ HotPink: "169463077092846",
41
+ AquaBlue: "2442142322678320",
42
+ BrightPurple: "234137870477637",
43
+ CoralPink: "980963458735625",
44
+ Orange: "175615189761153",
45
+ Green: "2136751179887052",
46
+ LavenderPurple: "2058653964378557",
47
+ Red: "2129984390566328",
48
+ Yellow: "174636906462322",
49
+ TealBlue: "1928399724138152",
50
+ Aqua: "417639218648241",
51
+ Mango: "930060997172551",
52
+ Berry: "164535220883264",
53
+ Citrus: "370940413392601",
54
+ Candy: "205488546921017",
55
+ //StarWars: "809305022860427" Removed.
56
+ };
57
+ };
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function unsendMessage(userID, callback) {
8
+ var resolveFunc = function(){};
9
+ var rejectFunc = function(){};
10
+ var returnPromise = new Promise(function (resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ callback = function (err, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
21
+ };
22
+ }
23
+
24
+ var form = {
25
+ uid: userID,
26
+ unref: "bd_friends_tab",
27
+ floc: "friends_tab",
28
+ "nctr[_mod]": "pagelet_timeline_app_collection_" + ctx.userID + ":2356318349:2"
29
+ };
30
+
31
+ defaultFuncs
32
+ .post(
33
+ "https://www.facebook.com/ajax/profile/removefriendconfirm.php",
34
+ ctx.jar,
35
+ form
36
+ )
37
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
38
+ .then(function(resData) {
39
+ if (resData.error) {
40
+ throw resData;
41
+ }
42
+
43
+ return callback();
44
+ })
45
+ .catch(function(err) {
46
+ log.error("unfriend", err);
47
+ return callback(err);
48
+ });
49
+
50
+ return returnPromise;
51
+ };
52
+ };
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ var utils = require("../utils");
4
+ var log = require("npmlog");
5
+
6
+ module.exports = function(defaultFuncs, api, ctx) {
7
+ return function unsendMessage(messageID, callback) {
8
+ var resolveFunc = function(){};
9
+ var rejectFunc = function(){};
10
+ var returnPromise = new Promise(function (resolve, reject) {
11
+ resolveFunc = resolve;
12
+ rejectFunc = reject;
13
+ });
14
+
15
+ if (!callback) {
16
+ callback = function (err, friendList) {
17
+ if (err) {
18
+ return rejectFunc(err);
19
+ }
20
+ resolveFunc(friendList);
21
+ };
22
+ }
23
+
24
+ var form = {
25
+ message_id: messageID
26
+ };
27
+
28
+ defaultFuncs
29
+ .post(
30
+ "https://www.facebook.com/messaging/unsend_message/",
31
+ ctx.jar,
32
+ form
33
+ )
34
+ .then(utils.parseAndCheckLogin(ctx, defaultFuncs))
35
+ .then(function(resData) {
36
+ if (resData.error) {
37
+ throw resData;
38
+ }
39
+
40
+ return callback();
41
+ })
42
+ .catch(function(err) {
43
+ log.error("unsendMessage", err);
44
+ return callback(err);
45
+ });
46
+
47
+ return returnPromise;
48
+ };
49
+ };
@@ -0,0 +1,146 @@
1
+ module.exports = {
2
+ "delta": {
3
+ "attachments": [
4
+ {
5
+ "fbid": "1522004821162174",
6
+ "id": "1522004821162174",
7
+ "mercury": {
8
+ "app_attribution": null,
9
+ "attach_type": "share",
10
+ "name": null,
11
+ "url": null,
12
+ "rel": null,
13
+ "preview_url": null,
14
+ "preview_width": null,
15
+ "preview_height": null,
16
+ "large_preview_url": null,
17
+ "large_preview_width": null,
18
+ "large_preview_height": null,
19
+ "icon_type": null,
20
+ "metadata": null,
21
+ "thumbnail_url": null,
22
+ "share": {
23
+ "description": null,
24
+ "media": {
25
+ "animated_image": null,
26
+ "animated_image_size": {
27
+ "height": null,
28
+ "width": null
29
+ },
30
+ "image": null,
31
+ "image_size": {
32
+ "height": null,
33
+ "width": null
34
+ },
35
+ "duration": null,
36
+ "playable": null,
37
+ "source": null
38
+ },
39
+ "source": "Dimon - testing",
40
+ "style_list": [
41
+ "business_message_items", "fallback"
42
+ ],
43
+ "title": "search engines",
44
+ "properties": null,
45
+ "uri": null,
46
+ "subattachments": [],
47
+ "deduplication_key": "abcde",
48
+ "action_links": [],
49
+ "share_id": "1522004821162174",
50
+ "target": {
51
+ "call_to_actions": [],
52
+ "items": [
53
+ {
54
+ "id": "629934437209008",
55
+ "name": "search engines",
56
+ "desc": "",
57
+ "thumb_url": null,
58
+ "item_url": null,
59
+ "title": "search engines",
60
+ "text": "",
61
+ "source": null,
62
+ "metalines": {
63
+ "metaline_1": "click to get redirected",
64
+ "metaline_2": null,
65
+ "metaline_3": null
66
+ },
67
+ "location": 12314,
68
+ "category": 69,
69
+ "call_to_actions": [
70
+ {
71
+ "action_link": "http://l.facebook.com/l.php?u=http%3A%2F%2Fgoogle.com%2F&h=ATNziCq_-6I3ZPYwwLluFdCrWMEwLLKvokFlXdEdS4LD2Lzsv2cR2SJYffJcDYBfB092Xeq8oRdftJk4husEYVduH24RnlP3HvVQOkOrciXDs2M7TkWYyNLBelvJ2Fc-mw8pbGy5NslGf_fkZ_A",
72
+ "action_type": 2,
73
+ "id": "FFD=",
74
+ "title": "Google",
75
+ "link_target_ids": [629934437209008],
76
+ "is_mutable_by_server": false,
77
+ "should_show_user_confirmation": false,
78
+ "confirmation_title": null,
79
+ "confirmation_message": null,
80
+ "confirmation_continue_label": null,
81
+ "confirmation_cancel_label": null,
82
+ "payment_metadata": {
83
+ "total_price": null,
84
+ "payment_module_config": null
85
+ },
86
+ "is_disabled": false
87
+ }, {
88
+ "action_link": "http://l.facebook.com/l.php?u=http%3A%2F%2Fyahoo.com%2F&h=ATNIuTf7iDGP5xXTWOAdhaGhRFfDf4eS09t_G9CrR0MDiBKpqtCDzPf_9y5Bq7TXMgmo6RttztsgeO0ReSc0PDvJDTa1fLMMK2CjrpkqC91_m-yaMXfeQ4aI6MbhZrOPnK3YFnQP4XvRx3N1udE",
89
+ "action_type": 2,
90
+ "id": "CDE=",
91
+ "title": "Yahoo",
92
+ "link_target_ids": [629934437209008],
93
+ "is_mutable_by_server": false,
94
+ "should_show_user_confirmation": false,
95
+ "confirmation_title": null,
96
+ "confirmation_message": null,
97
+ "confirmation_continue_label": null,
98
+ "confirmation_cancel_label": null,
99
+ "payment_metadata": {
100
+ "total_price": null,
101
+ "payment_module_config": null
102
+ },
103
+ "is_disabled": false
104
+ }, {
105
+ "action_link": "http://l.facebook.com/l.php?u=http%3A%2F%2Fbing.com%2F&h=ATMoMijAt6Da6WWIQ679DhZyZizWdxAViWwyl-RjKobFUG_x8GmB8LD6pPa3KP5K1-QTL9vuaFwjqB0itaMFWk4VwQ9uh56JgnbFnAo4qM_CrQufgLeHwwCnWSCnZt8IzYT4y6YULLLFA5bL1H4",
106
+ "action_type": 2,
107
+ "id": "ABC=",
108
+ "title": "Bing",
109
+ "link_target_ids": [629934437209008],
110
+ "is_mutable_by_server": false,
111
+ "should_show_user_confirmation": false,
112
+ "confirmation_title": null,
113
+ "confirmation_message": null,
114
+ "confirmation_continue_label": null,
115
+ "confirmation_cancel_label": null,
116
+ "payment_metadata": {
117
+ "total_price": null,
118
+ "payment_module_config": null
119
+ },
120
+ "is_disabled": false
121
+ }
122
+ ]
123
+ }
124
+ ],
125
+ "location": 132145,
126
+ "category": 69,
127
+ "message": "Aaa: search engines"
128
+ }
129
+ }
130
+ },
131
+ "otherUserFbIds": ["1521994257829897"],
132
+ "titanType": 1
133
+ }
134
+ ],
135
+ "messageMetadata": {
136
+ "actorFbId": "1345",
137
+ "messageId": "mid.12345:asdv",
138
+ "offlineThreadingId": "1345v1345",
139
+ "tags": ["source:messenger:commerce"],
140
+ "threadKey": {
141
+ "otherUserFbId": "13451345"
142
+ },
143
+ "timestamp": "1487078180265"
144
+ }
145
+ }
146
+ }
Binary file
Binary file
@@ -0,0 +1 @@
1
+ Fca For Naughty-Bot-V1
@@ -0,0 +1,140 @@
1
+ var login = require('../index.js');
2
+ var fs = require('fs');
3
+ var assert = require('assert');
4
+
5
+ var conf = JSON.parse(process.env.testconfig || fs.readFileSync('test/test-config.json', 'utf8'));
6
+ var credentials = {
7
+ email: conf.user.email,
8
+ password: conf.user.password,
9
+ };
10
+
11
+ var userIDs = conf.userIDs;
12
+
13
+ var options = {
14
+ selfListen: true,
15
+ listenEvents: true,
16
+ logLevel: "silent",
17
+ pageID: conf.pageID
18
+ };
19
+ var getType = require('../utils').getType;
20
+
21
+ var userID = conf.user.id;
22
+
23
+ var groupChatID;
24
+ var groupChatName;
25
+
26
+ function checkErr(done){
27
+ return function(err) {
28
+ if (err) done(err);
29
+ };
30
+ }
31
+
32
+ // describe('Login As Page:', function() {
33
+ // var api = null;
34
+ // process.on('SIGINT', () => api && !api.logout() && console.log("Logged out :)"));
35
+ // var tests = [];
36
+ // var stopListening;
37
+ // this.timeout(20000);
38
+
39
+ // function listen(done, matcher) {
40
+ // tests.push({matcher:matcher, done:done});
41
+ // }
42
+
43
+ // before(function(done) {
44
+ // login(credentials, options, function (err, localAPI) {
45
+ // if(err) return done(err);
46
+
47
+ // assert(localAPI);
48
+ // api = localAPI;
49
+ // stopListening = api.listen(function (err, msg) {
50
+ // if (err) throw err;
51
+ // // Removes matching function and calls corresponding done
52
+ // tests = tests.filter(function(test) {
53
+ // return !(test.matcher(msg) && (test.done() || true));
54
+ // });
55
+ // });
56
+
57
+ // done();
58
+ // });
59
+ // });
60
+
61
+ // it('should login without error', function (){
62
+ // assert(api);
63
+ // });
64
+
65
+ // it('should get the right user ID', function (){
66
+ // assert(userID == api.getCurrentUserID());
67
+ // });
68
+
69
+ // it('should send text message object (user)', function (done){
70
+ // var body = "text-msg-obj-" + Date.now();
71
+ // listen(done, msg =>
72
+ // msg.type === 'message' &&
73
+ // msg.body === body &&
74
+ // msg.isGroup === false
75
+ // );
76
+ // api.sendMessage({body: body}, userID, checkErr(done));
77
+ // });
78
+
79
+ // it('should send sticker message object (user)', function (done){
80
+ // var stickerID = '767334526626290';
81
+ // listen(done, msg =>
82
+ // msg.type === 'message' &&
83
+ // msg.attachments.length > 0 &&
84
+ // msg.attachments[0].type === 'sticker' &&
85
+ // msg.attachments[0].stickerID === stickerID &&
86
+ // msg.isGroup === false
87
+ // );
88
+ // api.sendMessage({sticker: stickerID}, userID, checkErr(done));
89
+ // });
90
+
91
+ // it('should send basic string (user)', function (done){
92
+ // var body = "basic-str-" + Date.now();
93
+ // listen(done, msg =>
94
+ // msg.type === 'message' &&
95
+ // msg.body === body &&
96
+ // msg.isGroup === false
97
+ // );
98
+ // api.sendMessage(body, userID, checkErr(done));
99
+ // });
100
+
101
+ // it('should send typing indicator', function (done) {
102
+ // var stopType = api.sendTypingIndicator(userID, function(err) {
103
+ // checkErr(done)(err);
104
+ // stopType();
105
+ // done();
106
+ // });
107
+ // });
108
+
109
+ // it('should get the right user info', function (done) {
110
+ // api.getUserInfo(userID, function(err, data) {
111
+ // checkErr(done)(err);
112
+ // var user = data[userID];
113
+ // assert(user.name);
114
+ // assert(user.firstName);
115
+ // assert(user.vanity !== null);
116
+ // assert(user.profileUrl);
117
+ // assert(user.gender);
118
+ // assert(user.type);
119
+ // assert(!user.isFriend);
120
+ // done();
121
+ // });
122
+ // });
123
+
124
+ // it('should get the list of friends', function (done) {
125
+ // api.getFriendsList(function(err, data) {
126
+ // checkErr(done)(err);
127
+ // assert(getType(data) === "Array");
128
+ // data.map(function(v) {parseInt(v);});
129
+ // done();
130
+ // });
131
+ // });
132
+
133
+ // it('should log out', function (done) {
134
+ // api.logout(done);
135
+ // });
136
+
137
+ // after(function (){
138
+ // if (stopListening) stopListening();
139
+ // });
140
+ // });