Back to Home
Gistify Snippet
Public
Scraper removebg
Scraper removebg
#github-gist#javascript#gist:d11dd671e13c5e361b11a99ecf495a6f#gistsync:2026-09-02T12:40:39Z
0
Rawremovebg.jsjavascript
181 lines| 1 | |
| 2 | |
| 3 | import * as __ns_749 from 'axios' |
| 4 | const axios = __ns_749.default |
| 5 | import * as __ns_750 from 'form-data' |
| 6 | const FormData = __ns_750.default |
| 7 | import * as __ns_751 from 'node:url' |
| 8 | const pathToFileURL = __ns_751.pathToFileURL |
| 9 | |
| 10 | const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"; |
| 11 | |
| 12 | async function resolveImageBuffer(input) { |
| 13 | if (Buffer.isBuffer(input)) return input; |
| 14 | if (typeof input === "string") { |
| 15 | if (input.startsWith("http")) { |
| 16 | const res = await axios.get(input, { responseType: "arraybuffer", headers: { "User-Agent": UA } }); |
| 17 | return Buffer.from(res.data); |
| 18 | } |
| 19 | if (input.includes("base64,")) return Buffer.from(input.split(",")[1], "base64"); |
| 20 | return Buffer.from(input, "base64"); |
| 21 | } |
| 22 | throw new Error("Invalid image format"); |
| 23 | } |
| 24 | |
| 25 | async function bgclearRemoveBg(input) { |
| 26 | const buf = await resolveImageBuffer(input); |
| 27 | const form = new FormData(); |
| 28 | form.append("file", buf, { filename: "image.png", contentType: "image/png" }); |
| 29 | |
| 30 | const res = await axios.post("https://bgclear.ai/api/remove", form, { |
| 31 | headers: { |
| 32 | ...form.getHeaders(), |
| 33 | origin: "https://bgclear.ai", |
| 34 | referer: "https://bgclear.ai/", |
| 35 | "user-agent": UA, |
| 36 | }, |
| 37 | timeout: 45000, |
| 38 | }); |
| 39 | |
| 40 | if (!res.data || !res.data.success || !res.data.variants?.transparent) { |
| 41 | throw new Error(res.data?.message || "BGClear AI gagal memproses gambar."); |
| 42 | } |
| 43 | |
| 44 | const dlRes = await axios.get(res.data.variants.transparent, { |
| 45 | responseType: "arraybuffer", |
| 46 | headers: { |
| 47 | referer: "https://bgclear.ai/", |
| 48 | "user-agent": UA, |
| 49 | }, |
| 50 | timeout: 30000, |
| 51 | }); |
| 52 | |
| 53 | return { |
| 54 | success: true, |
| 55 | buffer: Buffer.from(dlRes.data), |
| 56 | contentType: "image/png", |
| 57 | model: res.data.models_used?.[0] || "InSPyReNet AI", |
| 58 | engine: "BGClear (InSPyReNet)", |
| 59 | }; |
| 60 | } |
| 61 | |
| 62 | async function yunusekRemoveBg(input, highRes = false) { |
| 63 | const buf = await resolveImageBuffer(input); |
| 64 | const form = new FormData(); |
| 65 | form.append("image", buf, { |
| 66 | filename: "image.png", |
| 67 | contentType: "image/png", |
| 68 | }); |
| 69 | form.append("high_res", highRes ? "true" : "false"); |
| 70 | |
| 71 | const res = await axios.post("https://api.yunusek.org/api/remove-background", form, { |
| 72 | headers: { |
| 73 | ...form.getHeaders(), |
| 74 | "User-Agent": "okhttp/4.9.2", |
| 75 | "Accept-Encoding": "gzip", |
| 76 | }, |
| 77 | responseType: "arraybuffer", |
| 78 | timeout: 45000, |
| 79 | }); |
| 80 | |
| 81 | return { |
| 82 | success: true, |
| 83 | buffer: Buffer.from(res.data), |
| 84 | contentType: res.headers["content-type"] || "image/png", |
| 85 | model: "YunusEk AI", |
| 86 | engine: "YunusEk Core", |
| 87 | }; |
| 88 | } |
| 89 | |
| 90 | async function removebg(options = {}) { |
| 91 | const { |
| 92 | image, |
| 93 | mode = "removebg", |
| 94 | scale = "2", |
| 95 | highRes = false, |
| 96 | } = options; |
| 97 | |
| 98 | if (!image) throw new Error('Parameter "image" is required'); |
| 99 | |
| 100 | const activeMode = (mode || "removebg").toLowerCase(); |
| 101 | const buf = await resolveImageBuffer(image); |
| 102 | |
| 103 | if (activeMode === "removebg") { |
| 104 | try { |
| 105 | const res1 = await bgclearRemoveBg(buf); |
| 106 | if (res1.buffer && res1.buffer.length > 0) return res1; |
| 107 | } catch (err1) { |
| 108 | console.warn("[RemoveBG] BGClear failed, fallback to YunusEk:", err1.message); |
| 109 | } |
| 110 | |
| 111 | try { |
| 112 | const res2 = await yunusekRemoveBg(buf, highRes); |
| 113 | if (res2.buffer && res2.buffer.length > 0) return res2; |
| 114 | } catch (err2) { |
| 115 | console.error("[RemoveBG] YunusEk fallback error:", err2.message); |
| 116 | throw new Error(`Semua engine RemoveBG gagal: ${err2.message}`); |
| 117 | } |
| 118 | } |
| 119 | |
| 120 | if (activeMode === "upscale") { |
| 121 | const form = new FormData(); |
| 122 | form.append("image", buf, { filename: "image.png", contentType: "image/png" }); |
| 123 | form.append("scale", String(scale)); |
| 124 | |
| 125 | const res = await axios.post("https://api.yunusek.org/api/upscale", form, { |
| 126 | headers: form.getHeaders(), |
| 127 | responseType: "arraybuffer", |
| 128 | }); |
| 129 | |
| 130 | return { |
| 131 | success: true, |
| 132 | buffer: Buffer.from(res.data), |
| 133 | contentType: res.headers["content-type"] || "image/png", |
| 134 | engine: "YunusEk Upscale", |
| 135 | }; |
| 136 | } |
| 137 | |
| 138 | throw new Error('Invalid mode (use "removebg" or "upscale")'); |
| 139 | } |
| 140 | |
| 141 | if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) { |
| 142 | const __exports = { resolveImageBuffer: resolveImageBuffer, bgclearRemoveBg: bgclearRemoveBg, yunusekRemoveBg: yunusekRemoveBg, removebg: removebg, default: removebg } |
| 143 | const __fns = Object.fromEntries(Object.entries(__exports).filter(([, v]) => typeof v === 'function')) |
| 144 | const __names = Object.keys(__fns) |
| 145 | if (__names.length === 0) { |
| 146 | console.log('Tidak ada fungsi yang bisa di-demo. Import modul ini dari kode lain.') |
| 147 | } else { |
| 148 | const __search = __names.find((n) => /search|cari/i.test(n)) |
| 149 | const __name = __search || __names[0] |
| 150 | const __fn = __fns[__name] |
| 151 | const __isClass = /^class\s/.test(Function.prototype.toString.call(__fn)) |
| 152 | const __defaultArgs = (() => { |
| 153 | const n = __name.toLowerCase() |
| 154 | if (/emoji/.test(n)) return [{ emoji: '๐๐' }] |
| 155 | if (/textpro|generate.*text|effect/.test(n)) return ['neon', 'Hello'] |
| 156 | if (/image|wallpaper|search|query|anime|movie|manga|news|lyrics|wiki|quote|stalk|detail/.test(n)) return ['naruto'] |
| 157 | if (/download|youtube|video|audio|music|spotify|tiktok|instagram|facebook|twitter|reels|terabox|media/.test(n)) return ['https://www.youtube.com/watch?v=dQw4w9WgXcQ'] |
| 158 | if (/dork/.test(n)) return ['example.com', 'documents'] |
| 159 | if (/tts|speech|prompt|chat|ask|translate/.test(n)) return ['Hello world'] |
| 160 | if (/parse|format|normalize|list|features/.test(n)) return [] |
| 161 | return ['test'] |
| 162 | })() |
| 163 | let __args = __defaultArgs |
| 164 | if (process.argv.length > 2) __args = process.argv.slice(2).map((a) => { try { return JSON.parse(a) } catch { return a } }) |
| 165 | if (__args.length === 0 && !__search && !__isClass && __fn.length > 0) { |
| 166 | console.log('Fungsi: ' + __names.join(', ')) |
| 167 | console.log('Contoh: node ' + "removebg.js" + ' ' + __name + ' <arg>') |
| 168 | } else { |
| 169 | ;(async () => { |
| 170 | try { |
| 171 | const r = __isClass ? new __fn(...__args) : await __fn(...__args) |
| 172 | console.log(JSON.stringify(r, null, 2)) |
| 173 | } catch (e) { |
| 174 | console.error('Error: ' + (e && e.message ? e.message : e)) |
| 175 | process.exitCode = 1 |
| 176 | } |
| 177 | })() |
| 178 | } |
| 179 | } |
| 180 | } |
| 181 | |
Discussion & Comments0
No comments yet โ be the first to leave feedback or start a code discussion.
Sign in with your GitHub account to write comments and join the discussion.