home chevron_right src chevron_right pinterest.js
code

pinterest.js

JavaScript 3.62 KB 112 baris visibility 7 views
open_in_new
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))
  }
})()
link

Direct URL

check Disalin!