|
|
module.exports.config = { |
|
|
name: "post", |
|
|
version: "1.0.0", |
|
|
permission: 3, |
|
|
credits: "ryuko", |
|
|
usePrefix: true, |
|
|
premium: false, |
|
|
description: "create a new post in acc bot", |
|
|
commandCategory: "Facebook", |
|
|
cooldowns: 5 |
|
|
}; |
|
|
|
|
|
module.exports.run = async ({ event, api, getText, args }) => { |
|
|
const { threadID, messageID, senderID } = event; |
|
|
const uuid = getGUID(); |
|
|
const formData = { |
|
|
"input": { |
|
|
"composer_entry_point": "inline_composer", |
|
|
"composer_source_surface": "timeline", |
|
|
"idempotence_token": uuid + "_FEED", |
|
|
"source": "WWW", |
|
|
"attachments": [], |
|
|
"audience": { |
|
|
"privacy": { |
|
|
"allow": [], |
|
|
"base_state": "FRIENDS", |
|
|
"deny": [], |
|
|
"tag_expansion_state": "UNSPECIFIED" |
|
|
} |
|
|
}, |
|
|
"message": { |
|
|
"ranges": [], |
|
|
"text": "" |
|
|
}, |
|
|
"with_tags_ids": [], |
|
|
"inline_activities": [], |
|
|
"explicit_place_id": "0", |
|
|
"text_format_preset_id": "0", |
|
|
"logging": { |
|
|
"composer_session_id": uuid |
|
|
}, |
|
|
"tracking": [ |
|
|
null |
|
|
], |
|
|
"actor_id": api.getCurrentUserID(), |
|
|
"client_mutation_id": Math.floor(Math.random()*17) |
|
|
}, |
|
|
"displayCommentsFeedbackContext": null, |
|
|
"displayCommentsContextEnableComment": null, |
|
|
"displayCommentsContextIsAdPreview": null, |
|
|
"displayCommentsContextIsAggregatedShare": null, |
|
|
"displayCommentsContextIsStorySet": null, |
|
|
"feedLocation": "TIMELINE", |
|
|
"feedbackSource": 0, |
|
|
"focusCommentID": null, |
|
|
"gridMediaWidth": 230, |
|
|
"groupID": null, |
|
|
"scale": 3, |
|
|
"privacySelectorRenderLocation": "COMET_STREAM", |
|
|
"renderLocation": "timeline", |
|
|
"useDefaultActor": false, |
|
|
"inviteShortLinkKey": null, |
|
|
"isFeed": false, |
|
|
"isFundraiser": false, |
|
|
"isFunFactPost": false, |
|
|
"isGroup": false, |
|
|
"isTimeline": true, |
|
|
"isSocialLearning": false, |
|
|
"isPageNewsFeed": false, |
|
|
"isProfileReviews": false, |
|
|
"isWorkSharedDraft": false, |
|
|
"UFI2CommentsProvider_commentsKey": "ProfileCometTimelineRoute", |
|
|
"hashtag": null, |
|
|
"canUserManageOffers": false |
|
|
}; |
|
|
|
|
|
return api.sendMessage(`choose an audience that can see this article of yours\n1. everyone\n2. friend\n3. Only me`, threadID, (e, info) => { |
|
|
global.client.handleReply.push({ |
|
|
name: this.config.name, |
|
|
messageID: info.messageID, |
|
|
author: senderID, |
|
|
formData, |
|
|
type: "whoSee" |
|
|
}); |
|
|
}, messageID); |
|
|
}; |
|
|
|
|
|
module.exports.handleReply = async ({ event, api, handleReply }) => { |
|
|
const { type, author, formData } = handleReply; |
|
|
if (event.senderID != author) return; |
|
|
const axios = require("axios"); |
|
|
|
|
|
const fs = require("fs-extra"); |
|
|
|
|
|
const { threadID, messageID, senderID, attachments, body } = event; |
|
|
const botID = api.getCurrentUserID(); |
|
|
|
|
|
async function uploadAttachments(attachments) { |
|
|
let uploads = []; |
|
|
for (const attachment of attachments) { |
|
|
const form = { |
|
|
file: attachment |
|
|
}; |
|
|
uploads.push(api.httpPostFormData(`https://www.facebook.com/profile/picture/upload/?profile_id=${botID}&photo_source=57&av=${botID}`, form)); |
|
|
} |
|
|
uploads = await Promise.all(uploads); |
|
|
return uploads; |
|
|
} |
|
|
|
|
|
if (type == "whoSee") { |
|
|
if (!["1", "2", "3"].includes(body)) return api.sendMessage('please choose 1 of the 3 items above', threadID, messageID); |
|
|
formData.input.audience.privacy.base_state = body == 1 ? "EVERYONE" : body == 2 ? "FRIENDS" : "SELF"; |
|
|
api.unsendMessage(handleReply.messageID, () => { |
|
|
api.sendMessage(`reply to this message with the content of the article, if you want to leave it blank, please reply 0`, threadID, (e, info) => { |
|
|
global.client.handleReply.push({ |
|
|
name: this.config.name, |
|
|
messageID: info.messageID, |
|
|
author: senderID, |
|
|
formData, |
|
|
type: "content" |
|
|
}); |
|
|
}, messageID); |
|
|
}); |
|
|
} |
|
|
else if (type == "content") { |
|
|
if (event.body != "0") formData.input.message.text = event.body; |
|
|
api.unsendMessage(handleReply.messageID, () => { |
|
|
api.sendMessage(`reply to this message with a photo (you can send multiple photos, if you don't want to post pictures, please reply 0`, threadID, (e, info) => { |
|
|
global.client.handleReply.push({ |
|
|
name: this.config.name, |
|
|
messageID: info.messageID, |
|
|
author: senderID, |
|
|
formData, |
|
|
type: "image" |
|
|
}); |
|
|
}, messageID); |
|
|
}); |
|
|
} |
|
|
else if (type == "image") { |
|
|
if (event.body != "0") { |
|
|
const allStreamFile = []; |
|
|
const pathImage = __dirname + `/cache/imagePost.png`; |
|
|
for (const attach of attachments) { |
|
|
if (attach.type != "photo") continue; |
|
|
const getFile = (await axios.get(attach.url, { responseType: "arraybuffer" })).data; |
|
|
fs.writeFileSync(pathImage, Buffer.from(getFile)); |
|
|
allStreamFile.push(fs.createReadStream(pathImage)); |
|
|
} |
|
|
const uploadFiles = await uploadAttachments(allStreamFile); |
|
|
for (let result of uploadFiles) { |
|
|
if (typeof result == "string") result = JSON.parse(result.replace("for (;;);", "")); |
|
|
|
|
|
formData.input.attachments.push({ |
|
|
"photo": { |
|
|
"id": result.payload.fbid.toString(), |
|
|
} |
|
|
}); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const form = { |
|
|
av: botID, |
|
|
fb_api_req_friendly_name: "ComposerStoryCreateMutation", |
|
|
fb_api_caller_class: "RelayModern", |
|
|
doc_id: "7711610262190099", |
|
|
variables: JSON.stringify(formData) |
|
|
}; |
|
|
|
|
|
api.httpPost('https://www.facebook.com/api/graphql/', form, (e, info) => { |
|
|
api.unsendMessage(handleReply.messageID); |
|
|
try { |
|
|
if (e) throw e; |
|
|
if (typeof info == "string") info = JSON.parse(info.replace("for (;;);", "")); |
|
|
const postID = info.data.story_create.story.legacy_story_hideable_id; |
|
|
const urlPost = info.data.story_create.story.url; |
|
|
if (!postID) throw info.errors; |
|
|
try { |
|
|
fs.unlinkSync(__dirname + "/cache/imagePost.png"); |
|
|
|
|
|
} |
|
|
catch(e) {} |
|
|
return api.sendMessage(`post created successfully\n\npost id : ${postID}\nlink : ${urlPost}`, threadID, messageID); |
|
|
} |
|
|
catch (e) { |
|
|
|
|
|
return api.sendMessage(`Post creation failed, please try again later`, threadID, messageID); |
|
|
} |
|
|
}); |
|
|
|
|
|
} |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function getGUID() { |
|
|
var sectionLength = Date.now(); |
|
|
var id = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) { |
|
|
var r = Math.floor((sectionLength + Math.random() * 16) % 16); |
|
|
sectionLength = Math.floor(sectionLength / 16); |
|
|
var _guid = (c == "x" ? r : (r & 7) | 8).toString(16); |
|
|
return _guid; |
|
|
}); |
|
|
return id; |
|
|
} |