Wget - jak ściągnąć ten plik?

Próbuję przy użyciu wget ściągnąć na mój serwer plik mp4 z tej strony:

Kiedy sprawdzam element video przy użyciu DevTools w Chrome, widzę następującą lokalizację:

https://stream.vider.info/video/13575/v.mp4?uid=0

Niestety, ściąganie z tego adresu kończy się tak:

[rostov@s0]:<~>$ wget -c -nc --waitretry=1 --tries=0 https://stream.vider.info/video/13575/v.mp4?uid=0 -O /home/rostov/N/S01E01.mp4                                    --2022-06-28 14:53:14--  https://stream.vider.info/video/13575/v.mp4?uid=0
Translacja stream.vider.info (stream.vider.info)... 185.16.37.51, 185.16.37.53, 185.16.37.194, ...
Łączenie się z stream.vider.info (stream.vider.info)|185.16.37.51|:443... połączono.
Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 403 Forbidden
2022-06-28 14:53:14 BŁĄD 403: Forbidden.

Po włączeniu filmu i przejściu w zakładkę „Sieć” DevTools pojawia się jeden element, który po zaznaczeniu podaje wartość:

URL żądania: https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzU3NSIsImNoZWNrc3VtX2lkIjoiNjIwNzE0IiwicHJlbWl1bSI6ZmFsc2UsImxpbWl0X3JhdGVfYWZ0ZXIiOjMyM30,.mp4?uid=0

Ściąganie z tego URL’a kończy się tak:

[rostov@s0]:<~>$ wget -c -nc --waitretry=1 --tries=0 https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzU3NSIsImNoZWNrc3VtX2lkIjoiNjIwNzE0IiwicHJlbWl1bSI6ZmFsc2UsImxpbWl0X3JhdGVfYWZ0ZXIiOjMyM30,.mp4?uid=0 -O /home/rostov/N/S01E01.mp4
--2022-06-28 14:47:14--  https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzU3NSIsImNoZWNrc3VtX2lkIjoiNjIwNzE0IiwicHJlbWl1bSI6ZmFsc2UsImxpbWl0X3JhdGVfYWZ0ZXIiOjMyM30,.mp4?uid=0
Translacja stream2.vider.info (stream2.vider.info)... 164.132.171.88, 51.68.36.43, 164.132.162.84, ...
Łączenie się z stream2.vider.info (stream2.vider.info)|164.132.171.88|:443... połączono.
Żądanie HTTP wysłano, oczekiwanie na odpowiedź... 403 Forbidden
2022-06-28 14:47:14 BŁĄD 403: Forbidden.

Co ciekawe, gdy próbuję ściągnąć plik na dysk, przy użyciu Chrome’a („Zapisz film wideo jako…”), wszystko jest ok, a w menedżerze pobierania, jako adres pobieranego pliku wyświetla się wyżej wymieniony. Co robię nie tak, że w Chrome to działa, a przy użyciu wget nie?

Z technicznego punktu widzenia serwer sprawdza takie nagłówki jak: authority, referer. user-agent i finalnie autoryzację z pliku cookie, gdzie też jest zawarty user-agent, jest to też przesyłane jako nagłówek.
Jak klikniesz w konsoli dev, zakładka sieć w dokładnie ten odnośnik z „video_dummy2”, co odkryłeś PPM, to masz kopiuj > kopiuj jako cURL.

Będzie coś na wzór:

curl 'https://stream2.vider.info/video_dummy2/(...).mp4?uid=0' \
  -H 'authority: stream2.vider.info' \
  -H 'accept: */*' \
  -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'cookie: cookie_v12last_item_id=13575; cookie_v12viderinfoo12_sessions=TWÓJ_KLUCZ_SESJI' \
  -H 'range: bytes=0-' \
  -H 'referer: https://vider.info/' \
  -H 'sec-fetch-dest: video' \
  -H 'sec-fetch-mode: no-cors' \
  -H 'sec-fetch-site: same-site' \
  -H 'sec-gpc: 1' \
  -H 'user-agent: twój_user_agent' \
  --compressed

Na końcu, po --compressed dodajesz tylko -o plik.mp4. (nazwa pliku wyjściowego)
Przepustowość pobierania jest ograniczana przez serwer.

