Jump to content
Sign in to follow this  
Elias Assad Neto

Duvida IE.au3 Como preencher um Objeto INPUT do tipo file diretamente sem passar pela janela POPUP

Recommended Posts

Olá, a questão aqui é como fazer para preencher um Objeto INPUT do tipo File diretamente.

Se alguém souber como fazer isso agradeço muito.

 

Apos rodar o programa o INPUT "file" fica assim

@@ Debug(61) : $sFile = C:\fakepath\Teste.au3

 

O input "file" é somente leitura, e independente do Drive e caminho é sempre: C:\fakepath\

; O Exemplo abaixo é só para demostrar um script q já funciona e onde exatamente esta a parte q desejo mudar

; O Objetivo é conseguir passar o arquivo sem precisar abri a Janela POPUP quando se clica no [Procurar] do GoogleTranslate
; assim o procedimento pode ser feito em uma janela invisivel sem ficar aparecendo a janela POPUP mesmo q por uns ms


#include <IE.au3>

Global $LFrom = "auto" ; from Defalt Language (Detec language)
Global $LTo = "pt" ; to Defalt Language
Global $url_GoogleTranslateF = "https://translate.google.com.br/?tr=f#" & $LFrom & "/" & $LTo & "/" ; Translate from file, suport txt, doc.. etc.. returns UTF-8 in full IE window


Global $oIE = _IECreate($url_GoogleTranslateF)
If @error Then Exit
SetInputFileByName($oIE,"file",@ScriptFullPath) ; Aqui no Path do arquivo estou usando o proprio só como exemplo mas pode ser qualquer arquivo texto
; OBS se o arquivo não existir da erro
; O Tamanho do arquivo esta Limitado a 32KB, arquivos maiores tem a tradução truncada


Func SetInputFileByName($obj, $sname, $sPtah)
    Local $R
    Local $oFile = _IEGetObjById($obj, "file")
    If @error Then Return 0

    Local $sFile = _IEFormElementGetValue($oFile) ; Mostra valor do INPUT "file"
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sFile = ' & $sFile & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    ; === Essa Parte Abre a a janela POPUP para colocar o nome do arquivo.
    ;     Essa parte q quero fazer de uma forma q não abra a janela PopUp pedindo o arquivo
    Static $ClassFileUpload = StringFormat("DUIViewWndClassName\nDirectUIHWND\nCtrlNotifySink\nNamespaceTreeControl") ; Identify Window

    $R = _IEAction($oFile, "focus")
    If @error Then Return 0
    $hObj = _IEPropertyGet($obj, "hwnd")
    If @error Then Return 0
    $R = ControlSend($hObj, "", "Internet Explorer_Server1", " "); Envia um espaço, pois se clicar fica travado
    If $R <> 1 Then Return SetError($_IEStatus_NoMatch,0,0)
    Local $Ok = 0, $ti = TimerInit()
    Do ; Wait Window to Open
        Sleep(10)
        $S = WinGetClassList("[Active]", "")
        $Ok = StringInStr($S, $ClassFileUpload, 1) ; Janela PopUP para inserir o nome do arquivo de UpLoad
    Until $Ok = 1 Or TimerDiff($ti) > 5000 ; Timeout 5 Sec
    If $Ok = 0 Then Return SetError($_IESTATUS_LoadWaitTimeout, 0, 0) ; Error Janela não encontrada (Time Out)
    $hWnd = WinWaitActive("[Active]", "", 1) ; Window HWND
    If $hWnd = 0 Then Return SetError($_IEStatus_NoMatch,0,0)
    $R = ControlSetText($hWnd, "", "Edit1", $sPtah) ; ClassnameNN:  Edit1, Coloca o caminho do arquivo
    If $R <> 1 Then Return SetError($_IEStatus_NoMatch,0,0)
    $R = ControlClick($hWnd, "", "Button1") ; Clica no Botão [Abrir]
    If $R <> 1 Then Return SetError($_IEStatus_NoMatch,0,0)
        ;====================================================================
    
    Local $k = 0 ; leva um tempinho até o arquivo ser lido e o INPUT "file" ser preenchido
    Do
        $k +=1
        Sleep(100)
        $sFile = _IEFormElementGetValue($oFile) ; Mostra valor do INPUT "file"
    Until $sFile <> "" Or $k > 20 ; TimeOut 2 seg
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sFile = ' & $sFile & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console

    Return $R
EndFunc

 

Edited by Elias Assad Neto

Share this post


Link to post
Share on other sites

A intenção é somente traduzir mesmo?

 

Se sim, você pode enviar os arquivos no modo binário para o Google tradutor utilizando

 

_WinHttpSimpleRequest

 

e você terá a resposta do arquivo já traduzido.

  • Like 1

Share this post


Link to post
Share on other sites

Olá Elias.

 

