nhentai-tools
Version:
A toolset to interact with the doujin site nhentai.net
91 lines (90 loc) • 3.56 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.minDelay = exports.preventTooManyRequests = exports.client = exports.jar = void 0;
const axios_1 = require("axios");
class CookieJar {
constructor() {
this.jar = {};
}
get(name) {
return this.jar[name];
}
set(name, value) {
// console.log('set', name, value)
if (value) {
this.jar[name] = value;
}
else {
delete this.jar[name];
}
}
setFromHeader(header) {
const [name, value] = header.split('; ')[0].split('=');
this.set(name, value);
}
has(name) {
return this.jar[name] !== undefined;
}
clear() {
this.jar = {};
}
isEmpty() {
return Object.keys(this.jar).length === 0;
}
toString() {
return Object.entries(this.jar).map(([name, value]) => `${name}=${value}`).join('; ');
}
}
const delay = (ms) => new Promise(resolve => setTimeout(resolve, ms));
const customHeaders = {};
/** A custom CookieJar implementation. Only mess with this if you really know what you're doing. */
exports.jar = new CookieJar();
/** nhentai-tool's custom axios client. */
exports.client = axios_1.default.create({
baseURL: 'https://nhentai.net',
maxRedirects: 0
});
/* eslint-disable prefer-const */
/** Whether requests should be delayed or not. */
exports.preventTooManyRequests = true;
/* eslint-disable prefer-const */
/** The minimum ms delay between requests. */
exports.minDelay = 200;
let lastRequestTime = 0;
exports.client.interceptors.request.use((config) => __awaiter(void 0, void 0, void 0, function* () {
// console.log(config.method, config.url)
config.headers = Object.assign(Object.assign({}, config.headers), { Cookie: exports.jar.toString() });
Object.assign(config.headers, customHeaders);
// prevent 429 Too Many Requests by waiting a bit (200ms seems to be the minimum)
if (exports.preventTooManyRequests) {
const now = Date.now();
const delayAmount = lastRequestTime + exports.minDelay - now;
if (delayAmount > 0)
yield delay(delayAmount);
lastRequestTime = now;
}
return config;
}));
exports.client.interceptors.response.use(response => {
var _a;
if (typeof response.data === 'string') {
if (response.data.match(/new App\(\{\n\t\t\t\t\tcsrf_token: "/)) {
customHeaders['x-csrftoken'] = response.data.split('csrf_token: "')[1].split('"')[0] || customHeaders['x-csrftoken'];
}
}
(_a = response.headers['set-cookie']) === null || _a === void 0 ? void 0 : _a.forEach((cookie) => {
if (!cookie)
return;
exports.jar.setFromHeader(cookie);
});
return response;
});