File size: 13,418 Bytes
70335fc 6f115e7 70335fc cc43160 1c2f245 1002d9f f836f2f ff5dd77 7864014 7da0f43 2a1da11 0073410 a655a6b ff5dd77 9d7429f 7864014 9d7429f ea9ab95 8e9d6ef 4acf951 ea9ab95 51cd2da aaeefe8 03eff68 42c76b9 dd7e9fe 03eff68 1736687 b749907 e9a4054 f38b6df 4ae50c2 43320de 7008159 4e503c3 ded0ba9 e67e90e ad71933 1122fa5 7864014 1122fa5 c7e6d6e ff5dd77 ba1757e f24947a d97f748 8699696 e28d3f7 51cd2da 091ea21 51cd2da 43cc2ca 1aa6951 ad61b3a 42c76b9 ad61b3a 7008159 4e503c3 ad61b3a f0d7603 97876c6 8951429 7f65621 b33c5c1 282c249 f0d7603 f7c9792 b9de230 c58623a f0d7603 5de39f5 fec9be0 f0d7603 f7c9792 5b043ed 8dff905 5759522 d9f2458 8f27075 ae19575 8f27075 5759522 6827f95 5759522 5cec55d 5c6f80b 43678d6 d9f2458 bc6d89a 2390d65 74a71a3 41b05d6 8699696 73b11fb be1f5f7 8699696 2a61428 cada965 5de39f5 322f238 5de39f5 440dc45 5de39f5 440dc45 5de39f5 d97ef75 5de39f5 d97ef75 5de39f5 8699696 258ce6a dc73788 258ce6a 3218ffb 258ce6a 3218ffb 258ce6a 27062e0 258ce6a dc73788 8699696 73b11fb 0114ae9 9d7429f ff5dd77 0cb9b79 d8c0cd7 0cb9b79 0f816c4 27062e0 0f816c4 0cb9b79 9d7429f 440dc45 d8c0cd7 0cb9b79 8f2456d 9d7429f 7d62f05 9d7429f 4067ca0 ba1757e ea9ab95 e67e90e dc7aadc 90e4651 dc7aadc 1c2f245 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 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 151 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 |
/*
Credits @xpushz on telegram
Copyright 2017-2025 (c) Randy W @xtdevs, @xtsea on telegram
from : https://github.com/TeamKillerX
Channel : @RendyProjects
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import express from 'express';
const app = express();
import * as swaggerUi from 'swagger-ui-express';
import * as cheerio from 'cheerio';
import * as lifestyle from './startup/lifestyle.js';
import * as uuid from 'uuid';
import { Database } from './database/database.js'
import { ApiKey } from './models.js';
import { Readable } from "stream";
import { randomBytes } from "crypto";
import { AkenoaiJs } from "akenoaijs";
import {
CheckMilWare,
authenticateApiKey,
apiLimiter
} from './middleware/midware.js';
import { setup, serve } from './swagger.js';
import { swaggerOptions } from './settingOptions.js';
import path from "path";
import sharp from "sharp";
import bodyParser from 'body-parser';
import swaggerJsDoc from 'swagger-jsdoc';
import helmet from "helmet";
// routes
import { TrendingNewRoutes } from './plugins/trendings.js';
import { GempaRoutes } from './plugins/gempa.js';
import { FluxRoutes } from './plugins/fluxai.js';
import { GptRoutes } from './plugins/gptold.js';
import { HentaiRoutes } from './plugins/hentai.js';
import { TebakRoutes } from './plugins/tebak.js';
import { CopilotRoutes } from './plugins/copilot.js';
import { CarbonRoutes } from './plugins/carbon.js';
import { UnblockIpRoutes } from './plugins/unblockip.js';
import { AntibanRoutes } from './plugins/antiban.js';
import { AllDlRoutes } from './plugins/alldownloader.js';
import { GeminiRoutes } from './routes/googleGemini.js';
const __dirname = path.resolve();
const CheckMilWares = new CheckMilWare();
const myUUID = uuid.v4();
function _0x8e5f(){const _0x47a684=['21328MwnItu','akeno_','2HGYaRq','7539MDsoUT','239924nJVgmv','67736vpCrKx','7007630HuiUXg','620826tHyNgs','978pHDPNY','153GWQrSV','1344810LrohVJ'];_0x8e5f=function(){return _0x47a684;};return _0x8e5f();}(function(_0x2cc85e,_0x5b8aeb){const _0x30a48=_0x2eb9,_0x508eac=_0x2cc85e();while(!![]){try{const _0x401ae4=parseInt(_0x30a48(0x1b1))/0x1*(parseInt(_0x30a48(0x1b3))/0x2)+-parseInt(_0x30a48(0x1b6))/0x3+parseInt(_0x30a48(0x1af))/0x4+-parseInt(_0x30a48(0x1b9))/0x5+-parseInt(_0x30a48(0x1b7))/0x6*(parseInt(_0x30a48(0x1b2))/0x7)+-parseInt(_0x30a48(0x1b4))/0x8*(parseInt(_0x30a48(0x1b8))/0x9)+parseInt(_0x30a48(0x1b5))/0xa;if(_0x401ae4===_0x5b8aeb)break;else _0x508eac['push'](_0x508eac['shift']());}catch(_0x43caee){_0x508eac['push'](_0x508eac['shift']());}}}(_0x8e5f,0x24c61));function _0x2eb9(_0x71c9ef,_0x40f517){const _0x8e5f80=_0x8e5f();return _0x2eb9=function(_0x2eb9aa,_0xe433fa){_0x2eb9aa=_0x2eb9aa-0x1af;let _0x4300be=_0x8e5f80[_0x2eb9aa];return _0x4300be;},_0x2eb9(_0x71c9ef,_0x40f517);}function generateAkenoKey(){const _0x5cad5d=_0x2eb9,_0x399302=randomBytes(0x18)['toString']('base64')['replace'](/[^a-zA-Z0-9]/g,'');return _0x5cad5d(0x1b0)+_0x399302;}
app.use(async (req, res, next) => {
await CheckMilWares.handle(req, res, next);
});
// app.use(helmet({ dnsPrefetchControl: false }));
app.use("/api/v1/", apiLimiter);
app.use(bodyParser.json());
app.use(express.static('public'));
app.use(
bodyParser.urlencoded({
extended: true,
})
);
app.disable("x-powered-by");
app.disable("link")
// routes
app.use(TrendingNewRoutes);
app.use(GeminiRoutes);
app.use(FluxRoutes);
app.use(GptRoutes);
app.use(HentaiRoutes);
app.use(TebakRoutes);
app.use(GempaRoutes);
app.use(CopilotRoutes);
app.use(UnblockIpRoutes);
app.use(CarbonRoutes);
app.use(AntibanRoutes);
app.use(AllDlRoutes);
const specs = swaggerJsDoc(swaggerOptions);
const AllJsonReques = {
"AkenoXAPI": {
"akenox_date": new Date(),
"developer": "@xpushz",
"language": "JS && Python",
"cybersecurity": true,
"source_link": "https://github.com/TeamKillerX/akenoai-lib",
"ai": {
"endpoint": "ai/google-gemini",
"params": "query",
"method": "GET",
"headers": "x-api-key",
"part2": {
"endpoint": "ai/copilot2-trip",
"params": "q",
"method": "GET",
"headers": "x-api-key",
},
"part3": {
"endpoint": "ai/gpt-old",
"params": "query",
"method": "GET",
"headers": "x-api-key",
},
},
"flux": {
"endpoint": "flux/flux-ai",
"body": "query",
"method": "POST",
"headers": "x-api-key",
},
},
}
app.get("/api/v1/json/all", async (req, res) => {
res.json(AllJsonReques);
});
app.get('/api/v1/nsfw', async (req, res) => {
try {
const { url } = req.query;
if (!url) {
return res.status(400).json({ message: 'Invalid URL.' });
}
const response = await axios.get(url, { responseType: 'arraybuffer' });
const imageBuffer = Buffer.from(response.data);
let imageTensor;
if (url.endsWith('.gif')) {
const jpgBuffer = await sharp(imageBuffer)
.resize({ width: 299, height: 299 })
.toFormat('jpeg')
.toBuffer();
imageTensor = tf.node.decodeImage(jpgBuffer, 3);
} else {
imageTensor = tf.node.decodeImage(imageBuffer, 3);
}
const predictions = await model.classify(imageTensor);
imageTensor.dispose();
const formattedPredictions = predictions.reduce((acc, { className, probability }) => {
acc[className] = probability;
return acc;
}, {});
res.json(formattedPredictions);
} catch (error) {
console.error('Error processing image:', error);
if (error.response) {
return res.status(error.response.status).json({ message: 'Error fetching image from URL.', details: error.message });
} else if (error.code === 'ERR_INVALID_URL') {
return res.status(400).json({ message: 'Invalid image URL.', details: error.message });
} else {
return res.status(500).json({ message: 'Internal server error.', details: error.message });
}
}
});
app.get('/broadcast-user', async (req, res) => {
const dbClient = new Database("AkenoXJs");
const collection = dbClient.collection("api_keys");
try {
const result = await collection.find({}).toArray();
let userIds = [];
let storage_dict = {};
for (const data of result) {
if (data.owner !== undefined) {
storage_dict[data.owner] = data.key;
userIds.push(data.owner);
}
}
res.json({ user_id: userIds, count: userIds.length });
// console.log(storage_dict);
} catch (error) {
console.error("Failed to get data from DB: " + error);
res.status(500).send("Error fetching data from database.");
}
});
app.post('/webhook', (req, res) => {
console.log('Received webhook:', req.body);
res.status(200).send('Webhook received');
});
app.delete("/api/v2/delete-key", async (req, res) => {
const apiKey = req.query.api_key;
if (!apiKey) {
return res.status(400).json({ error: "Missing 'api_key' parameter" });
}
try {
const DocsKey = await ApiKey.deleteOne({ key: apiKey });
if (DocsKey.deletedCount > 0) {
res.json({ message: "API key has been successfully deleted" });
} else {
res.status(404).json({ message: "API key not found" });
}
} catch (err) {
res.status(500).json({ error: `Key deletion failed: ${err.message}` });
}
});
app.delete("/api/v1/delete-key", async (req, res) => {
const dbClient = new Database("AkenoXJs");
const collection = dbClient.collection("api_keys");
const apiKey = req.query.api_key;
if (!apiKey) {
return res.status(400).json({ error: "Missing 'api_key' parameter" });
}
try {
const DocsKey = await collection.deleteOne({ key: apiKey });
if (DocsKey.deletedCount > 0) {
res.json({ message: "API key has been successfully deleted" });
} else {
res.status(404).json({ message: "API key not found" });
}
} catch (err) {
res.status(500).json({ error: `Key deletion failed: ${err.message}` });
}
});
app.get("/api/v1/test", authenticateApiKey, apiLimiter, async (req, res) => {
res.json({ message: "access key" });
})
app.get("/runtime", async (req, res) => {
res.send("Running lifetime");
})
app.post('/api/v2/generate-key', async (req, res) => {
try {
const newKey = generateAkenoKey();
const userIdNumber = Number(req.query.user_id);
const email = req.query.email;
if (isNaN(userIdNumber)) {
return res.status(400).json({ error: "Invalid or missing user_id" });
}
const existingUser = await ApiKey.findOne({ owner: userIdNumber });
if (existingUser) {
return res.status(200).json({
apiKey: existingUser.key,
createdAt: existingUser.createdAt,
expiresAt: existingUser.expiresAt,
owner: existingUser.owner,
type: existingUser.type
});
}
const expirationDate = new Date();
expirationDate.setDate(expirationDate.getDate() + 30);
const userDocument = new ApiKey({
key: newKey,
createdAt: new Date(),
expiresAt: expirationDate,
owner: userIdNumber,
type: "premium",
email: email || null
});
await userDocument.save();
res.json({ apiKey: newKey, createdAt: new Date(), expiresAt: expirationDate, owner: userIdNumber, type: "premium" });
} catch (err) {
res.status(500).json({ error: `Key generation failed: ${err.message}` });
}
});
app.post("/api/v1/revoked-key", async (req, res) => {
const dbClient = new Database("AkenoXJs");
const collection = dbClient.collection("api_keys");
try {
const userIdString = req.query.user_id;
const userIdNumber = Number(userIdString);
const username = req.query.username;
if (isNaN(userIdNumber)) {
return res.status(400).json({ error: "Invalid or missing user_id" });
}
const existingUser = await collection.findOne({ owner: userIdNumber });
if (!existingUser) {
return res.status(404).json({ error: "API key not found" });
}
const newKey = generateAkenoKey();
const result = await collection.updateOne(
{ owner: userIdNumber },
{ $set: { key: newKey, createdAt: new Date(), username: username } },
{ upsert: false }
);
if (result.modifiedCount > 0) {
res.json({
message: "API key successfully revoked and regenerated",
apiKey: newKey,
createdAt: new Date(),
owner: userIdNumber
});
} else {
res.status(500).json({ error: "Failed to update API key" });
}
} catch (err) {
res.status(500).json({ error: `Key generation failed: ${err.message}` });
}
});
app.post('/api/v1/generate-key', async (req, res) => {
const dbClient = new Database("AkenoXJs");
const collection = dbClient.collection('api_keys');
try {
const newKey = generateAkenoKey();
const userIdString = req.query.user_id;
const userIdNumber = Number(userIdString);
const email = req.query.email;
const username = req.query.username;
if (isNaN(userIdNumber)) {
return res.status(400).json({ error: "Invalid or missing user_id" });
}
const existingUser = await collection.findOne({ owner: userIdNumber });
if (existingUser) {
return res.status(200).json({
apiKey: existingUser.key,
createdAt: existingUser.createdAt,
owner: existingUser.owner
});
}
const userDocument = {
key: newKey,
createdAt: new Date(),
owner: userIdNumber,
type: "free",
username: username,
};
if (email) {
userDocument.email = email;
}
await collection.insertOne(userDocument);
res.json({ apiKey: newKey, createdAt: new Date(), owner: userIdNumber });
} catch (err) {
res.status(500).json({ error: `Key generation failed: ${err.message}` });
}
});
app.get("/policy", ( req, res ) => {
res.sendFile(path.join(__dirname + "/public/policy.html"));
});
app.get("/scraper/read", ( req, res ) => {
res.sendFile(path.join(__dirname + "/public/docs.html"));
});
app.use(
'/docs',
serve,
setup(specs, {
customCss: `
.swagger-ui .topbar { display: none; }
.swagger-ui .opblock .opblock-summary-path {
display: inline-block;
word-break: break-word;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 100%;
}
`,
customCssUrl: "https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.3.0/swagger-ui.min.css",
customSiteTitle: 'AkenoXJs'
})
);
app.get('/', (req, res) => {
res.redirect('https://t.me/RendyProjects');
});
lifestyle.startServer(app); |