Oczywiście można składnię curl przerobić to na polecenie wget, ale po co? :slight_smile:
Ot tak cala tajemnica, czemu w przeglądarce działa, a w zewnętrznej apce nie :wink:

1 polubienie

@Domker:

[rostov@s0]:<~>$ curl 'https://stream.vider.info/video/13575/v.mp4?uid=683884' \
>   -H 'authority: stream.vider.info' \
>   -H 'accept: */*' \
>   -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' \
>   -H 'cookie: spfp=5b989adff11a5fe887c234711156388a; WPabs=60a597; spol_tg=eu%3Atrue%7Cip%3A83.4.15.182' \
>   -H 'range: bytes=0-' \
>   -H 'referer: https://vider.pl/' \
>   -H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"' \
>   -H 'sec-ch-ua-mobile: ?0' \
>   -H 'sec-ch-ua-platform: "Windows"' \
>   -H 'sec-fetch-dest: video' \
>   -H 'sec-fetch-mode: no-cors' \
>   -H 'sec-fetch-site: cross-site' \
>   -H 'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' \
>   --compressed -O /home/rostov/N/S01E01.mp4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100     2    0     2    0     0     14      0 --:--:-- --:--:-- --:--:--    14
curl: (3) URL using bad/illegal format or missing URL

Co robię źle?

@Domker, kiedy użyłem drugiego linka (faktycznie, nie zauważyłem, że to nie z katalogu ‘video_dummy2’), ściąganie ruszyło, trwało ponad 12 minut, ale po zakończeniu pojawił się ten sam komunikat:

[rostov@s0]:<~>$ curl 'https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzU3NSIsImNoZWNrc3VtX2lkIjoiNjIwNzE0IiwicHJlbWl1bSI6ZmFsc2UsImxpbWl0X3JhdGVfYWZ0ZXIiOjMyM30,.mp4?uid=683884'   -H 'authority: stream2.vider.info'   -H 'accept: */*'   -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7'   -H 'cookie: spfp=5b989adff11a5fe887c234711156388a; WPabs=60a597; spol_tg=eu%3Atrue%7Cip%3A83.4.15.182'   -H 'range: bytes=0-'   -H 'referer: https://vider.pl/'   -H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"'   -H 'sec-ch-ua-mobile: ?0'   -H 'sec-ch-ua-platform: "Windows"'   -H 'sec-fetch-dest: video'   -H 'sec-fetch-mode: no-cors'   -H 'sec-fetch-site: cross-site'   -H 'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'   --compressed -O /home/rostov/N/S01E01.mp4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  207M  100  207M    0     0   276k      0  0:12:49  0:12:49 --:--:--  303k
curl: (3) URL using bad/illegal format or missing URL

Użyłeś parametru „-O” (duże O), zamiast „-o” (małe o).
Duże „O” powoduje nadanie nazwy takiej jak plik jest na serwerze.
Nazwa zawiera „?” i jest o tym informacja.
Chcesz nadać nazwę to używaj -o

1 polubienie

@Domker, działa wyśmienicie. Dziękuję bardzo. :slight_smile:

@Domker, dopytam o jeszcze jedną rzecz. Ściągam te pliki zazwyczaj w nocy. Dlatego wrzucam polecenia curla do skryptu sh i ustalam jego uruchomienie o konkretnej godzinie w crontab. Czy mogę do jednego skryptu sh wrzucić polecenia dla ściągania kilku plików na raz? Np.:

#!/bin/bash

