Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
modulo whatsapp recriado
Browse files Browse the repository at this point in the history
  • Loading branch information
JonasCaetanoSz committed Dec 17, 2023
1 parent d340394 commit 240e7d0
Show file tree
Hide file tree
Showing 10 changed files with 184 additions and 305 deletions.
35 changes: 7 additions & 28 deletions README.MD
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@

# Maturador de chips

maturador de chips é um pequeno programa para "esquentar" contas do whatssap e dessa forma, evitar banimento da rede social.
maturador de chips é um pequeno programa para "esquentar" contas do whatssap e dessa forma, evitar banimento da rede social


## Instalação

Se você é usuário Windows, pode <a href="https://github.com/JonasCaetanoSz/maturador-de-chips/releases/download/27.09.2023/MaturadorSetup_27.09.2023.exe"> fazer download do instalador x64</a> ou siga as instruções abaixo para executar o código-fonte da versão de codigo aberto:
Se você é usuário Windows, pode <a href="https://github.com/JonasCaetanoSz/maturador-de-chips/releases/download/v16.12.2023/Maturador_setup16.12.2023.exe"> fazer download do instalador x64</a> ou siga as instruções abaixo para executar o código-fonte da versão de codigo aberto:

- Clone o repositório

Expand Down Expand Up @@ -52,42 +52,21 @@ python main.py
- escolher nome instância
- remover instância

## Roadmap

- Adicionar envio de arquivos
- Adicionar disparador

## FAQ


### Quais são as portas usadas por este programa?


A porta 5025 é usada pela API e a porta 5026 é usada pelo websocket.


### Quais são os requisitos mínimos do sistema?


desenvolvi em uma maquina com processador i3 e 4GB de memoria RAM, portanto, se sua maquina possui configurações semelhantes ou superiores a essas, o maturador rodará sem problemas.
### Versões Alternativas:

- <a href="https://github.com/APIBrasil/maturador-de-chips"> https://github.com/APIBrasil/maturador-de-chips </a>
- <a href="https://github.com/AdrianoF0nseca/maturador-de-chips"> https://github.com/AdrianoF0nseca/maturador-de-chips </a>


### Como gerar meu próprio executável?

Este é o comando pyinstaller para gerar o executavel do maturador:

```shell
pyinstaller --noconfirm --onedir --windowed --icon "$(pwd)/pages/assets/medias/icon.ico" --add-data "$(pwd)/state.json;." --add-data "$(pwd)/user-agent;." --add-data "$(pwd)/LICENSE;." --add-data "$(pwd)/scripts;scripts/" --add-data "$(pwd)/pages;pages/" "$(pwd)/main.py"
```

Este é o comando pyinstaller para gerar o executável do servidor websocket:
pyinstaller --noconfirm --onedir --windowed --icon "(pwd)/pages/assets/medias/icon.ico" --add-data "(pwd)/pages;pages/" --add-data "(pwd)/scripts;scripts/" --add-data "(pwd)/LICENSE;." --add-data "(pwd)/README.MD;." --add-data "(pwd)/user-agent;." --add-data "(pwd)/requirements.txt;." "(pwd)/main.py"


```shell
pyinstaller --noconfirm --onefile --windowed "$(pwd)/websocket_server.py"
```


## Licença


Expand Down
32 changes: 26 additions & 6 deletions controller.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from PyQt5.QtWidgets import QMessageBox, QMainWindow
from PyQt5.QtCore import pyqtSlot, QObject
from PyQt5.QtWidgets import QMessageBox
from tkinter import filedialog
import webbrowser
import json
Expand All @@ -14,6 +14,8 @@ def __init__(self, accounts_page, version, signals):
self.VERSION = version
self.configs:dict = json.loads((open(file="state.json", mode="r", encoding="utf8").read()))
self.connected_numbers = {}
self.dashboard_window:QMainWindow = None
self.notifications = []

# bot de números virtuais no telegram

