LOADING
import axios from 'axios'
import FormData from 'form-data'
import fs from 'fs'
import path from 'path'
const API = 'https://api.unwatermark.ai/api/web/unblurimage/v1/image-unblur-v2'
const baseHeaders = {
'product-code': '067003',
'product-serial': 'q637zn',
'Referer': 'https://unblurimage.ai/',
'accept-language': 'id-ID,id;q=0.9,en-US;q=0.8,en;q=0.7',
'cache-control': 'no-cache',
'pragma': 'no-cache',
}
async function createJob(filePath) {
const form = new FormData()
form.append('original_image_file', fs.createReadStream(filePath), path.basename(filePath))
const { data } = await axios.post(`${API}/create-job`, form, {
headers: { ...baseHeaders, ...form.getHeaders() },
})
if (!data.result?.job_id) throw new Error(data.message?.en ?? 'create-job failed')
return data.result.job_id
}
async function pollJob(jobId, interval = 3000, maxAttempts = 30) {
for (let i = 0; i < maxAttempts; i++) {
const { data } = await axios.get(`${API}/get-job/${jobId}`, {
headers: { ...baseHeaders, 'content-type': 'application/json; charset=UTF-8' },
})
if (data.result.status === 1) return data.result
if (data.result.status === 2) throw new Error(data.message?.en ?? 'job failed')
await new Promise(r => setTimeout(r, interval))
}
throw new Error('polling timeout')
}
async function unblur(filePath) {
const jobId = await createJob(filePath)
const result = await pollJob(jobId)
return {
job_id: result.job_id,
input_url: result.input_url,
output_url: result.output_url,
credits_cost: result.credits_cost,
remaining_free_times: result.remaining_free_times,
}
}
export { unblur }
const [, , filePath] = process.argv
if (filePath) {
unblur(filePath)
.then(r => console.log(JSON.stringify(r, null, 2)))
.catch(e => {
console.error(JSON.stringify({ error: e.message }, null, 2))
process.exit(1)
})
}bashnpm install axios form-data
bashnode unblur.js input.jpg
bashimport { unblur } from './unblur.js' const result = await unblur('foto.jpg')