curl 'https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzY2MCIsImNoZWNrc3VtX2lkIjoiMTczOTI2NiIsInByZW1pdW0iOmZhbHNlLCJsaW1pdF9yYXRlX2FmdGVyIjozMTR9.mp4?uid=683884' \
  -H 'authority: stream2.vider.info' \
  -H 'accept: */*' \
  -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'cookie: spfp=5b989adff11a5fe887c234711156388a; WPabs=60a597; spol_tg=eu%3Atrue%7Cip%3A83.4.13.16' \
  -H 'range: bytes=0-' \
  -H 'referer: https://vider.pl/' \
  -H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'sec-fetch-dest: video' \
  -H 'sec-fetch-mode: no-cors' \
  -H 'sec-fetch-site: cross-site' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' \
  --compressed -o /home/rostov/N/S01E09.mp4

  curl 'https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzcwMCIsImNoZWNrc3VtX2lkIjoiMTczOTUwMiIsInByZW1pdW0iOmZhbHNlLCJsaW1pdF9yYXRlX2FmdGVyIjozMTl9.mp4?uid=683884' \
  -H 'authority: stream2.vider.info' \
  -H 'accept: */*' \
  -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'cookie: spfp=5b989adff11a5fe887c234711156388a; WPabs=60a597; spol_tg=eu%3Atrue%7Cip%3A83.4.13.16' \
  -H 'range: bytes=0-' \
  -H 'referer: https://vider.pl/' \
  -H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'sec-fetch-dest: video' \
  -H 'sec-fetch-mode: no-cors' \
  -H 'sec-fetch-site: cross-site' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' \
  --compressed -o /home/rostov/N/S01E10.mp4

  curl 'https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzcxMyIsImNoZWNrc3VtX2lkIjoiNjIwNzE5IiwicHJlbWl1bSI6ZmFsc2UsImxpbWl0X3JhdGVfYWZ0ZXIiOjMxNn0,.mp4?uid=683884' \
  -H 'authority: stream2.vider.info' \
  -H 'accept: */*' \
  -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'cookie: spfp=5b989adff11a5fe887c234711156388a; WPabs=60a597; spol_tg=eu%3Atrue%7Cip%3A83.4.13.16' \
  -H 'range: bytes=0-' \
  -H 'referer: https://vider.pl/' \
  -H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'sec-fetch-dest: video' \
  -H 'sec-fetch-mode: no-cors' \
  -H 'sec-fetch-site: cross-site' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' \
  --compressed -o /home/rostov/N/S01E11.mp4

  curl 'https://stream2.vider.info/video_dummy2/eyJmaWxlSUQiOiIxMzg5NyIsImNoZWNrc3VtX2lkIjoiNjIwNzIxIiwicHJlbWl1bSI6ZmFsc2UsImxpbWl0X3JhdGVfYWZ0ZXIiOjMxOX0,.mp4?uid=683884' \
  -H 'authority: stream2.vider.info' \
  -H 'accept: */*' \
  -H 'accept-language: pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7' \
  -H 'cookie: spfp=5b989adff11a5fe887c234711156388a; WPabs=60a597; spol_tg=eu%3Atrue%7Cip%3A83.4.13.16' \
  -H 'range: bytes=0-' \
  -H 'referer: https://vider.pl/' \
  -H 'sec-ch-ua: ".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'sec-ch-ua-platform: "Windows"' \
  -H 'sec-fetch-dest: video' \
  -H 'sec-fetch-mode: no-cors' \
  -H 'sec-fetch-site: cross-site' \
  -H 'user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' \
  --compressed -o /home/rostov/N/S01E12.mp4

Czy taka forma będzie poprawna? Czy muszę dla każdego pliku tworzyć osobny skrypt sh?

Można do jednego, ale pamiętaj, że ciasteczka sesyjne tworzone przez serwer mają ograniczony czas i wygasają.
Jeżeli przygotujesz polecenia dużo wcześniej to po dłuższym czasie linki nie będą działały.
W takim przypadku pozostaje tylko zainicjowanie wszystkich pobierań naraz np. dodając na końcu każdego curla:
&>/dev/null &

Posłużyłem się pierwszą odpowiedzią na posta stąd: Creating A Simple Bash Script With Multiple Commands - Ask Ubuntu — zadziałało.

Zastanawia mnie tylko, czy potrzebne jest użycie exec bash na końcu?

Co powoduje umieszczenie &>/dev/null przed &?

Co to ma wspólnego z programowaniem?

Bo bash to język programowania?

&>/dev/null przekierowuje stdout i stderr (dwa strumienie wyjściowe wyniku działania operacji - w tym wypadku curla) donikąd
& na końcu uruchamia proces w tle

Ten temat został automatycznie zamknięty 90 dni po ostatnim wpisie. Tworzenie nowych odpowiedzi nie jest już możliwe.