Autor Zpráva
nethor
Profil
Zdravím, na cizím serveru jsou soubory dostupné po přihlášení.
Funguje to tak, že zadám adresu souboru a když nejsem přihlášen, přesměrujemě na přihlášení, pozadání loginu se pak spustí stahování.
Pokud trvá přihlášení, jde stahovat bez omezení, bez opětovného zadávání loginu. Web běží na ASP, HTTPS, login form má csrf ochranu.

Těch souborů potřebuji ale stáhovat řádově tisíce a stahovat a ukládat soubory (naklikat to) je zdlouhavé a prakticky neprůchodné.
Hledám tedy způsob, jak to zpracovat strojem. Napadly mě dvě cesty:

1. Jiným serverem třeba localhost (PHP):
Pokusit se přihlásit server; přes file_get_contents() zjistit tokeny, doplnit login a serverem cizímu serveru poslat zpět.
Pak už by měly jít soubory hromadně stahovat pomocí file_get_contents().
Nejsem si ale jistý, jestli localhost dokáže udržet cizí session, tj. zůstat přihlášen.
(asi to nějak jde, mám dojem, že kdysi šlo do GoogleWebmaster zadat login webu, aby mohl zaindexovat i stránky dostupné jen po požihlášení. )

2. Na straně klienta, JavaScript:
Přihlásit se normálně a pak z přihlášeného prohlížeče spustit JS.
Našel jsem fci browser.downloads.download() ; downloads.download()
Jestli to správně chápu, měla by stáhnpout soubor a uložit ho u klienta (? je to vůbec technicky / bezpečnostně možné ?)
Třeba browser(/chrome).downloads.download({url: "d32-a.sdn.cz/d_32/c_static_QJ_N/iFamk/media/img/logo_v2.svg"}) ;
se mi ale napodařilo rozchodit. (Download.html:24 Uncaught TypeError: Cannot read properties of undefined (reading 'download'))

----

Je některá z cest schůdná, napadá Vás jiná?
Keeehi
Profil
nethor:
Ta první možnost jde určitě použít. Session se drží většinou pomocí hodnoty v cookie. Takže stačí když s požadavkem na stažení pošleš hodnotu cookie kterou jsi dostal v odpovědi na přihlášení.
Vypadá to, že to je jen nějaká jednorázovka. V takovém případě bych neimplementoval samotné přihlašování v php. Přihlásil bych se v prohlížeči a hodnotu cookie bych si nakopíroval ručně do toho scriptu.

$urls = [
    'https://example.com/file1.csv',
    'https://example.com/file2.csv'
];

$opts = [
    'http'=> [
        'method'=>"GET",
        'header'=>"Cookie: foo=bar\r\n"
    ]
];

foreach ($urls as $url) {
    $context = stream_context_create($opts);
    file_put_contents('./dowloaded_files/'.basename($url), file_get_contents($url, false, $context)));
}
nethor
Profil
Keeehi:
Děkuji, vyzkouším.
nethor
Profil
Keeehi:
Tak se mi nedaří, zkoušel jsem různé varianty.
Server vrací buď přesměrování na login, Bad request nebo Internal Server Error:

$http_response_header:
array(12) {
  [0]=>
  string(34) "HTTP/1.1 500 Internal Server Error"
  [1]=>
  string(38) "Content-Type: text/html; charset=utf-8"
  [2]=>
  string(26) "Server: Microsoft-IIS/10.0"
  [3]=>
  string(62) "Strict-Transport-Security: max-age=31536000; includeSubdomains"
  [4]=>
  string(293) "Content-Security-Policy: default-src 'self'; img-src 'self' https://*****.cz https://*****.priv https://i.ytimg.com; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ajax.aspnetcdn.com; style-src 'self' 'unsafe-inline'; frame-src 'self' https://www.youtube.com"
  [5]=>
  string(48) "Referrer-Policy: strict-origin-when-cross-origin"
  [6]=>
  string(27) "X-Frame-Options: SAMEORIGIN"
  [7]=>
  string(31) "X-Content-Type-Options: nosniff"
  [8]=>
  string(30) "X-XSS-Protection: 1 mode=block"
  [9]=>
  string(35) "Date: Tue, 19 Oct 2021 09:10:24 GMT"
  [10]=>
  string(17) "Connection: close"
  [11]=>
  string(20) "Content-Length: 3010"
}

Nemůžu sem veřejně psát o jakou adresu jde, ale jestli to dokážeš rozchodit, určitě se domluvíme i finančně.
Vyžaduje to ale mlčenlivost. Mohu mailem?
Kajman
Profil
Nebo ty finance nabídněte vlastníkovi stránky. Třeba už má nebo připraví nějaké API pro roboty.
nethor
Profil
Kajman:
To by bylo nejlepší, ale bohužel nemůže. Už jsme o tom dlouze jednali.
Keeehi
Profil
nethor:
Mohu mailem?
Ale jo, klidně.
nethor
Profil
Vyřešeno.

V první cestě jsem se dostal o kousek dál odesláním stream_context (user_agent a pod.)
ale narazil jsem na další překážku, nějakou opičárnu s přesměrováním.

Zkusil jsem tedy 2. cestu, která se ukázala jako jednoduchá. Stačilo nastavit Chrome (který používám jen zřídka)
nastavit adresář pro stahování, povolit automatické stahování bez dotazu a povolit vyskakovací okna pro localhost.
Pak už se jen přihlásit a ve frontě po dávkách js nastřílet odkazy do vyskakovacích oken ...a okna zase js pozavírat.

Díky za pomoc.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0