Expand Down Expand Up @@ -71,12 +73,13 @@ def select_file(self):
if not file_path:
return json.dumps({"ok":False, "message": "nenhum arquivo selecionado", "filename": self.messages_base["filename"]})
file = open(mode="r", encoding="utf8", file=file_path)

if not file.read():
file.close()
return json.dumps({"ok":False, "message": "o arquivo selecionado está vazio.", "filename": self.messages_base["filename"]})

file.seek(0)
self.messages_base["filename"]= file.name.split("/")[len(file.name.split("/")) - 1]
self.messages_base["content"]= file.read()
self.messages_base["content"]= file.readlines()
file.close()
return json.dumps({"ok":True, "message": "alterações foram salvas com êxito", "filename": self.messages_base["filename"]})

Expand All @@ -85,7 +88,7 @@ def select_file(self):
@pyqtSlot()
def view_project_version(self):
QMessageBox.about(
self.accounts_page_instance,
self.dashboard_window,
"Maturador de Chips",
f"você está usando a versão {self.VERSION}, verifique a qualquer momento no github se há atualizações disponíveis."
)
Expand All @@ -95,7 +98,7 @@ def view_project_version(self):
@pyqtSlot()
def disparador(self):
QMessageBox.about(
self.accounts_page_instance,
self.dashboard_window,
"Maturador de Chips",
"este recurso estará disponível na proxima atualização!"
)
Expand Down Expand Up @@ -150,4 +153,21 @@ def start_maturation(self):

@pyqtSlot(result=str)
def stop_maturation(self):
self.signals.stop_maturation.emit()
self.signals.stop_maturation.emit()

# referencia: https://pt.stackoverflow.com/questions/254506/o-que-%C3%A9-long-polling

@pyqtSlot(result=str)
def long_polling(self) -> str|None:
result = self.notifications.copy()
self.notifications = []
return json.dumps(result)

# exibir o QmessageBox

def message_box(self, message, title) -> None:
QMessageBox.about(
self.dashboard_window,
title,
message
)
11 changes: 7 additions & 4 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,20 @@ class SignalReceive(QtCore.QObject):
stop_maturation = QtCore.pyqtSignal()
# iniciar maturação
start_maturation = QtCore.pyqtSignal(dict, dict)

# exibir um Qmessagebox
message_box = QtCore.pyqtSignal(str, str)
# iniciar maturação

wapp:WhatsApp = None

def start_maturation(window, messages_file, phones,signals):
global wapp
wapp = WhatsApp(window=window, messages_file=messages_file, phones=phones,signals=signals, webviews=accounts_page.webviews)
global wapp, controller_instance
wapp = WhatsApp(window=window, messages_file=messages_file, phones=phones,signals=signals, webviews=accounts_page.webviews, controller=controller_instance)
wapp.start()

# iniciar a aplicação

VERSION = "27.09.2023"
VERSION = "16.12.2023"

if __name__ == "__main__":

Expand All @@ -47,13 +48,15 @@ def start_maturation(window, messages_file, phones,signals):
controller_instance = Controller(accounts_page, VERSION, signals)
window = dashboard.MainWindow(accounts_page, signals, app, controller_instance)
accounts_page.controller = controller_instance
controller_instance.dashboard_window = window

# conectar os sinais de pyqtsignal

signals.new_phone_number.connect(lambda account_data:( controller_instance.account_added(account_data) == window.webview.reload() if "/dashboard" in window.webview.url().toString() else None) if account_data else window.webview.reload())
signals.start_maturation.connect(lambda messages_file, phones: start_maturation(window=window, messages_file=messages_file, phones=phones,signals=signals))
signals.stop_maturation.connect(lambda: threading.Thread(target=wapp.stop() if wapp else None, daemon=True).start())
signals.account_blocked.connect(lambda account_data: ( controller_instance.account_blocked(account_data) == wapp.set_account_block(phone=account_data["phone"]) ))
signals.message_box.connect(lambda title, message: controller_instance.message_box(message=message, title=title))

# iniciar o programa na interface dashboard