Vc está tentando traduzir algo através do formulário padrão, onde é solicitado arquivo a ser traduzido.

 

Imagino que haja uma página ou um parâmetro onde vc possa informar diretamente o "input file".

Share this post


Link to post
Share on other sites

A intenção é somente traduzir mesmo?

 

Se sim, você pode enviar os arquivos no modo binário para o Google tradutor utilizando

 

_WinHttpSimpleRequest

 

e você terá a resposta do arquivo já traduzido.

 

Esse meu código faz parte de um programa q fiz para traduzir legendas de filmes em ".srt"

 

O Codigo inteiro é bem mais complicado pq eu removo as marcações de tempo e depois reconstituo mesmas na tradução

alem de q ele quebra o arquivo em blocos com menos de 32KB quando necessário,

 

 

Tem um exemplo de como fazer isso enviando texto grande tipo 32KB para o Google e recebendo a tradução?

 

pq só por essa dica a coisa complica bastante?

Share this post


Link to post
Share on other sites

Olá Elias.

 

Vc está tentando traduzir algo através do formulário padrão, onde é solicitado arquivo a ser traduzido.

 

Imagino que haja uma página ou um parâmetro onde vc possa informar diretamente o "input file".

 

Olá

o Objeto INPUT do tipo "file" não aceita ser escrito o valor .Value

 

talvez com a informação aqui de para descobrir como fazer

 

input type=file element | input type=file object

https://msdn.microsoft.com/pt-br/library/windows/apps/hh466145.aspx

Share this post


Link to post
Share on other sites

Tem sim, o API do google tradutor, porém no modo gratuito, tem algumas limitações...

 

https://cloud.google.com/translate/pricing

 

O lance desse é o TRYIT FREE

 

para mim não compensa , já esta funcionando legal assim apesar da janela popup

 

mas o mais importante mesmo é saber como usar o elemento file, pq eu faço automação e não é só para o google isso pode ter outros casos q eu preciso usar

ainda não aconteceu mas quando acontecer quero estar preparado

 

 

Share this post


Link to post
Share on other sites

Tem um exemplo de como fazer isso enviando texto grande tipo 32KB para o Google e recebendo a tradução?

 

pq só por essa dica a coisa complica bastante?

 

#include "WinHttp.au3"
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>



$fileStream = @ScriptDir & '\Ex.Machina.2015.720p.BluRay.x264-WiKi.en.txt' ;usei uma legenda maior que os 32kbytes

$fileStreamReady = @ScriptDir & '\arquivo_traduzido.txt'

$sResponseTranslated = TranslateThisFile($fileStream) ;string contem arquivo já traduzido

saveTranslateFile($sResponseTranslated) ;salvar o arquivo traduzido

Func saveTranslateFile($sTranslateMessage)
    If Not FileWrite($fileStreamReady, $sTranslateMessage) Then
        MsgBox($MB_SYSTEMMODAL, "", "Erro ao salvar arquivo traduzido")
    Else
        MsgBox($MB_SYSTEMMODAL, "", "arquivo traduzido salvo com sucesso " & $fileStreamReady)
    EndIf
EndFunc   ;==>saveTranslateFile



Func TranslateThisFile($fileStream)
    Global $hOpen = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36")
    Local $googleTranslateForm = '<form id="gt-form" action="https://translate.googleusercontent.com/translate_f" name="text_form" method="post" enctype="multipart/form-data">' & _

Obs: Ficou uns erros de semântica no código, como por exemplo esse global redundante dentro da função local, mas é só arrumar ai, eu fiz na correria aqui esse código.

Exemplo_Autoit_&_google_Tradutor.zip

Exemplo_Autoit_&_google_Tradutor.zip

  • Like 2

Share this post


Link to post
Share on other sites
#include "WinHttp.au3"
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>



$fileStream = @ScriptDir & '\Ex.Machina.2015.720p.BluRay.x264-WiKi.en.txt' ;usei uma legenda maior que os 32kbytes

$fileStreamReady = @ScriptDir & '\arquivo_traduzido.txt'

$sResponseTranslated = TranslateThisFile($fileStream) ;string contem arquivo já traduzido

saveTranslateFile($sResponseTranslated) ;salvar o arquivo traduzido

Func saveTranslateFile($sTranslateMessage)
    If Not FileWrite($fileStreamReady, $sTranslateMessage) Then
        MsgBox($MB_SYSTEMMODAL, "", "Erro ao salvar arquivo traduzido")
    Else
        MsgBox($MB_SYSTEMMODAL, "", "arquivo traduzido salvo com sucesso " & $fileStreamReady)
    EndIf
EndFunc   ;==>saveTranslateFile



