Страницы: 1
RSS
Получение куков из уже залогиненного в Хроме сайта
 
Добрый день!

подскажите возможно ли получить значение куки из уже залогиненного в хроме сайта?

авторизоваться силами vba не вариант, т.к. происходит через госуслуги, очень заморочено. По итогу авторизации выдаётся токен. его значение можно легко увидеть по ссылке вида chrome://settings/cookies/detail?site=адрес_сайта. Можно было бы спарсить открывающуюся по этой ссылке страницу, но я не знаю как её открыть средствами VBA. с помощью WinHttp.WinHttpRequest.5.1 не получается.
не получается открыть и таким образом - CreateObject("WScript.Shell").Run "chrome://settings/cookies/detail?site=адрес_сайта"
можно было бы вытащить эту куку из файла с куками расположенного по C:\Users\username\AppData\Local\Google\Chrome\username\Default­\cookies, но там всё толи зашифровано, толи я с кодировкой разобраться не могу. в общем тоже не получается.

getAllResponseHeaders() не помогает, т.к. нет залогинивания, да и в респонсе нет куков. они только в реквесте
 
Через Chrome - никак, или очень сложно
Если же использовать IE, то оттуда легко взять куки как с открытой страницы (1 строка кода), так и из файлов cookie (20 строк кода)
В большинстве случаев достаточно взять cookie из документа:
Цитата
res = IE.document.Cookie

Из файлов Cookie взять данные посложнее, примерно так:
Код
Function GetIECookiesFromFiles(ByVal domain$, Optional Apply As Boolean, Optional ExcludeUseless As Boolean) As String
    On Error Resume Next
    Dim sCookiesPath$, oCookies As Object, oFSO As Object, oFolder As Object, oFile
    Dim sContent As String, a() As String, i As Long, aItems, aCookies()
    
    ' read IE cookie files
    sCookiesPath = CreateObject("shell.application").Namespace("shell:Cookies").self.path
    Set oCookies = CreateObject("Scripting.Dictionary")
    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = oFSO.GetFolder(sCookiesPath)
    For Each oFile In oFolder.files
        If LCase(oFSO.GetExtensionName(oFile.Name)) = "txt" Then
            With oFile.OpenAsTextStream(1, 0) ' read-only, ascii
                sContent = .ReadAll
                .Close
            End With
            sContent = Replace(sContent, vbCr, "")
            ' split cookies within file
            a = Split(sContent, vbLf & "*" & vbLf)
            For i = 0 To UBound(a) - 1
                If InStr(1, a(i), domain$, vbTextCompare) > 0 Then oCookies.Add oCookies.Count, a(i)
            Next
        End If
    Next
    
    ' parse data, repack to 2d array
    aItems = oCookies.Items()
    If UBound(aItems) = -1 Then Exit Function
    
    If CookiesStore Is Nothing Then Set CookiesStore = New Dictionary        ' глобальный словарь с cookies
    ReDim aCookies(1 To UBound(aItems) + 1, 1 To 6)
    Dim param_name$, param_value$, NewCookiesList$
    
    For i = 1 To UBound(aItems) + 1
        a = Split(aItems(i - 1), vbLf)
        aCookies(i, 1) = a(0)
        aCookies(i, 2) = a(1)
        aCookies(i, 3) = a(2)
        'aCookies(i, 4) = GetInetCookieFlags(a(3))
        'aCookies(i, 5) = ConvDT(a(4), a(5))
        'aCookies(i, 6) = ConvDT(a(6), a(7))
        
        
        param_name$ = "": param_value$ = ""
        param_name$ = a(0)
        param_value$ = a(1)
        
       ' If ExcludeUseless Then param_name$ = ExcludeUselessCookie(param_name$)        
        
        If Len(param_name$) Then
            NewCookiesList$ = NewCookiesList$ & IIf(NewCookiesList$ = "", "", vbLf) & param_name$
            GetIECookiesFromFiles = GetIECookiesFromFiles & IIf(GetIECookiesFromFiles = "", "", "; ") & param_name$ & "=" & param_value$
            
            If Apply Then CookiesStore.item(param_name$) = param_value$
           Debug.Print  "Set cookie from IE cookie file" & param_name$ & " = " & param_value$
        End If
    Next   
End Function
 
спасибо за ответ!

по пути C:\Users\имя_пользователя\AppData\Local\Microsoft\Windows\INet­Cookies  у меня нет куков. там только лежит файл "deprecated.cookie" весом 1 кб датированный концом прошлого года в котором одна запись - "Cookies are no longer stored in files.  Please use Internet*Cookie* APIs to access cookies."

актуальные куки у меня лежат по пути C:\Users\имя_пользователя\AppData\Local\Google\Chrome\username­\Default­\ там файл без расширения "Cookies"

подставляю его в вашу функцию. содержимое считывается но на этапе разделения a = Split(sContent, vbLf & "*" & vbLf) массив не набивается. не видит он такого разделителя.

во вложении кусок файла с нужной мне кукой "session" в непонятной мне кодировке. Есть ли возможность перевести её на человеческий язык (средствами VBA)?
Изменено: Максим - 01.03.2021 15:51:25
 
По-моему, такие вещи лучше через Python делать
 
Цитата
Максим написал:
По итогу авторизации выдаётся токен. его значение можно легко увидеть по ссылке вида chrome://settings/cookies/detail?site=адрес_сайта. Можно было бы спарсить открывающуюся по этой ссылке страницу, но я не знаю как её открыть средствами VBA.
Ну а в чем проблема? авторизуйтесь через chrome, а потом откройте еще одну вкладку с нужным вам адресом.
Браузером Chrome управлять умеете?
Изменено: Андрей_26 - 01.03.2021 16:39:31
 
это бесспорно..но я в питон вообще не умею.
нужно учиться. это тоже очевидно..
 
Андрей_26,

метод открытия сайта в хроме  - CreateObject("WScript.Shell").Run "адрес_сайта" работает с сайтами и не работает с адресом "chrome://settings/cookies/detail?site=адрес_сайта"
буду очень признателен если подскажете как средствами VBA открыть такого вида адрес
 
Для управления браузером Chrome необходимо установить Selenium WebDriver и скачать обновленный файл Chromedriver.exe, который закинуть в папку Selenium. Тогда браузером Chrome можно управлять как и IE. Только там свой API.
 
мне нужно чтобы макрос везде мог работать, без доустановки специфических плагинов
Страницы: 1
Наверх