Expand Down
71 changes: 17 additions & 54 deletions pages/assets/js/updates.js
Original file line number Diff line number Diff line change
@@ -1,23 +1,15 @@
// se conecta com o servidor web socket
// atualizar o status da aquecimento

var socket;
function ConnectWebSocketServer() {
socket = new WebSocket('ws://localhost:5026');
socket.onopen = function (event) {
$.notify("conexão websocket estabelecida", "success");
};
setInterval(() => {
const notifications = controller.long_polling().then(notifications => {
notifications = JSON.parse(notifications);
notifications.forEach( notification => {

var SendOf = notification.enviadoDe;
var ReceivedBy = notification.recebidoPor;
var message = notification.mensagem;
var hours = notification.horario; //new Date().toLocaleDateString();

// nova atualização recebida do servidor

socket.onmessage = function (event) {

var data = JSON.parse(event.data);
var SendOf = data.enviadoDe;
var ReceivedBy = data.recebidoPor;
var message = data.mensagem;
var hours = data.horario; //new Date().toLocaleDateString();

// criar uma nova linha na tabela de log

var newRow = $("<tr>");
var cols = "";
Expand All @@ -32,42 +24,13 @@

var logTableContainer = document.getElementsByClassName("log-table-container")[0];
logTableContainer.scrollTop = logTableContainer.scrollHeight;
};

// por algum motivo a conexão websocket não foi realizada (o motivo principal é que ele ainda esta iniciando)

socket.onerror = function (error) {
//$.notify("erro ao me conectar no servidor websocket", "error");
ConnectWebSocketServer()
};

// conexão com o servidor foi fechada

socket.onclose = function () {
$.notify("a conexão com o servidor websocket foi fechada, agora não é mais possível atualizar o log.", "error");
};
}

// chama a função que inicia o servidor websocket, além de liberar o botão parar maturação

function StartLog() {
ConnectWebSocketServer();
$("#stopButton").prop("disabled", false);
}

// parar maturação

function StopMaturation() {
$("#stopButton").prop("disabled", true);
if (socket) {
socket.close();
}

let xhr = new XMLHttpRequest()
xhr.open("GET", "/api/stop-maturation", true)
xhr.send()
})}); 1 * 1000
})

}
// parar o aquecimento

$("#stopButton").click(StopMaturation);
$(document).ready(StartLog);
document.querySelector(".btn-danger").addEventListener("click", (el)=> {
el.target.disabled = true;
controller.stop_maturation();
})
7 changes: 6 additions & 1 deletion pages/updates.html
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,12 @@
</div>
<button class="btn btn-danger" id="stopButton">Parar</button>
</div>

<script src="qrc:///qtwebchannel/qwebchannel.js"></script>
<script>
var channel = new QWebChannel(qt.webChannelTransport, function(channel) {
window.controller = channel.objects.controller;
});
</script>
<script src="assets/js/ajax.googleapis.com_ajax_libs_jquery_1_jquery.js"></script>
<script src="assets/js/stackpath.bootstrapcdn.com_bootstrap_4.5.2_js_bootstrap.min.js"></script>
<script src="assets/js/notify.js"></script>
Expand Down
4 changes: 3 additions & 1 deletion scripts/send_message.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,6 @@
setTimeout(() => {
let SendButton = document.querySelector('[data-icon="send"]')
SendButton.click();
}, 500);
}, 500);

// eu ia mexer nesse script de envio para a mensagem ser enviada direto, mas desisti
4 changes: 2 additions & 2 deletions state.json
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
{
"ContinueOnBlock": true,
"ContinueOnBlock": false,
"MinimumMessageInterval": "67",
"MaximumMessageInterval": "90",
"ChangeAccountEveryMessages": "5",
"StopAfterMessages": "2",
"StopAfterMessages": "10",
"ShutdownAfterCompletion": false
}
Binary file removed websocket_server.exe
Binary file not shown.
53 changes: 0 additions & 53 deletions websocket_server.py

This file was deleted.

Loading

0 comments on commit 240e7d0

Please sign in to comment.