Страницы: 1
RSS
как из Excel запустить бат, который обращается к wget
 
здравствуйте. в консоли пытаюсь выполнить эту команду
Код
C:\abc\wget-1.20.3-win32\wget.exe -i c:\200\url-list.txt --secure-protocol=auto -nc -c -P c:\200\cba\

но не работает.пишет так
Код
Username/Password Authentication Failed.
--2019-06-11 14:24:47--  https://query1.finance.yahoo.com/v7/finance/download/AA
OI?period1=1519851600&period2=1551387600&interval=1d&events=history&crumb=ANSzWA
JVaFj
Reusing existing connection to query1.finance.yahoo.com:443.
HTTP request sent, awaiting response... 401 Unauthorized

по моему, причина в Internet Explorer. то есть если запускать ссылки с адресной строки браузера Internet Explorer, то начинаются переговоры: что вы хотите: открыть или сохранить. если сохранить то куда или как). если же эту ссылку открыть в Гугл Хром, то скачивается без разговору.
если ли возможность указать команде wget чтобы использовала гугл хром? или где то в реестре можно указать гугл хром по умолчанию? хотя гугл хром, как браузер по умолчанию, выбран и указан
и как, чтобы темка пожила, ко всему этому приплясать Excel)
 
artyrH, логи ясно дают понять, что нужно авторизоваться для начала.
Тема не ясна, вы хотите скачать файл посредством wget? Это можно сделать и без wget.
Или вы просто хотите разобраться во wget?

Цитата
artyrH написал:
Гугл Хром, то скачивается без разговору.
Это потому что в настройках хрома стоит по умолчанию папка и куда скачивать без спроса у пользователя, если отключить, то будет выводиться окно сохранения.
Цитата
artyrH написал:
если ли возможность указать команде wget чтобы использовала гугл хром?
Используйте CMD и хром, хрому можно указать ссылку для перехода.
 
Jungl, если надо авторизация, то как это в команде прописать? мне казалось, раз качается с браузера без авторизации, то и не нужна авторизация
Цитата
Jungl написал:
хотите скачать файл посредством wget? Это можно сделать и без wget
как без wget скачать - не знаю. про wget сегодня узнал здесь.  хотел бы узнать как скачать сразу несколько файлов. рассмотрел бы любые варианты
как в Explorer установить только скачать файл без открытия - не знаю
Цитата
Jungl написал:
Используйте CMD и хром, хрому можно указать ссылку для перехода
как это сделать - не знаю
 
Здравствуйте, коллеги! Обычная схема действий для вызова любых внешних программ:
  • Подбираем параметры для командной строки (в консоли). Параметры командной строки Chrome описаны во многих местах
  • Переносим в Excel. Можно, например, использовать эту  функцию.
Владимир
 
sokol92, здравствуйте. Вы все написали понятно, но мне не понятно как это сделать
вот так не сработало
Код
cd "C:\Program Files\Google\Chrome\Application"
C:\abc\wget-1.20.3-win32\wget.exe -i c:\200\url-list.txt --secure-protocol=auto -nc -c -P c:\200\cba\
 
Честно говоря, я не спец по Хрому :) . По совету коллеги из #2 пример закачки вложения из соседней темы (командная строка) через движок Хрома:
Код
curl "https://www.planetaexcel.ru/bitrix/components/bitrix/forum.interface/show_file.php?fid=346086&action=download" -s -L -o "C:\Temp\Пример.xlsx"
Владимир
 
Цитата
artyrH написал:
раз качается с браузера без авторизации, то и не нужна авторизация
Не совсем верно, эта авторизация у вас может сохраняться локально в виде кэша. Т.е., например, заходя на этот форум, вы же не используете каждый раз форму авторазиции?
Проверьте, откройте в браузере окно в режиме инкогнито и вставьте вашу ссылку в начале поста. У меня выдает
Код
"finance": {
        "error": {
            "code": "Unauthorized",
            "description": "Invalid cookie"
        }
    }
 
Цитата
Jungl написал:
окно в режиме инкогнито и вставьте вашу ссылку
да, Вы правы. выходит такой ответ
Код
{
    "finance": {
        "error": {
            "code": "Unauthorized",
            "description": "Invalid cookie"
        }
    }
}

получается, мне надо в Internet Explorer авторизоваться на яхоо и, скорее всего, начнет качаться без разговору. пойду проверять так ли это. так же попробую вариант от sokol92. здесь что то похожее, только я не понял что именно надо добавить  
 
