login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Youtube Api Curl Upload systeem

Offline peterdg - 18/09/2009 21:28
Avatar van peterdgNieuw lid Hoi iedereen,

Ik ben bezig om een youtube api te gebruiken zonder Zend )

Google zelf geeft een prachtige uitleg waar ik geen hol van snap omdat het niet wil werken 
Uploading the video file

Het is me echter wel gelukt om een Authenticatie code op te vragen met een SID en een LSID code, maar het uploaden doet echt heel erg vaag en raar.

Mijn code tot nu:
  1. <?php
  2. [...]
  3. function upload() {
  4. $files = $_FILES;
  5. $name = $files['file']['name'];
  6. $type = $files['file']['type'];
  7. $size = $files['file']['size'];
  8. $tmp_nm = $files['file']['tmp_name'];
  9.  
  10. $data = array('name' => 'Foo', 'file' => '@'.$tmp_nm);
  11.  
  12. print_r($_POST);
  13. print_r($_FILES);
  14.  
  15. echo 'Size '.$size;
  16.  
  17. $headers = array(
  18. "Authorization: AuthSub token=".$this->auth,
  19. "GData-Version: 2",
  20. "X-GData-Key: key=".$this->dev_key,
  21. "Content-length: ".$size,
  22. "API_XML_request"
  23. );
  24.  
  25. $ch = curl_init();
  26. curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/action/GetUploadToken');
  27. curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
  28. curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
  29. curl_setopt($ch, CURLOPT_TIMEOUT, 10);
  30. curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  31.  
  32. curl_setopt($ch, CURLOPT_POST,1);
  33. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
  34.  
  35. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  36. curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
  37. curl_setopt($ch, CURLOPT_REFERER,true);
  38. curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1);
  39. curl_setopt($ch, CURLOPT_HEADER,0);
  40.  
  41. if($this->get_info)
  42. {
  43. $this->curlget_info($ch);
  44. }
  45. $output = curl_exec($ch);
  46.  
  47. print_r($output);
  48.  
  49. return $output;
  50. }
  51. [...]
  52. ?>


Output 1:
Citaat:
[ignore]
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => 0016.png [type] => image/png [tmp_name] => D:wamptmpphp178D.tmp [error] => 0 [size] => 4216 ) ) Size 4216
[/ignore]
Google
Error

Length Required

POST requests require a Content-length header.


Output 2:
Citaat:
[ignore]
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => Film.wmv [type] => video/x-ms-wmv [tmp_name] => D:wamptmpphp11D3.tmp [error] => 0 [size] => 96589 ) ) Size 96589
[/ignore]
Google
Error

Length Required

POST requests require a Content-length header.

Ik hoop dat iemand me ermee kan helpen

6 antwoorden

Gesponsorde links
Offline marten - 19/09/2009 01:33
Avatar van marten Beheerder Heb je op irc al verteld dat je er een get van moet maken......
Offline peterdg - 30/09/2009 15:51 (laatste wijziging 30/09/2009 15:52)
Avatar van peterdg Nieuw lid @marten, get ondersteunen ze niet
Dit is wat ik dan krijg als ik POST in GET omzet:

Citaat:
HTTP method GET is not supported by this URL
Error 405


maar Ik heb het probleem geprobeerd te construeren met sockets en fsockopen.. maar nog steeds hetzelfde probleem en output 

Sockets:
  1. <?php
  2. $server = "gdata.youtube.com";
  3. $script = "/action/GetUploadToken";
  4.  
  5.  
  6. define('SERVER', $server);
  7. define('PORT', 80);
  8. define('PATH', $script);
  9. define('_EOL', "\r\n");
  10.  
  11. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
  12. if (!$sock) {
  13. echo 'Fatal error: Couldn\'t create socket';
  14. exit;
  15. }
  16.  
  17. if (!socket_connect($sock, SERVER, PORT)) {
  18. echo 'Fatal error: Couldn\'t connect';
  19. exit;
  20. }
  21.  
  22.  
  23. $request = null;
  24. $request .= 'POST ' . PATH . ' HTTP/1.0' . _EOL;
  25. $request .= 'Host: ' . SERVER . _EOL;
  26. $request .= 'Authorization: AuthSub token="'.$this->auth.'"'. _EOL;
  27. $request .= 'GData-Version: 2 '._EOL;
  28. $request .= 'X-GData-Client: '.$this->sid._EOL;
  29. $request .= 'X-GData-Key: key='.$this->dev_key._EOL;
  30. $request .= 'Content-Length: 5' . _EOL;
  31. $request .= 'Content-Type: application/atom+xml; charset=UTF-8'._EOL;
  32. $request .= 'API_XML_request'._EOL;
  33. $request .= 'Connection: close' . _EOL;
  34. $request .= _EOL;
  35.  
  36. echo '<pre>';
  37. print_r($request);
  38. echo '</pre>';
  39.  
  40. if (!socket_send($sock, $request, strlen($request), 0)) {
  41. echo 'Fatal error: Couldn\'t send request';
  42. exit;
  43. }
  44.  
  45. $output = null;
  46. $buffer = null;
  47. while (socket_recv($sock, $buffer, 1024, 0) != 0) {
  48. $output .= $buffer;
  49. }
  50.  
  51. print_r($output);
  52. ?>