Func TranslateThisFile($fileStream)
    Global $hOpen = _WinHttpOpen("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36")
    Local $googleTranslateForm = '<form id="gt-form" action="https://translate.googleusercontent.com/translate_f" name="text_form" method="post" enctype="multipart/form-data">' & _

 

Valeu Obrigado

Share this post


Link to post
Share on other sites

Uma coisa importante aqui é converter as Entidades, nnn; nn; e &aaa; para os respectivos carácteres

Acredito q deve ter uma chamada de DLL para isso mas não achei

 

Tem um Script q faz isso mas achei muito ineficiente então fiz outro baseado nesse q vou colocar aqui no tópico

visto q quando se extrai o texto de um HTML haverá Entidades principalmente dos caracteres acentuados e alguns símbolos

 

Nesse Include tem duas Func

_HTMLExtracText($text [, $flg]) Que extrai todo o texto eliminando as tags (ele ja chama o _HTMLEntityNDecod no final)

 

_HTMLEntityNDecode($text) Que converte todas as entidades para os respectivos caracteres

 

Pagina onde se encontra o Script q usei como base para fazer a Func _HTMLEntityNDecode($text)

https://www.autoitscript.com/forum/topic/51084-html-entity-udf/

 

 

Abaixo o Script q Fiz

#include-once

;============================================================
;
; Autor Elias Assad Neto
;
; 3/abr/2017
;
;
;============================================================


Func _HTMLExtracText($sHTML, $flg = 0)  ; Extrai texto de HTML removendo todas as TAGs
    Local $xdSPC = " +"                 ; BitAnd(flg,1) = 0 Substitue multiplos espaços por 1 espaço
    If BitAND($flg,1) Then $xdSPC = ""  ; Não elilina espaços multiplos por apenas um espaço
    Local $xoTD = " ", $xcTD = ""       ; BitAnd(flg,2) = 0 Separa intens de tabelas com 1 espaço antes de cada item
    If BitAND($flg,2) Then Local $xoTD = "[", $xcTD = "]"   ; Separa linhas tabelas com [xxxx][xxxx][xxxx]

    Local $aRER[][2] = [ _
    ["(?i)(.*<body[^>]*?>)(.*?)(</body>.*)","\2"], _    ; Pega somente o corpo da mensagem
    ["(?ms)^\s+|\s*[\r\n]+|",""], _                     ; Trim espaços antes e depois e Elimina todas as mudanças de linha
    ["(?ms) " & $xdSPC," "], _                                  ; Elimina todos os expaços multiplos
    ["(?i)<head[^>]*?>.*?</head>",""], _                ; Remove invisible content
    ["(?i)<style[^>]*?>.*?</style>",""], _
    ["(?i)<script[^>]*?.*?</script>",""], _
    ["(?i)<object[^>]*?.*?</object>",""], _
    ["(?i)<embed[^>]*?.*?</embed>",""], _
    ["(?i)<applet[^>]*?.*?</applet>",""], _
    ["(?i)<noframes[^>]*?.*?</noframes>",""], _
    ["(?i)<noscript[^>]*?.*?</noscript>",""], _
    ["(?i)<noembed[^>]*?.*?</noembed>",""], _
    ["(?i)</?((div)|(h[1-9])|(ins)|(isindex)|(p)|(pre))[^>]*>",@CRLF], _
    ["(?i)</?((form)|(button)|(fieldset)|(legend)|(input))[^>]*>",""], _
    ["(?i)</?((address)|(blockquote)|(center)|(del))[^>]*>",@CRLF], _
    ["(?i)</?((dir)|(dl)|(dt)|(dd)|(li)|(menu)|(ol)|(ul))[^>]*>",@CRLF], _
    ["(?i)</?((table)|(th)|(caption))[^>]*>",@CRLF], _
    ["(?i)<((tr)|(img))[^>]*>",""], _
    ["(?i)</((tr)|(img))[^>]*>",@CRLF], _
    ["(?i)<(td)[^>]*>",$xoTD], _
    ["(?i)</(td)[^>]*>",$xcTD], _
    ["(?i)</?((label)|(select)|(optgroup)|(option)|(textarea))[^>]*>",@CRLF], _
    ["(?i)</?((frameset)|(frame)|(iframe))[^>]*>",@CRLF], _
    ["(?i)(<((span)|(a))[^>]*>)+"," "], _               ; Sequencias de "span" e "a" substitue por um unico spaço
    ["(?i)</((span)|(a))[^>]*>",""], _
    ["(?i)<((br)|(hr))[^>]*>",@CRLF], _                 ; Substitue quebras de linha por CRLF
    ["<[^>]*>",""], _                                   ; Elimina Tudo mais q não foi pego acima
    ["(?m)^(     +)","     "], _                        ; Remove exesso de espaços antes
    [" *\r\n",@CRLF], _                                 ; Remove espaços depois
    ["(\r\n){3,}",@CRLF &@CRLF &@CRLF] _                ; Remove excesso de linhas em brabco
    ]

    Local $s = $sHTML

    $x = ""
    For $i=0 To UBound($aRER)-1
        If $i > 11 Then
            ;$x = " (" & StringRegExpReplace($aRER[$i][0],"[^\w\|]","") & ")"
            $s = StringRegExpReplace($s,$aRER[$i][0], $x & $aRER[$i][1])
        Else
            $s = StringRegExpReplace($s,$aRER[$i][0],$aRER[$i][1])
        EndIf
    Next
    Return _HTMLEntityNDecode($s) ; Decodifica as entidades no texto