ничего ни сработало. Internet Explorer вообще не может этот файл ни скачать, ни открыть. слов нет. мало того, открыл в браузере тему с planetaexcel.ru, у которой есть вложение. так и вложение .xlsx не могу скачать. вообще слов нет
как прописать, задать гугл хром?
Изменено: artyrH - 11.06.2019 19:27:04
 
для chrome есть ChromeDriver
Ставим SeleniumBase, в папку, куда установилось кидаем ChromeDriver.exe отсюда
код из примеров в папке Examples с Selenium
Код
Private Sub Download_File_Chrome()
  Dim driver As New ChromeDriver, file As String
  
  'Set the preferences specific to Chrome
  driver.SetPreference "download.default_directory", ThisWorkbook.Path & "\"
  driver.SetPreference "download.directory_upgrade", True
  driver.SetPreference "download.prompt_for_download", False
  driver.SetPreference "plugins.plugins_disabled", Array("Chrome PDF Viewer")
  driver.SetPreference "plugins.always_open_pdf_externally", True
  
  ' Init the file waiter
  WaitNewFile ThisWorkbook.Path & "\*.pdf"
  Dim s As New Selenium.By:
  Set s = New Selenium.By
  'Open the file for download
  driver.Get "https://www.mozilla.org/en-US/foundation/documents"
  driver.FindElementByLinkText("IRS Form 872-C").Click
    
  ' Waits for a new file
  file = WaitNewFile()
  
  'Stop the browser
  Debug.Assert 0
  driver.Quit
End Sub

''
' Waits for a new file to be created in a folder
' @folder {String}  Folder where the file will be created
' Usage:
'   WaitNewFile "C:\download\*.pdf"
'   ' The new file is created here
'   filename = WaitNewFile()
''
Public Function WaitNewFile(Optional target As String) As String
  Static files As Collection, filter$
  Dim file$, file_path$, i&
  If Len(target) Then
    ' Initialize the list of files and return
    filter = target
    Set files = New Collection
    file = Dir(filter, vbNormal)
    Do While Len(file)
      files.Add Empty, file
      file = Dir
    Loop
    Exit Function
  End If
  
  ' Waits for a file that is not in the list
  On Error GoTo WaitReady
  Do
    file = Dir(filter, vbNormal)
    Do While Len(file)
      files.Item file
      file = Dir
    Loop
    For i = 0 To 3000: DoEvents: Next
  Loop
  
