Jump to content
Sign in to follow this  
4ggr35510n

FF.au3 -> getCookies

Recommended Posts

4ggr35510n

Two functions (but second is only operating on data returned by the first one) receiving cookies from Firefox.

Enjoy! Comments and feedback are welcome!

PS

FF.au3 required!

;; ======= ;;
;; EXAMPLE ;;
;; ======= ;;
#include <FF.au3>
#include <Array.au3>
_FFStart()
$cookie_name = _FFGetSingleCookie('ID', 'google')   ; receives single cookie - first one containing 'ID' (case sensitive!) in name, and 'google' in host
MsgBox(0, '', $cookie_name)

$COOKIE_ARRAY = _FFGetSingleCookie('id', '', True)  ; receives 3-elements array with cookie: name, value, host of a first cookie, where name contains 'id' (case sensitive!)
_ArrayDisplay($COOKIE_ARRAY)

$timer = TimerInit()
$global_cookie_array = _FFGetAllCookies()       ; returns all cookies in 2dimensional, 3column array with cookies NAME, VALUE and HOST
MsgBox(0, '', TimerDiff($timer))                ; as you can see it's pretty fast... BUT ArrayDisplaying is rather slow with many cookies...

_ArrayDisplay($global_cookie_array)
MsgBox(0, '', TimerDiff($timer) )
;; ======= ;;
;; ======= ;;

;===============================================================================
;
; Function Name:    _FFGetAllCookies
; Description::     Returns array with _ALL_ cookies
; Parameter(s):     - none -
; Requirement(s):   FF.au3
; Return Value(s):  On succes: 2-dimensional array with all cookies (column names:)
;                                                   NAME        VALUE       HOST
;                   On failure: '_FFCmdErr'
;
;===============================================================================
Func _FFGetAllCookies()
    ;~  © 4ggr35510n ©

    Local $aT, $aTA
    $sCS = _FFCmd("var cookiestring='';var cookieManager=Components.classes['@mozilla.org/cookiemanager;1'].getService(Components.interfaces.nsICookieMana"& _
    "ger);var iter=cookieManager.enumerator;while(iter.hasMoreElements()){var cookie=iter.getNext();if(cookie instanceof Components.interfaces.nsICookie){"& _
    "cookiestring+=cookie.name+'='+cookie.value+'='+cookie.host+';';}};cookiestring;")
    $aTA = StringSplit($sCS, ';')
    Local $aCA[$aTA[0]-1][3]
    For $i = 1 to $aTA[0] - 1
        $aT = StringSplit($aTA[$i], '=')
        $aCA[$i-1][0] = $aT[1]
        If $aT[0] > 3 Then  ; in case that cookie.value contains equals signs '=' [ it's more common then you think! ]
            For $j = 2 to $aT[0] - 1
                $aCA[$i-1][1] &= $aT[$j] & '='
            Next
            $aCA[$i-1][1] &= $aT[$aT[0]-1]
        Else
            $aCA[$i-1][1] &= $aT[2]
        EndIf
        $aCA[$i-1][2] = $aT[$aT[0]]
    Next
    Return $aCA

    ;~  © 4ggr35510n ©
EndFunc

;===============================================================================
;
; Function Name:    _FFGetSingleCookie
; Description::     Returns cookie with a given name
;
; Parameter(s):
;                   $sName  - Name of a cookie you want receive, used in StringRegExp as a pattern
;                   $sUrl   - Optional: (default = '') : url (host) of a cookie, used in StringRegExp as a pattern
;                   $iMode  - Optional: (Default = False) : determines is Return Value a string containing value of cookie, or 3-elements array containing
;                                                           name, value and host of a cookie
;                           | False - returns string (cookie.value)
;                           | True - returns array (cookie.name, cookie.value and cookie.host)
; Requirement(s):   FF.au3
; Return Value(s):  On succes: Cookie value or 3-elements array
;                   On failure (no cookie matches given sName and sUrl pattern): -1
;
;===============================================================================
Func _FFGetSingleCookie($sName, $sUrl = '', $iMode = False)
    ;~  © 4ggr35510n ©


    If $sURL = Default Then $sUrl = ''
    Local $aCA = _FFGetAllCookies()
    If $iMode Then
        Local $aOut[3]
    EndIf

    For $i = 0 To UBound($aCA) -1
        If StringRegExp($aCA[$i][0], $sName, 0) And StringRegExp($aCA[$i][2], $sURL, 0) Then
            Switch $iMode
                Case False
                    Return $aCA[$i][1]
                Case True
                    $aOut[0] = $aCA[$i][0]
                    $aOut[1] = $aCA[$i][1]
                    $aOut[2] = $aCA[$i][2]
                    Return $aOut
            EndSwitch
        EndIf
    Next

    Return -1

    ;~  © 4ggr35510n ©
EndFunc
Edited by 4ggr35510n

Share this post


Link to post
Share on other sites
Acanis

Hey, extreme usefull! :)

I added 2 functions to use this stuff to f.e. share sessions between FF and WinHttp.

;===============================================================================
; Function Name:    _FFGetCookie
; Description::     Returns string with the whole Cookie.
; Parameter(s):     $sUrl    -    URL of the target
; Requirement(s):   FF.au3
; Return Value(s):  On succes: String with the whole Cookie.
;                   On failure: '_FFCmdErr'
; Author :            Acanis @codebot.de
;===============================================================================
Func _FFGetCookie($sUrl)
    Local $aArray, $sString

    $aArray = _FFGetCookieGroup($sUrl)

    For $i = 0 To UBound($aArray) - 1
        $sString &= $aArray[$i][0] & "=" & $aArray[$i][1] & "; "
    Next

    Return $sString
EndFunc

;===============================================================================
; Function Name:    _FFGetCookieGroup
; Description::     Returns array with all cookies from one address.
; Parameter(s):     $sUrl    -    URL of the target
; Requirement(s):   FF.au3
; Return Value(s):  On succes: 2-dimensional array with "all wanted" cookies.
;                   On failure: '_FFCmdErr'
; Author :            Acanis @codebot.de
;===============================================================================
Func _FFGetCookieGroup($sUrl)
    Local $aCookies, $iCounter, $iPlace

    $aCookies = _FFGetAllCookies()

    For $i = 0 To UBound($aCookies) - 1
        If StringRegExp($aCookies[$i][2], $sURL, 0) Then $iCounter += 1
    Next

    Dim $aCookieGroup[$iCounter][2]

    For $i = 0 To UBound($aCookies) - 1
        If StringRegExp($aCookies[$i][2], $sURL, 0) Then
            $aCookieGroup[$iPlace][0] = $aCookies[$i][0]
            $aCookieGroup[$iPlace][1] = $aCookies[$i][1]
            $iPlace += 1
        EndIf
    Next

    Return $aCookieGroup
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  

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.