game screenshot
parent
cdee582951
commit
e12308e8bb
|
@ -1,52 +1,129 @@
|
|||
const puppeteer = require("puppeteer");
|
||||
const axios = require("axios");
|
||||
// const { execSync } = require('child_process');
|
||||
|
||||
// const gameIds = [
|
||||
// '26', '27', '28', '29', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '40', '41', '42', '43', '44',
|
||||
// '45', '46', '47', '48', '49', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '60', '61', '62', '63',
|
||||
// '64', '65', '66', '67', '68', '69', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '80', '81', '82',
|
||||
// '83', '84', '85', '86', '87', '88', '89', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '100', '101',
|
||||
// '102', '103', '104', '105', '106', '107', '108', '109', '110', '111', '112', '113', '114', '115', '116',
|
||||
// '117', '118', '119', '120', '121', '122', '123', '124', '125', '126', '127', '128', '129', '130', '131',
|
||||
// '132', '133', '134', '135', '136', '137', '138', '139', '140', '141', '142', '143', '144', '145', '146',
|
||||
// '147', '148', '149', '150', '152', '153', '154', '155', '156', '157', '158', '159', '160', '161', '162',
|
||||
// '163', '164', '165', '166', '167', '168', '169', '170', '171', '172', '173', '174', '175', '176', '177',
|
||||
// '178', '179', '180', '181', '182', '183', '184', '185', '186', '187', '188', '189', '190', '191', '192',
|
||||
// '193', '194', '195', '196', '197', '198', '199', '200', '201', '202', '203', '204', '205', '206', '207',
|
||||
// '208', '209', '210', '211', '212', '213', '214', '215', '216', '217', '218', '219', '220', '221', '222',
|
||||
// '223', '224', '225', '226', '227', '228', '229', '230', '231', '232', '233', '234', '235', '236', '237',
|
||||
// '238', '239', '240', '241', '242', '243', '244', '245', '246', '247', '248', '249', '250', '251', '252',
|
||||
// '253', '254', '255', '256', '257', '258', '259', '260', '261', '262', '263', '264', '265', '266', '267',
|
||||
// '268', '269', '270', '271', '272', '273', '274', '275', '276', '277', '278', '279', '280', '281', '282',
|
||||
// '283', '284', '285', '286', '287', '288', '289', '290', '291', '292', '293', '294', '295', '296', '297',
|
||||
// '298', '299', '300', '301', '302', '303', '304', '305', '306', '307', '308', '309', '310', '311', '312',
|
||||
// '313', '314', '315', '316', '317', '318', '319', '320', '321', '322', '323', '324', '325', '326', '327',
|
||||
// '328', '329', '330', '331', '332', '333', '334', '335', '336', '337', '338', '339', '340', '341', '342',
|
||||
// '343', '344', '345', '346', '347', '348', '349', '350', '351', '352', '353', '354', '355', '356', '357',
|
||||
// '358', '359', '360', '361', '362', '363', '364', '365', '366', '367', '368', '369', '370', '371', '372',
|
||||
// '373', '374', '375', '376', '377', '378', '379', '380', '381', '382', '383', '384', '385', '386', '387',
|
||||
// '388', '389', '390', '391', '392', '393', '394', '395', '396', '397', '398', '399', '400', '401', '402',
|
||||
// '403', '404', '405', '406', '407', '408', '409', '410', '411', '412', '413', '414', '415', '416', '417',
|
||||
// '418', '419', '420', '421', '422', '423', '424', '425', '426', '427', '428', '429', '430', '431', '432',
|
||||
// '433', '434', '435', '436', '437', '438', '439', '440', '441', '442', '443', '444', '445', '446', '447',
|
||||
// '448', '449', '450', '451', '452', '453', '454', '455', '456', '457', '458', '459', '460', '461', '462',
|
||||
// '463', '464', '465', '466', '467', '468', '469', '470', '471', '472', '473', '474', '475', '476', '477',
|
||||
// '478', '479', '480', '481', '482', '483', '484', '485', '486', '487', '488', '489', '490', '491', '492',
|
||||
// '493', '494', '495', '496', '497', '498', '499', '500', '501', '502', '503', '504', '505', '506', '507',
|
||||
// '508', '509', '510', '511', '512', '513', '514', '515', '516', '517', '518', '519', '520', '521', '522',
|
||||
// '524', '525', '526', '527', '528', '529', '530', '531', '532', '533', '534', '535', '536', '537', '538',
|
||||
// '539', '540', '541', '542', '543', '544', '545', '546', '547', '548', '549', '550', '551', '552', '553',
|
||||
// '554', '555', '556', '557', '558', '559', '560', '561', '562', '563', '564', '565', '566', '567', '568',
|
||||
// '903', '904', '905', '906', '907', '908', '909', '910', '911', '912', '913', '914', '915', '916', '917',
|
||||
// '918', '919'
|
||||
// ];
|
||||
|
||||
const { execSync } = require("child_process");
|
||||
const fs = require("fs");
|
||||
const FormData = require("form-data");
|
||||
const path = require("path");
|
||||
const axios = require("axios");
|
||||
|
||||
const takeSnap = async (req, res) => {
|
||||
try {
|
||||
const { url, itemId } = req.body;
|
||||
if (!url || !itemId) {
|
||||
return res.status(400).json({ error: "URL and itemId are required" });
|
||||
const gameIds = ["26", "27"];
|
||||
|
||||
const SCREENSHOT_FOLDER = path.join(__dirname, "game-screen/drawing");
|
||||
if (!fs.existsSync(SCREENSHOT_FOLDER)) {
|
||||
fs.mkdirSync(SCREENSHOT_FOLDER, { recursive: true });
|
||||
}
|
||||
|
||||
const DIRECTUS_API_URL = "https://game-du.teachertrainingkolkata.in/files";
|
||||
|
||||
async function takeSnap(req, res) {
|
||||
for (const id of gameIds) {
|
||||
try {
|
||||
const url = `https://interaktogames.beanstalkedu.com/drawing?id=${id}`;
|
||||
console.log(`📸 Taking screenshot for Game ID: ${id}`);
|
||||
const command = `url2jpg ${url}`;
|
||||
execSync(command, { stdio: "inherit", shell: true });
|
||||
const files = fs.readdirSync(process.cwd()).filter(f => f.endsWith(".jpg"));
|
||||
if (files.length === 0) throw new Error("No screenshot found!");
|
||||
|
||||
const latestFile = files.reduce((a, b) =>
|
||||
fs.statSync(b).mtimeMs > fs.statSync(a).mtimeMs ? b : a
|
||||
);
|
||||
const newPath = path.join(SCREENSHOT_FOLDER, `${id}.jpg`);
|
||||
fs.renameSync(latestFile, newPath);
|
||||
console.log(`✅ Screenshot saved: ${newPath}`);
|
||||
const fileId = await uploadToDirectus(newPath);
|
||||
if (fileId) {
|
||||
console.log(`📤 Uploaded to Directus. File ID: ${fileId}`);
|
||||
await updateThumbnail(id, fileId);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ Error processing Game ID ${id}:`, error.message);
|
||||
}
|
||||
|
||||
// 1️⃣ Take Screenshot
|
||||
const browser = await puppeteer.launch({ headless: "new" });
|
||||
const page = await browser.newPage();
|
||||
await page.goto(url, { waitUntil: "networkidle2" });
|
||||
|
||||
const screenshotPath = path.join(__dirname, "screenshot.png");
|
||||
await page.screenshot({ path: screenshotPath, fullPage: true });
|
||||
await browser.close();
|
||||
|
||||
// 2️⃣ Upload Screenshot to Directus (No Authorization Required)
|
||||
const formData = new FormData();
|
||||
formData.append("file", fs.createReadStream(screenshotPath));
|
||||
|
||||
const uploadResponse = await axios.post(
|
||||
"https://game-du.teachertrainingkolkata.in/files",
|
||||
formData,
|
||||
{ headers: { ...formData.getHeaders() } } // No Authorization needed
|
||||
);
|
||||
|
||||
const fileId = uploadResponse.data.data.id;
|
||||
console.log("File uploaded to Directus with ID:", fileId);
|
||||
|
||||
// 3️⃣ Update Directus Collection (No Authorization Required)
|
||||
await axios.patch(
|
||||
`https://game-du.teachertrainingkolkata.in/items/game_drawing_v3/${itemId}`,
|
||||
{ thumbnail: fileId }
|
||||
);
|
||||
|
||||
// Delete local file after upload
|
||||
fs.unlinkSync(screenshotPath);
|
||||
|
||||
res.json({ success: true, fileId, message: "Screenshot taken and uploaded successfully!" });
|
||||
} catch (error) {
|
||||
console.error("Error taking screenshot:", error);
|
||||
res.status(500).json({ error: "Failed to take screenshot" });
|
||||
}
|
||||
};
|
||||
|
||||
res.json({ message: "All screenshots processed successfully!" });
|
||||
}
|
||||
|
||||
async function uploadToDirectus(filePath) {
|
||||
try {
|
||||
const fileData = fs.createReadStream(filePath);
|
||||
|
||||
const response = await axios.post(
|
||||
DIRECTUS_API_URL,
|
||||
{ file: fileData },
|
||||
{
|
||||
headers: { "Content-Type": "multipart/form-data" },
|
||||
}
|
||||
);
|
||||
return response.data.data.id;
|
||||
} catch (error) {
|
||||
console.error("❌ Failed to upload screenshot to Directus:", error.message);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
async function updateThumbnail(gameId, fileId) {
|
||||
const UPDATE_THUMBNAIL_URL = "https://game-du.teachertrainingkolkata.in/items/game_drawing/";
|
||||
try {
|
||||
const response = await axios.patch(
|
||||
`${UPDATE_THUMBNAIL_URL}${gameId}`,
|
||||
{ thumbnail: fileId }, // ✅ No need for "data" wrapper in REST API
|
||||
{ headers: { "Content-Type": "application/json" } }
|
||||
);
|
||||
console.log(`✅ Thumbnail updated for Game ID ${gameId}:`, response.data);
|
||||
} catch (error) {
|
||||
console.error(`❌ Failed to update thumbnail for Game ID ${gameId}`);
|
||||
if (error.response) {
|
||||
console.error("Response Data:", error.response.data);
|
||||
console.error("Status Code:", error.response.status);
|
||||
} else {
|
||||
console.error("Error Message:", error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
module.exports = takeSnap;
|
||||
|
|
|
@ -215,7 +215,7 @@ router.get("/ping", (req, res) => {
|
|||
getGameData(req, res);
|
||||
});
|
||||
|
||||
router.post("/takeSnap", (req, res) => {
|
||||
router.get("/takeSnap", (req, res) => {
|
||||
takeSnap(req, res);
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue