ImageSearch

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Curbani
Posts: 12
Joined: 30 Jun 2020, 12:28

ImageSearch

Post by Curbani » 11 Mar 2021, 08:47

Estou criando um Replicador de Mensagens no Whatsapp. Eles consiste em encaminhar todas mensagens de um Grupo Fixado no Whatsapp Web (aplicativo Desktop) e encaminhar para outro grupo fixado. Não estou conseguindo evoluir. No momento o script já consegue identificar se chegou novas mensagens, abrir o grupo e selecionar o menu encaminhar. O próximo passo seria selecionar as Captchas das novas mensagens que estão abaixo de um comando "ImageSeach", que busca a imagem de "1 Mensagem Não Lida" ou "2 Mensagens Não Lidas" etc.

Vou deixar marcado em negrito a parte que ele não consegue selecionar apenas as Captchas. Detalhe, o script marca apenas uma Captcha acima da imagem (1 Mensagem Não Lida). Como faço para ele marcar TODAS abaixo da imagem, podendo ou não ter mais de uma mensagem.

Code: Select all

#IfWinActive WhatsApp

=::

Loop
{

MouseMove, 353, 190 ; Posição da bolinha verde de notificação
MouseGetPos, Pos_X, Pos_Y
Sleep, 500	
PixelSearch, PosX, PosY, 353, 190, 0, 0, 0x00AF9C, 1, RGB ; Cor da bolinha verde que muda em cada monitor
If (ErrorLevel = 0)
	{
	Sleep, 3000
	MouseClick, left, 353, 190 ; Caso tenha notificação vai abrir a conversa
	Sleep, 1000
	MouseClick, left, 1337, 62 ; Abrir Opções
	Sleep, 200
	MouseClick, left, 1203, 162 ; Selecionar Mensagens
	CoordMode, Pixel, Screen ;
	ImageSearch, Pos_Primeira_X, Pos_Primeira_Y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/mensagem nao lida.png ; Procurando onde a imagem de informação que existe uma nova mesnsagem, mudar apenas o nome do arquivo .png
	Sleep, 2000
	CoordMode, Pixel, Screen ;
	ImageSearch, Pos_Segunda_X, Pos_Segunda_Y, 0, %Pos_Primeira_Y%/caixa de envio.png ; Procurando a caixa de envio para selecionar a mensagem, mudar apenas o nome do arquivo .png
	Sleep, 3000
	MouseClick, left, Pos_Segunda_X, Pos_Segunda_Y ; Vai clicar na Caixa de Envio.
	Sleep, 500
}
}

Return

F12::
	Pause
Return	
Attachments
image.png
image.png (935 Bytes) Viewed 895 times
mensagem nao lida.png
mensagem nao lida.png (935 Bytes) Viewed 895 times

Curbani
Posts: 12
Joined: 30 Jun 2020, 12:28

Re: ImageSeach

Post by Curbani » 11 Mar 2021, 09:05

Mandei o anterior com uma falha. Segue correto!

Code: Select all

#IfWinActive WhatsApp

=::

Loop
{

MouseMove, 353, 190 ; Posição da bolinha verde de notificação
MouseGetPos, Pos_X, Pos_Y
Sleep, 500	
PixelSearch, PosX, PosY, 353, 190, 0, 0, 0x00AF9C, 1, RGB ; Cor da bolinha verde que muda em cada monitor
If (ErrorLevel = 0)
	{
	Sleep, 3000
	MouseClick, left, 353, 190 ; Caso tenha notificação vai abrir a conversa
	Sleep, 1000
	MouseClick, left, 1337, 62 ; Abrir Opções
	Sleep, 200
	MouseClick, left, 1203, 162 ; Selecionar Mensagens
	CoordMode, Pixel, Screen ;
	ImageSearch, Pos_Primeira_X, Pos_Primeira_Y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/mensagem nao lida.png ; Procurando onde a imagem de informação que existe uma nova mesnsagem, mudar apenas o nome do arquivo .png
	Sleep, 2000
	CoordMode, Pixel, Screen ;
	ImageSearch, Pos_Segunda_X, Pos_Segunda_Y, 0, %Pos_Primeira_Y%, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/caixa de envio.png ; Procurando a caixa de envio para selecionar a mensagem, mudar apenas o nome do arquivo .png
	Sleep, 3000
	MouseClick, left, Pos_Segunda_X, Pos_Segunda_Y ; Vai clicar na Caixa de Envio.
	Sleep, 500
}
}

Return

F12::
	Pause
Return	

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: ImageSeach

Post by Gio » 12 Mar 2021, 08:50

Bom dia Curbani.

Eu não entendi o que você quiz dizer com "as captchas". Captchas são aqueles testes anti-robô onde você tem que clicar em um quadrado e depois selecionar as figuras que se assemelham a uma descrição (tal como o ReCaptcha do Google). Foi isso mesmo que você quiz dizer?

Também existe a palavra inglesa caption, que significa título, descrição, etc.

Curbani
Posts: 12
Joined: 30 Jun 2020, 12:28

Re: ImageSeach

Post by Curbani » 12 Mar 2021, 09:08

Eu quis dizer aqueles quadradinhos para selecionar a mensagem que você quer mandar! Me expressei mal!

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: ImageSeach

Post by Gio » 12 Mar 2021, 10:02

Ah sim. Aquilo se chama checkbox. Temos esse controle disponível nas GUIs padrão do AutoHotkey também.

:arrow: Quando você roda um ImageSearch, ele te devolve as coordenadas do ponto onde a imagem foi localizada (do pixel mais superior-esquerdo da imagem). Então, o que você tem que fazer é que um segundo (ou terceiro, etc) imagesearch busque apenas numa área que esteja DEPOIS desse ponto.

Por exemplo, suponhamos que você rode um imagesearch na tela inteira (ou seja, de x0 y0 até x1920 y1080 em uma tela FullHD, por exemplo) e ele localize uma imagem nas coordenadas x200 y350. Suponhamos também que a imagem tenha as dimensões de w100 h50. Então neste caso, para pesquisar com um segundo ImageSearch ABAIXO dessa imagem, por exemplo, você vai alterar a área de busca para: de x0 y400 até x1920 y1080. Ao fazer isso, torna-se impossível ao script achar de novo a imagem que está em x200 y350, então agora ele achará qualquer imagem que esteja abaixo dela.

Algumas perguntas e Respotas da explicação acima:
1. O que é w e h?
São Widthe Height, Largura e Altura de uma imagem (em pixels) respectivamente.

2. O que é x e y?
São as coordenadas horizontal da esquerda para a direita e vertical de cima para baixo respectivamente.

3. Porque somente o y inicial da área de busca foi alterado adicionando a altura da imagem?
Porque essa é a lógica para procurar ABAIXO, afinal, se alterar o x também, vai procurar MAIS À DIREITA da primeira imagem, e queremos apenas procurar ABAIXO.

Exemplo:

Code: Select all

; Exemplo para procurar 3 imagens iguais, sendo que sabemos que a segunda estará necessariamente ABAIXO da primeira e a terceira abaixo das duas primeiras.
; A imagem exemplo possui as dimensões 100x50
ImageSearch, PosX_1, PosY_1, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, C:/teste/imagemteste.png

NOVA_POSICAO_INICIAL_Y := PosY_1 + 50 ; Recalculamos o Y inicial da área de busca com o Y onde a imagem 1 foi localizada adicionado à altura da imagem.
ImageSearch, PosX_2, PosY_2, 0, %NOVA_POSICAO_INICIAL_Y%, %A_ScreenWidth%, %A_ScreenHeight%, C:/teste/imagemteste.png ; E assim procuramos a SEGUNDA imagem

NOVA_POSICAO_INICIAL_Y := PosY_2 + 50 ; Recalculamos o Y inicial da área de busca com o Y onde a imagem 2 foi localizada adicionado à altura da imagem.
ImageSearch, PosX_2, PosY_2, 0, %NOVA_POSICAO_INICIAL_Y%, %A_ScreenWidth%, %A_ScreenHeight%, C:/teste/imagemteste.png ; E assim procuramos a TERCEIRA imagem

Curbani
Posts: 12
Joined: 30 Jun 2020, 12:28

Re: ImageSeach

Post by Curbani » 12 Mar 2021, 11:27

@Gio ,eu fiz exatamente o que você exemplificou, porém continua do mesmo jeito! Consigo contato com você fora do Forum para resolver essa questão e quando resolvido posto o resultado aqui?

Code: Select all

#IfWinActive WhatsApp

=::

Loop
{

MouseMove, 353, 190 ; Posição da bolinha verde de notificação
MouseGetPos, Pos_X, Pos_Y
Sleep, 500	
PixelSearch, PosX, PosY, 353, 190, 0, 0, 0x00AF9C, 1, RGB ; Cor da bolinha verde que muda em cada monitor
If (ErrorLevel = 0)
	{
	Sleep, 3000
	MouseClick, left, 353, 190 ; Caso tenha notificação vai abrir a conversa
	Sleep, 1000
	MouseClick, left, 1337, 62 ; Abrir Opções
	Sleep, 200
	MouseClick, left, 1203, 162 ; Selecionar Mensagens
	CoordMode, Pixel, Screen ;
	ImageSearch, Pos_Primeira_X, Pos_Primeira_Y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/1 mensagem.png ; Procurando onde a imagem de informação que existe uma nova mesnsagem, mudar apenas o nome do arquivo .png
	Sleep, 2000
	ImageSearch, Pos_Segunda_X, Pos_Segunda_Y, 0, %Pos_Primeira_Certo_Y%, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/caixa de envio.png ; Procurando a caixa de envio para selecionar a mensagem, mudar apenas o nome do arquivo .png
	Sleep, 3000
	MouseClick, left, Pos_Segunda_X, Pos_Segunda_Y ; Vai clicar na Caixa de Envio.
	Sleep, 5000
}
}

	Pos_Primeira_Certo_Y := Pos_Primeira_Y + 52 ; Recalculando Y inicial da área de busca com o Y onde a imagem 1 foi localizada adicionado 52 altura da imagem.
	
Return

F12::
	Pause
Return	

Curbani
Posts: 12
Joined: 30 Jun 2020, 12:28

Re: ImageSearch

Post by Curbani » 17 Mar 2021, 14:17

Aguardando retorno! Ainda não consegui finalizar esse projeto!

User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: ImageSearch

Post by Gio » 18 Mar 2021, 09:25

Bom dia Curbani.

Não entendi seu código. Ao meu ver, o cálculo da nova posição devia ser após o imagesearch e não após a rotina inteira.

Não tenho como testar um código pois não uso WhatsApp web, mas creio que a escrita da rotina seria mais ou menos assim:

Code: Select all

#IfWinActive WhatsApp

=::

Loop
{
	MouseMove, 353, 190 ; Posição da bolinha verde de notificação
	MouseGetPos, Pos_X, Pos_Y
	Sleep, 500	
	PixelSearch, PosX, PosY, 353, 190, 0, 0, 0x00AF9C, 1, RGB ; Cor da bolinha verde que muda em cada monitor
	If (ErrorLevel = 0)
	{
		Sleep, 3000
		MouseClick, left, 353, 190 ; Caso tenha notificação vai abrir a conversa
		Sleep, 1000
		MouseClick, left, 1337, 62 ; Abrir Opções
		Sleep, 200
		MouseClick, left, 1203, 162 ; Selecionar Mensagens
		CoordMode, Pixel, Screen ;
		ImageSearch, Pos_Primeira_X, Pos_Primeira_Y, 0, 0, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/1 mensagem.png ; Procurando onde a imagem de informação que existe uma nova mesnsagem, mudar apenas o nome do arquivo .png
		If (ErrorLevel = 0) ; Se existir essa informação de que há mensagens novas...
		{
			Sleep, 2000
			Pos_Primeira_Certo_Y := Pos_Primeira_Y + 52 ; Calculamos um ponto 52 pixels abaixo para iniciar a busca pelos checkboxes checkbox
			Loop 10 ; Para procurar até 10 mensagens novas (Este código pode ser atualizado para procurar um número indefinido de imagens)
			{
				ImageSearch, Pos_Segunda_X, Pos_Segunda_Y, 0, %Pos_Primeira_Certo_Y%, %A_ScreenWidth%, %A_ScreenHeight%, %A_ScriptDir%/caixa de envio.png ; Procurando a caixa de envio para selecionar a mensagem, mudar apenas o nome do arquivo .png
				If (ErrorLevel = 0)
				{
					Sleep, 3000
					MouseClick, left, Pos_Segunda_X, Pos_Segunda_Y ; Vai clicar na Caixa de Envio.
					Pos_Primeira_Certo_Y := Pos_Segunda_Y + 52
					Sleep, 5000
				}
			}
		}
	}
}

	
Return

F12::
	Pause
Return	

:arrow: Não sei o código acima vai funcionar de primeira, pois me baseei no que entendi do seu código, mas veja se consegue entender a lógica acima: Temos um ImageSearch que busca a informação de novas mensagens, CASO ele encontre, calcula a posição a partir de 52 pixels abaixo e depois procura naquela área pela checkbox. Caso encontre, clica nela e recalcula a posição para procurar de novo depois (loop) 52 pixels abaixo da posição anteriormente encontrada...

Caso não funcione, peço que tire um print (da sua tela inteira) da conversa quando as caixas de seleção (checkbox) estiverem visíveis e poste aqui.

Post Reply

Return to “Ajuda e Suporte Geral”