EndFunc

Func _HTMLEntityNDecode($Text) ; Implemantação Elias
    Local $amp = Chr(1) ; Caracter de susbtituição das Entidades & , & e & No Final é restaurada a "&" para evitar substituição dupla em casos especiais
    $Text = StringRegExpReplace($Text,"&|&|&",$amp) ; Isso evita converter casos como &amp; ou  amp; para && que tem q resultar como &

    Local $aX = StringRegExp($Text,"?\d+;",3) ; Pega todos as Entidades do tipo nn; e nnn;
    Local $aE = StringRegExp($Text,"&[A-Za-z\d]{2,6};",3) ; Pega todos as Entidades do tipo &lll;
    Local $sX, $sE
    For $i=0 to UBound($aX)-1 ; Cria String Unico das Entidades nnn; e nn;
        If StringInStr($sX, $aX[$i],1,1) = 0 Then $sX &= $aX[$i] & @LF
    Next
    For $i=0 to UBound($aE)-1 ; Cria String Unico das Entidades &lll;
        If StringInStr($sE, $aE[$i],1,1) = 0 Then $sE &= $aE[$i] & @LF
    Next

    If $sX <> "" Then ; Substitue todas as ocorrencias nn; e nnn;
        $aX = StringSplit($sX,@LF,3) ; Cria array das Entidades nnn; e nn; a serem substituidas
        For $i=0 to UBound($aX)-2 ; (-2) pq ultima entrada esta em branco, Substitue todas as ocorrencias nn; e nnn;
            If StringLeft($aX[$i], 3) = "" Then
                ;Check for Dec/Hex variations... HEX is with x.
                Local $strHex = StringTrimRight(StringTrimLeft($aX[$i], 3),1)
                $Text = StringReplace($Text,$aX[$i],ChrW(Dec($strHex)),0,1)
            Else
                Local $strDec = StringTrimRight(StringTrimLeft($aX[$i], 2),1)
                $Text = StringReplace($Text,$aX[$i],ChrW($strDec),0,1)
            EndIf
        Next
    EndIf

    If $sE <> "" Then
        $aE = StringSplit($sE,@LF,3) ; Cria array das Entidades &lll; a serem substituidas
        If UBound($aE) > 1 Then
            Static $sT = _  ; Lista &Entidade;=nnn onde nnn é o AscW da Entidade
            "&=38 =160¡=161¢=162£=163¤=164¥=165¦=166§=167¨=168©=169ª=170«=171¬=172­=173" & _
            "®=174¯=175°=176±=177²=178³=179´=180µ=181¶=182·=183¸=184¹=185º=186»=187¼=188" & _
            "½=189¾=190¿=191À=192Á=193Â=194Ã=195Ä=196Å=197Æ=198Ç=199È=200É=201" & _
            "Ê=202Ë=203Ì=204Í=205Î=206Ï=207Ð=208Ñ=209Ò=210Ó=211Ô=212Õ=213Ö=214×=215" & _
            "Ø=216Ù=217Ú=218Û=219Ü=220Ý=221Þ=222ß=223à=224á=225â=226ã=227ä=228" & _
            "å=229æ=230ç=231è=232é=233ê=234ë=235ì=236í=237î=238ï=239ð=240ñ=241ò=242" & _
            "ó=243ô=244õ=245ö=246÷=247ø=248ù=249ú=250û=251ü=252ý=253þ=254ÿ=255"=34" & _
            "'=39<=60>=62"

            For $i=0 to UBound($aE)-2 ;(-2) pq ultima entrada esta em branco, Substitue todas as ocorrencias &lll;
                Local $strDEC = StringRegExpReplace($sT,"(.*)(" & $aE[$i] & "=)(\d+)(.*)","\3",1) ; pega o valor da entidade, deferencia maiusculas e minusculas
                If @extended Then $Text = StringReplace($Text,$aE[$i],ChrW($strDec),0,1) ; Susbtitue todas as entidades desse tipo
            Next

        EndIf
    EndIf
    $Text = StringReplace($Text,$amp,"&",0,1) ; Restaura os "&" Originais convertidos nas primeiras linhas dessa Func
    Return $Text
EndFunc

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

×