У нас невероятная скидка 90% на подписку специально для вас!
Теперь вы можете наслаждаться следующими непревзойденными ценами:
- Профессиональный план: всего **29.9/месяц** (первоначальная цена 299)
- Корпоративный план: всего **59.9/месяц** (первоначальная цена 599)
Более того, вы будете продолжать пользоваться этими скидками с автоматическим продлением! Никаких дополнительных действий не требуется — ваша скидка будет автоматически применена при продлении.
Прежде чем начать учебник, давайте сначала разберемся, что такое Nstbrowser и Nstbrowser docker.
Nstbrowser — это мощный браузер с отпечатками пальцев, который предоставляет реальную среду браузера для каждой учетной записи пользователя. Каждый браузер изолирован друг от друга и может достигать кроссплатформенной симуляции среды. Основанный на технологии браузера с отпечатками пальцев, он может легко обходить отслеживание учетных записей и обнаружение различных сайтов.
Nstbrowser docker — это образ docker, созданный на основе Nstbrowser. Из-за ограниченных локальных ресурсов мы можем легко развернуть Nstbrowser в облачных сервисах через docker. Основываясь на функции облачной синхронизации, мы можем напрямую использовать Nstbrowser в Nstbrowser docker для создания культивированной среды браузера.
Далее мы покажем, как использовать Nstbrowser docker для автоматического клика лайков на TikTok (Примечание: TikTok имеет строгий контроль предотвращения рисков учетной записи, пожалуйста, старайтесь не использовать недавно созданные учетные записи)
docker pull docker.io/nstbrowser/browserless:latest
docker run -d -it \
-e TOKEN="ВАШ API КЛЮЧ" \
-p 8848:8848 \
--name nstbrowserless \
nstbrowser/browserless:latest
Здесь мы используем puppeteer-core
+ axios
для демонстрации
# pnpm
pnpm i puppeteer-core axios
# yarn
yarn add puppeteer-core axios
# npm
npm i --save puppeteer-core axios
Перед использованием puppeteer для подключения к Nstbrowser необходимо сначала запустить Nstbrowser, запустите интерфейс: http://localhost:8848/start/{profileId}. Вы можете проверить подробные сведения об интерфейсе и параметры на официальном сайте:
const baseUrl = 'localhost:8848'
const profileId = 'ВАШ_PROFILEID'
async function startBrowser() {
const config = {
"name": "tiktok_star",
"platform": "windows",
"kernel": "chrome",
"kernelMilestone": "130",
// "proxy": "http://127.0.0.1:8000", // Вы можете использовать пользовательский прокси
// "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);
});
}
Мы переходим на сайт TikTok. И получаем элемент поля ввода и кнопку ОК на веб-странице через инструмент разработчика (F12):
Введите нужное вам пользовательское содержимое:
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')
Иногда при переходе на страницу воспроизведения по умолчанию будет использоваться режим маленького окна. Нам нужно восстановить окно:
try {
await page.waitForSelector('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0', { timeout: 3000 });
// закрыть PictureInPicture
await page.click('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0')
} catch (e) {
console.log("cant find close button")
}
Подождите, пока видео воспроизведется некоторое время, прежде чем поставить лайк
// подождите, пока видео воспроизведется некоторое время
await new Promise(resolve => setTimeout(resolve, 10000));
// поставить лайк
await page.click('button.css-1mizk9b-ButtonActionItem.e1hk3hf90')
Затем переместите видео на следующее и повторите эту операцию:
const boundingBox = await page.$('body video').then(el => el.boundingBox());
for (let i = 0; i < 3; i++) {
// подождите, пока видео воспроизведется некоторое время
await new Promise(resolve => setTimeout(resolve, 10000));
// поставить лайк
await page.click('button.css-1mizk9b-ButtonActionItem.e1hk3hf90')
// переместите мышь в центр видео
await page.mouse.move(
boundingBox.x + boundingBox.width / 2,
boundingBox.y + boundingBox.height / 2
);
// прокрутите видео вниз
await page.mouse.wheel({ deltaY: 100 });
}
import puppeteer from 'puppeteer-core';
import axios from 'axios';
const baseUrl = 'localhost:8848'
const profileId = 'ВАШ_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 });
// закрыть PictureInPicture
await page.click('button.e12q9uh55.css-1xiq6b1-Button-ButtonReturn.e1v8cfre0')
} catch (e) {
console.log("cant find close button")
}
await page.waitForSelector('button[data-e2e=arrow-right]')
await page.click('button[data-e2e=arrow-right]')
// получить ограничивающий прямоугольник видео
const boundingBox = await page.$('body video').then(el => el.boundingBox());
for (let i = 0; i < 3; i++) {
// подождите, пока видео воспроизведется некоторое время
await new Promise(resolve => setTimeout(resolve, 10000));
// поставить лайк
await page.click('button.css-1mizk9b-ButtonActionItem.e1hk3hf90')
// переместите мышь в центр видео
await page.mouse.move(
boundingBox.x + boundingBox.width / 2,
boundingBox.y + boundingBox.height / 2
);
// прокрутите видео вниз
await page.mouse.wheel({ deltaY: 100 });
}
await browser.close()
} catch (e) {
console.error(e)
}
}
(async () => {
const ok = await startBrowser()
if (ok) {
await execPuppeteer()
}
})();
Функция облачной синхронизации Nstbrowser позволяет создавать профиль на любом устройстве и синхронизировать профиль с другими устройствами и средами docker.
Облачная синхронизация может сохранять содержимое и историю последней посещенной вами страницы, значительно упрощая затраты на работу. И та же среда профиля одинакова на любом устройстве, что может предотвратить обнаружение устройства на сайте. Куки облачной синхронизации могут синхронизировать данные куки пользователя вместе, и состояние входа в систему на основе куки также может быть синхронизировано с той же средой профиля.