tester-scraper
Version:
Sebuah Module Scraper yang dibuat oleh Sxyz dan SuzakuTeam untuk memudahkan penggunaan scraper di project ESM maupun CJS.
741 lines (688 loc) • 20 kB
JavaScript
import axios from "axios";
import WebSocket from "ws";
import * as cheerio from "cheerio";
import FormData from "form-data";
import fakeUserAgent from "fake-useragent";
const { fromBuffer } = await import("file-type");
import MathRandoms from "./lib/math.random.js";
import { randomUUID } from "crypto";
import https from "https";
import qs from "qs";
import { Success } from "./lib/function.js";
const ai = {
ss2code: async (urlImage, timeoutMs = 30000) => {
function generateUUIDv4() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
const r = (Math.random() * 16) | 0;
const v = c === "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
});
}
const buffer = await axios.get(urlImage, { responseType: "arraybuffer" });
const base64 = `data:image/png;base64,${Buffer.from(buffer.data).toString("base64")}`;
const uuid = generateUUIDv4();
return new Promise((resolve, reject) => {
const sock = new WebSocket(
"wss://screenshot-code.onrender.com/generate-code",
);
const timer = setTimeout(() => {
sock.terminate();
reject(new Error("Timeout: Server tidak merespons dalam 30 detik"));
}, timeoutMs);
sock.on("open", () => {
const payload = {
generationType: "create",
image: base64,
codeGenerationModel: "gpt-4o-2024-05-13",
editorTheme: "cobalt",
generatedCodeConfig: "html_tailwind",
inputMode: "image",
isImageGenerationEnabled: true,
isTermOfServiceAccepted: false,
openAiApiKey: null,
openAiBaseURL: null,
screenshotOneApiKey: null,
sessionId: uuid,
};
sock.send(JSON.stringify(payload));
});
sock.on("message", (raw) => {
try {
const data = JSON.parse(raw.toString());
if (data.type === "setCode") {
clearTimeout(timer);
sock.close();
resolve({ code: data.value });
}
} catch (err) {
clearTimeout(timer);
sock.close();
reject(new Error("Parsing error: " + err.message));
}
});
sock.on("error", (err) => {
clearTimeout(timer);
reject(err);
});
sock.on("close", () => {
console.log("WebSocket Closed!");
});
});
},
chatAIOrg: async (query) => {
if (!query) {
return {
code: 403,
timestamp: new Date().getTime(),
message: "Query Tidak Di Isi!",
};
}
let payload = {
messages: [
{
role: "user",
content: query,
},
],
};
let headers = {
headers: {
Origin: "https://chatai.org",
Referer: "https://chatai.org/",
},
};
let { data } = await axios.post(
"https://chatai.org/api/chat",
payload,
headers,
);
if (data.status === 500) {
return {
code: 500,
timestamp: new Date().getTime(),
message: data.data || null,
};
}
return {
code: 200,
timestamp: new Date().getTime(),
message: data.content,
};
},
chatAIOrgPrompt: async (query, prompt) => {
if (!query && !prompt) {
return {
code: 403,
timestamp: new Date().getTime(),
message: "Parameter Query Atau Prompt Tidak Terisi.",
};
}
let payload = {
messages: [
{
role: "user",
content: "Siapa Nama Kamu?",
},
{
role: "assistant",
content: prompt,
},
{
role: "user",
content: query,
},
],
};
let headers = {
headers: {
Origin: "https://chatai.org",
Referer: "https://chatai.org/",
},
};
let { data } = await axios.post(
"https://chatai.org/api/chat",
payload,
headers,
);
if (data.status === 500) {
return {
code: 500,
timestamp: new Date().getTime(),
message: data.data || null,
};
}
return {
code: 200,
timestamp: new Date().getTime(),
content: data.content,
};
},
gptOnline: async (prompt) => {
const { data: html } = await axios.get(
"https://gptonline.ai/id/chatgpt-online/",
);
const $ = cheerio.load(html);
const div = $(".wpaicg-chat-shortcode");
const nonce = div.attr("data-nonce");
const botId = div.attr("data-bot-id");
const postId = div.attr("data-post-id");
const form = new FormData();
form.append("_wpnonce", nonce);
form.append("post_id", postId);
form.append("url", "https://gptonline.ai/id/chatgpt-online/");
form.append("action", "wpaicg_chat_shortcode_message");
form.append("message", prompt);
form.append("bot_id", botId);
form.append("chat_bot_identity", "custom_bot_1040");
form.append("wpaicg_chat_history", "[]");
form.append("wpaicg_chat_client_id", "LCgGOMeIOC");
const headersList = {
headers: {
...form.getHeaders(),
},
};
const { data } = await axios.post(
"https://gptonline.ai/id/wp-admin/admin-ajax.php",
form,
headersList,
);
return data;
},
aiCodeAssistant: async (q) => {
async function generateUserId() {
const chars =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
let userId = "";
for (let i = 0; i < 10; i++) {
userId += chars[Math.floor(Math.random() * chars.length)];
}
return userId;
}
let userId = await generateUserId();
let { data } = await axios.get(
`https://yw85opafq6.execute-api.us-east-1.amazonaws.com/default/boss_mode_15aug?text=Generate a Codes in Indonesian for the following text: ${encodeURIComponent(q)}&country=Asia&user_id=${userId}`,
);
return data;
},
toBald: async (imgUrl) => {
const ress = await axios.get(imgUrl, {
responseType: "arraybuffer",
});
const base64 = Buffer.from(ress.data).toString("base64");
const payload = {
filter: "botak",
imageData: base64,
};
const { data } = await axios.post(
"https://wpw.my.id/api/process-image",
payload,
);
return {
success: true,
outputBase64: data.processedImageUrl,
};
},
toBlack: async (imgUrl) => {
const ress = await axios.get(imgUrl, {
responseType: "arraybuffer",
});
const base64 = Buffer.from(ress.data).toString("base64");
const payload = {
filter: "hitam",
imageData: base64,
};
const { data } = await axios.post(
"https://wpw.my.id/api/process-image",
payload,
);
return {
success: true,
outputBase64: data.processedImageUrl,
};
},
toPiggy: async (imgUrl) => {
const ress = await axios.get(imgUrl, {
responseType: "arraybuffer",
});
const base64 = Buffer.from(ress.data).toString("base64");
const payload = {
filter: "piggy",
imageData: base64,
};
const { data } = await axios.post(
"https://wpw.my.id/api/process-image",
payload,
);
return {
success: true,
outputBase64: data.processedImageUrl,
};
},
toNerd: async (imgUrl) => {
const ress = await axios.get(imgUrl, {
responseType: "arraybuffer",
});
const base64 = Buffer.from(ress.data).toString("base64");
const payload = {
filter: "nerd",
imageData: base64,
};
const { data } = await axios.post(
"https://wpw.my.id/api/process-image",
payload,
);
return {
success: true,
outputBase64: data.processedImageUrl,
};
},
gemini: async (chat) => {
const apikeyArray = [
"AIzaSyA0ECSvKEUpTySjwCXLPQATWTjJzmaDeoc",
"AIzaSyB8qHA81c8rsNGQ9PyeOSCXMgxJ99h63Rg",
"AIzaSyDptw3Q8R_s_cLUfYcb3hQCWXuboM08CSQ",
];
const randomMath = MathRandoms(apikeyArray);
const payload = {
contents: [
{
parts: [
{
text: chat,
},
],
},
],
};
const { data } = await axios.post(
`https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent?key=${randomMath}`,
payload,
);
return {
success: true,
response: data.candidates[0].content.parts[0].text,
};
},
phindChat: async (chat, options = {}) => {
const endpoint = "https://https.extension.phind.com/agent/";
const getHeaders = () => ({
"Content-Type": "application/json",
"User-Agent": "",
Accept: "*/*",
"Accept-Encoding": "Identity",
});
const createRequestBody = (input, options = {}) => ({
additional_extension_context: "",
allow_magic_buttons: true,
is_vscode_extension: true,
message_history: [
...(options.previousMessages || []),
{ content: input, role: "user" },
],
requested_model: options.model || "Phind-70B",
user_input: input,
});
try {
const response = await fetch(endpoint, {
method: "POST",
headers: getHeaders(),
body: JSON.stringify(createRequestBody(chat, options)),
});
if (!response.ok) {
throw new Error(`Request failed with status ${response.status}`);
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
let fullText = "";
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
const text = decoder.decode(value);
const lines = text.split("\n");
for (const line of lines) {
if (line.startsWith("data: ")) {
try {
const jsonStr = line.slice(6);
if (jsonStr === "[DONE]") continue;
const data = JSON.parse(jsonStr);
if (data.choices?.[0]?.delta?.content) {
fullText += data.choices[0].delta.content;
}
} catch (e) {
// Skip invalid JSON
}
}
}
}
return fullText;
} catch (error) {
console.error("Error:", error);
throw error;
}
},
ratePhoto: async (url) => {
const ress = await axios.get(url, {
responseType: "arraybuffer",
});
const binarys = Buffer.from(ress.data, "binary");
const d = new FormData();
d.append("imageFile", binarys, { filename: "y.png" });
d.append("canvasimg", "");
d.append(
"image_data",
`data:image/png;base64,${Buffer.from(ress.data).toString("base64")}`,
);
const headers = {
headers: {
...d.getHeaders(),
},
};
const { data: s } = await axios.post(
"https://rate-my-photo.com/result",
d,
headers,
);
const $ = cheerio.load(s);
const score = $(".skill-progress")
.first()
.text()
.trim()
.replace("SCORE: ", "");
const compare = $(".card-text").text().trim();
const aesthetic = $(".text-success").text().replace(/\s+/g, " ").trim();
return {
success: true,
result: {
score,
aesthetic,
},
};
},
img2prompt: async (u) => {
if (!u) throw new Error("Masukkan URL-nya");
const rdss = await axios.get(u, { responseType: "arraybuffer" });
const form = new FormData();
form.append("image_bytes", rdss.data, { filename: "image.png" });
const { data } = await axios({
method: "post",
url: "https://api.findit.moe/util/image_caption",
data: form,
headers: form.getHeaders(),
responseType: "stream",
});
return new Promise((resolve, reject) => {
function parsePromptText(text) {
const extract = (tag) => {
const regex = new RegExp(
`<${tag}>\\s*([\\s\\S]*?)\\s*</${tag}>`,
"i",
);
const match = text.match(regex);
return match ? match[1].trim() : "";
};
return {
description: extract("DESCRIPTION"),
details: extract("DETAILS"),
style: extract("STYLE"),
query: extract("QUERY"),
};
}
let fullText = "";
data.on("data", (chunk) => {
try {
const lines = chunk.toString().split("\n");
for (const line of lines) {
if (line.startsWith("data:")) {
const payload = JSON.parse(line.replace(/^data:\s*/, ""));
fullText += payload.content || "";
}
}
} catch (err) {
console.error("Parsing error:", err);
}
});
data.on("end", () => {
resolve(parsePromptText(fullText));
});
data.on("error", reject);
});
},
pollai: async (
question,
{
systemMessage = "yang membuatmu adalah suzakuTeam dan owner mu cifumo",
model = "gpt-4.1-mini",
imageBuffer = null,
} = {},
) => {
try {
const modelList = {
"gpt-4.1": "openai-large",
"gpt-4.1-mini": "openai",
"gpt-4.1-nano": "openai-fast",
};
if (!question) throw new Error("Question is required");
if (!modelList[model])
throw new Error(
`List available model: ${Object.keys(modelList).join(", ")}`,
);
const messages = [
...(systemMessage ? [{ role: "system", content: systemMessage }] : []),
{
role: "user",
content: [
{ type: "text", text: question },
...(imageBuffer
? [
{
type: "image_url",
image_url: {
url: `data:image/jpeg;base64,${imageBuffer.toString("base64")}`,
},
},
]
: []),
],
},
];
const { data } = await axios.post(
"https://text.pollinations.ai/openai",
{
messages,
model: modelList[model],
temperature: 0.5,
presence_penalty: 0,
top_p: 1,
frequency_penalty: 0,
},
{
headers: {
accept: "*/*",
authorization: "Bearer dummy",
"content-type": "application/json",
origin: "https://sur.pollinations.ai",
referer: "https://sur.pollinations.ai/",
"user-agent":
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36",
},
},
);
return data.choices[0].message.content;
} catch (error) {
console.error(error.message);
throw new Error("No result found");
}
},
claila: async (msg, sessionid, model) => {
const validModels = [
"chatgpt",
"grok",
"chatgpto1p",
"claude",
"chatgpt41mini",
"gemini",
"mistral",
];
if (!validModels.includes(model)) {
throw new Error(
`Model tidak valid. Pilihan yang tersedia: ${validModels.join(", ")}`,
);
}
let csrfToken;
try {
const tokenres = await axios.get(
"https://app.claila.com/api/v2/getcsrftoken",
);
if (tokenres.status === 403) {
throw new Error("dapet hadiah tuh bang 403");
}
csrfToken = tokenres.data;
if (!csrfToken)
throw new Error("Token kosong, mungkin format response berubah?");
} catch (err) {
if (err.message === "403" || err.response?.status === 403) {
return {
status: false,
msg: "ngambil tokennya gabisa rek, itu vps mu jelek kayaknya, ganti region makanya jangan sg terus wkwk",
};
}
return {
status: false,
msg: "servernya lagi down atau webnya nambah bypass lagi kayaknya om sabar yah wkwkw",
};
}
try {
const data = qs.stringify({
calltype: "completion",
message: msg,
sessionId: sessionid,
});
const response = await axios.post(
`https://app.claila.com/api/v2/unichat1/${model}`,
data,
{
headers: {
"User-Agent":
"Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36",
"Accept-Encoding": "gzip, deflate, br, zstd",
"Content-Type": "application/x-www-form-urlencoded",
"sec-ch-ua-platform": '"Android"',
"x-csrf-token": csrfToken,
"sec-ch-ua":
'"Google Chrome";v="137", "Chromium";v="137", "Not/A)Brand";v="24"',
"sec-ch-ua-mobile": "?1",
"x-requested-with": "XMLHttpRequest",
origin: "https://app.claila.com",
"sec-fetch-site": "same-origin",
"sec-fetch-mode": "cors",
"sec-fetch-dest": "empty",
referer: "https://app.claila.com/chat?uid=9683c3b4&lang=en",
"accept-language": "en-GB,en;q=0.9,id;q=0.8,en-US;q=0.7,ja;q=0.6",
priority: "u=1, i",
},
},
);
return {
status: true,
msg: response.data,
};
} catch (e) {
if (e.response?.status === 403 || e.message.includes("403")) {
return {
status: false,
msg: "vps mu jelek tuh dapet 403, ganti region aja lek",
};
} else {
return {
status: false,
msg: "scrapenya rusak kali om, tanyain sama yang punya aja",
};
}
}
},
ripleAI: async (text) => {
let payload = {
messages: [
{
content: text,
role: "user",
},
],
};
try {
let { data } = await axios.post("https://ai.riple.org/", payload, {
headers: {
"Content-Type": "application/json",
Accept: "application/json",
"User-Agent":
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
},
responseType: "stream",
});
return new Promise((resolve, reject) => {
let fullResponse = "";
data.on("data", (chunk) => {
let lines = chunk.toString().split("\n");
for (let line of lines) {
if (line.startsWith("data: ")) {
let jsonString = line.slice(6).trim();
if (jsonString === "[DONE]") {
return resolve({ result: fullResponse.trim() });
}
try {
let parsedData = JSON.parse(jsonString);
let content = parsedData?.choices?.[0]?.delta?.content;
if (content) {
fullResponse += content;
}
} catch (err) {
reject(err);
}
}
}
});
data.on("error", (err) => reject(err));
});
} catch (error) {
throw new Error(error.message);
}
},
text2image: async (prompt) => {
const payload = {
clip_skip: 2,
guidance: 7,
height: 768,
lora_ids: "",
lora_weight: "0.7",
model_id: "mistoonJade_v10Anime",
negative_prompt: "",
prompt,
sampler: "Euler a",
samples: 1,
seed: 0,
steps: 25,
width: 512
};
const createRes = await axios.post(
"https://api.arting.ai/api/cg/text-to-image/create",
payload
);
const requestId = createRes.data.data.request_id;
const checkPayload = { request_id: requestId };
while (true) {
const { data } = await axios.post(
"https://api.arting.ai/api/cg/text-to-image/get",
checkPayload
);
if (data?.data?.output?.length > 0) {
return new Success({
imageGenerated: data.data.output[0]
})
}
await new Promise((resolve) => setTimeout(resolve, 1000));
}
}
};
export default ai;