Kembali ke Beranda
Gistify Snippet
kyiov
Jul 13·1 file(s)
Public

WhatsApp bot plugin: pixiv2

synced from github gist pixiv2.js

#downloader
pixiv2.jsjavascript
121 baris
1/**
2 * @module plugins/search/pixiv2
3 * @description Search Pixiv artworks via Kyio API v2 (pixiv-v2)
4 */
5
6import { createUrl } from '#system/apis.js'
7import { sendAlbumMessage, getVerifiedQuoted } from '#system/function.js'
8
9const PXIMG_HEADERS = {
10 'Referer': 'https://www.pixiv.net/',
11 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
12}
13
14// Ubah thumbnail 250x250 jadi master1200 (resolusi lebih tinggi)
15const upgradeImage = (thumb = '') =>
16 thumb.replace(/\/c\/\d+x\d+[^/]*\//, '/').replace('_square1200', '_master1200').replace('_custom1200', '_master1200')
17
18// pximg memblokir hotlink, jadi wajib download dengan Referer pixiv
19const downloadPximg = async (url) => {
20 try {
21 const res = await fetch(url, { headers: PXIMG_HEADERS })
22 if (!res.ok) return null
23 return Buffer.from(await res.arrayBuffer())
24 } catch {
25 return null
26 }
27}
28
29const pixivSearch = async (query, { mode = 'all' } = {}) => {
30 const apiUrl = createUrl('kyio', '/api/v2/search/pixiv-v2', {
31 q: query,
32 order: 'date_d',
33 mode,
34 sMode: 's_tag_full',
35 type: 'all'
36 }, 'apikey')
37
38 if (!apiUrl) throw new Error('Gagal membangun URL API.')
39
40 const res = await fetch(apiUrl, {
41 headers: { Accept: 'application/json', 'User-Agent': 'KyioAPI-Client/1.0' }
42 })
43 const json = await res.json()
44
45 if (!json || (!json.status && !json.success) || !Array.isArray(json.results) || json.results.length === 0) {
46 throw new Error(json?.message || 'Tidak ada hasil ditemukan.')
47 }
48 return json
49}
50
51const handler = async (m, { conn, text, usedPrefix, command, args }) => {
52 const raw = (text || args.join(' ')).trim()
53 const isR18 = /(--r18|\b-r18\b)/i.test(raw)
54 const query = raw.replace(/--r18|\b-r18\b/gi, '').trim()
55
56 if (!query) return m.reply(`PIXIV SEARCH V2
57
58Masukkan kata kunci.
59Contoh:
60- ${usedPrefix + command} kucing
61- ${usedPrefix + command} frieren
62- ${usedPrefix + command} waifu --r18`)
63
64 await m.react('⏳')
65
66 try {
67 const data = await pixivSearch(query, { mode: isR18 ? 'r18' : 'all' })
68
69 // Ambil sampai 5 gambar yang berhasil diunduh
70 const mediaItems = []
71 for (const item of data.results) {
72 if (mediaItems.length >= 5) break
73 const src = upgradeImage(item.thumbnail)
74 let buffer = await downloadPximg(src)
75 if (!buffer && src !== item.thumbnail) buffer = await downloadPximg(item.thumbnail)
76 if (!buffer) continue
77
78 const badges = []
79 if (item.isR18) badges.push('R18')
80 if (item.isAI) badges.push('AI')
81 const badgeTxt = badges.length ? `\nBadge: ${badges.join(', ')}` : ''
82 const tags = Array.isArray(item.tags) ? item.tags.slice(0, 5).join(', ') : ''
83
84 mediaItems.push({
85 type: 'image',
86 media: buffer,
87 caption: `${item.title || 'Tanpa Judul'}\nAuthor: ${item.author?.name || 'Unknown'}\nPID: ${item.id}` +
88 (tags ? `\nTags: ${tags}` : '') + badgeTxt,
89 buttons: [
90 {
91 name: 'cta_url',
92 buttonParamsJson: JSON.stringify({
93 display_text: 'Buka di Pixiv',
94 url: item.url,
95 merchant_url: item.url
96 })
97 }
98 ]
99 })
100 }
101
102 if (mediaItems.length === 0) throw new Error('Semua gambar gagal dimuat.')
103
104 const header = `PIXIV SEARCH V2\nQuery: ${query}\nMode: ${isR18 ? 'R18' : 'All'}\nTotal ditemukan: ${data.total ?? data.results.length} (tampil ${mediaItems.length})`
105 await sendAlbumMessage(conn, m.chat, mediaItems, { text: header }, { quoted: getVerifiedQuoted(m.pushName) })
106
107 await m.react('✅')
108 } catch (e) {
109 console.error('Pixiv2 Error:', e)
110 m.reply(`PIXIV2 ERROR\nReason: ${e.message || 'Unknown error'}`)
111 await m.react('❌')
112 }
113}
114
115handler.help = ['pixiv2 <query>']
116handler.tags = ['search', 'anime']
117handler.command = ['pixiv2', 'pixivv2']
118handler.limit = true
119
120export default handler
121
Diskusi & Komentar0

Belum ada komentar — jadilah yang pertama memberikan masukan atau diskusi kode.

Masuk dengan akun GitHub untuk menulis komentar dan berdiskusi.