Youtube API - Login Beispiel ?

  • Hallo Leute,

    und zwar suche ich nach einer Möglichkeit sich mit der Youtube API in Autoit bei Youtube einzuloggen. Bisher habe ich nur etwas von so Dingen wie AuthSub usw. gelesen, habe aber noch nicht verstanden wie man das in Autoit dann am besten umsetzt.
    Hat jemand von euch vllt. schon ein funktionierendes Login Beispiel mit Hilfe der Youtube API ?

  • Ja, mit den IE Funktionen usw. komme ich ja bestens klar.
    Aber ich suche halt eine Login Funktion für Youtube, welches über die richtige Youtube Developer API geht, also per TCP, ohne den IE dabei zu nutzen, sodass man einiges an Zeitersparnis raus holen kann. :)

    Ich verstehe nur nicht ganz wie der Login in Autoit über diese Doku umzusetzen ist:
    http://code.google.com/intl/de-DE/api…lientlogin.html

    Bzw. wie verfährt man dann mit diesem Authentication Token weiter, um z.B. nen Kommentar zu schreiben oder so ?

  • Hol dir mal diese UDF: http://www.autoitscript.com/forum/topic/29631-http-udfs/

    Zum einloggen musst du dann, wie auch bei google direkt beschrieben, an die URL "https://www.google.com/accounts/ClientLogin" einen Post mti dem Inhalt "Email=<username>&Passwd=<password> &service=youtube&source=<source>" senden. Dann bekommst ein "authentication token" zurück mit dem dann weiter machst.

    Andy hat mir ein Schnitzel gebacken aber da war ein Raupi drauf und bevor Oscar das Bugfixen konnte kam Alina und gab mir ein AspirinJunkie.

  • chip: Danke, ich werde es mal probieren und hier berichten. :)

    Ist allerdings noch die Frage ob man dieses Loginverfahren noch verwenden soll, weil oben ja steht das man lieber AuthSub z.B. verwenden sollte. Allerdings verstehe ich bei dem AuthSub nicht wozu ich den "next" Parameter brauche, weil mit Autoit macht man ja Clientprogramme und da brauche ich keine Weiterleitung auf irgendwas. :/

    http://code.google.com/intl/de-DE/api…lientlogin.html

  • Also bei dem ClientLogin funktioniert das irgendwie nicht wie erhofft. Da kommt immer eine 0 zurück. :/

    [autoit]

    Local $h_session = _WinHttpOpen("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0")
    Local $h_connect = _WinHttpConnect($h_session, "https://www.google.com/")
    Local $sHTML = _WinHttpSimpleRequest($h_connect, "GET", "/")

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

    Local $sReferer = "https://www.google.com/"
    Local $sPost = "Email=myYoutubeUserName&Passwd=myYoutubePassword&service=youtube&source=Test"
    $sHTML = _WinHttpSimpleRequest($h_connect, "POST", "/accounts/ClientLogin", $sReferer, $sPost)
    Sleep(500)

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

    FileWrite("test.html", $sHTML)

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

    _WinHttpCloseHandle($h_connect)
    _WinHttpCloseHandle($h_session)

    [/autoit]
  • Ich vermute mal das du einen falschen Host bei _WinHTTPConnect angegeben hast.

    Edit: Und wegen an dem https:// merkt man das es eine SSL geschütze Seite ist vermute ich mal. Daher muss du _WinHTTPSimpleSSLRequest benutzen anstatt _WinHTTPSimpleRequest

    Einmal editiert, zuletzt von blacky94 (18. November 2011 um 14:16)

  • ClientLogin

    Spoiler anzeigen
    [autoit]

    #region - Timestamp
    ;2011-11-18 18:25:54
    #endregion - Timestamp

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

    $sUername = "ich@googlemail.com"
    $sPassword = "meinpasswort"

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

    Local Static $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("POST", "https://www.google.com/accounts/ClientLogin", False)
    $oHTTP.SetRequestHeader("User-Agent", "autoit")
    $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    $oHTTP.Send("Email=" & _URIEncode($sUername) & _
    "&Passwd=" & _URIEncode($sPassword) & _
    "&service=youtube" & _
    "&source=abcdefg")
    ConsoleWrite($oHTTP.ResponseText & @CRLF)

    [/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]
  • Hi,

    hab es mal gemacht ( Anleitung von google: http://code.google.com/intl/de-DE/api…lientlogin.html )

    Spoiler anzeigen
    [autoit]

    #include <WinHTTP.au3>

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

    $post = "Email=<deinbenutzername>&Passwd=<deinpasswort>&service=youtube&source=test"

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

    $hw_open = _WinHttpOpen("Google Client")
    $hw_connect = _WinHttpConnect($hw_open, "www.google.com",$INTERNET_DEFAULT_HTTPS_PORT)
    $h_openRequest = _WinHttpOpenRequest($hw_connect,"POST", "/accounts/ClientLogin","HTTP/1.1", _
    $WINHTTP_NO_REFERER, $WINHTTP_DEFAULT_ACCEPT_TYPES, $WINHTTP_FLAG_SECURE)
    _WinHttpSendRequest($h_openRequest, "Content-Type: application/x-www-form-urlencoded" & @CRLF, $post)
    _WinHttpReceiveResponse($h_openRequest)

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

    $header = _WinHttpQueryHeaders($h_openRequest)
    MsgBox(0, "Header", $header)
    If _WinHttpQueryDataAvailable($h_openRequest) Then
    Local $data=""
    Do
    $data&=_WinHttpReadData($h_openRequest)
    Until @error<>0
    MsgBox(0, "Body", $data)
    EndIf

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

    _WinHttpCloseHandle($h_openRequest)
    _WinHttpCloseHandle($hw_connect)
    _WinHttpCloseHandle($hw_open)

    [/autoit]

    <deinbenutzername> und <deinpasswort> musst du noch ersetzen.

    Wenn es geklappt hat bekommst du so etwas zurück:

    Spoiler anzeigen
    Zitat

    SID=DQAAALQAAAA6wx7byZp-s4BizDqS1OaT21j9dmY6wMjexpQdNC3
    LSID=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_0vh-4XbUedCN9XTZ
    Auth=DQAAALUAAAARH_PvRXoaz23Dv_UmOSUz2_jxJVCGjoulKlhWbU

    ( Nur viel länger )

    Steht ja auch alles in der Anleitung.

    Gruß Greek

  • Hallo i2c und Greek,

    erst einmal möchte ich mich bei euch beiden ganz herzlich bedanken. :)
    Ich habe es mittlerweile so nebenbei auch gelöst, zumindest so ähnlich. Der Login scheint ganz gut zu funktionieren und den Auth-Key bekomme ich so auch.
    Dann habe ich noch versucht ein Video zu liken, als Test, ob ich nach dem Login richtig mit der Youtube API arbeiten kann.
    Das Komische ist: Der Like Request scheint auch zu funktionieren, da ich den erfolgreichen 201 HTTP Request erhalte und da steht auch richtigerweise das User x erfolgreich das Video geliket hat, aber im Video bzw. auf Youtube an sich ist dann nichts zu sehen. Komisch. :/

    Spoiler anzeigen
    [autoit]

    Local $sDeveloperKey = "developer key"
    Local $sMyEmail = "meineemail"
    Local $sMyPwd = "meinPwd"
    Local $sVideoID = "VIDEO_ID"

    [/autoit] [autoit][/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, "www.google.com")

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

    Local $sReferer = "www.google.com"
    Local $sPost = "Email=" & $sMyEmail & "&Passwd=" & $sMyPwd & "&service=youtube&source=Test"
    Local $sHTML = _WinHttpSimpleSSLRequest($h_connect, "POST", "/accounts/ClientLogin", $sReferer, $sPost)
    Sleep(500)

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

    Local $iAuthPos = StringInStr($sHTML, "Auth=")
    Local $sAuthorizationKey = StringMid($sHTML, $iAuthPos + 5, StringLen($sHTML) - $iAuthPos)

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

    ; Make a request
    $h_connect = _WinHttpConnect($h_session, "gdata.youtube.com")
    Local $hRequest = _WinHttpOpenRequest($h_connect, "POST", "/feeds/api/videos/" & $sVideoID & "/ratings", Default, Default, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", $WINHTTP_FLAG_SECURE)
    _WinHttpAddRequestHeaders($hRequest, "Content-Type: application/atom+xml")
    _WinHttpAddRequestHeaders($hRequest, "Authorization: GoogleLogin auth=" & $sAuthorizationKey)
    _WinHttpAddRequestHeaders($hRequest, "GData-Version: 2")
    _WinHttpAddRequestHeaders($hRequest, "X-GData-Key: key=" $sDeveloperKey)

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

    Local $sPostData = '<?xml version="1.0" encoding="UTF-8"?>' & _
    '<entry xmlns="http://www.w3.org/2005/Atom" xmlns:yt="http://gdata.youtube.com/schemas/2007">' & _
    '<yt:rating value="like"/>' & _
    '</entry>'

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

    _WinHttpSendRequest($hRequest, -1, $sPostData)
    _WinHttpReceiveResponse($hRequest)

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

    ; Check if there is a response
    Local $sHeader, $sReturned
    If _WinHttpQueryDataAvailable($hRequest) Then
    $sHeader = _WinHttpQueryHeaders($hRequest)
    MsgBox(64, "Header", $sHeader)
    Do
    $sReturned &= _WinHttpReadData($hRequest)
    Until @error
    ; Print returned
    FileWrite("test.html", $sReturned)
    Else
    ConsoleWriteError("!No data available." & @CRLF)
    MsgBox(48, "Failure", "No data available.")
    EndIf

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

    ;FileWrite("test.html", $sHTML)

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

    _WinHttpCloseHandle($h_connect)
    _WinHttpCloseHandle($h_session)

    [/autoit]
  • Ja, das habe ich mir auch gedacht, da es einem ja empfohlen wird. Nur kriege ich damit erst recht keinen Login hin, da man ja irgendwie ne Website angeben muss auf die zurück geleitet wird usw.
    Aber sowas gibts ja alles nicht in Autoit. :/

  • Oh ok. Habe mir nun schon mal mein Programm registriert und ne Client ID erhalten. Jetzt muss ich nur noch schauen wie man sich damit einloggt. Meld mich dann wieder hier, ob alles geklappt hat. Danke. :)

  • Also ich verstehe echt nicht für was ich den "scope" Parameter brauche und was ich da hinein schreiben soll ? Kann mir da jemand helfen ? :/

    http://code.google.com/intl/de-DE/api…stalledApp.html

    Edit:
    Also ich habe das mit dem oAuth 2.0 jetzt mal so umgesetzt, dass ich auf die Loginseite komme.
    So wie ich das aus dem oberen Link heraus lese, muss ich mich zuerst mit einem Request auf die Loginseite begeben, dann muss ich nen Request schicken um die Userdaten eintragen zu lassen und zu bestätigen, dann muss ich mir den Authorization Code raus picken, der z.B. im Bild bei "Forming the URL" angezeigt wird und erst mit diesem Authorization Code kann ich mir dann im Austausch einen Access Token geben lassen mit Hilfe dessen und meiner Client ID etc. ich dann später die eigentlichen Anfragen an die Youtube API stellen kann ?

    Also besteht der Loginprozess so gesehen aus 6 Schritten, wobei die ersten 5 Schritte eher zum oAuth Login / Authentifizierung da sind:
    - Anfrage an oAuth 2.0 senden
    - Einloggen mit Hilfe der Userdaten (Mail und Passwort)
    - Zugriff gewähren für die Installed App
    - Authorization Code entnehmen
    - Access Token im Austausch gegen Authorization Code anfragen
    - Api Aufrufe wie Youtube Funktionen usw. ?

    Habe ich das soweit alles richtig verstanden ?

    Einmal editiert, zuletzt von Kelturio (19. November 2011 um 20:47)

  • Spoiler anzeigen
    [autoit]

    #Region - Timestamp
    ;2011-11-20 13:22:32
    #EndRegion - Timestamp

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

    $sClientID = ""
    $sSecret = ""
    $sRedirectURI = ""
    $sScope = "http://gdata.youtube.com"

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

    ShellExecute("https://accounts.google.com/o/oauth2/auth" & _
    "?response_type=code" & _
    "&client_id=" & _URIEncode($sClientID) & _
    "&redirect_uri=" & _URIEncode($sRedirectURI) & _
    "&scope=" & _URIEncode($sScope))

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

    $sAuthCode = InputBox("","")

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

    Local Static $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
    $oHTTP.Open("POST", "https://accounts.google.com/o/oauth2/token", False)
    $oHTTP.SetRequestHeader("User-Agent", "autoit")
    $oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
    $oHTTP.Send("code=" & $sAuthCode & _
    "&client_id=" & $sClientID & _
    "&client_secret=" & $sSecret & _
    "&redirect_uri=" & $sRedirectURI & _
    "&grant_type=authorization_code")
    ConsoleWrite($oHTTP.ResponseText & @CRLF)

    [/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]
  • i2c: Vielen Dank, das funktioniert schon mal einwandfrei. Ich werde das eben mal auf meine WinHTTP Klasse umbauen. :)

    Gibt es eigentlich auch eine Doku über das WinHTTP welches du benutzt ? Du scheinst ja direkt von Windows was zu verwenden, wie ich das sehe. Gibt es bei dem einen besonderen Vorteil warum du dies nutzt ?

    Edit:
    Wie ist das eigentlich wenn das ein User ausführt, der noch nicht eingeloggt ist ?
    Beispielsweise habe ich meine Account Daten in meinem Skript mit hinterlegt. Muss ich mich dann vorher über diesen ServiceAuthLogin einloggen oder wie muss ich da vorgehen ?

    Einmal editiert, zuletzt von Kelturio (21. November 2011 um 21:06)

  • http://msdn.microsoft.com/en-us/library/…6(v=vs.85).aspx
    Weniger Code dafür geringerer Funktionsumfang. Für diesen Zweck aber vollkommen ausreichend.

    Wenn ein User nicht eingeloggt ist, wird er im Browser eine Anmeldeseite von Google zu Gesicht bekommen. Er meldet sich an und bekommt dann seinen AuthCode.

  • Vielen Dank für die Funktionslibrary. :)

    Ja, das der User dann den Anmeldebildschirm zu sehen bekommt, sehe ich. Aber ich will die Youtube API ja nutzen, um alles im Hintergrund laufen zu lassen. Demnach hinterlege ich meine Logindaten mit im Skript und möchte dann den Anmeldeprozess auch gerne über WinHTTP ansteuern. Nur leider finde ich dazu nicht mehr als das oAuth Verfahren und wenn ich den Request des manuellen Logins nachbaue, so funktioniert das auch nicht wirklich. :/