chats task
This commit is contained in:
parent
a9a37db38f
commit
163f7cb6bb
5 changed files with 258 additions and 48 deletions
|
@ -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}`)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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',
|
||||
|
|
74
index.ts
74
index.ts
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
3
interfaces/databaseInterface.d.ts
vendored
3
interfaces/databaseInterface.d.ts
vendored
|
@ -10,7 +10,8 @@ export interface faucetMailInterface {
|
|||
}
|
||||
}
|
||||
export interface AccountCompletedGroupsTasksInterface {
|
||||
|
||||
timeToLeave: number,
|
||||
groupID: bigInt.BigInteger
|
||||
}
|
||||
|
||||
export interface AccountWithdrawInterface {
|
||||
|
|
4
utils.ts
4
utils.ts
|
@ -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`]
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue