Kembali ke katalog plugin
search
shortlink
Pendekkan link panjang lewat TinyURL
Shorten a long link via TinyURL
plugins/search/shortlink.js
Lokasi file di repo kana-md
3
Perintah termasuk alias
2.5 KB
Ukuran file sumber
4/11/2026
Update terakhir, commit 5e7e0e7
Daftar perintah
Ketuk tombol salin untuk menyalin perintah, lalu tempel di chat WhatsApp bot KANA.
.shortlink.short.tinyurlCara pakai
.shortlink <link>
Contoh
.shortlink https://example.com/halaman-yang-panjang
Kode sumber plugin
Cara pasang: simpan file ini ke folder plugins/search/ di bot KANA kamu, lalu restart bot. Pemilik source code lain bisa mengambil update plugin terbaru dari halaman ini kapan saja.
import { assertSafeUrl, retry, withBreaker } from '../../src/scrapers/runner.js'
import { sendButtons } from '../../src/ui/buttons.js'
export const config = {
name: 'shortlink',
alias: ['short', 'tinyurl'],
category: 'search',
description: { id: 'Pendekkan link panjang lewat TinyURL', en: 'Shorten a long link via TinyURL' },
usage: '.shortlink <link>',
example: '.shortlink https://example.com/halaman-yang-panjang',
cooldown: 5,
limit: 5,
}
export const i18n = {
id: {
shortlink: {
needUrl: 'Kirim linknya dulu yaa, contoh: .shortlink https://example.com~',
invalidUrl: 'Mouu, link itu nggak valid atau nggak aman buat dipendekkan. Pastikan formatnya lengkap, contoh: https://example.com/halaman~',
failed: 'Mouu, gagal memendekkan link: {message}. Coba lagi nanti ya~',
result: 'Link pendeknya siap: {short}\nAsli: {original}',
btnQr: 'Buat QR',
},
},
en: {
shortlink: {
needUrl: 'Send the link first, example: .shortlink https://example.com~',
invalidUrl: 'Mouu, that link is not valid or not safe to shorten. Make sure the format is complete, example: https://example.com/page~',
failed: 'Mouu, failed to shorten the link: {message}. Try again later~',
result: 'Your short link is ready: {short}\nOriginal: {original}',
btnQr: 'Make QR',
},
},
}
export const test = { input: '.shortlink https://omnidevv.vercel.app', expect: /Link pendeknya siap/i }
export async function handler(ctx) {
const raw = ctx.args[0]
if (!raw) return ctx.reply(ctx.t('shortlink.needUrl'))
let url
try {
url = assertSafeUrl(raw)
} catch {
return ctx.reply(ctx.t('shortlink.invalidUrl'))
}
let short
try {
short = await withBreaker('tinyurl', () =>
retry(async () => {
const res = await fetch(`https://tinyurl.com/api-create.php?url=${encodeURIComponent(url.href)}`, {
signal: AbortSignal.timeout(20000),
})
if (!res.ok) throw new Error(`TinyURL balas HTTP ${res.status}`)
const text = (await res.text()).trim()
if (!/^https?:\/\/\S+$/.test(text)) throw new Error('TinyURL membalas hasil yang tidak dikenal')
return text
})
)
} catch (err) {
return ctx.reply(ctx.t('shortlink.failed', { message: err.message }))
}
const body = ctx.t('shortlink.result', { short, original: url.href })
await sendButtons(ctx.sock, ctx.chat, {
title: 'KANA',
body,
footer: ctx.t('menu.footer'),
replies: [{ text: ctx.t('shortlink.btnQr'), id: `.qr ${short}` }],
textFallback: body,
})
}
