| | 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; |
| | } |