php script um Youtube als Videofile-space-server zu nutzen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • php script um Youtube als Videofile-space-server zu nutzen

    Hallo miteinander

    ich brauche hilfe für folgendes vorhaben:

    Ich möchte allo VIdeos, die auf meiner Platform hochgeladen werden direkt auf Youtube laden (über ein eigenes Account)

    dazu fand ich diese dokumentation: link


    dort wird sehr schön erklärt, wie ich solch etwas bewerkstelligen kann....


    wie folgt möchte ich vorgehen:

    über fsockopen möchte ich ein HTTP POST request in php schreiben um den upload serverseitig zu versenden

    in etwa so muss mein code aussehen:

    PHP-Quellcode

    1. <?php
    2. $fp = fsockopen("uploads.gdata.youtube.com", 80, $errno, $errstr, 30); // Verbindung starten
    3. if (!$fp) {
    4. echo "Fehler beim Verbindungsaufbau: $errstr<br />\n";
    5. exit;
    6. } else {
    7. $out = "POST /feeds/api/users/default/uploads HTTP/1.1\r\n";
    8. $out .= "Host: uploads.gdata.youtube.com\r\n";
    9. // bla, bla... den rest findet man auf meinem oben genannten link
    10. $out .= "Connection: Close\r\n\r\n"; // Wichtig: Beim letzten Header zweimal \r\n!
    11. fwrite($fp, $out); // Senden
    12. $content = "";
    13. while (!feof($fp)) { // Inhalt empfangen, bis Ende
    14. $content .= fgets($fp, 1024);
    15. }
    16. // In $content stehen sowohl Header als auch Inhalt der Antwort
    17. // des Servers
    18. fclose($fp); // Verbindung schließen
    19. }
    20. ?>
    Alles anzeigen


    nun geht es weiter....im oben genannten link findet man versch. variablen die man übergeben muss und die erklärung was genau für var. das sind und welchen zweck sie erfüllen wie auch wo man die dann auch letztentlich finden kann!!!


    schon bei der suche nach der ersten variable "<authentication_token>" komme ich nicht weiter!!!

    in der erklärung zu dieser var. sieht man, dass es vier versch. möglichkleiten für einen solchen "token" gibt (ebenfalls zu finden im oben genannten link...unter Variables in the upload request / authentication_token

    einerseits ist es mir nicht einmal geheuer welchen der vier möglichkeiten nun für mich die richtige ist...andernseits blicke ich sowiso bei keinem durch, wie i nun diesen abruf (für einen solchen "token") zu tätigen!!

    am besten leigt mir irgendwie der Client-Logintoken.....(von der erklärung her)

    dort sollte man folgendes über HTTP POST request übergeben um als antwort seinen "auth.-token" zu erhalten:

    Quellcode

    1. curl \
    2. --location https://www.google.com/youtube/accounts/ClientLogin \
    3. --data 'Email=<youtube_username>&Passwd=<youtube_password>
    4. &service=youtube&source=<source>' \
    5. --header 'Content-Type:application/x-www-form-urlencoded'


    dabei ist username und passwort ein platzhalter für genua diese angaben!

    ich seh da "curl" ....kenne mich zwar so gut wie garnicht aus damit, aber ich weis dass dies was ähnliche ist wie fsockopen!!!


    ich bitte euch nun um hilfe, damit ich entlich mal erste tests mit dem eigentlichen "HTTP POST request fürs uploaden" machen kann!!!

    Dank euch

    gruss by_homer
  • curl (curl.haxx.se/) ist eine Commandline-Tool für das Erzeugen von HTTP-Requests. Dafür gibt es auch ein PHP-Binding (de3.php.net/curl) was ich dir anraten würde, dies für dein Vorhaben zu verwenden und keine Plain Socket Connection via fsockopen. Im Grunde übernimmt curl den Part der korrekten und validen Header-Erzeugung. Du setzt einfach nur die für dich relevanten optionen (de3.php.net/manual/en/function.curl-setopt.php)
  • @bennybunny

    das hört sich bei dir so einfach an....

    na wie würde dann eine solche curl commandline mit ph-binding für dieses kleine HTTP request aussehen:

    Quellcode

    1. curl \
    2. --location https://www.google.com/youtube/accounts/ClientLogin \
    3. --data 'Email=testuser&Passwd=testpw&service=youtube&source=Test' \
    4. --header 'Content-Type:application/x-www-form-urlencoded'


    detailierters hier zu finden!!!

    danke dir bennybunny

    gruss by_homer
  • also habe mithilfe von Linux, dem Terminal und CURL einen solchen auth.token erhalten!!!


    habe demnach mein script geschrieben und den http request ausgeführt.

    jedoch wird einfach kein Host gefunden....obwohl ich genau den verwende, der in der API beschrieben wird!!

    muss ein fehler im script sein. Finde ihn aber nicht bez.weise ich bin zu unerfahren mit fsockopen!!!

    hier mein "zensiertes" script:

    PHP-Quellcode

    1. <?php
    2. $auth_token = "AI.....UDA";
    3. $boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
    4. $fp = fsockopen("uploads.gdata.youtube.com", 80, $errno, $errstr, 30); // Verbindung starten
    5. if (!$fp) {
    6. echo "Fehler beim Verbindungsaufbau: $errstr<br />\n";
    7. exit;
    8. } else {
    9. $out = "POST /feeds/api/users/default/uploads HTTP/1.1\r\n";
    10. $out .= "Host: uploads.gdata.youtube.com\r\n";
    11. $out .= "Authorization: GoogleLogin auth=".$auth_token."\r\n";
    12. $out .= "GData-Version: 2\r\n";
    13. $out .= "X-GData-Key: key=A........9S\r\n";
    14. $out .= "Slug: video-test2.avi\r\n";
    15. $out .= "Content-Type: multipart/related; boundary=".$boundary."\r\n";
    16. $out .= "Content-Length: 29926400\r\n";
    17. $out .= "Connection: Close\r\n\r\n"; // Wichtig: Beim letzten Header zweimal \r\n!
    18. fwrite($fp, $out); // Senden
    19. $content = "";
    20. while (!feof($fp)) { // Inhalt empfangen, bis Ende
    21. $content .= fgets($fp, 1024);
    22. }
    23. // In $content stehen sowohl Header als auch Inhalt der Antwort
    24. // des Servers
    25. fclose($fp); // Verbindung schließen
    26. }
    27. ?>
    Alles anzeigen


    was darin ist nun falsch...warum erhalte ich keine antwort???

    hier nochmals der link zu API von google fürs directe uploaden

    dort sieht man wie mein HTTP POST request aussehen sollte (einfach nur die angaben...ohne php oder sonst welches geschmeus)


    Ich bitte euch inständig um HILFE

    gruss by_homer
  • Also ich könnte mir vorstellen, dass es an mehrern Stellen Probleme geben könnte. Zum einen wird dieser Auht-Token keine unendliche Lebensdauer haben. Und zum anderen könnte es ein Problem mit der Content-Length geben. Falls diese größer ist, als deine Datei wartet der Webserver so lange bis die entsprechende Anzahl an bytes übertragen wurde. Wenn dies aber nicht der Fall ist macht er natürlich nüscht. Das Problem tritt halt auf, wenn du den ganzen Kram manuell machst. Deswegen würde ich dir immer noch empfehlen mit dem php-curl-binding zu arbeiten.

    Ein Beispiel findest du in der php.net-Doku:

    Quellcode

    1. <?php
    2. /* http://localhost/upload.php:
    3. print_r($_POST);
    4. print_r($_FILES);
    5. */
    6. $ch = curl_init();
    7. $data = array('name' => 'Foo', 'file' => '@/home/user/test.png');
    8. curl_setopt($ch, CURLOPT_URL, 'http://localhost/upload.php');
    9. curl_setopt($ch, CURLOPT_POST, 1);
    10. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    11. curl_exec($ch);
    12. ?>
    Alles anzeigen


    Es kann sein, dass curl bei deiner PHP-Distribution nicht vorhanden ist und du es installieren musst.
  • Hi,

    ich habe mal wegen dem token in der GData Komponente des ZendFrameworks geschaut und dort wird ein Request an folgende Url gesendet , gdata.youtube.com/action/GetUploadToken .
    Die Response ist ein Xml Dokument wo am Anfang ein Knoten Namens Token auftaucht.
    Abgesendet wird es entweder via curl oder socket (proxy).

    Ich würde auch, wie BennyBunny schon schrieb cUrl nutzen.


    Wenn ich das so richtig interpretiert habe muss man sich erstmal den AuthToken holen und kann dann den Upload mittels des tokens durchführen.

    //edit
    ich habe überlesen, dass du schon mit dem ClientLogin einen Token erhalten hast
  • das bringt mich schon einiges weiter!!!

    kurze klärungen einiger fragen:


    @BennyBunny

    Zum einen wird dieser Auht-Token keine unendliche Lebensdauer haben


    es gibt ja vier versch. tokens....die ClientLogin token jedoch ist eine die entsprechend meinem "richtigen" login besteht!!! so lange ich mein login e-mail und passwort nicht ändere wird die immer exakt glich bleiben (habe dies mehrere male überprüft...indem ich im terminal unter Linux die CURL anfrage geschickt habe....ist immer der gleiche auth.token retour gekommen)


    Und zum anderen könnte es ein Problem mit der Content-Length geben. Falls diese größer ist, als deine Datei wartet der Webserver so lange bis die entsprechende Anzahl an bytes übertragen wurde


    hmmm....ich habe ja die "test2.avi" datei! der schnelligkeit halber, hab ich einfach unter "Eigenschaften" nachgeschaut wie viel bytes die datei hat und dies dann dort übergeben!!! ich weis nun nicht ob diese bytes-zahl aus dem "eigenschaften-fenster" exakt die grösse angibt, die die datei auch besitzt!!!!


    Das Problem tritt halt auf, wenn du den ganzen Kram manuell machst. Deswegen würde ich dir immer noch empfehlen mit dem php-curl-binding zu arbeiten.


    glaub mir...ich würde verdammt gern mit CURL arbeiten....jedoch finde ich mich damit einfach nicht zurecht!!!

    wede nun dein script studieren (habs kurz überflogen....blieben jedoch immer noch nur lauter ???? evt. wenn ich mich noch etwas mehr damit befasse werde ich bestimmt schlauer.....ICH DANKE DIER VIEL MALS FÜR DIESES BEISPIEL....hab nun wenigstens einen anhaltspunkt)


    Es kann sein, dass curl bei deiner PHP-Distribution nicht vorhanden ist und du es installieren musst.


    ich arbeite "testweise" auf einem XAMPP localen testserverumgebung auf Windows.......da CURL (soweit ich herausgefunden habe) nur auf Linux läuft, stellt sich mir die frage kann ich dies überhaupt auf XAMPP instalieren???



    @vince

    ich habe mal wegen dem token in der GData Komponente des ZendFrameworks geschaut und dort wird ein Request an folgende Url gesendet , gdata.youtube.com/action/GetUploadToken


    ja die ZendFramework hab ich mir auch angeschaut.....jedoch benutzen sie eine "AuthSub session token" die eben nur als SESSION dient...und danach wider gelöscht wird!!! diese muss jedesmal durch den Admin von dem YT-account freigegeben werden (sonst erhält man die auth. nicht) da ich aber jedem meine auth. bewilligen möchte kann ich damit nichs anfangen!!

    Nun zur klärung: das ZendFramework macht dieses ganze spiel über das "Browser based uploading" ....dort wird der Request eben an diese URL übergeben ( gdata.youtube.com/action/GetUploadToken)

    ich weis nicht....vileicht sollte ich auch die "Browser based uploading" verwenden...

    natürlich hab ichs auch versucht!!! jedoch erhalte ich ein "Bad Request Error 400"


    ich werde wohl kaum drum herum kommen das Zend Framework auf herz und nieren auseinander zu nehmen!!!

    @vince könntest du mir sagen wo du den code-teil fürs request gefunden hast??? ich habs auch versucht...bin jedoch nicht fündig gewesen!!! (datei / zeile) DANKE!!!!



    anhang:

    fals das Zend-framework ebenfals CURL verwendet.....dann sollte cURL auch bei mir funktionieren!!! da ich es bei mir erfolgreich getestet habe......funzt einwandfrei!!!


    hei ihr zwei seit genial!!!! DANKE EUCH ZUTIEFST ;)


    äääh ja noch mein browser based uploading code:

    PHP-Quellcode

    1. <?php
    2. $auth_token = "AI.............DA";
    3. $file = "file";
    4. $video = "test2.avi";
    5. $fp = fsockopen("gdata.youtube.com", 80, $errno, $errstr, 30); // Verbindung starten
    6. if (!$fp) {
    7. echo "Fehler beim Verbindungsaufbau: $errstr<br />\n";
    8. exit;
    9. } else {
    10. $out = "POST /action/GetUploadToken HTTP/1.1\r\n";
    11. $out .= "Host: gdata.youtube.com\r\n";
    12. $out .= "Authorization: GoogleLogin auth=".$auth_token."\r\n";
    13. $out .= "GData-Version: 2\r\n";
    14. $out .= "X-GData-Key: key=AI.......................................m9S\r\n";
    15. $out .= "Content-Disposition: form-data; name=".$file."; filename=".$video."\r\n";
    16. $out .= "Content-Transfer-Encoding: binary\r\n";
    17. $out .= "Content-Length: 29926400\r\n\r\n";
    18. fwrite($fp, $out); // Senden
    19. $content = "";
    20. while (!feof($fp)) { // Inhalt empfangen, bis Ende
    21. $content .= fgets($fp, 1024);
    22. }
    23. // In $content stehen sowohl Header als auch Inhalt der Antwort
    24. // des Servers
    25. fclose($fp); // Verbindung schließen
    26. }
    27. print $content;
    28. ?>
    Alles anzeigen


    hab den code um die "Content-Disposition" erweitert....nach meinem ersten "Bad request Error 400" .....war das einzige was mir eingefallen ist :D


    gruss by_homer
  • ich arbeite "testweise" auf einem XAMPP localen testserverumgebung auf Windows.......da CURL (soweit ich herausgefunden habe) nur auf Linux läuft, stellt sich mir die frage kann ich dies überhaupt auf XAMPP instalieren???


    extension=php_curl.dll in der php.ini einkommentieren.

    Nimms mir nicht übel - Aber mehr Hilfestellung kann ich jetzt auch nicht mehr geben. Im Grunde steht alles auf der PHP-Seite die Namen der Optionen sind eigentlich selbsterklärend. Aber ich hab das Gefühl du packst das ;)
  • extension=php_curl.dll in der php.ini einkommentieren.


    du meins das ; weg machen??? hab ich gemacht!!!

    danke :)


    Nimms mir nicht übel - Aber mehr Hilfestellung kann ich jetzt auch nicht mehr geben. Im Grunde steht alles auf der PHP-Seite die Namen der Optionen sind eigentlich selbsterklärend. Aber ich hab das Gefühl du packst das


    kann ich verstehen....bin selber in zwei drei Foren aktiv am helfen und weis wie es ist, wenn gewisse user einfach nicht VERSTEHEN wollen bez.weise kaum eigen initiatieve leisten!!!!

    ich werde das schon irgendwie gebacken kriegen.....schön das du auch an mich glaubst...das hilft!!!! :D


    DANKE DIER

    gruss by_homer
  • Ich würde dir auch nur das Zend Framework empfehlen. Wenn du dich abgemüht hast den HTTP Request selber zusammenzubauen, hast du die nächsten Youtube Pläne, die genauso viel Implementierungsaufwand benötigen.
    Wenn du das Zend Framework einmal richtig eingerichtet hast, dann hast du ALLE youtube features geschenkt.

    Du wunderst dich wo die Ordner herkommen?

    Also als erstes lädst du dir die neuste version der google api klassen herunter:
    framework.zend.com/download/gdata

    Beachte:
    To use the PHP client library, you must be running PHP >= 5.1.4. You also need to use Zend_Gdata >= 1.7.7, which is distributed as part of the Zend Framework.


    Aus der ZIP benötigst du den Ordner library/Zend.

    Zusätzlich legst du eine eigene simple Datei an, sieh code.google.com/intl/de-DE/api…_php.html#Getting_Started

    Quellcode

    1. require_once 'Zend/Loader.php'; // the Zend dir must be in your include_path
    2. Zend_Loader::loadClass('Zend_Gdata_YouTube');
    3. $yt = new Zend_Gdata_YouTube();
    4. Zend_Loader::loadClass('Zend_Gdata_AuthSub');
    5. Zend_Loader::loadClass('Zend_Gdata_ClientLogin');


    Wenn du die Datei aufrufst sollte erstmal nichts geschehen - aber auch keine Fehlermeldung erscheinen.

    Danach gehts an den Upload, siehe code.google.com/intl/de-DE/api…de_php.html#Direct_Upload
    ... das Passt doch genau zu deiner Beschreibung:
    Direct uploading allows you to add videos that are in your video library to YouTube. You should choose a direct-upload implementation if you want to host or store videos uploaded through your site and also add those videos to YouTube. In a direct-uploading scenario, when a user uploads a video through your site, the video will be sent to your servers. Your application will subsequently send an API request to upload the video from your server to YouTube.