Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: YouTube - nie moge poprac automatycznie pliku
Forum PHP.pl > Forum > PHP
Antoniossss
Witam!
Dla sportu chce sobie uwić ściągarke do YT. Samą metodologię "niby znam". Mój problem polega na tym, że tworząc sobie linkę "z ręki" mogę ściągnąć dowolny klip z youtube. Robiąc jednak to automatem w phapie link staje się błędny. Nie rozumiem dlaczego:(

Sprawa jest prosta. Potrzeba nam tylko video_id (czyli v= w linku) oraz parametr t. Ten drugi o ile nie z linku to bez problemu można wyłowić ze źródła strony (2 wystąpienia &t=, każdy token zakończony %3D włącznie) a następnie skleić z tego linka postaci youtube.com/get_video?video_id=[parametr v]&t=[token wyciągnięty prosto ze źródła strony]&fmt=13 (ostatni parametr odpowiada za format klipu).
Tak jak mówiłem, sklejając taką linke z łapy, wszystko działa, jednak generując link skryptem który zamieszczam poniżej, pod tym linkiem otrzymuje pustą stronę, a w nagłówkach komunikat forbidden.
Dlaczego tak się dzieje ? plz hlp

  1.  
  2. function wyluskaj($data,$poczatek,$koniec)
  3. {
  4. $start=strpos($data,$poczatek)+strlen($poczatek);
  5. $end=strpos($data,$koniec,$start);
  6. $token=substr($data,$start,$end-$start);
  7. if($end==NULL || $start==NULL || $start>$end)
  8. {
  9. return (NULL);
  10. }
  11. else
  12. return($token);
  13.  
  14. }
  15. // ok link <a href="http://www.youtube.com/get_video?video_id=D5BGuOUOHcQ&t=vjVQa1PpcFM3QKkEqQFQsVWXwrPm0MkcpwTaYv5RfdM%3D&fmt=13" target="_blank">http://www.youtube.com/get_video?video_id=...M%3D&fmt=13</a>
  16. $ch = curl_init();
  17. curl_setopt ($ch, CURLOPT_URL, "http://www.youtube.com/watch?v=D5BGuOUOHcQ");
  18. curl_setopt ($ch, CURLOPT_HEADER, 0);
  19. curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
  20. curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
  21. curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 5);
  22. $cache = curl_exec($ch);
  23. curl_close($ch);
  24.  
  25. $token=wyluskaj($cache,"&t=","&rv");
  26. $id=wyluskaj($cache,"/watch?v=",'"');
  27. //echo("<br>dlugosc tokena dobrego=".strlen("vjVQa1PpcFOdvP0ljs2Rp1WBUlWYr568iCWw2O2pbSA%3D"));
  28. //echo("<br>Dlugosc mojego tokena=".strlen($token));
  29. echo("<br><a href=http://www.youtube.com/get_video?video_id=$id&t=$token&fmt=13>link</a>");
  30.  
bim2
Dodaj może CURL_REFERER smile.gif Pewnie sprawdzają.
Antoniossss
ok pewnie, że dodam i zaraz napisze czy dziala czy nie (tyle ze link z łapy można nawet na innym kompie odpalić wklejając odrazu w pasek adresu i bryka)

Nie, dodanie w nagłówkach strony odniesienia nie pomaga (jako referer dałem stronke z klipem YT do którego próbuje podkraść linke)

Nie wiem czy to jest istotne, ale jeżeli spróbuje wyświetlić pobraną stronę YT (echo($cache)winksmiley.jpg to strona jest po francusku (z krzaczkami).


na chwile obecną CURL zwraca mi w nagłówkach takie oto pole
Kod
Location: http://v16.lscache7.c.youtube.com/videoplayback?ip=91.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor&fexp=902220%2C904001&algorithm=throttle-factor&itag=13&ipbits=8&burst=40&sver=3&expire=1271908800&key=yt1&signature=8E1568CC0478BE105A034F07A5DC0566088F597F.D0F26EF0753B857C1FE33AAFE
86F8CBA0978A95B&factor=1.25&id=0f9046b8e50e1dc4


podczas gdy aplikacja w javie o kodzie
Kod
private String getRedirUrl(String url)
    {
        String hdr = "";
        try
        {
            HttpURLConnection conn = (HttpURLConnection)(new URL(url)).openConnection();
            conn.setInstanceFollowRedirects(false);
            conn.addRequestProperty("User-Agent", getParameter("ua"));
            hdr = conn.getHeaderField("location");
        }
        catch(Exception e)
        {
            e.printStackTrace();
            return null;
        }
        return hdr;
    }


gdzie String jest taki sam jak w php, w zmiennej hdr zwróci mi pole nagłówka w takiej postaci:
Kod
http://v16.lscache7.c.youtube.com/videoplayback?ip=0.0.0.0&sparams=id%2Cexpire%2Cip%2Cipbits%2Citag%2Calgorithm%2Cburst%2Cfactor%2Coc%3AU0dWRllLU19FSkNNNl9RRVdD&fexp=902218%2C904510%2C901903&algorithm=throttle-factor&itag=13&ipbits=0&burst=40&sver=3&expire=1271905200&key=yt1&signature=9FEFEE740885B5228704EAF001CF52E38E071240.309DAEEA2EF44F7D5E826845E
780A5ABA312E17D&factor=1.25&id=0f9046b8e50e1dc4


przy czym ten drugi link z javy działa już bez problemów ( można sprawdzić, o ile one nie wygasają, powinno zassać klip z TY). Różnią się przede wszystkim długością, pierwszym &ip argumentem i nie tylko. Ma ktoś może jakikolwiek pomysł dlaczego tak się dzieje? Zależne jest to może tego, że w php YT widzi serwer, a z javy moją maszyne? A może w javie obiekt HttpURLConnection posiada inaczej ustawiane lub też zupełnie inne properties niż w przypadku CURL przez co niejawie wysyłane jest tak naprawdę inny request ?

Nadmienie tylko, że jeżeli do mojego kodu w PHP który jest widoczny w pierwszym poście, dołożyć jeszcze jeden blok do połączenia, i jaku url podać już to co poprzednio udało mi się wyciągnąć oraz ustawić flage CURLOPT_FOLLOWLOCATION na TRUE, serwer pobierze clip z YT, co się objawi po przez wyświetlenie bardzo dużej ilości krzaków będącymi "kodem" klipu w postaci tekstu. Może istnieje jakaś metoda php do przekierowania strumienia danych, jednak tak czy inaczej powodowałoby to ruch na serwerze a tego wolałbym uniknąć przecież. Ten sam skrypt odpalony na serwerze lokalnym ( na mojej maszynie ) generuje również krótszy link, z ip 83.0.0.0 więc wykluczam znaczenie położenia serwera, bardziej myślę, że chodzi różnice między zachowaniem się javy i curl

Dzięki z góry za siedzenie nad moimi wywodami i za pomoc
sada
Prawdopodobnie masz server OVH lub jakiś inny stojący fizycznie nie w Polsce, youtube sprawdza prawdopodobnie geolokalizację fizyczną a nie wynikającą z IP, a więc nawet cookis,y w curlu nie pomoga.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.