Sylvatica.

Back to Library

Blur Face

js 1/27/2026
16
const axios = require("axios")
const Jimp = require("jimp")
const fileType = require("file-type")
const FormData = require("form-data")

class BlurFaceAPI {
  constructor() {
    this.api = null
    this.server = null
    this.taskId = null
    this.token = null
    this.width = null
    this.height = null
  }

  async init() {
    const { data: html } = await axios.get("https://www.iloveimg.com/blur-face", { timeout: 15000 })

    const token = html.match(/(ey[a-zA-Z0-9?%-_/]+)/g)?.[1]
    if (!token) throw new Error("Token not found")
    this.token = token

    const cfg = html.match(/var ilovepdfConfig = ({.*?});/s)
    if (!cfg) throw new Error("Config not found")

    const servers = JSON.parse(cfg[1]).servers
    this.server = servers[Math.floor(Math.random() * servers.length)]
    this.taskId = html.match(/taskId\s*=\s*'(\w+)/)?.[1]
    if (!this.taskId) throw new Error("Task ID not found")

    this.api = axios.create({
      baseURL: `https://${this.server}.iloveimg.com`,
      timeout: 30000,
      headers: { Authorization: `Bearer ${this.token}` }
    })
  }

  async upload(buffer, filename) {
    const type = await fileType.fromBuffer(buffer)
    
    if (!type || !type.mime.startsWith("image/")) throw new Error("Invalid image type")

    const img = await Jimp.read(buffer)
    this.width = img.bitmap.width
    this.height = img.bitmap.height

    const form = new FormData()
    form.append("name", filename)
    form.append("chunk", "0")
    form.append("chunks", "1")
    form.append("task", this.taskId)
    form.append("preview", "1")
    form.append("v", "web.0")
    form.append("file", buffer, { filename, contentType: type.mime })

    const { data } = await this.api.post("/v1/upload", form, {
      headers: { ...form.getHeaders(), "Content-Length": form.getLengthSync() }
    })

    if (!data?.server_filename) throw new Error("Upload failed")
    return data.server_filename
  }

  async process(serverFilename, originalName) {
    const form = new FormData()
    form.append("task", this.taskId)
    form.append("tool", "blurfaceimage")
    form.append("mode", "include")
    form.append("level", "recommended")
    form.append("width", this.width)
    form.append("height", this.height)
    form.append("files[0][server_filename]", serverFilename)
    form.append("files[0][filename]", originalName)

    await this.api.post("/v1/process", form, {
      headers: { ...form.getHeaders(), "Content-Length": form.getLengthSync() }
    })

    const res = await this.api.get(`/v1/download/${this.taskId}`, { responseType: "arraybuffer" })
    return res.data
  }
}

async function blurFace(buffer, filename = "image.jpg") {
  const api = new BlurFaceAPI()
  await api.init()
  const serverFile = await api.upload(buffer, filename)
  return await api.process(serverFile, filename)
}

module.exports = { blurFace }