ephoto360.mjs

Create text images with many effect options.

#tools#utility#fun
63
4 Jan 2026, 04:15
RawEdit
javascript0 lines
/***
  @ Base: https://en.ephoto360.com/
  @ Author: Shannz
  @ Note: Create text images with many effect options.
***/

import axios from 'axios';
import qs from 'qs';
import * as cheerio from 'cheerio';

const CONFIG = {
    BASE_URL: 'https://en.ephoto360.com',
    API_CREATE: 'https://en.ephoto360.com/effect/create-image',
    HEADERS: {
        NAVIGATE: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8',
            'Upgrade-Insecure-Requests': '1',
            'Sec-Fetch-Mode': 'navigate',
            'Sec-Fetch-Site': 'same-origin'
        },
        AJAX: {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'X-Requested-With': 'XMLHttpRequest',
            'Sec-Fetch-Mode': 'cors',
            'Sec-Fetch-Site': 'same-origin'
        }
    }
};

export const ephoto360 = {
    updateCookies: (oldCookie, newCookiesHeader) => {
        if (!newCookiesHeader) return oldCookie;
        const newCookieStr = newCookiesHeader.map(c => c.split(';')[0]).join('; ');
        return oldCookie ? `${oldCookie}; ${newCookieStr}` : newCookieStr;
    },

    getSession: async (url, textArray) => {
        try {
            const resInit = await axios.get(url, { headers: CONFIG.HEADERS.NAVIGATE });
            let cookies = ephoto360.updateCookies('', resInit.headers['set-cookie']);
            
            const $ = cheerio.load(resInit.data);
            const tokenShort = $('input[name="token"]').val();
            const buildServer = $('input[name="build_server"]').val();
            const buildServerId = $('input[name="build_server_id"]').val();

            if (!tokenShort) throw new Error('Token awal tidak ditemukan.');

            const formData = {
                'text': textArray,
                'submit': 'GO',
                'token': tokenShort,
                'build_server': buildServer,
                'build_server_id': buildServerId
            };

            const resMeta = await axios.post(url, qs.stringify(formData, { arrayFormat: 'brackets' }), {
                headers: {
                    ...CONFIG.HEADERS.NAVIGATE,
                    'Content-Type': 'application/x-www-form-urlencoded',
                    'Referer': url,
                    'Cookie': cookies
                }
            });

            cookies = ephoto360.updateCookies(cookies, resMeta.headers['set-cookie']);

            const $meta = cheerio.load(resMeta.data);
            const rawJson = $meta('#form_value_input').val();
            
            if (!rawJson) throw new Error('Token generate tidak ditemukan (IP mungkin limit/spam).');
            
            const sessionData = JSON.parse(rawJson);

            return {
                ...sessionData,
                cookies,
                referer: url
            };

        } catch (error) {
            throw new Error(`Session Error: ${error.message}`);
        }
    },

    create: async (effectUrl, texts) => {        
        try {
            const session = await ephoto360.getSession(effectUrl, texts);

            const payload = {
                ...session,
                autocomplete: '',
                text: texts
            };

            const response = await axios.post(CONFIG.API_CREATE, qs.stringify(payload, { arrayFormat: 'brackets' }), {
                headers: {
                    ...CONFIG.HEADERS.AJAX,
                    'Referer': session.referer,
                    'Origin': CONFIG.BASE_URL,
                    'Cookie': session.cookies
                }
            });

            const data = response.data;

            if (data.success) {
                const fullUrl = session.build_server + data.image;
                
                return {
                    status: true,
                    image_url: fullUrl,
                    server: session.build_server
                };
            } else {
                return {
                    status: false,
                    message: 'Server menolak request (Cek parameter teks).'
                };
            }

        } catch (error) {
            return {
                status: false,
                message: error.message
            };
        }
    }
};

//ephoto360.create('https://en.ephoto360.com/create-pornhub-style-logos-online-free-549.html', ['Shannz', 'Hub']).then(a => console.log(a))