WaitReady:
  ' Waits for the size to be superior to 0 and try to rename it
  file_path = Left$(filter, InStrRev(filter, "\")) & file
  Do
    If FileLen(file_path) Then
      On Error Resume Next
      Name file_path As file_path
      If Err = 0 Then Exit Do
    End If
    For i = 0 To 3000: DoEvents: Next
  Loop
  files.Add Empty, file
  WaitNewFile = file_path
End Function
 
Андрей Лящук, спасибо, только этот вариант для меня сложный. мне бы инструкцию на русском. как устанавливать? как пользоваться? где прописывать пути к файлу и папке?
 
Цитата
artyrH написал:
как устанавливать?
запустить установщик, Next отметить I accept aggreement, Next, Next,  смотрим Install folder (в эту папку нужно закинуть свежий Chromedriver), Install, Finish, закидываем в папку ChromeDriver. Готово
В vba нужно добавлять в проекте референс к Selenium (Tools>References отметить галочкой Selenium type library)
по поводу документации, с ней непросто вот перевод официальной документации
Здесь туториалы на английском
в папке с Selenium есть куча примеров кодов
Изменено: Андрей Лящук - 13.11.2019 01:04:34 (заменил ссылку на перевод докуметации)
 
Цитата
Андрей Лящук
А Вы сами код проверяли?
Драйвер для хрома работает с версиями 71-75, сейчас 80 -я .Лису и оперу не видит в реестре.Только с ишаком работает.
 
doober, тот, который написан в посте - однозначно да, и он работал. Файл Examples.xlsm выложил "as is" из папки Selenium Basic, для ознакомления. То, что не указал, что для разных версий хрома свой драйвер - мое упущение. Сейчас есть 81-я Beta, и, в том числе, для нее есть свой ChromeDriver тут
 
Спасибо, попробую
 
Почитал:
What is Selenium
Using Excel VBA and Selenium

Пока не понял насколько это работоспособно на VBA/переносимо на клиент. Смущает установка доп. ПО, а не просто подключаемая библиотека. Как это все ставится без админа и т.д.
Можно, конечно глянуть сырцы и возможно собрать свою СОМ.DLL без GUI, .exe, только с нужным функционалом получить строку для дальнейшего парсинга из Chrome воспользоватся, возможно, уже имеющимся решением и не перебирать велосипед.
«Бритва Оккама» или «Принцип Калашникова»?
 
нашел я тут Selenium.WebDriver.3.141.0
Извлек папки из \lib в %Appdata%\WebDriver Chromedriver.exe лежит в %windir%\system32  в Application.Path лежит excel.exe.config с содержимым
Код
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="0"/>
  </startup>
</configuration>



модуль utils
Код
Const NetRef = False
Const NetVer = "0"

Option Explicit

Private Sub auto_close()
    Dim b As Boolean
    With ThisWorkbook
        b = .Saved
        SetConst "NetRef", False
        SetConst "NetVer", """0"""
        On Error Resume Next
        With .VBProject.References
            .Remove .Item("mscoree")
            .Remove .Item("mscorlib")
        End With
        If b Then .Save
    End With
End Sub

Private Function netdll() As String
    Dim ver$
    ver = "net" & Mid(Replace(NetVersion, ".", ""), 2, 2)
    netdll = Environ("appdata") & "\Webdriver\" & ver & "\WebDriver.dll"
End Function

Function CreateObject2(typeName As String) As Object
    If Not NetRef Then
        AddNetRef
    End If
    On Error Resume Next
    Set CreateObject2 = Application.Run("NetLib.Wrapper", netdll, typeName)
End Function

Private Function NetVersion$()
    Const HKEY_LOCAL_MACHINE = &H80000002
    Dim ver$, arrSubKeys As Variant
    If Not NetRef Then
        With GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\default:StdRegProv")
            .EnumKey HKEY_LOCAL_MACHINE, "SOFTWARE\Microsoft\.NETFramework", arrSubKeys
            arrSubKeys = Filter(arrSubKeys, "v", 1, vbTextCompare)
            ver = arrSubKeys(UBound(arrSubKeys))
            SetConst "NetVer", """" & ver & """"
        End With
    Else
        ver = NetVer
    End If
    NetVersion = ver
End Function

Private Sub AddNetRef()
    #If Win64 Then
        Const s$ = "64"
    #Else
        Const s$ = ""
    #End If
    Dim sNetFWDir$, iRefCount%
    sNetFWDir = Environ("windir") & "\Microsoft.NET\Framework" & s & "\" & NetVersion
    On Error Resume Next
    With ThisWorkbook.VBProject.References
        .Remove .Item("mscoree"): .Remove .Item("mscorlib")
        iRefCount = .Count
        .AddFromFile sNetFWDir & "\mscoree.tlb": .AddFromFile sNetFWDir & "\mscorlib.tlb"
        If .Count - iRefCount = 2 Then SetConst "NetRef", True
    End With
End Sub

Private Sub SetConst(ByVal sName$, ByVal v)
    Dim lineNum&, newLine$
    newLine = "Const " & sName & " = " & v
    With ThisWorkbook.VBProject.VBComponents("utils").CodeModule
        If .Find(sName, lineNum, 7, .CountOfDeclarationLines, 7 + Len(sName), 1, 1) Then
            .ReplaceLine lineNum, newLine
        Else
            .InsertLines 1, newLine
        End If
    End With
End Sub

Модуль NetLib
Код
Function Wrapper(netdll As String, typeName As String) As Object
    On Error Resume Next
    Static domain As mscorlib.AppDomain
    If domain Is Nothing Then
        Dim host As New mscoree.CorRuntimeHost
        host.Start
        host.GetDefaultDomain domain
    End If
    Set Wrapper = domain.CreateInstanceFrom(netdll, typeName).Unwrap
End Function


Код
Private Sub test_Chrome()
    Set driver = CreateObject2("OpenQA.Selenium.Chrome.ChromeDriver")
    driver.Navigate().GoToUrl "https://google.co.uk"
    driver.Quit
End Sub

Полет нормальный
Изменено: Андрей Лящук - 18.03.2020 22:32:45
 
Цитата
bedvit написал:
Пока не понял насколько это работоспособно на VBA/переносимо на клиент. Смущает установка доп. ПО, а не просто подключаемая библиотека. Как это все ставится без админа и т.д.
На VBA все прекрасно работает, тестил на Google Chrome. Доп. ПО и нужно чтобы работала данная библиотека. На работе нет прав админа - установилось без проблем. В папку User/имя пользователя и т.д.
Страницы: 1
Наверх