src/pinterest.js
/*
Pinterest search
Create by dann
Note jangan hapus cr
*/
(async () => {
async function getSession() {
try {
const { default: axios } = await import("axios")
const res = await axios.get("https://id.pinterest.com/", {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9"
}
})
const raw = res.headers['set-cookie'] || []
const cookies = raw.map(c => c.split(";")[0]).join("; ")
const csrf = raw.find(c => c.startsWith("csrftoken="))?.match(/csrftoken=([^;]+)/)?.[1] || ""
return { cookies, csrf }
} catch {
return { cookies: "", csrf: "" }
}
}
async function pinterestSearch(query, options = {}) {
const axios = (await import("axios")).default
const { limit = 5, scope = "pins", bookmark = null } = options
try {
const session = await getSession()
const data = {
options: {
query,
scope,
page_size: limit,
refine_search_with_filters: true,
...(bookmark ? { bookmarks: [bookmark] } : {})
},
context: {}
}
const sourceUrl = `/search/${scope}/?q=${encodeURIComponent(query)}`
const url = `https://id.pinterest.com/resource/BaseSearchResource/get/?source_url=${encodeURIComponent(sourceUrl)}&data=${encodeURIComponent(JSON.stringify(data))}&_=${Date.now()}`
const res = await axios.get(url, {
headers: {
"Accept": "application/json, text/javascript, */*; q=0.01",
"Accept-Language": "en-US,en;q=0.9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
"Referer": `https://id.pinterest.com${sourceUrl}`,
"X-Requested-With": "XMLHttpRequest",
"X-App-Version": "6d51d5a",
"X-Pinterest-AppState": "active",
"X-Pinterest-PWS-Handler": "www/search/[scope].js",
"X-Pinterest-Source-Url": sourceUrl,
...(session.csrf ? { "X-CSRFToken": session.csrf } : {}),
...(session.cookies ? { "Cookie": session.cookies } : {})
}
})
const payload = res.data?.resource_response?.data
if (!payload) {
return { status: false, creator: "dann", error: "No data found wak!" }
}
const arr = Array.isArray(payload) ? payload : payload.results || []
const mapPin = (pin) => ({
title: pin.title || pin.grid_title || "",
image: pin.images?.orig?.url || pin.images?.["736x"]?.url || null,
video: pin.videos?.video_list?.V_HLSV4?.url || pin.videos?.video_list?.V_EXP7?.url || pin.videos?.video_list?.V_720P?.url || null,
username: pin.pinner?.username || null,
fullName: pin.pinner?.full_name || null,
pinUrl: `https://id.pinterest.com/pin/${pin.id}/`
})
const results = arr.filter(x => x?.id).map(mapPin)
return {
status: true,
creator: "dann",
data: {
query,
count: results.length,
bookmark: payload.bookmark || (payload.results && payload.bookmarks ? payload.bookmarks[0] : null) || null,
results
}
}
} catch (e) {
return {
status: false,
creator: "dann",
error: e.message
}
}
}
const query = "ideas logo"
const output = await pinterestSearch(query)
if (output.status) {
return m.reply(JSON.stringify(output.data, null, 2))
} else {
return m.reply(JSON.stringify(output, null, 2))
}
})()
Direct URL
Disalin!