2022-11-30 16:43:49 +01:00
|
|
|
import fs = require('fs');
|
2022-12-07 18:47:49 +01:00
|
|
|
import { database as db, settings } from './database'
|
2022-12-01 21:53:29 +01:00
|
|
|
import prompt from 'prompts';
|
2022-11-30 15:04:45 +01:00
|
|
|
import logger from "./logger"
|
2022-11-30 16:43:49 +01:00
|
|
|
import * as telegram from 'telegram';
|
|
|
|
import { LogLevel } from 'telegram/extensions/Logger';
|
2022-11-30 19:23:04 +01:00
|
|
|
import { AccountInterface } from './interfaces/databaseInterface';
|
|
|
|
import { sleep } from 'telegram/Helpers';
|
|
|
|
import findFreePorts from 'find-free-ports';
|
2022-12-09 17:38:09 +01:00
|
|
|
import { waitNewMessages, startNewTorDocker, getIP, getMessagesByEntity, isBannedByClient, randomAB } from './utils';
|
2022-12-10 23:27:49 +01:00
|
|
|
import TorControl from "tor-control";
|
2022-12-02 13:07:07 +01:00
|
|
|
import Miner from '@ulixee/miner';
|
|
|
|
import Hero from '@ulixee/hero';
|
2022-12-07 18:46:23 +01:00
|
|
|
import { portsInterface, usedIPInterface } from "./interfaces/otherInterfaces"
|
2022-12-05 19:07:39 +01:00
|
|
|
import { doSitesTasks, vertification, doChatsTasks } from './automatization';
|
2022-12-03 06:37:20 +01:00
|
|
|
import ExecuteJsPlugin from '@ulixee/execute-js-plugin';
|
2022-12-03 15:43:20 +01:00
|
|
|
import _ from 'lodash';
|
2022-12-04 16:52:54 +01:00
|
|
|
import Docker from 'dockerode';
|
|
|
|
import cliProgress from "cli-progress"
|
2022-12-05 19:27:27 +01:00
|
|
|
import BigInteger from "big-integer";
|
2022-11-30 15:04:45 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
const addAccounts: () => Promise<void> = async () => {
|
|
|
|
let apiId: number = 0
|
|
|
|
let apiHash: string = '';
|
|
|
|
let accounts = await db.getUsers();
|
|
|
|
if (accounts.length != 0) {
|
|
|
|
const usePrevData = await prompt({
|
2022-11-30 16:43:49 +01:00
|
|
|
type: 'confirm',
|
|
|
|
name: 'confirmed',
|
|
|
|
message: 'Use apiId and apiHash from last added account?'
|
|
|
|
});
|
2022-12-07 18:46:23 +01:00
|
|
|
if (usePrevData.confirmed == true) {
|
|
|
|
apiId = accounts[accounts.length - 1].apiID;
|
|
|
|
apiHash = accounts[accounts.length - 1].apiHash;
|
2022-11-30 16:43:49 +01:00
|
|
|
}
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
if (apiId == 0 && apiHash == '') {
|
|
|
|
const api = await prompt([
|
2022-11-30 16:43:49 +01:00
|
|
|
{
|
2022-12-07 18:46:23 +01:00
|
|
|
type: 'number',
|
|
|
|
name: 'apiId',
|
|
|
|
message: 'ApiId?'
|
2022-11-30 16:43:49 +01:00
|
|
|
},
|
|
|
|
{
|
2022-12-07 18:46:23 +01:00
|
|
|
type: 'text',
|
|
|
|
name: 'apiHash',
|
|
|
|
message: 'ApiHash?'
|
2022-11-30 16:43:49 +01:00
|
|
|
}
|
|
|
|
]);
|
2022-12-07 18:46:23 +01:00
|
|
|
apiId = Number(api.apiId);
|
|
|
|
apiHash = api.apiHash;
|
2022-11-30 16:43:49 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
let jsonFiles: prompt.Choice[] = [];
|
|
|
|
fs.readdirSync("./").forEach((file) => {
|
|
|
|
if (file.search('.json') != -1 && file != 'db.json' && file != 'settings.json') {
|
2022-11-30 16:43:49 +01:00
|
|
|
jsonFiles.push(
|
|
|
|
{
|
2022-12-07 18:46:23 +01:00
|
|
|
title: file,
|
|
|
|
description: 'json file',
|
|
|
|
value: file,
|
2022-11-30 16:43:49 +01:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
});
|
2022-12-07 18:46:23 +01:00
|
|
|
const walletsFile = (await prompt({
|
2022-11-30 16:43:49 +01:00
|
|
|
type: 'select',
|
|
|
|
name: 'file',
|
|
|
|
message: 'Choose wallets json file',
|
|
|
|
choices: jsonFiles
|
|
|
|
})).file
|
|
|
|
await db.findWallet(walletsFile);
|
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-11-30 16:43:49 +01:00
|
|
|
|
|
|
|
mainLoop:
|
2022-12-07 18:46:23 +01:00
|
|
|
while (true) {
|
|
|
|
accounts = await db.getUsers();
|
|
|
|
const answers = await prompt([
|
2022-11-30 16:43:49 +01:00
|
|
|
{
|
2022-12-07 18:46:23 +01:00
|
|
|
type: 'text',
|
|
|
|
name: 'number',
|
|
|
|
message: 'Phone number?'
|
2022-11-30 16:43:49 +01:00
|
|
|
},
|
|
|
|
{
|
2022-12-07 18:46:23 +01:00
|
|
|
type: 'text',
|
|
|
|
name: 'password',
|
|
|
|
message: '2FA Password?'
|
2022-11-30 16:43:49 +01:00
|
|
|
}
|
|
|
|
]);
|
2022-12-07 18:46:23 +01:00
|
|
|
for (const account of accounts) {
|
|
|
|
if (account.phoneNumber == answers.number) {
|
2022-11-30 16:43:49 +01:00
|
|
|
logger.warn('You already added this number');
|
|
|
|
continue mainLoop;
|
|
|
|
}
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
const session = new telegram.sessions.StringSession('');
|
|
|
|
const client = new telegram.TelegramClient(session, apiId, apiHash, { deviceModel: 'Samsung SM-G980', connectionRetries: 5, systemVersion: '10' });
|
2022-11-30 16:43:49 +01:00
|
|
|
client.setLogLevel(LogLevel.ERROR);
|
|
|
|
await client.start({
|
2022-12-07 18:46:23 +01:00
|
|
|
phoneNumber: async () => answers.number.replace(/ /g, ""),
|
|
|
|
password: async () => answers.password.replace(/ /g, ""),
|
2022-11-30 16:43:49 +01:00
|
|
|
phoneCode: async () => (await prompt({
|
2022-12-07 18:46:23 +01:00
|
|
|
type: 'number',
|
|
|
|
name: 'code',
|
|
|
|
message: 'Enter recieved code'
|
2022-11-30 16:43:49 +01:00
|
|
|
})).code.toString(),
|
|
|
|
onError: (err) => {
|
|
|
|
logger.error(`Error due singning into telegram account\n${err}`);
|
|
|
|
throw err
|
|
|
|
},
|
|
|
|
});
|
2022-12-07 18:46:23 +01:00
|
|
|
if ((await client.isUserAuthorized()) == true) {
|
|
|
|
const account: telegram.Api.User | telegram.Api.InputPeerUser = (await client.getMe(false));
|
|
|
|
if (account instanceof telegram.Api.User) {
|
2022-11-30 16:43:49 +01:00
|
|
|
await db.addUser({
|
|
|
|
password: answers.password,
|
|
|
|
phoneNumber: answers.number,
|
|
|
|
apiHash: apiHash,
|
|
|
|
telegramID: Number(account.id),
|
|
|
|
apiID: apiId,
|
|
|
|
stringSession: String(client.session.save()),
|
|
|
|
refferal: await db.findRefferal(settings.maxRefferals)
|
2022-12-07 18:46:23 +01:00
|
|
|
}, walletsFile)
|
2022-11-30 16:43:49 +01:00
|
|
|
} else {
|
|
|
|
logger.error("Wrong type of account?");
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-11-30 16:43:49 +01:00
|
|
|
} else {
|
|
|
|
logger.error('Client not authorized');
|
|
|
|
}
|
|
|
|
if ((await prompt({
|
|
|
|
type: 'confirm',
|
|
|
|
name: 'continue',
|
|
|
|
message: 'continue?'
|
2022-12-07 18:46:23 +01:00
|
|
|
})).continue != true) {
|
2022-11-30 16:43:49 +01:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2022-11-30 15:04:45 +01:00
|
|
|
|
2022-11-30 16:43:49 +01:00
|
|
|
}
|
2022-11-30 15:04:45 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
const farm: () => Promise<void> = async () => {
|
|
|
|
let usedIPs: usedIPInterface[] = [];
|
|
|
|
const proccesGroup = async (workersGroups: AccountInterface[], ports: portsInterface) => {
|
|
|
|
|
|
|
|
|
2022-12-04 16:52:54 +01:00
|
|
|
workersLoop:
|
2022-12-07 18:46:23 +01:00
|
|
|
for (const worker of workersGroups) {
|
2022-12-07 19:36:04 +01:00
|
|
|
logger.info(`Current worker:${worker.phoneNumber}\nBalance:${worker.balance}`);
|
2022-12-05 19:07:39 +01:00
|
|
|
{
|
2022-12-10 23:27:49 +01:00
|
|
|
let tor: any
|
2022-12-09 19:54:36 +01:00
|
|
|
try{
|
2022-12-10 23:27:49 +01:00
|
|
|
tor=new TorControl({
|
|
|
|
host:'127.0.0.1',
|
2022-12-09 19:54:36 +01:00
|
|
|
port: ports.control,
|
2022-12-10 23:27:49 +01:00
|
|
|
password: 'qwerty', // Your password for tor-control
|
|
|
|
persistent: false // Keep connection (persistent)
|
2022-12-09 19:54:36 +01:00
|
|
|
});
|
|
|
|
} catch( err){
|
|
|
|
logger.error(`Cant connect to tor control via ${ports.control}\n${err}`)
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
function isFree(currentIP: string) {
|
|
|
|
for (const usedIP of usedIPs) {
|
|
|
|
|
|
|
|
if (usedIP.usedIps.indexOf(currentIP) != -1 || usedIP.current == currentIP) {
|
|
|
|
return false;
|
2022-12-05 19:07:39 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-03 15:43:20 +01:00
|
|
|
}
|
2022-12-06 15:11:23 +01:00
|
|
|
return true;
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
while (true) {
|
|
|
|
const currentIP = await getIP(ports.http);
|
|
|
|
if (currentIP != null) {
|
|
|
|
if (isFree(currentIP)) {
|
|
|
|
usedIPs.filter((value) => { return _.isEqual(worker, value.worker) })[0].current = currentIP;
|
|
|
|
usedIPs.filter((value) => { return _.isEqual(worker, value.worker) })[0].usedIps.push(currentIP);
|
2022-12-06 15:11:23 +01:00
|
|
|
break;
|
|
|
|
} else {
|
2022-12-10 23:27:49 +01:00
|
|
|
await tor.signalNewnym();
|
2022-12-06 15:11:23 +01:00
|
|
|
await sleep(3_000);
|
2022-12-05 19:07:39 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-03 15:43:20 +01:00
|
|
|
}
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-02 13:07:07 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
const fingerprint = worker.browserFingerprint
|
2022-12-04 16:52:54 +01:00
|
|
|
let hero: Hero;
|
2022-12-07 18:46:23 +01:00
|
|
|
while (true) {
|
|
|
|
|
2022-12-06 15:11:23 +01:00
|
|
|
hero = new Hero({
|
2022-12-07 18:46:23 +01:00
|
|
|
userProfile: {
|
|
|
|
deviceProfile: {
|
|
|
|
deviceMemory: fingerprint.navigator.deviceMemory,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
name: `${worker.telegramID}`,
|
|
|
|
connectionToCore: { host: `ws://127.0.0.1:${ports.minerPort}` },
|
|
|
|
disableDevtools: true, // to bypass hk site
|
2022-12-09 17:38:09 +01:00
|
|
|
showChrome:true, // to debug
|
2022-12-07 18:46:23 +01:00
|
|
|
userAgent: fingerprint.navigator.userAgent,
|
|
|
|
viewport: fingerprint.screen,
|
|
|
|
locale: fingerprint.navigator.language,
|
|
|
|
upstreamProxyUrl: `socks5://127.0.0.1:${ports.socks}`,
|
2022-12-09 19:54:36 +01:00
|
|
|
upstreamProxyIpMask:{
|
|
|
|
ipLookupService:'icanhazip.com',
|
|
|
|
proxyIp:usedIPs.filter((value) => { return _.isEqual(worker, value.worker) })[0].current
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
});
|
2022-12-06 15:11:23 +01:00
|
|
|
hero.use(ExecuteJsPlugin);
|
2022-12-07 18:46:23 +01:00
|
|
|
try {
|
|
|
|
await hero.goto('https://www.google.com');
|
|
|
|
} catch (err) {
|
2022-12-06 15:11:23 +01:00
|
|
|
await hero.close();
|
2022-12-02 13:07:07 +01:00
|
|
|
logger.warn(`Some error due openning Hero. Trying again...\n${err}`);
|
|
|
|
continue
|
|
|
|
}
|
2022-12-06 15:11:23 +01:00
|
|
|
break;
|
2022-12-02 16:41:38 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
const client = new telegram.TelegramClient(
|
2022-12-02 16:41:38 +01:00
|
|
|
new telegram.sessions.StringSession(worker.stringSession),
|
|
|
|
worker.apiID,
|
|
|
|
worker.apiHash,
|
2022-12-07 18:46:23 +01:00
|
|
|
{ deviceModel: 'Samsung SM-G980', connectionRetries: 5, systemVersion: '10' }
|
2022-12-02 16:41:38 +01:00
|
|
|
);
|
2022-12-07 18:46:23 +01:00
|
|
|
client.setLogLevel(LogLevel.NONE);
|
2022-12-02 16:41:38 +01:00
|
|
|
await client.connect();
|
2022-12-07 18:46:23 +01:00
|
|
|
if ((await client.checkAuthorization()) == false) {
|
2022-12-02 16:41:38 +01:00
|
|
|
logger.error(`Account ${worker.phoneNumber} is not authorizated`);
|
2022-12-07 18:47:49 +01:00
|
|
|
continue workersLoop
|
2022-12-02 16:41:38 +01:00
|
|
|
} else {
|
|
|
|
logger.debug(`Successfully connected to account ${worker.phoneNumber}`);
|
|
|
|
// https://gram.js.org/beta/modules/Api.channels.html
|
|
|
|
// https://gram.js.org/beta/classes/Api.messages.DeleteChat.html
|
2022-12-06 15:11:23 +01:00
|
|
|
let botEntity: telegram.Api.User;
|
2022-12-07 18:46:23 +01:00
|
|
|
try {
|
|
|
|
botEntity = await client.getEntity(settings.telegramLinks.botLink) as telegram.Api.User;
|
|
|
|
} catch (err) {
|
2022-12-09 17:38:09 +01:00
|
|
|
if (err instanceof telegram.errors.FloodWaitError) {
|
2022-12-06 15:11:23 +01:00
|
|
|
switch (err.errorMessage) {
|
|
|
|
case 'FLOOD':
|
2022-12-09 17:38:09 +01:00
|
|
|
logger.warn(`Account has flood(${err.seconds} secs timeout) error,skipping`);
|
2022-12-06 15:11:23 +01:00
|
|
|
break;
|
|
|
|
default:
|
2022-12-09 17:38:09 +01:00
|
|
|
logger.error(`Unknown error due getEntity ${err}`)
|
2022-12-06 15:11:23 +01:00
|
|
|
break;
|
|
|
|
}
|
2022-12-09 17:38:09 +01:00
|
|
|
} else {
|
|
|
|
logger.error(`Unknown error due getEntity ${err}`)
|
2022-12-06 15:11:23 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
usedIPs.filter((value) => { return _.isEqual(worker, value.worker) })[0].current = ''
|
|
|
|
usedIPs.filter((value) => { return _.isEqual(worker, value.worker) })[0].usedIps.pop()
|
2022-12-06 15:11:23 +01:00
|
|
|
await hero.close()
|
2022-12-07 18:47:49 +01:00
|
|
|
continue workersLoop
|
2022-12-06 15:11:23 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-05 19:27:27 +01:00
|
|
|
// leaving old groups
|
2022-12-07 18:46:23 +01:00
|
|
|
{
|
|
|
|
const now = new Date();
|
|
|
|
worker.completedGroupsTasks = worker.completedGroupsTasks.filter(async (oldGroup) => {
|
|
|
|
if (+now > oldGroup.timeToLeave) {
|
|
|
|
const olderGroups = worker.completedGroupsTasks.filter((value) => {
|
|
|
|
if (value.groupID == oldGroup.groupID && value.timeToLeave > oldGroup.timeToLeave) {
|
2022-12-05 19:45:44 +01:00
|
|
|
return true;
|
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
});
|
2022-12-07 18:46:23 +01:00
|
|
|
if (olderGroups.length == 0) {
|
|
|
|
let peerChannel: string | number | BigInteger.BigInteger | telegram.Api.PeerUser | telegram.Api.PeerChat | telegram.Api.PeerChannel | telegram.Api.InputPeerEmpty | telegram.Api.InputPeerSelf | telegram.Api.InputPeerChat | telegram.Api.InputPeerUser | telegram.Api.InputPeerChannel | telegram.Api.InputPeerUserFromMessage | telegram.Api.InputPeerChannelFromMessage | telegram.Api.User | telegram.Api.Chat | telegram.Api.Channel | telegram.Api.UserEmpty | telegram.Api.ChatEmpty | telegram.Api.ChatForbidden | telegram.Api.ChannelForbidden | telegram.Api.UserFull | telegram.Api.messages.ChatFull | telegram.Api.ChatFull | telegram.Api.ChannelFull | telegram.Api.InputChannelEmpty | telegram.Api.InputChannel | telegram.Api.InputChannelFromMessage | telegram.Api.InputUserEmpty | telegram.Api.InputUserSelf | telegram.Api.InputUser | telegram.Api.InputUserFromMessage;
|
|
|
|
try{
|
|
|
|
peerChannel = await client.getInputEntity(BigInteger(oldGroup.groupID));
|
|
|
|
}
|
|
|
|
catch (err){
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
await client.invoke(new telegram.Api.channels.GetParticipant({ channel: peerChannel, participant: 'me' }));
|
|
|
|
} catch (err) {
|
|
|
|
if (err.code == 400) {
|
|
|
|
return false
|
|
|
|
} else {
|
|
|
|
logger.error(`Unknown error due GetParticipant | ${worker.phoneNumber}`)
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
try {
|
|
|
|
await client.invoke(
|
|
|
|
new telegram.Api.channels.LeaveChannel({
|
|
|
|
channel: peerChannel
|
|
|
|
})
|
|
|
|
);
|
|
|
|
} catch (err){
|
|
|
|
logger.debug(`Cant leave channel | ${worker.phoneNumber}`);
|
|
|
|
return true;
|
|
|
|
}
|
2022-12-05 19:45:44 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
}
|
2022-12-05 19:45:44 +01:00
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
return true
|
2022-12-05 19:27:27 +01:00
|
|
|
}
|
2022-12-05 19:45:44 +01:00
|
|
|
})
|
2022-12-05 19:27:27 +01:00
|
|
|
}
|
|
|
|
//
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
|
|
|
|
for (const chat of settings.telegramLinks.groupsToJoin) {
|
|
|
|
try {
|
|
|
|
await client.invoke(new telegram.Api.channels.GetParticipant({ channel: chat, participant: 'me' }));
|
|
|
|
} catch (err) {
|
|
|
|
if (err.code == 400) {
|
|
|
|
await client.invoke(new telegram.Api.channels.JoinChannel({ channel: chat }));
|
|
|
|
} else {
|
2022-12-04 16:52:54 +01:00
|
|
|
logger.error(`Unknown error due GetParticipant | ${worker.phoneNumber}`)
|
2022-12-02 16:41:38 +01:00
|
|
|
throw err;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-12-04 16:52:54 +01:00
|
|
|
{
|
|
|
|
// unblock hkbot
|
2022-12-07 18:46:23 +01:00
|
|
|
if (await isBannedByClient(client, settings.telegramLinks.botLink)) {
|
|
|
|
|
|
|
|
const result = await client.invoke(
|
2022-12-04 16:52:54 +01:00
|
|
|
new telegram.Api.contacts.Unblock({
|
2022-12-07 18:46:23 +01:00
|
|
|
id: settings.telegramLinks.botLink
|
2022-12-04 16:52:54 +01:00
|
|
|
}));
|
2022-12-07 18:46:23 +01:00
|
|
|
if (result != true) {
|
2022-12-04 16:52:54 +01:00
|
|
|
logger.error(`Cant unblock ${settings.telegramLinks.botLink} | ${worker.phoneNumber}`);
|
|
|
|
continue workersLoop;
|
2022-12-07 18:46:23 +01:00
|
|
|
} else {
|
|
|
|
logger.info(`HK bot unblocked | ${worker.phoneNumber}`)
|
2022-12-04 16:52:54 +01:00
|
|
|
}
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-04 16:52:54 +01:00
|
|
|
}
|
2022-12-09 17:38:09 +01:00
|
|
|
await sleep(Math.random() * 50_000);
|
2022-12-07 18:46:23 +01:00
|
|
|
if ((await getMessagesByEntity(client, botEntity, botEntity)).length == 0) {
|
2022-12-04 16:52:54 +01:00
|
|
|
// sending start message
|
2022-12-07 18:46:23 +01:00
|
|
|
let id: number = -1;
|
|
|
|
if (worker.refferal !== null) {
|
|
|
|
id = (await client.sendMessage(botEntity, { message: `/start ${worker.refferal}` })).id;
|
2022-12-04 16:52:54 +01:00
|
|
|
logger.debug(`First start of ${botEntity.username} via refferal link of ${worker.refferal} | ${worker.phoneNumber}`);
|
2022-12-07 18:46:23 +01:00
|
|
|
} else {
|
|
|
|
id = (await client.sendMessage(botEntity, { message: `/start` })).id;
|
2022-12-04 16:52:54 +01:00
|
|
|
logger.debug(`First start of ${botEntity.username} | ${worker.phoneNumber}`);
|
2022-12-02 16:41:38 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
await waitNewMessages(client, worker, botEntity, id)
|
2022-12-02 18:38:40 +01:00
|
|
|
}
|
2022-12-04 16:52:54 +01:00
|
|
|
logger.info(`Sending earn message... | ${worker.phoneNumber}`);
|
2022-12-07 18:46:23 +01:00
|
|
|
const requestTasksMessage = await client.sendMessage(botEntity, { message: settings.botButtons.earn });
|
|
|
|
await waitNewMessages(client, worker, botEntity, requestTasksMessage.id)
|
|
|
|
let tasksSelector: telegram.Api.Message = (await client.getMessages(botEntity, {
|
|
|
|
minId: requestTasksMessage.id,
|
2022-12-02 18:38:40 +01:00
|
|
|
}))[0];
|
2022-12-07 18:46:23 +01:00
|
|
|
if (tasksSelector.message.includes(settings.botMessages.verification) == true) {
|
2022-12-04 16:52:54 +01:00
|
|
|
// vertification
|
2022-12-03 06:37:20 +01:00
|
|
|
logger.warn(`Account ${worker.phoneNumber} is unvertificated`)
|
2022-12-07 18:46:23 +01:00
|
|
|
const url: string = tasksSelector.buttons![0][0].url!;
|
|
|
|
await vertification(client, worker, hero, url, botEntity, tasksSelector.id);
|
|
|
|
const requestTasksMessage = await client.sendMessage(botEntity, { message: settings.botButtons.earn });
|
|
|
|
await waitNewMessages(client, worker, botEntity, requestTasksMessage.id)
|
|
|
|
tasksSelector = (await client.getMessages(botEntity, {
|
|
|
|
minId: requestTasksMessage.id,
|
2022-12-02 18:38:40 +01:00
|
|
|
}))[0];
|
2022-12-07 18:46:23 +01:00
|
|
|
}
|
2022-12-02 16:41:38 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
try{
|
|
|
|
await doSitesTasks(client,worker,hero,botEntity,tasksSelector);
|
|
|
|
await doChatsTasks(client, worker, hero, botEntity, tasksSelector);
|
|
|
|
} catch (err){
|
|
|
|
logger.error(`Some error due doing tasks\n${err}\n${err.stack}`)
|
|
|
|
}
|
2022-12-09 17:38:09 +01:00
|
|
|
db.updateUser(worker);
|
2022-12-07 18:46:23 +01:00
|
|
|
await hero.close();
|
2022-12-09 17:38:09 +01:00
|
|
|
await sleep(randomAB(settings.sleepTime.betweenSessions[0],settings.sleepTime.betweenSessions[1])*1_000);
|
2022-12-07 18:46:23 +01:00
|
|
|
}
|
2022-12-02 16:41:38 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
}
|
2022-11-30 19:23:04 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
const workers = await db.getUsers();
|
2022-12-09 17:38:09 +01:00
|
|
|
if (settings.shuffleAccounts){
|
|
|
|
workers.sort(() => Math.random() - 0.5)
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
let workersGroups: Array<AccountInterface[]> = [];
|
|
|
|
|
|
|
|
for (const worker of workers) {
|
2022-12-06 15:11:23 +01:00
|
|
|
usedIPs.push({
|
2022-12-03 15:43:20 +01:00
|
|
|
worker: worker,
|
|
|
|
usedIps: [],
|
|
|
|
current: '',
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
for (let i = 0; i != workers.length + 1; i += settings.pararels) {
|
|
|
|
const _workers = workers.slice(i, i + settings.pararels);
|
|
|
|
if (_workers.length != 0) {
|
2022-12-03 06:37:20 +01:00
|
|
|
workersGroups.push(_workers);
|
2022-11-30 19:23:04 +01:00
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-11-30 19:23:04 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
if (workersGroups.length != Math.ceil(workers.length / settings.pararels)) {
|
|
|
|
logger.warn(`There is strange thing with workersGroups\n${workersGroups.length} ${Math.ceil(workers.length / settings.pararels)}`);
|
2022-11-30 19:23:04 +01:00
|
|
|
}
|
2022-12-09 17:38:09 +01:00
|
|
|
let pararels: Promise<void>[] = [];
|
2022-12-09 19:54:36 +01:00
|
|
|
|
2022-12-03 06:37:20 +01:00
|
|
|
const miner = new Miner();
|
2022-12-10 11:40:08 +01:00
|
|
|
await miner.listen({port:(await findFreePorts(1))[0]});
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-09 19:54:36 +01:00
|
|
|
const _ports = await findFreePorts(workers.length * 3);
|
2022-12-10 23:27:49 +01:00
|
|
|
// logger.debug(`Is there port of miner:${_ports.indexOf(await miner.port)}, ${await miner.port}`)
|
2022-12-07 18:46:23 +01:00
|
|
|
let containers: Docker.Container[] = [];
|
2022-12-04 16:52:54 +01:00
|
|
|
|
|
|
|
{
|
|
|
|
const multibar = new cliProgress.MultiBar({
|
|
|
|
hideCursor: true,
|
2022-12-07 18:46:23 +01:00
|
|
|
barsize: 50,
|
|
|
|
barCompleteChar: '❌',
|
|
|
|
barIncompleteChar: '✔️',
|
2022-12-04 16:52:54 +01:00
|
|
|
clearOnComplete: true,
|
|
|
|
format: `{status} | {bar} | {value}/{total}sec timeout`,
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
});
|
|
|
|
let _containers: Promise<Docker.Container>[] = [];
|
|
|
|
for (let i = 0; i != workersGroups.length; i++) {
|
2022-12-04 16:52:54 +01:00
|
|
|
_containers.push(
|
2022-12-07 18:46:23 +01:00
|
|
|
startNewTorDocker(_ports[i * 3], _ports[i * 3 + 1], _ports[i * 3 + 2], multibar)
|
2022-12-04 16:52:54 +01:00
|
|
|
);
|
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
containers = (await Promise.allSettled(_containers)).map((value) => { return (value as PromiseFulfilledResult<Docker.Container>).value });
|
2022-12-04 16:52:54 +01:00
|
|
|
multibar.stop();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
for (let i = 0; i != workersGroups.length; i++) {
|
|
|
|
|
|
|
|
pararels.push(proccesGroup(workersGroups[i], {
|
|
|
|
http: _ports[i * 3],
|
|
|
|
socks: _ports[i * 3 + 1],
|
|
|
|
control: _ports[i * 3 + 2],
|
2022-12-03 15:43:20 +01:00
|
|
|
minerPort: await miner.port
|
|
|
|
|
2022-12-06 10:36:50 +01:00
|
|
|
}
|
2022-12-04 16:52:54 +01:00
|
|
|
));
|
2022-11-30 19:23:04 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
const results = await Promise.allSettled(pararels);
|
|
|
|
for (const result of results) {
|
|
|
|
if (result.status == 'rejected') {
|
2022-12-09 19:54:36 +01:00
|
|
|
logger.warn(`Promise is canceled due ${result.reason}`);
|
2022-12-09 17:38:09 +01:00
|
|
|
}
|
2022-12-04 16:52:54 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
logger.debug('Closing opened docker containers ')
|
|
|
|
for (const container of containers) {
|
2022-12-05 19:07:39 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
try {
|
2022-12-09 17:38:09 +01:00
|
|
|
await container.stop();
|
2022-12-07 18:46:23 +01:00
|
|
|
} catch (err) { }
|
|
|
|
|
2022-12-05 19:07:39 +01:00
|
|
|
}
|
2022-12-09 17:38:09 +01:00
|
|
|
await db.save()
|
2022-12-09 22:38:49 +01:00
|
|
|
await miner.close(true);
|
2022-11-30 19:23:04 +01:00
|
|
|
}
|
2022-11-30 15:04:45 +01:00
|
|
|
|
|
|
|
// menu
|
2022-12-07 18:46:23 +01:00
|
|
|
(async () => {
|
|
|
|
while (true) {
|
|
|
|
|
2022-12-07 18:47:49 +01:00
|
|
|
const answer = await prompt({
|
|
|
|
type: 'select',
|
|
|
|
name: 'menu',
|
|
|
|
message: 'Choose action',
|
|
|
|
choices: [
|
|
|
|
((await db.getUsers()).length > 0) ? { title: 'Start', description: 'Starting farm', value: 'start' } : { title: 'Start', description: 'Add accounts first...', value: 'start', disabled: true },
|
|
|
|
{ title: 'Add accounts', description: 'Add accounts to database', value: 'addAccounts' },
|
|
|
|
{ title: 'Check balances', value: 'checkBalances', disabled: true },
|
|
|
|
{ title: 'Withdraw', value: 'withdraw', disabled: true },
|
|
|
|
{ title: 'Exit', description: 'You realy dont know what it mean?' }
|
|
|
|
]
|
|
|
|
})
|
|
|
|
switch (answer.menu) {
|
|
|
|
case 'addAccounts':
|
|
|
|
await addAccounts();
|
|
|
|
break;
|
|
|
|
case 'start':
|
|
|
|
while (true) {
|
|
|
|
try {
|
|
|
|
await farm();
|
2022-12-09 17:38:09 +01:00
|
|
|
const sleepTime=randomAB(settings.sleepTime.afterDoing[0],settings.sleepTime.afterDoing[1]);
|
|
|
|
logger.info(`Sleeping for ${sleepTime} secs`);
|
|
|
|
await sleep(sleepTime*1_000);
|
2022-12-07 18:47:49 +01:00
|
|
|
} catch (err) {
|
|
|
|
logger.error(`Unknown error\n${err.stack}\n${typeof err}`);
|
|
|
|
break;
|
|
|
|
}
|
2022-11-30 19:23:04 +01:00
|
|
|
}
|
2022-12-07 18:47:49 +01:00
|
|
|
break;
|
2022-12-07 18:46:23 +01:00
|
|
|
|
|
|
|
|
2022-12-07 18:47:49 +01:00
|
|
|
default:
|
|
|
|
logger.info('Bye bye');
|
|
|
|
process.exit();
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-12-07 18:47:49 +01:00
|
|
|
}
|
2022-12-07 18:46:23 +01:00
|
|
|
|
2022-11-30 15:04:45 +01:00
|
|
|
}
|
|
|
|
})();
|
2022-12-03 16:10:47 +01:00
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
process.on('SIGINT', function () {
|
2022-12-09 17:38:09 +01:00
|
|
|
db.save().then(()=>{
|
|
|
|
logger.info('Bye bye');
|
|
|
|
process.exit();
|
|
|
|
})
|
|
|
|
|
2022-12-07 18:46:23 +01:00
|
|
|
});
|