Youtube API - Login Beispiel ?

  • Die Login Daten müssen von Hand eingegeben werden. Darum wirst du afaik nicht herumkommen. Nachdem der User sich authentifiziert hat und du Token, Refresh Token etc. bei google abgeholt hast, kann der Rest problemlos "im Hintergrund" laufen.

    edit: Du musst die Login Seite natürlich nicht unbedingt im Standardbrowser öffnen. Kannst sie auch in dein GUI einbetten.

  • i2c: Aber wenn ich die Loginseite in meine GUI einbette mit z.B. einem Login Feld und einem PW Feld, wo der User seine Daten eingeben kann, dann muss ich ja auch irgendwie den Loginprozess in WinHTTP übernehmen können, oder nicht ?
    Weil ich hätte halt wirklich gerne ein Programm, welches komplett im Hintergrund arbeitet, ohne jeglichen Browser etc. etc.
    Und theoretisch geht das ja auch alles über die API, z.B. Dinge auslesen usw. Nur an dem Login scheitert es irgendwie.

  • Also ich habe den Login soeben noch einmal ausprobiert und er funktioniert soweit ganz gut. Aber leider nur bis zur Hälfte. :(
    Wenn man die Requests nach dem POST-Request auskommentiert, so sieht man das der Login gut funktioniert, wenn man die generierte test.html aufruft. Nur die weiteren Requests müssen irgendwie noch funktionabel gemacht werden, bei denen ich aber verzweifel. :/

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <WinHTTP.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $sClientID = ""
    Local $sSecret = ""
    Local $sRedirectURI = "urn:ietf:wg:oauth:2.0:oob"
    Local $sScope = "http://gdata.youtube.com"
    Local $sMail = ""
    Local $sPW = ""

    [/autoit] [autoit][/autoit] [autoit]

    Local $h_session = _WinHttpOpen("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0")
    Local $h_connect = _WinHttpConnect($h_session, "accounts.google.com")
    Local $sHTML, $sPost, $sReferer

    [/autoit] [autoit][/autoit] [autoit]

    $sHTML = _WinHttpSimpleSSLRequest($h_connect, "GET", "/ServiceLogin?hl=de")

    [/autoit] [autoit][/autoit] [autoit]

    Local $arrDsh = StringRegExp($sHTML, "(?s)<input.*?id=""dsh"".*?value=""(.*?)"".*?>", 3)
    Local $sDsh = $arrDsh[0]
    Local $arrGALX = StringRegExp($sHTML, "(?s)<input.*?name=""GALX"".*?value=""(.*?)"".*?>", 3)
    Local $sGALX = $arrGALX[0]

    [/autoit] [autoit][/autoit] [autoit]

    $sReferer = "https://accounts.google.com/ServiceLogin?hl=de"
    $sPost = "dsh=" & $sDsh & "&GALX=" & $sGALX & "&pstMsg=1&dnConn=https%3A%2F%2Faccounts.youtube.com&timeStmp=&secTok=&Email="&_URIEncode($sMail)&"&Passwd="&_URIEncode($sPW)&"&signIn=Anmelden&PersistentCookie=yes&rmShown=1"
    $sHTML = _WinHttpSimpleSSLRequest($h_connect, "POST", "/ServiceLoginAuth", $sReferer, $sPost)
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    $sHTML = _WinHttpSimpleSSLRequest($h_connect, "GET", "/CheckCookie?hl=de&chtml=LoginDoneHtml&dnConn=https%3A%2F%2Faccounts.youtube.com&pstMsg=1")
    Local $arrSidt = StringRegExp($sHTML, "sidt=(.*?)\\x26", 3)
    Local $sSidt1 = $arrSidt[0]
    Local $sSidt2 = $arrSidt[1]
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    $sHTML = _WinHttpSimpleSSLRequest($h_connect, "GET", "/accounts/SetSID?ssdc=1&sidt=" & $sSidt1 & "&pmpo=https%3A%2F%2Faccounts.google.com")
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    $sHTML = _WinHttpSimpleSSLRequest($h_connect, "GET", "/accounts/SetSID?ssdc=1&sidt=" & $sSidt2 & "&pmpo=https%3A%2F%2Faccounts.google.com")
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    $h_connect = _WinHttpConnect($h_session, "www.google.de")
    $sHTML = _WinHttpSimpleRequest($h_connect, "GET", "/")
    Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    ;ConsoleWrite(_URIEncode("https://accounts.google.com/o/oauth2/auth") & "?scope=" & _URIEncode($sScope) & "&redirect_uri=" & _URIEncode($sRedirectURI) & "&response_type=code&client_id=" & _URIEncode($sClientID) & "&EMail=" & _URIEncode($sMail) & "&Passwd=" & _URIEncode($sPW))

    [/autoit] [autoit][/autoit] [autoit]

    ;$sPost = "scope=" & _URIEncode($sScope) & "&redirect_uri=" & _URIEncode($sRedirectURI) & "&response_type=code&client_id=" & _URIEncode($sClientID)
    ;$sHTML = _WinHttpSimpleSSLRequest($h_connect, "POST", "/o/oauth2/auth", $sReferer, $sPost)
    ;Sleep(500)

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite("test.html", $sHTML)

    [/autoit] [autoit][/autoit] [autoit]

    _WinHttpCloseHandle($h_connect)
    _WinHttpCloseHandle($h_session)

    [/autoit] [autoit][/autoit] [autoit]

    Func _URIEncode($sData)
    ; Prog@ndy
    Local $aData = StringSplit(BinaryToString(StringToBinary($sData, 4), 1), "")
    Local $nChar
    $sData = ""
    For $i = 1 To $aData[0]
    $nChar = Asc($aData[$i])
    Switch $nChar
    Case 45, 46, 48 - 57, 65 To 90, 95, 97 To 122, 126
    $sData &= $aData[$i]
    Case 32
    $sData &= "+"
    Case Else
    $sData &= "%" & Hex($nChar, 2)
    EndSwitch
    Next
    Return $sData
    EndFunc ;==>_URIEncode

    [/autoit]