Logo OmniDevvKANA Web
Kembali ke katalog plugin

search

gambar

Cari gambar di Bing dan kirim hasil pertama

Search images on Bing and send the first result

plugins/search/gambar.js

Lokasi file di repo kana-md

3

Perintah termasuk alias

2.9 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.

.gambar.image.img

Cara pakai

.gambar <kata kunci>

Contoh

.gambar kucing lucu

Kode sumber plugin

Unduh .js

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 { searchImages } from '../../src/scrapers/search/gambar.js'
import { downloadBuffer } from '../../src/scrapers/runner.js'
import { sendImage, MAX_IMAGE_BYTES } from '../../src/ui/media.js'
import { sendButtons } from '../../src/ui/buttons.js'

export const config = {
  name: 'gambar',
  alias: ['image', 'img'],
  category: 'search',
  description: { id: 'Cari gambar di Bing dan kirim hasil pertama', en: 'Search images on Bing and send the first result' },
  usage: '.gambar <kata kunci>',
  example: '.gambar kucing lucu',
  cooldown: 8,
  limit: 5,
}

export const i18n = {
  id: {
    gambar: {
      needQuery: 'Ketik kata kuncinya dulu yaa, contoh: .gambar kucing lucu~',
      notFound: 'Mouu, nggak ada gambar buat kata kunci itu. Coba kata lain ya~',
      failed: 'Mouu, pencarian gambar gagal: {message}. Coba lagi nanti ya~',
      caption: 'Gambar buat "{query}"',
      moreHeader: 'Tautan gambar lain buat "{query}":',
      item: '{n}. {url}',
      btnAgain: 'Cari lagi',
      btnPinterest: 'Cari di Pinterest',
    },
  },
  en: {
    gambar: {
      needQuery: 'Type the keywords first, example: .gambar cute cat~',
      notFound: 'Mouu, no images for those keywords. Try others~',
      failed: 'Mouu, image search failed: {message}. Try again later~',
      caption: 'Image for "{query}"',
      moreHeader: 'More image links for "{query}":',
      item: '{n}. {url}',
      btnAgain: 'Search again',
      btnPinterest: 'Search on Pinterest',
    },
  },
}

export const test = { input: '.gambar kucing lucu', expect: /kucing lucu/i }

export async function handler(ctx) {
  const query = ctx.text.trim()
  if (!query) return ctx.reply(ctx.t('gambar.needQuery'))
  let search
  try {
    search = await searchImages(query, { limit: 5 })
  } catch (err) {
    return ctx.reply(ctx.t('gambar.failed', { message: err.message }))
  }
  if (!search.results.length) return ctx.reply(ctx.t('gambar.notFound'))
  let sent = false
  for (const url of search.results.slice(0, 3)) {
    try {
      const media = await downloadBuffer(url, { maxBytes: MAX_IMAGE_BYTES })
      if (!media.contentType.startsWith('image/')) continue
      await sendImage(ctx, media.buffer, { caption: ctx.t('gambar.caption', { query }) })
      sent = true
      break
    } catch {
      // coba gambar berikutnya
    }
  }
  const lines = []
  if (!sent) lines.push(ctx.t('gambar.caption', { query }))
  if (search.results.length > 1) {
    lines.push(ctx.t('gambar.moreHeader', { query }))
    search.results.forEach((url, i) => lines.push(ctx.t('gambar.item', { n: i + 1, url })))
  }
  const body = lines.join('\n')
  await sendButtons(ctx.sock, ctx.chat, {
    title: 'KANA',
    body,
    footer: ctx.t('menu.footer'),
    replies: [
      { text: ctx.t('gambar.btnAgain'), id: `.gambar ${query}` },
      { text: ctx.t('gambar.btnPinterest'), id: `.pinterest ${query}` },
    ],
    textFallback: body,
  })
}