chats task

This commit is contained in:
”minicx” 2022-12-05 21:07:39 +03:00
parent a9a37db38f
commit 163f7cb6bb
5 changed files with 258 additions and 48 deletions

View File

@ -6,11 +6,12 @@ import { prevTaskInterface } from "./interfaces/otherInterfaces";
import logger from "./logger";
import { waitNewMessages } from "./utils";
import {database as db,settings} from './database'
import BigInteger from "big-integer";
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:180_000});
await hero.waitForLoad('AllContentLoaded');
await hero.waitForLoad('AllContentLoaded',{timeoutMs:180_000});
const captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
if (captchaButton!=null){
let verify=hero.document.querySelector('body > section > h2');
@ -31,7 +32,7 @@ export const vertification=async function (client: telegram.TelegramClient,worke
}
}
export const do_sites_task=async function (client: telegram.TelegramClient,worker: AccountInterface,hero: Hero,botEntity: telegram.Api.Chat | telegram.Api.User,tasksSelector: telegram.Api.Message) {
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,
@ -55,7 +56,7 @@ export const do_sites_task=async function (client: telegram.TelegramClient,worke
const urlButton=task.buttons![0][0];
const skipButton=task.buttons![0][1];
await hero.goto(urlButton.url!.replace("https","http"),{timeoutMs:180_000});
await hero.waitForLoad('AllContentLoaded');
await hero.waitForLoad('AllContentLoaded',{timeoutMs:180_000});
let captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
if (captchaButton!=null && urlButton.url!.includes('hkbots')==true){
@ -80,14 +81,16 @@ export const do_sites_task=async function (client: telegram.TelegramClient,worke
while (captchaButton!=null && await hero.activeTab.url==urlButton.url!){
const isCaptchaPassed=hero.document.querySelector("input[id='recaptcha-token']");
if ((isCaptchaPassed==null || await isCaptchaPassed.$isVisible==false) ){
try {
await hero.interact({click:{element: captchaButton, verification: 'exactElement'}});
} catch( err){
logger.warn(`Some error due clicking | ${worker.phoneNumber}`);
continue mainLoop;
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(5000);
await sleep(1000);
captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
} else {
logger.error("catpcha detected");
@ -99,7 +102,8 @@ export const do_sites_task=async function (client: telegram.TelegramClient,worke
await waitNewMessages(client,worker,botEntity,prevTask.task.id);
let afterTask:telegram.Api.Message=(await client.getMessages(botEntity,{
minId:prevTask.task.id,
minId: prevTask.task.id,
reverse: true
// search: settings.botMessages.tasksSelector,
}))[0];
if (afterTask!=null){
@ -109,11 +113,11 @@ export const do_sites_task=async function (client: telegram.TelegramClient,worke
continue
}
}
console.log(afterTask,afterTask.message)
}
} else if (task.message.includes(settings.botMessages.taskOver)==true){
logger.info(`Ad tasks complete | ${worker.phoneNumber}`)
logger.info(`Ad tasks completed | ${worker.phoneNumber}`)
break
} else {
logger.error(`Check out last message of ${worker.phoneNumber}`);
@ -121,4 +125,194 @@ export const do_sites_task=async function (client: telegram.TelegramClient,worke
}
}
}
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 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){
if (prevTask.task.message==task.message){
logger.warn(`Same tasks detected on ${worker.phoneNumber}...`);
}
logger.info(`New chat task | ${worker.phoneNumber}`);
prevTask.task=task;
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.replace("https","http"),{timeoutMs:180_000});
await hero.waitForLoad('AllContentLoaded',{timeoutMs:180_000});
let captchaButton=hero.document.querySelector('button.g-recaptcha.btn.btn-primary');
while (captchaButton!=null && await hero.activeTab.url==urlButton.url!){
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});
prevTask.task=task;
await waitNewMessages(client,worker,botEntity,task.id);
const afterTask=(await client.getMessages(botEntity,{
minId:task.id,
reverse: true
// search: (await settings.botMessages()).tasksSelector,
}));
prevTask.lastMessage=afterTask[afterTask.length-1];
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});
prevTask.task=task;
await waitNewMessages(client,worker,botEntity,task.id);
const afterTask=(await client.getMessages(botEntity,{
minId:task.id,
reverse: true
// search: (await settings.botMessages()).tasksSelector,
}));
prevTask.lastMessage=afterTask[afterTask.length-1];
continue mainLoop;
}
}
}
}
await confirmButton.click({sharePhone: false});
await waitNewMessages(client,worker,botEntity,prevTask.task.id);
let afterTask:telegram.Api.Message=(await client.getMessages(botEntity,{
minId: prevTask.task.id,
reverse: true
}))[0];
if (afterTask!=null && group){
prevTask.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:BigInteger(`-100${group.id}`)
}
)
logger.debug(`Chat task complete | ${worker.phoneNumber}`);
continue
} else if (afterTask.message.includes('')==true){
logger.warn(`User joined but hk says not. Skipping...`)
await skipButton.click({sharePhone: false});
prevTask.task=task;
await waitNewMessages(client,worker,botEntity,task.id);
const afterTask=(await client.getMessages(botEntity,{
minId:task.id,
reverse: true
// search: (await settings.botMessages()).tasksSelector,
}));
prevTask.lastMessage=afterTask[afterTask.length-1];
} else {
logger.debug(`Anomaly | ${worker.phoneNumber}`)
}
}
}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}`)
}
}
}

View File

@ -85,6 +85,9 @@ export class Database {
}
return refferal;
}
async updateUser(account:interfacesDB.AccountInterface){
await this.json.push(`/accounts[${ await this.json.getIndex("/accounts", account.phoneNumber)}]`,account,true);
}
async addUser(account: Omit<interfacesDB.AccountInterface,
'balance' | 'withdraws' | 'completedGroupsTasks' | 'canBeRefferal'
| 'browserFingerprint' | 'faucetMail'>,wallets_json: string): Promise<void>{
@ -148,7 +151,7 @@ export class Settings implements interfacesSettings.settingsInterface {
verification: 'To continue using this bot,',
tasksSelector: 'Choose an option to start earning your TRX',
taskOver: 'Sorry, there are no new ads available.',
taskComplete: 'TRX has been added to your balance.'
taskComplete: 'Success, '
},
botButtons: {
earn: '❇️ Earn cryptocurrency',

View File

@ -1,5 +1,5 @@
import fs = require('fs');
import {database as db,settings} from './database'
import {database, database as db,settings} from './database'
import prompt from 'prompts';
import logger from "./logger"
import * as telegram from 'telegram';
@ -12,11 +12,12 @@ import {connect, disconnect, tor} from "node-tor-control";
import Miner from '@ulixee/miner';
import Hero from '@ulixee/hero';
import {portsInterface, usedIPInterface} from "./interfaces/otherInterfaces"
import { do_sites_task, vertification } from './automatization';
import { doSitesTasks, vertification, doChatsTasks } from './automatization';
import ExecuteJsPlugin from '@ulixee/execute-js-plugin';
import _ from 'lodash';
import Docker from 'dockerode';
import cliProgress from "cli-progress"
import { AxiosError, isAxiosError } from 'axios';
const addAccounts: ()=>Promise<void>=async ()=>{
let apiId: number=0
@ -147,34 +148,40 @@ const farm: ()=>Promise<void>=async ()=>{
for (const worker of workersGroups){
logger.debug(`Current worker:${worker.phoneNumber}\nBalance:${worker.balance}`);
while (usedIP.filter((value:usedIPInterface)=>{
if (_.isEqual(worker,value.worker)){
if (value.usedIps.indexOf(value.current)!=-1 || value.current==''){
return true
{
let pause:number=2_000;
while (usedIP.filter((value:usedIPInterface)=>{
if (_.isEqual(worker,value.worker)){
if (value.usedIps.indexOf(value.current)!=-1 || value.current==''){
return true
}
} else {
const _ip=usedIP.filter((value)=>{return _.isEqual(worker,value.worker)});
if (value.usedIps.indexOf(_ip[0].current)!=-1 || value.current==_ip[0].current){
return true
}
}
} else {
const _ip=usedIP.filter((value)=>{return _.isEqual(worker,value.worker)});
if (value.usedIps.indexOf(_ip[0].current)!=-1 || value.current==_ip[0].current){
return true
}).length!=0){
const torConnection = await connect({
host: '127.0.0.1',
port:ports.control,
password: 'qwerty',
});
await tor.signalNewNYM(torConnection);
await sleep(pause);
try{
usedIP.filter((value)=>{return _.isEqual(worker,value.worker)})[0].current=(await getIP(ports.http))!;
} catch (err){
if (isAxiosError(err)){
pause*=3;
}
continue;
}
}
}).length!=0){
const torConnection = await connect({
host: '127.0.0.1',
port:ports.control,
password: 'qwerty',
});
await tor.signalNewNYM(torConnection);
await sleep(1000);
try{
usedIP.filter((value)=>{return _.isEqual(worker,value.worker)})[0].current=(await getIP(ports.http))!;
} catch (err){
continue
}
}
usedIP.filter((value)=>{return _.isEqual(worker,value.worker)})[0].usedIps.push(usedIP.filter((value)=>{return _.isEqual(worker,value.worker)})[0].current)
const fingerprint=worker.browserFingerprint
@ -279,11 +286,11 @@ const farm: ()=>Promise<void>=async ()=>{
}
await do_sites_task(client,worker,hero,botEntity,tasksSelector);
// await doSitesTasks(client,worker,hero,botEntity,tasksSelector);
await doChatsTasks(client,worker,hero,botEntity,tasksSelector);
await database.updateUser(worker);
@ -293,7 +300,6 @@ const farm: ()=>Promise<void>=async ()=>{
}
}
container.kill();
}
@ -370,6 +376,12 @@ const farm: ()=>Promise<void>=async ()=>{
logger.warn(result.reason);
}
}
for (const container of containers){
try{
container.kill();
} catch (err){}
}
await miner.close();
}

View File

@ -10,7 +10,8 @@ export interface faucetMailInterface {
}
}
export interface AccountCompletedGroupsTasksInterface {
timeToLeave: number,
groupID: bigInt.BigInteger
}
export interface AccountWithdrawInterface {

View File

@ -104,8 +104,8 @@ export const startNewTorDocker=async function(proxyPort: number,socksPort: numbe
}
},
Healthcheck:{
Interval:1.5*1_000_000_000,
Timeout:15*1_000_000_000,
Interval:2*1_000_000_000,
Timeout:50*1_000_000_000,
StartPeriod:50*1_000_000_000,
// Test:['CMD_SHELL',`curl -sx localhost:8118 'https://check.torproject.org/' | grep -qm1 Congratulations`]
}