Youtube Api Curl Upload systeem
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
[...]
function upload() {
$files = $_FILES;
$name = $files['file']['name'];
$type = $files['file']['type'];
$size = $files['file']['size'];
$tmp_nm = $files['file']['tmp_name'];
$data = array('name' => 'Foo', 'file' => '@'.$tmp_nm);
print_r($_POST);
print_r($_FILES);
echo 'Size '.$size;
$headers = array(
"Authorization: AuthSub token=".$this->auth,
"GData-Version: 2",
"X-GData-Key: key=".$this->dev_key,
"Content-length: ".$size,
"API_XML_request"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/action/GetUploadToken');
curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_REFERER,true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt($ch, CURLOPT_HEADER,0);
if($this->get_info)
{
$this->curlget_info($ch);
}
$output = curl_exec($ch);
print_r($output);
return $output;
}
[...]
?>
[...]
function upload() {
$files = $_FILES;
$name = $files['file']['name'];
$type = $files['file']['type'];
$size = $files['file']['size'];
$tmp_nm = $files['file']['tmp_name'];
$data = array('name' => 'Foo', 'file' => '@'.$tmp_nm);
print_r($_POST);
print_r($_FILES);
echo 'Size '.$size;
$headers = array(
"Authorization: AuthSub token=".$this->auth,
"GData-Version: 2",
"X-GData-Key: key=".$this->dev_key,
"Content-length: ".$size,
"API_XML_request"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://gdata.youtube.com/action/GetUploadToken');
curl_setopt($ch, CURLOPT_USERAGENT, $this->user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_REFERER,true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION ,1);
curl_setopt($ch, CURLOPT_HEADER,0);
if($this->get_info)
{
$this->curlget_info($ch);
}
$output = curl_exec($ch);
print_r($output);
return $output;
}
[...]
?>
Output 1:
Quote:
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => 0016.png [type] => image/png [tmp_name] => D:\wamp\tmp\php178D.tmp [error] => 0 [size] => 4216 ) ) Size 4216
Google
Error
Length Required
POST requests require a Content-length header.
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => 0016.png [type] => image/png [tmp_name] => D:\wamp\tmp\php178D.tmp [error] => 0 [size] => 4216 ) ) Size 4216
Error
Length Required
POST requests require a Content-length header.
Output 2:
Quote:
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => Film.wmv [type] => video/x-ms-wmv [tmp_name] => D:\wamp\tmp\php11D3.tmp [error] => 0 [size] => 96589 ) ) Size 96589
Google
Error
Length Required
POST requests require a Content-length header.
Array ( [token] => TOKEN ) Array ( [file] => Array ( [name] => Film.wmv [type] => video/x-ms-wmv [tmp_name] => D:\wamp\tmp\php11D3.tmp [error] => 0 [size] => 96589 ) ) Size 96589
Error
Length Required
POST requests require a Content-length header.
Ik hoop dat iemand me ermee kan helpen
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
maar goed je mag moeilijk doen
goed tijd voor actie
1) curl kan de content length zelf bepalen dus geef die liever maar niet mee!
2) ik zou die timeout niet meegeven
3) misschien kan je beter eerste je file nog even moooooven naar een echte locatie
Webmakerij schreef op 18.09.2009 19:10:
[...]
goed tijd voor actie
1) curl kan de content length zelf bepalen dus geef die liever maar niet mee!
2) ik zou die timeout niet meegeven
3) misschien kan je beter eerste je file nog even moooooven naar een echte locatie
goed tijd voor actie
1) curl kan de content length zelf bepalen dus geef die liever maar niet mee!
2) ik zou die timeout niet meegeven
3) misschien kan je beter eerste je file nog even moooooven naar een echte locatie
Hmm, 2 en 3 kan ik doen geen probleem. Maar stap 1 snap ik dan niet helemaal. Want als ik content-lenth helemaal weg zet krijg ik nog steeds dezelfde error
Bumpppppp :))
Peter je Mocht 2 berichten plaatsen was na 42 uur geweest ;)
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld? Moet er niet een 'kb' achter oid?
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Eddy Erkelens schreef op 23.09.2009 08:04:
De melding is dat er geen lengte-header wordt meegestuurd.
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld? Moet er niet een 'kb' achter oid?
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld? Moet er niet een 'kb' achter oid?
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Nee, want:
Quote:
14.13 Content-Length
The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
Content-Length = "Content-Length" ":" 1*DIGIT
An example is
Content-Length: 3495
The Content-Length entity-header field indicates the size of the entity-body, in decimal number of OCTETs, sent to the recipient or, in the case of the HEAD method, the size of the entity-body that would have been sent had the request been a GET.
Content-Length = "Content-Length" ":" 1*DIGIT
An example is
Content-Length: 3495
Doe eens met curl_getinfo je headers enzo opvragen.
CURLOPT_INFILESIZE nog moet gebruiken?
Ik zie hem namelijk wel in de HTTP header staan die size, dus dat moet goed zijn. Misschien moet je die nog aan de CURL gegevens/ opties meegeven. (misschien dat de volgorde wat uit (kan) maken, maar dat lijkt me eigenlijk niet)
maurice schreef op 23.09.2009 06:23:
Peter je Mocht 2 berichten plaatsen was na 42 uur geweest ;)
Geen idee waar jij het over hebt, mja ik wink je wel terug ;)
Anyway
Eddy Erkelens schreef op 23.09.2009 08:04:
De melding is dat er geen lengte-header wordt meegestuurd.
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld?
Oplossing is die dus WEL meesturen. Ik zie dat je dat wel doet, maar is $size wel goed gevuld?
Dan zou ik op zijn minste een error van google verwachten dat de size verkeerd is of iets dergelijks, op het moment krijg ik namelijk een error waarbij de hele content-length mist betreft google..
Eddy Erkelens schreef op 23.09.2009 08:04:
Moet er niet een 'kb' achter oid?
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Ik ben er bijna 2 weken mee bezig heb dat natuurlijk goed overgenomen, maar als je twijfels hebt.. Controleer dan maar voor mij :))
Link
Webmakerij schreef op 23.09.2009 09:53:
Ik stuur al mijn request richting youtube, picassa zonder heel de content-length header. Gewoon niet opgeven en ik heb nergens last;
Doe eens met curl_getinfo je headers enzo opvragen.
Doe eens met curl_getinfo je headers enzo opvragen.
Wat voor requests zijn het? Bestanden ophalen of uploaden? Want ophalen lukt me wel, maar het uploaden is een rommel. (Als het een upload script is o.i.d. mag ik het dan heel misschien even koekeloeren hoe jij het in elkaar heb gezet :D)
By the way mijn curl_getinfo ziet er heel erg geweldig mooi uit :)
Array
(
=> http://gdata.youtube.com/action/GetUploadToken
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => 0
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 0
[namelookup_time] => 0
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => 0
[upload_content_length] => 0
[starttransfer_time] => 0
[redirect_time] => 0
)
[quote='Robert_Deiman schreef op 23.09.2009 09:55']Kan het zijn dat je:
CURLOPT_INFILESIZE nog moet gebruiken?
<?php
curl_setopt($ch, CURLOPT_INFILESIZE,$size);
?>
Ik zie hem namelijk wel in de HTTP header staan die size, dus dat moet goed zijn. Misschien moet je die nog aan de CURL gegevens/ opties meegeven. (misschien dat de volgorde wat uit (kan) maken, maar dat lijkt me eigenlijk niet)[/quote]
Net geprobeerd, geen verandering. In me wireshark zie ik wel dat het mooi verzonden word :( maar ik weet het niet of ik mis echt een belangerijke ding of google wil mij niet accepteren. Ik denk dat ik dit script ook eens in HTTP ga construeren hoewel ik al me hoop kwijt ben en geen zin meer heb... :P
Gewijzigd op 01/01/1970 01:00:00 door Kumkwat Trender
Overigens zeggen foutmeldingen van Google nooit zo heel veel. Zo krijg je bij Picasa de melding dat de geuploaden content is strijd is met de tos als je een verkeerde user id meegeeft.
Zet je wireshark of network monitor aan en kijk eens of er idd geen content-length wordt gestuurd.
Sockets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";
define('SERVER', $server);
define('PORT', 80);
define('PATH', $script);
define('_EOL', "\r\n");
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
if (!$sock) {
echo 'Fatal error: Couldn\'t create socket';
exit;
}
if (!socket_connect($sock, SERVER, PORT)) {
echo 'Fatal error: Couldn\'t connect';
exit;
}
$request = null;
$request .= 'POST ' . PATH . ' HTTP/1.0' . _EOL;
$request .= 'Host: ' . SERVER . _EOL;
$request .= 'Authorization: AuthSub token="'.$this->auth.'"'. _EOL;
$request .= 'GData-Version: 2 '._EOL;
$request .= 'X-GData-Client: '.$this->sid._EOL;
$request .= 'X-GData-Key: key='.$this->dev_key._EOL;
$request .= 'Content-Length: 5' . _EOL;
$request .= 'Content-Type: application/atom+xml; charset=UTF-8'._EOL;
$request .= 'API_XML_request'._EOL;
$request .= 'Connection: close' . _EOL;
$request .= _EOL;
echo '<pre>';
print_r($request);
echo '</pre>';
if (!socket_send($sock, $request, strlen($request), 0)) {
echo 'Fatal error: Couldn\'t send request';
exit;
}
$output = null;
$buffer = null;
while (socket_recv($sock, $buffer, 1024, 0) != 0) {
$output .= $buffer;
}
print_r($output);
?>
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";
define('SERVER', $server);
define('PORT', 80);
define('PATH', $script);
define('_EOL', "\r\n");
$sock = socket_create(AF_INET, SOCK_STREAM, 0);
if (!$sock) {
echo 'Fatal error: Couldn\'t create socket';
exit;
}
if (!socket_connect($sock, SERVER, PORT)) {
echo 'Fatal error: Couldn\'t connect';
exit;
}
$request = null;
$request .= 'POST ' . PATH . ' HTTP/1.0' . _EOL;
$request .= 'Host: ' . SERVER . _EOL;
$request .= 'Authorization: AuthSub token="'.$this->auth.'"'. _EOL;
$request .= 'GData-Version: 2 '._EOL;
$request .= 'X-GData-Client: '.$this->sid._EOL;
$request .= 'X-GData-Key: key='.$this->dev_key._EOL;
$request .= 'Content-Length: 5' . _EOL;
$request .= 'Content-Type: application/atom+xml; charset=UTF-8'._EOL;
$request .= 'API_XML_request'._EOL;
$request .= 'Connection: close' . _EOL;
$request .= _EOL;
echo '<pre>';
print_r($request);
echo '</pre>';
if (!socket_send($sock, $request, strlen($request), 0)) {
echo 'Fatal error: Couldn\'t send request';
exit;
}
$output = null;
$buffer = null;
while (socket_recv($sock, $buffer, 1024, 0) != 0) {
$output .= $buffer;
}
print_r($output);
?>
Output:
Quote:
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.
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:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";
$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = $data['file'];
$headers= "POST ".$script." HTTP/1.1\r\n";
$headers.= "Host: gdata.youtube.com\r\n";
$headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
$headers.= "GData-Version: 2\r\n";
$headers.= "X-GData-Client: ".$this->sid."\r\n";
$headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
$headers.= "API_XML_request\r\n";
$headers.= "Connection: close\r\n";
$headers.= "\r\n";
fwrite($sock, $headers);
fwrite($sock, $szParams);
$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}
print_r($output);
}
?>
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";
$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = $data['file'];
$headers= "POST ".$script." HTTP/1.1\r\n";
$headers.= "Host: gdata.youtube.com\r\n";
$headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
$headers.= "GData-Version: 2\r\n";
$headers.= "X-GData-Client: ".$this->sid."\r\n";
$headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
$headers.= "API_XML_request\r\n";
$headers.= "Connection: close\r\n";
$headers.= "\r\n";
fwrite($sock, $headers);
fwrite($sock, $szParams);
$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}
print_r($output);
}
?>
zelfde output :((
Je definieert nu zelf je regeleinde, maar probeer het eens met PHP_EOL?
wat ik terug krijg:
Quote:
HTTP/1.1
411
Length Required
Content-Type: text/html; charset=UTF-8
Content-Length: 1363
Date: Sat, 03 Oct 2009 16:09:24 GMT
Server: GFE/2.0 X-XSS-Protection: 0
Google
Error
Length Required
POST requests require a Content-length header.
411
Length Required
Content-Type: text/html; charset=UTF-8
Content-Length: 1363
Date: Sat, 03 Oct 2009 16:09:24 GMT
Server: GFE/2.0 X-XSS-Protection: 0
Error
Length Required
POST requests require a Content-length header.
Bump?
API_XML_REQUEST moet je vervangen :P
Kijk eens naar het voorbeeld ;)
Hij geeft gewoon de error verkeerd aan...
Edit:
Er staat: This value contains an atom field with information about the video...
Gewijzigd op 01/01/1970 01:00:00 door Jeffrey H
ok snap er niets van, Verklaar u nader a.u.b. :)
bump...
Peter schreef op 23.09.2009 12:12:
Ik ben er bijna 2 weken mee bezig heb dat natuurlijk goed overgenomen, maar als je twijfels hebt.. Controleer dan maar voor mij :))
Link
Eddy Erkelens schreef op 23.09.2009 08:04:
Moet er niet een 'kb' achter oid?
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Dat soort dingen moet je even goed controleren, want 1 teken te veel of te weinig is al fout.
Ik ben er bijna 2 weken mee bezig heb dat natuurlijk goed overgenomen, maar als je twijfels hebt.. Controleer dan maar voor mij :))
Link
Dat kan ik dus inderdaad ook niet bevestigen. Het staat nergens bij. Vandaar dat het te proberen is.
Nu zie ik wel dat het in bytes moet, dus zal het wel zonder 'b' erachter zijn. Maar dat zal je ongetwijfeld geprobeerd hebben.
Peter schreef op 03.10.2009 18:11:
Nog steeds hetzelfde output :(
wat ik terug krijg:
wat ik terug krijg:
Quote:
HTTP/1.1
411
Length Required
Content-Type: text/html; charset=UTF-8
Content-Length: 1363
Date: Sat, 03 Oct 2009 16:09:24 GMT
Server: GFE/2.0 X-XSS-Protection: 0
Google
Error
Length Required
POST requests require a Content-length header.
411
Length Required
Content-Type: text/html; charset=UTF-8
Content-Length: 1363
Date: Sat, 03 Oct 2009 16:09:24 GMT
Server: GFE/2.0 X-XSS-Protection: 0
Error
Length Required
POST requests require a Content-length header.
Dus... je geeft de HTTP-header mee.
En als je DIRECT daarna de length meegeeft (wat de code ook weergeeft)?
Dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";
$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = $data['file'];
$headers= "POST ".$script." HTTP/1.1\r\n";
// hier dus de lengte direct al, voor de rest!
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Host: gdata.youtube.com\r\n";
$headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
$headers.= "GData-Version: 2\r\n";
$headers.= "X-GData-Client: ".$this->sid."\r\n";
$headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
$headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
$headers.= "API_XML_request\r\n";
$headers.= "Connection: close\r\n";
$headers.= "\r\n";
fwrite($sock, $headers);
fwrite($sock, $szParams);
$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}
print_r($output);
}
?>
$server = "gdata.youtube.com";
$script = "/action/GetUploadToken";
$sock = fsockopen($server, 80);
if ( $sock )
{
$szParams = $data['file'];
$headers= "POST ".$script." HTTP/1.1\r\n";
// hier dus de lengte direct al, voor de rest!
$headers.= "Content-Length: ".strlen($szParams)."\r\n";
$headers.= "Host: gdata.youtube.com\r\n";
$headers.= "Authorization: AuthSub token=\"".$this->auth."\"\r\n";
$headers.= "GData-Version: 2\r\n";
$headers.= "X-GData-Client: ".$this->sid."\r\n";
$headers.= "X-GData-Key: key=".$this->dev_key."\r\n";
$headers.= "Content-Type: application/atom+xml; charset=UTF-8\r\n";
$headers.= "API_XML_request\r\n";
$headers.= "Connection: close\r\n";
$headers.= "\r\n";
fwrite($sock, $headers);
fwrite($sock, $szParams);
$output = "";
while ( !feof($sock) )
{
$output .= fread($sock, 4096);
}
print_r($output);
}
?>
Het is het proberen waard, toch?
Gelieve Niet Bumpen::
Gewijzigd op 01/01/1970 01:00:00 door Eddy E