Files
Image-Tracker/main.js
2026-06-03 18:47:38 +02:00

54 lines
2.1 KiB
JavaScript

import "dotenv/config";
import express from "express";
import { publish, MessagePriority } from "ntfy";
import config from "./config.json" with { type: "json" };
import fs from "fs/promises";
import { UAParser } from "ua-parser-js";
const app = express();
const PORT = Number(process.env.PORT);
app.set("trust proxy", true);
for (const image of config.images) {
app.get(`/${encodeURI(image.name)}`, async (req, res) => {
try {
const buffer = Buffer.from(image.data, "base64");
const extension = image.name.split(".").at(-1).toLowerCase();
if (extension === "jpg") extension = "jpeg";
res.setHeader("Content-Type", `image/${extension}`);
res.send(buffer);
const userAgent = UAParser(req.headers["user-agent"]);
const title = `New connection for image "${image.name}"`;
const message = `At ${new Date(Date.now()).toLocaleString()}\n
IP: ${req.ip} | PORT: ${req.socket.remotePort}\n
Browser: ${userAgent.browser.name} version ${userAgent.browser.version}\n
OS: ${userAgent.os.name} version ${userAgent.os.version}\n
CPU architecture: ${userAgent.cpu.architecture}\n
Languages: ${req.headers["accept-language"]}\n
Source: ${req.get("Sec-Fetch-Dest")}
`;
await publish({
authorization: {
username: process.env.NTFY_USER,
password: process.env.NTFY_PASSWORD,
},
title: title,
message: message,
topic: process.env.NTFY_TOPIC,
server: process.env.NTFY_SERVER,
priority: MessagePriority.DEFAULT,
});
} catch (error) {
console.error(error);
res.status(500).send("Server Error");
}
});
}
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});