Scrape obrazów z canvas ze strony internetowej

Scrape obrazów z canvas ze strony internetowej
CA
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 miesięcy
  • Postów:60
0

Witajcie, pytanie dotyczy możliwości pobierania obrazów generowanych przez canvas. Chciałbym pobierać sobie obrazki ze strony: https://zehfernandes.com/generativeplanets/builder (przez Greasemonkey-a) - na użytek prywatny.

Przerobiłem do tej pory toDataURL, ale w przypadku grafik z powyższej strony ta metoda nie zadziała - zwraca pusty obraz. Czy istnieje jakaś możliwość pobrania snapshota takiej animowanej grafiki przy pomocy JS?

edytowany 1x, ostatnio: Riddle
Radosław Głębicki
coś jest dla: js screenshoot
Riddle
Administrator
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10037
0

Próbowałeś wpisać w google "greasemonkey scrape canvas"?

CA
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 miesięcy
  • Postów:60
0
Riddle napisał(a):

Próbowałeś wpisać w google "greasemonkey scrape canvas"?

Tak, siedzę nad tym od 2-ch dni i sprawdzałem różne sposoby. W przypadku statycznych canvasów nie ma problemu, jedynie z tym animowanym coś nie działa. Sprawdzałem też kilka wtyczek do przeglądarek, ale w takim przypadku grafika albo jest pusta, albo np. ucięta w połowie

Riddle
Administrator
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10037
0
catshy napisał(a):
Riddle napisał(a):

Próbowałeś wpisać w google "greasemonkey scrape canvas"?

Tak, siedzę nad tym od 2-ch dni i sprawdzałem różne sposoby. W przypadku statycznych canvasów nie ma problemu, jedynie z tym animowanym coś nie działa. Sprawdzałem też kilka wtyczek do przeglądarek, ale w takim przypadku grafika albo jest pusta, albo np. ucięta w połowie

A po co dokładnie próbujesz zapisać te animowane canvas?

CA
  • Rejestracja:ponad 6 lat
  • Ostatnio:6 miesięcy
  • Postów:60
0

@Riddle mi właściwie zależy na statycznym obrazie, one są anonimowane na tej stronie. Moje dzieciaki lubią temat kosmosu, planet itd. i chcę im z tych planet porobić różne zabawki w JS, typu minigierki jak memory z odkrywaniem kart, jakieś tam puzzle i inne tego typu. Chciałbym żeby była duża unikatowość tych obrazów i przydałoby mi się tak z kilkaset, a ręczne screenowanie i wycinanie tła to byłaby trochę robota głupiego

Riddle
Administrator
  • Rejestracja:ponad 14 lat
  • Ostatnio:około 7 godzin
  • Lokalizacja:Laska, z Polski
  • Postów:10037
1

To chyba lepiej by było odpalić selenium, wchodzić na tą stronę np 1000 razy, i zapisywać screenshot.

Tu masz kod python który mógłby to zrobić.

Kopiuj
from selenium import webdriver

for i in range(0, 1000):
  driver = webdriver.Chrome(executable_path = 'path\to\chromedriver.exe')
  driver.get("https://zehfernandes.com/generativeplanets/builder")
  driver.save_screenshot('planet.' + str(i) + '.png')

Jakbyś chciał kliknąć na "New random planet", to wywołaj:

Kopiuj
driver.find_element_by_css_selector('span.property-name').click()

Tutaj jest opis jak to zrobić: https://www.browserstack.com/guide/take-screenshot-with-selenium-python

edytowany 5x, ostatnio: Riddle
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:38 minut
  • Postów:8397
0

Spróbuj Puppeteer.

Co do pustego obrazu, może włączyła się polityka bezpieczeństwa
https://developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/toDataURL
Przeczytaj fragment o SecurityError


abc
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 4 godziny
1

