hk_bot/automatization.ts
2022-12-09 19:38:09 +03:00

384 lines
No EOL
18 KiB
TypeScript

import Hero from "@ulixee/hero";
import * as telegram from 'telegram';
import { sleep } from "telegram/Helpers";
import { AccountInterface } from "./interfaces/databaseInterface";
import { prevTaskInterface } from "./interfaces/otherInterfaces";
import logger from "./logger";
import { waitNewMessages } from "./utils";
import {settings} from './database'
import { isNull } from "lodash";
export const vertification=async function (client: telegram.TelegramClient,worker: AccountInterface,hero: Hero,url: string,botEntity: telegram.Api.Chat | telegram.Api.User,idOfLastMessage: number) {
await hero.goto(url,{timeoutMs:1300_000});
await hero.waitForLoad('AllContentLoaded',{timeoutMs:1180_000});
const captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
if (captchaButton!=null){
let verify=hero.document.querySelector('body > section > h2');
while (verify!=null && (await verify.textContent)!.includes('All right!')==false){
const isCaptchaPassed=hero.document.querySelector("input[id='recaptcha-token']");
if (isCaptchaPassed==null || await isCaptchaPassed.$isVisible==false){
await hero.interact({click:{element: captchaButton, verification: 'exactElement'}});
await sleep(5000);
verify=hero.document.querySelector('body > section > h2');
} else {
logger.error("catpcha detected");
throw new Error("Auhtung captcha detected");
}
}
} else {
throw new Error('Cant find captcha button');
}
}
export const doSitesTasks=async function (client: telegram.TelegramClient,worker: AccountInterface,hero: Hero,botEntity: telegram.Api.Chat | telegram.Api.User,tasksSelector: telegram.Api.Message) {
const taskSitesButton=tasksSelector.buttons![1][0];
let prevTask: prevTaskInterface={
task:tasksSelector,
lastMessage:tasksSelector
};
mainLoop:
while (true){
await sleep(2000);
await taskSitesButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,prevTask.lastMessage.id);
const task=(await client.getMessages(botEntity,{
minId:prevTask.lastMessage.id,
// search: (await settings.botMessages()).tasksSelector,
}))[0];
if (task.buttonCount==2){
logger.debug(`New ad task | ${worker.phoneNumber}`);
const urlButton=task.buttons![0][0];
const skipButton=task.buttons![0][1];
await hero.goto(urlButton.url!,{timeoutMs:1300_000});
await hero.waitForLoad('AllContentLoaded',{timeoutMs:1180_000});
let captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
if (isNull(captchaButton)){
if (prevTask.task.message==task.message){
logger.warn(`Same tasks detected on ${worker.phoneNumber}... Skipping due captcha isnt detected......`);
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
} else {
prevTask.task=task;
logger.warn(`Captcha isnt detected... | ${worker.phoneNumber}`);
}
continue mainLoop;
}
prevTask.task=task;
if (urlButton.url!.includes('hkbots')==true){
if (await captchaButton.$isClickable!=true){
// timer page
logger.warn(`Found timer... | ${worker.phoneNumber}`)
if (settings.bypassMode==true){
logger.warn(`Bypassing timer... | ${worker.phoneNumber}`)
try {
await hero.executeJs("document.getElementById('form').setAttribute('style', '')");
} catch (err){
logger.error(`Something went wrong due bypass`);
}
} else {
while (hero.document.querySelector("i[id='timer']")!=null && await captchaButton.$isClickable!=true){
await sleep(1000);
}
}
}
const now=new Date();
while (await hero.activeTab.url==urlButton.url!){
if ((+(new Date())-+now)/1000>2*60){
if ( (await captchaButton.$isClickable)==false){
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
continue mainLoop;
}
logger.warn(`Anomaly activity in browser. Please checkout`);
await hero.reload();
}
const isCaptchaPassed=hero.document.querySelector("input[id='recaptcha-token']");
if ((isCaptchaPassed==null || await isCaptchaPassed.$isVisible==false) ){
if (await captchaButton.$isClickable){
try {
await hero.interact({click:{element: captchaButton, verification: 'exactElement'}});
} catch( err){
logger.warn(`Some error due clicking | ${worker.phoneNumber}`);
continue mainLoop;
}
}
await sleep(1000);
captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
} else {
logger.error("catpcha detected");
throw new Error("Auhtung captcha detected");
}
}
await waitNewMessages(client,worker,botEntity,task.id);
const afterTask:telegram.Api.Message=(await client.getMessages(botEntity,{
minId:task.id,
reverse:true,
limit:100
})).filter((value)=>{return value.message.includes(settings.botMessages.taskComplete)})[0];
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
if (afterTask!=null){
if (afterTask.message.includes(settings.botMessages.taskComplete)==true){
logger.info(`Site task complete | ${worker.phoneNumber}`);
continue
}
}
}
} else if (task.message.includes(settings.botMessages.taskOver)==true){
logger.info(`Ad tasks completed | ${worker.phoneNumber}`);
break
} else {
logger.error(`Check out last message of ${worker.phoneNumber}`);
throw new Error(`Check out last message of ${worker.phoneNumber}`)
}
}
}
export const doChatsTasks=async function (client: telegram.TelegramClient,worker: AccountInterface,hero: Hero,botEntity: telegram.Api.Chat | telegram.Api.User,tasksSelector: telegram.Api.Message){
const taskChatsButton=tasksSelector.buttons![1][1];
let prevTask: prevTaskInterface={
task:tasksSelector,
lastMessage:tasksSelector
};
mainLoop:
while (true){
await sleep(2000);
await taskChatsButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,prevTask.lastMessage.id);
const task=(await client.getMessages(botEntity,{
minId:prevTask.lastMessage.id,
// search: (await settings.botMessages()).tasksSelector,
}))[0];
if (task.buttonCount==3){
logger.info(`New chat task | ${worker.phoneNumber}`);
const urlButton=task.buttons![0][0];
const confirmButton=task.buttons![0][1];
const skipButton=task.buttons![0][2];
let groupLink='';
if (urlButton.url?.includes('hkbot')==true){
await hero.goto(urlButton.url,{timeoutMs:1300_000});
await hero.waitForLoad('AllContentLoaded',{timeoutMs:1180_000});
let captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
if (isNull(captchaButton)){
if (prevTask.task.message==task.message){
logger.warn(`Same tasks detected on ${worker.phoneNumber}... Skipping due captcha isnt detected......`);
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
} else {
prevTask.task=task;
prevTask.lastMessage=task;
logger.warn(`Captcha isnt detected... | ${worker.phoneNumber}`);
}
continue mainLoop;
}
const now=new Date()
while (captchaButton!=null && await hero.activeTab.url==urlButton.url!){
if ((+(new Date())-+now)/1000>2*60){
if ( (await captchaButton.$isClickable)==false){
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
continue mainLoop;
}
logger.warn(`Anomaly activity in browser. Please checkout`);
await hero.reload();
}
const isCaptchaPassed=hero.document.querySelector("input[id='recaptcha-token']");
if ((isCaptchaPassed==null || await isCaptchaPassed.$isVisible==false) ){
if (await captchaButton.$isClickable){
try {
await hero.interact({click:{element: captchaButton, verification: 'exactElement'}});
} catch( err){
logger.warn(`Some error due clicking | ${worker.phoneNumber}`);
continue mainLoop;
}
}
await sleep(1000);
captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
} else {
logger.error("catpcha detected");
throw new Error("Auhtung captcha detected");
}
}
groupLink=await hero.url;
} else {
groupLink=urlButton.url!;
}
// https://gram.js.org/tl/messages/GetFullChat
// hash checking
let group:telegram.Api.Channel | undefined;
if (!/(^\w+:|^)\/\/(?:t|telegram)\.(?:me|dog)\/(joinchat\/|\+)([\w-]+)/i.test(groupLink)){
groupLink=groupLink.replace(/(^\w+:|^)\/\/(?:t|telegram)\.(?:me|dog)\//i,'');
try {
group=(((await client.invoke(
new telegram.Api.channels.JoinChannel({
channel:groupLink
})
)) as telegram.Api.Updates).chats[0] as telegram.Api.Channel)
} catch (err: unknown){
if (err instanceof telegram.errors.RPCError){
switch (err.errorMessage) {
case 'CHANNELS_TOO_MUCH':
logger.warn(`Too much groups | ${worker.phoneNumber}`);
return;
case 'USER_ALREADY_PARTICIPANT':
logger.warn(`Already in group | ${worker.phoneNumber}`)
group=(await client.invoke(
new telegram.Api.channels.GetChannels({
id:[groupLink]
})
))[0]
break;
default:
logger.warn(`Something wrong with chat ${err.errorMessage} | ${worker.phoneNumber}`)
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
continue mainLoop;
}
}
}
} else {
// hash
groupLink=groupLink.replace(/(^\w+:|^)\/\/(?:t|telegram)\.(?:me|dog)\/(joinchat\/|\+)/i,'');
try {
group=(((await client.invoke(
new telegram.Api.messages.ImportChatInvite({
hash:groupLink
})
)) as telegram.Api.Updates).chats[0] as telegram.Api.Channel)
} catch (err: unknown){
if (err instanceof telegram.errors.RPCError){
switch (err.errorMessage) {
case 'CHANNELS_TOO_MUCH':
logger.warn(`Too much groups | ${worker.phoneNumber}`);
return;
case 'USER_ALREADY_PARTICIPANT':
logger.warn(`Already in group | ${worker.phoneNumber}`)
group=((await client.invoke(
new telegram.Api.messages.CheckChatInvite({
hash:groupLink
})
)) as telegram.Api.ChatInviteAlready).chat as telegram.Api.Channel
break;
default:
logger.warn(`Something wrong with chat ${err.errorMessage} | ${worker.phoneNumber}`)
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id
}))[0];
continue mainLoop;
}
}
}
}
await confirmButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
const afterTask=(await client.getMessages(botEntity,{
minId: task.id,
reverse:true,
limit:100
})).filter((value)=>{
if (value.message.includes(settings.botMessages.notInGroup) || value.message.includes(settings.botMessages.taskComplete)){
return true
} else {
return false
}
})[0];
const lastMessage=(await client.getMessages(botEntity,{
minId: task.id
}))[0];
prevTask.task=task;
prevTask.lastMessage=(lastMessage!==undefined) ? lastMessage: afterTask ;
if (afterTask.message.includes(settings.botMessages.taskComplete)==true){
worker.completedGroupsTasks.push(
{
timeToLeave: +(new Date())+Number(afterTask.message.replace(/\D/g,''))*3600*1_000,
groupID:(await client.getPeerId(group!))
}
);
logger.info(`Chat task complete | ${worker.phoneNumber}`);
continue;
} else if (afterTask.message.includes(settings.botMessages.notInGroup)==true){
logger.warn(`User joined but hk says not. Skipping...`)
await skipButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,task.id);
prevTask.task=task;
prevTask.lastMessage=(await client.getMessages(botEntity,{
minId:task.id,
// search: (await settings.botMessages()).tasksSelector,
}))[0];
worker.completedGroupsTasks.push(
{
timeToLeave: 1,
groupID:(await client.getPeerId(group!))
}
);
} else {
logger.debug(`Anomaly | ${worker.phoneNumber}`);
logger.debug(task.message);
}
}else if (task.message.includes(settings.botMessages.taskOver)==true){
logger.info(`Chats tasks completed | ${worker.phoneNumber}`)
break
} else {
logger.error(`Check out last message of ${worker.phoneNumber}`);
throw new Error(`Check out last message of ${worker.phoneNumber}`)
}
}
}