Output:
Citaat:
HTTP/1.0 411
Length Required Content-Type: text/html;
charset=UTF-8
Content-Length: 1363
Date: Wed, 30 Sep 2009 13:38:57 GMT
Server: GFE/2.0 X-XSS-Protection: 0

Google Error
Length Required
POST requests require a Content-length header.


En fsockopen:
  1. <?php
  2. $server = "gdata.youtube.com";
  3. $script = "/action/GetUploadToken";
  4.  
  5. $sock = fsockopen($server, 80);
  6. if ( $sock )
  7. {
  8. $szParams = $data['file'];
  9.  
  10. $headers= "POST ".$script." HTTP/1.1\r\n";
  11. $headers.= "Host: gdata.youtube.com\r\n";
  12. $headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
  13. $headers.= "GData-Version: 2\r\n";
  14. $headers.= "X-GData-Client: ".$this->sid."\r\n";
  15. $headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
  16. $headers.= "Content-Length: ".strlen($szParams)."\r\n";
  17. $headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
  18. $headers.= "API_XML_request\r\n";
  19. $headers.= "Connection: close\r\n";
  20. $headers.= "\r\n";
  21.  
  22. fwrite($sock, $headers);
  23. fwrite($sock, $szParams);
  24.  
  25. $output = "";
  26. while ( !feof($sock) )
  27. {
  28. $output .= fread($sock, 4096);
  29. }
  30.  
  31. print_r($output);
  32. }
  33. ?>

zelfde output (
Offline genkstar - 30/09/2009 17:03
Avatar van genkstar Nieuw lid required - This code indicates that a required field is missing or has an empty value.
Offline SvenP - 30/09/2009 17:07
Avatar van SvenP PHP interesse kan het mis hebben hoor, maar kan het zijn dat de api dinges hoofdlettergevoelig is?

  1. $headers.= "Content-Length: ".strlen($szParams)."\r\n";

Maak van die L een lowercase l. als in het bericht
Citaat:
POST requests require a Content-length header.
Offline Richard - 30/09/2009 17:28
Avatar van Richard Crew algemeen Lijkt me sterk, Content-Length is HTTP/1.1 standaard protocol.
Verder, de content length header klopt gewoon niet. Simpel genoeg.

Overigens klopt je hele body gewoon niet, die hoor je met bijvoorbeeld PHP.net: http_build_query op te bouwen.
Offline peterdg - 30/09/2009 18:44
Avatar van peterdg Nieuw lid Okej ik weet zeg maar ongeveer wat de probleem is.

Wanneer ik mijn verstuurde waardes controlleer met wireshark krijg ik dit te zien:
POST /action/GetUploadToken HTTP/1.0\r\n
Citaat:
Request Method: POST
Request URI: /action/GetUploadToken
Request Version: HTTP/1.0
Host: gdata.youtube.comrn
Authorization: AuthSub token="D[..HELE lange token code hier..]wgn


En na authorization zie ik niets meer.. Althans niet in de kader waar je de tabellen mooi gestructureerd krijg, maar in de onderste kader van wireshark.

Echter als ik mijn content length boven authorization token ding zet dan zie ik het wel in dat tabelletje van wireshark :S

POST /action/GetUploadToken HTTP/1.0\r\n
Citaat:
Request Method: POST
Request URI: /action/GetUploadToken
Request Version: HTTP/1.0
Host: gdata.youtube.comrn
Content-length: 5rn
Authorization: AuthSub token="D[..HELE lange token code hier..]qgn


maar dan krijg ik een leuke error:

Token invalid - Invalid AuthSub token.
Error 401
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.213s