¡Tenemos una increíble Oferta de suscripción con 90% de descuento solo para ti!
Ahora, puedes disfrutar de los siguientes precios imbatibles:
- Plan Profesional: Solo **29.9/mes** (precio original 299)
- Plan Enterprise: Solo **59.9/mes** (precio original 599)
Además, ¡seguirás disfrutando de estos descuentos con la renovación automática! No se necesitan pasos adicionales; tu descuento se aplicará automáticamente en la renovación.
Antes de comenzar el tutorial, primero entendamos qué son Nstbrowser y Nstbrowser docker.
Nstbrowser es un potente navegador de huellas digitales que proporciona un entorno de navegador real para la cuenta de cada usuario. Cada navegador está aislado de los demás y puede lograr la simulación de entornos multiplataforma. Basado en la tecnología de navegador de huellas digitales, puede eludir fácilmente el seguimiento de cuentas y la detección de varios sitios.
Nstbrowser docker es una imagen de docker construida basada en Nstbrowser. Debido a los recursos locales limitados, podemos implementar fácilmente Nstbrowser en servicios en la nube a través de docker. Basándonos en la función de sincronización en la nube, podemos usar directamente Nstbrowser en Nstbrowser docker para crear un entorno de navegador cultivado.
A continuación, demostraremos cómo usar Nstbrowser docker para hacer clic automáticamente en "me gusta" en TikTok (Nota: TikTok tiene un estricto control de prevención de riesgos de cuentas, por favor, intenta no usar cuentas recién creadas)
docker pull docker.io/nstbrowser/browserless:latest
docker run -d -it \
-e TOKEN="TU CLAVE API" \
-p 8848:8848 \
--name nstbrowserless \
nstbrowser/browserless:latest
Aquí usamos puppeteer-core
+ axios
para demostrar
# pnpm
pnpm i puppeteer-core axios
# yarn
yarn add puppeteer-core axios
# npm
npm i --save puppeteer-core axios
Antes de usar puppeteer para conectarse a Nstbrowser, debemos iniciar Nstbrowser primero, iniciar la interfaz: http://localhost:8848/start/{profileId}. Puedes consultar los detalles e parámetros específicos de la interfaz en el sitio web oficial:
const baseUrl = 'localhost:8848'
const profileId = 'TU_PROFILEID'
async function startBrowser() {
const config = {
"name": "tiktok_star",
"platform": "windows",
"kernel": "chrome",
"kernelMilestone": "130",
// "proxy": "http://127.0.0.1:8000", // Puedes usar un proxy personalizado
// "fingerprint": { // configurar parámetros de huella dactilar personalizados
// "flags": {
// "timezone": "BasedOnIp",
// "screen": "Custom"
// },
// },
// "args": {
// "--proxy-bypass-list": "*.nstbrowser.io" // configurar parámetros de inicio personalizados
// }
};
return axios.post(`http://${baseUrl}/start/${profileId}`, JSON.stringify((config)), { headers: { 'Content-Type': 'application/json' } })
.then((response) => {
if (response.data.code === 200) {
return true
}
})
.catch((error) => {
console.error(error);
});
}
Navegamos al sitio web de TikTok. Y obtenemos el elemento del cuadro de entrada y el botón Aceptar en la página web a través de la herramienta para desarrolladores (F12):
Introduce el contenido de usuario que quieres ver:
const page = await browser.newPage();
await page.goto('https://www.tiktok.com/');
await page.waitForSelector('input[type=search]')
await page.type('input[type=search]', 'WillSmith', { delay: '100' })
await page.waitForSelector('div.css-1fxbsrz-DivVideoListScrollBar.e10wilco12 > div > div:nth-child(1) a')
await page.click('div.css-1fxbsrz-DivVideoListScrollBar.e10wilco12 > div > div:nth-child(1) a')
A veces, al entrar en la página de reproducción, se utilizará el modo de ventana pequeña de forma predeterminada. Necesitamos restaurar la ventana:
try {
await page.waitForSelector('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0', { timeout: 3000 });
// cerrar PictureInPicture
await page.click('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0')
} catch (e) {
console.log("no se puede encontrar el botón de cierre")
}
Espera a que el vídeo se reproduzca durante un rato antes de darle a "me gusta"
// esperar a que el vídeo se reproduzca durante un rato
await new Promise(resolve => setTimeout(resolve, 10000));
// dar un "me gusta"
await page.click('button.css-1mizk9b-ButtonActionItem.e1hk3hf90')
Luego desliza el vídeo al siguiente y repite esta operación:
const boundingBox = await page.$('body video').then(el => el.boundingBox());
for (let i = 0; i < 3; i++) {
// esperar a que el vídeo se reproduzca durante un rato
await new Promise(resolve => setTimeout(resolve, 10000));
// dar un "me gusta"
await page.click('button.css-1mizk9b-ButtonActionItem.e1hk3hf90')
// mover el ratón al centro del vídeo
await page.mouse.move(
boundingBox.x + boundingBox.width / 2,
boundingBox.y + boundingBox.height / 2
);
// desplazar el vídeo hacia abajo
await page.mouse.wheel({ deltaY: 100 });
}
import puppeteer from 'puppeteer-core';
import axios from 'axios';
const baseUrl = 'localhost:8848'
const profileId = 'TU_PROFILEID'
async function startBrowser() {
const config = {
"name": "tiktok_star",
"platform": "windows",
"kernel": "chrome",
"kernelMilestone": "130",
// "proxy": "http://127.0.0.1:8000",
// "doProxyChecking": false,
// "fingerprint": {
// "flags": {
// "timezone": "BasedOnIp",
// "screen": "Custom"
// },
// },
// "args": {
// "--proxy-bypass-list": "*.nstbrowser.io"
// }
};
return axios.post(`http://${baseUrl}/start/${profileId}`, JSON.stringify((config)), { headers: { 'Content-Type': 'application/json' } })
.then((response) => {
if (response.data.code === 200) {
return true
}
})
.catch((error) => {
console.error(error);
});
}
async function execPuppeteer() {
try {
const browser = await puppeteer.connect({
browserWSEndpoint: `ws://${baseUrl}/connect/${profileId}`
});
const page = await browser.newPage();
await page.goto('https://www.tiktok.com/');
await page.waitForSelector('input[type=search]')
await page.type('input[type=search]', 'WillSmith', { delay: '100' })
await page.click('button[data-e2e=search-box-button]')
await page.waitForSelector('div.css-1fxbsrz-DivVideoListScrollBar.e10wilco12 > div > div:nth-child(1) a')
// div.css-1fxbsrz-DivVideoListScrollBar.e10wilco12
await page.click('div.css-1fxbsrz-DivVideoListScrollBar.e10wilco12 > div > div:nth-child(1) a')
try {
await page.waitForSelector('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0', { timeout: 3000 });
// cerrar PictureInPicture
await page.click('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0')
} catch (e) {
console.log("no se puede encontrar el botón de cierre")
}
await page.waitForSelector('button[data-e2e=arrow-right]')
await page.click('button[data-e2e=arrow-right]')
// obtener el cuadro delimitador del vídeo
const boundingBox = await page.$('body video').then(el => el.boundingBox());
for (let i = 0; i < 3; i++) {
// esperar a que el vídeo se reproduzca durante un rato
await new Promise(resolve => setTimeout(resolve, 10000));
// dar un "me gusta"
await page.click('button.css-1mizk9b-ButtonActionItem.e1hk3hf90')
// mover el ratón al centro del vídeo
await page.mouse.move(
boundingBox.x + boundingBox.width / 2,
boundingBox.y + boundingBox.height / 2
);
// desplazar el vídeo hacia abajo
await page.mouse.wheel({ deltaY: 100 });
}
await browser.close()
} catch (e) {
console.error(e)
}
}
(async () => {
const ok = await startBrowser()
if (ok) {
await execPuppeteer()
}
})();
La función de sincronización en la nube de Nstbrowser puede crear un perfil en cualquier dispositivo y sincronizar el perfil con otros dispositivos y entornos docker.
La sincronización en la nube puede conservar el contenido y el historial de la página que visitaste por última vez, simplificando en gran medida el coste de operación. Y el mismo entorno de perfil es el mismo en cualquier dispositivo, lo que puede evitar la detección de dispositivos en el sitio. Las cookies de sincronización en la nube pueden sincronizar los datos de cookies del usuario, y el estado de inicio de sesión basado en cookies también se puede sincronizar con el mismo entorno de perfil.