Wczytywanie obrazu po HTTP

0

Cześć wszystkim,
mam pytanie moze ktos mi pomoże chciałbym pobrać zdjęcia z serwisu z metrykami. Jednak mam problem z ich pobraniem. Serwis bedzie zamknięty 3.3.2022 wiec chcialbym zrobic sobie kopie dla dwóch parafii. podaje swoj login i hasło tam prócz przegladania zdjęć nie ma możliwości robienia czego innego. także zamieszczam je świadomie.

from requests import Session
from bs4 import BeautifulSoup as bs
 
with Session() as s:
    site = s.get("https://metryki.genbaza.pl/auth/index")
    bs_content = bs(site.content, "html.parser")
    login_data = {
      'auth[login]': 'xxxx',
      'auth[pass]': 'xxxx',
      's': 'Zaloguj'
    }
    s.post("https://metryki.genbaza.pl/auth/index",login_data)
    home_page = s.get("https://metryki.genbaza.pl/genbaza,detail,56899,1")
    #print(home_page.content)
    
 

cookies = {
    'cookieName': 'no',
    'image_viewer_scale': '0.772906327797834',
    '_remember_cookie_left_smallscreen_toolsContainer': '15px',
    '_remember_cookie_top_smallscreen_toolsContainer': '15px',
    '_remember_cookie_collapsed_smallscreen_toolsContainer': 'no',
    'metryki_global': 'p9spef22u791o3lclv894v5094',
}

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0',
    'Accept': 'image/avif,image/webp,*/*',
    'Accept-Language': 'pl,en-US;q=0.7,en;q=0.3',
    'Accept-Encoding': 'gzip, deflate',
    'Connection': 'keep-alive',
    'Pragma': 'no-cache',
    'Cache-Control': 'no-cache',
}

response = s.get('http://metryki.genbaza.pl/photo/202202/56899/k_000078.JPG', headers=headers, cookies=cookies)
file = open("image1.jpg", "wb")

file.write(response.content)

file.close() 

Niestety skrypt nie pobiera mi zdjęcia które chce a jedynie znak chyba jest zabezpieczenie przed kopiowaniem. Może ktoś byłby w stanie mi pomóc.
Z góry dziękuję za pomoc.

0

Może poproś administratora, żeby Ci udostępnił te dane?

1
Spine napisał(a):

Może poproś administratora, żeby Ci udostępnił te dane?

próbowałem nie odpisuje...

5

A ten URI: http://metryki.genbaza.pl/photo/202202/56899/k_000078.JPG to skąd wziąłeś?

Bo jeśli wyciągnąłeś z source-code'u HTML, to na 99% to specjalnie jest taki link wrzucony, i pod nim po prostu jest ten obrazek zakazu.

PS: Po pobierznym ogarnięciu, wychodzi na to że ten URI pod którym jest obrazek jest dostępny tylko przez chwilkę, a potem zwraca ten znak zakazu. Żeby się do niego dobić najpierw musisz strzelić pod POST https://metryki.genbaza.pl/photo/allow-display (z parametrami w body, np directory_id: 328003 oraz fileName: _000.jpg), a potem dopiero po obrazek.

Wyszukaj sobie w view-source w JS'ie funkcyjke allowDisplayImage(), ona strzela do backendu, i po niej przez chwile obrazek jest dostępny pod linkiem.

Czyli innymi słowy, to nie z Twoim programem w Python jest problem, tylko z samym algorytmem do wyciągania tych zdjęć, czyli odpowiednią sekwencją requestów i parametrów.

Co do samej zasadności

To pomijając jak słabe jest to zabezpieczenie; tak powinieneś wiedzieć że zostało to zrobione z myślą dokładnie taką żeby nie robić tego to co Ty chcesz robić; więc ja bym raczej polubownie poprosił albo o te zdjęcia; albo o to żęby strona nie była niedostępna jakoś. Albo jeśli ma być zamknięty, to mógłbyś ustalić z jakiego powodu. Może autor będzie chciał oddać stronkę; tak jak czasem właściciele biblitek je oddają.

0

@TomRiddle:
No oki zrobiłem tak jak pisałeś ale dalej mi nie pobiera ;( też już tak próbowałem... najpierw post otrzymuje true ale potem jest get dwa razy i dalej mi pobiera znaczek.

data = {
  'directory_id': '56899',
  'fileName': 'k_000078.JPG'
}

response = requests.post('https://metryki.genbaza.pl/photo/allow-display', headers=headers, cookies=cookies, data=data)

response = requests.get('https://metryki.genbaza.pl/photo/202202/56899/k_000078.JPG', headers=headers, cookies=cookies)
file = open("image1.jpg", "wb")

file.write(response.content)

file.close()

3
PYJTER napisał(a):

@TomRiddle:
No oki zrobiłem tak jak pisałeś ale dalej mi nie pobiera ;( też już tak próbowałem... najpierw post otrzymuje true ale potem jest get dwa razy i dalej mi pobiera znaczek.

No to musiałeś coś źle zrobić; bo ja ściągnąłem. I te headery i cookies też nie potrzebne.

import requests

def fetch( directory:str, filename:str) -> bytes:
    cookies = {'metryki_global': 'p9spef22u791o3lclv894v5094'}
    data = {'directory_id': directory, 'fileName': filename}
    response = requests.post('https://metryki.genbaza.pl/photo/allow-display', cookies=cookies, data=data)
    response = requests.get('http://metryki.genbaza.pl/photo/202202/56899/k_000078.JPG', cookies=cookies)
    return response.content

if __name__ == '__main__':
    content = fetch('56899', 'k_000078.JPG')
    with open("image4.jpg", "wb") as file:
        file.write(content)

PS: @PYJTER Jak teraz patrze to logowanie nie jest potrzebne, wystarczą dwa requesty

1 użytkowników online, w tym zalogowanych: 0, gości: 1