Jeśli Twoim celem jest faktycznie zrobić to z kontekstu przeglądarki, to tworząc skrypt do greasemonkey, (czy też tempermonkey) musisz zadbać o kilka rzeczy:

Tak, siedzę nad tym od 2-ch dni i sprawdzałem różne sposoby. W przypadku statycznych canvasów nie ma problemu, jedynie z tym animowanym coś nie działa. Sprawdzałem też kilka wtyczek do przeglądarek, ale w takim przypadku grafika albo jest pusta, albo np. ucięta w połowie

  • przede wszystkim, przed stworzeniem contextu webgl, musisz wymusić by był on stworzony z zachowaniem bufora. Dlatego w cyklu życia strony i też skryptu, musisz jak najwcześniej podmienić metodę getContext np. poprzez nadpisanie prototypu HTMLCanvasElement
    Przykład:

    Kopiuj
    HTMLCanvasElement.prototype.getContext = function(origFn) {
      return function(type, attributes) {
        if (type === 'webgl') {
          attributes = Object.assign({}, attributes, {
            preserveDrawingBuffer: true,
          });
        }
        return origFn.call(this, type, attributes);
      };
    }(HTMLCanvasElement.prototype.getContext);
    

    To powinno zapobiec czyszczeniu bufora w trakcie transformacji do obrazka

  • następnie możesz stworzyć bloba i zemulować ściąganie pliku poprzez atrybut download dostępny na linkach w HTML5, ale to już pewnie wiesz, skoro dostawałeś wcześniej puste obrazki ;)
    PoC:

    Kopiuj
    const data = document.querySelector('#canvas-planet').toDataURL()
    fetch(data).then((b) => b.blob())
    .then(blob => {
        saveFile('planet.png', blob);
    });
    
    function saveFile(fileName,blob){
        const url = URL.createObjectURL(blob);
        const a = document.createElement("a");
        a.style = "display: none";
        document.body.appendChild(a);
        a.href = url;
        a.download = fileName;
        a.click();
        window.URL.revokeObjectURL(url);
        a.remove();
    }
    
edytowany 3x, ostatnio: Riddle
TU
Poprawne rozwiązanie i zero plusów, to jest forum programistyczne XD W sumie preserve drawing buffer ten attrybut można ustawić tez poprzez spatchowanie pliku, teraz każda przeglądarka to nawet umożliwia zapisanie zmodyfikowanej strony to łatwo ustawić to na początku przed załadowaniem skryptu lub grasemonkeyem przed załadowaniem strony i innymi skryptami.
P4
  • Rejestracja:ponad rok
  • Ostatnio:ponad rok
  • Postów:4
0

toDataURL czasami wyrzuca pusty obraz, szczegolnie jesli chodzi o grafiki z zabezpieczeniami lub jesli canvas zostal "zanieczyszczony" przez dane z innych zrodel. mozliwe, ze to wlasnie problem tkwi tutaj. ale spoko, sa inne sposoby. 😎 mozna sprobowac toBlob - to tez pozwala na sciaganie obrazkow z canvas, tyle ze nie jest az tak znana. ale jak masz do czynienia z animacja i chcesz snapshot w konkretnym momencie, to znowu, wyzwanie - trzeba trafic w ten wlasciwy frame.co mozesz zrobic, to ustawic w JS interwal, ktory bedzie probowal zlapac klatke w dobrym czasie. 🤔 tylko warto uwazac, zeby nie przesadzic z czestoscia, bo mozna spowolnic dzialanie strony.
jesli chodzi o greasemonkey, to pamietaj, zeby wszystko robic ostroznie. skrypty uzytkownika sa super do personalizowania doswiadczen w necie, ale latwo cos popsuc. 🙈 jak juz bedziesz gotowy poeksperymentowac z JS, warto poczytac o canvas API. znajdziesz tam rozne eventy i metody, ktore moga ci pomoc w twoim projekcie. w koncu czlowiek sie uczy całe zycie.

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)