Zmiana strony startowej w przeglądarce

0

Witam,
Czy posiada ktoś kod, którym mógłby się podzielić? Mianowicie chodzi o zmiane strony startowej w przeglądarce Firefox oraz Chrome. Miałem gdzieś to, lecz zgubiłem source :/.

btw, Olesio dzięki za kod odnosnie IE i Opery.

0

Spoko. A wspomnianych przeglądarek nie używam. I nie mam zamiaru używać. Także niewiele doradzę. Jednak jeżeli miałeś kod z sieci, to wygoogluj go ponownie. Ewentualnie informacje, gdzie przeglądarki te takowe dane przechowują. To wtedy sobie wczytasz.

0

Wracając do twojego programu w Operze,to już raczej jest on nieaktualny. Zauważyłem dopiero dziś po pobraniu najnowszej Opery. Teraz strona startowa przechowywana jest nie w pliku INI a w zwyklym pliku 'Preferences'.
Mógłby mi ktoś podpowiedzieć jak mogę podmienić stronę startową?.

Przykładowa strona startowa z pliku Preferences Opery.

"session": {
"restore_on_startup": 4,
"startup_urls": [ "http://www.google.pl/" ],
"urls_signature": "QhClQAXHlTn5QZ9wv0pmkgxRZ6ONwDObyaYbyzIVm5M="
},

Będę wdzięczny za jakiekolwiek wskazówki. Wiem, że musze wyszukać ten tekst
"startup_urls": [ , ale jak podmienic tą stronę nie mam pojęcia dlatego proszę o jakies wskazówki, pozdrawiam.

1

Nie wiem jak jest w nowszej Operze. Bo używać będę 12.16, ponieważ gówniane chromopodobne coś z wywaloną połową funkcjonalności nadaje się, no właśnie do niczego się nie nadaje. Co do pytania to z fragmentu wnioskuje, że jest to JSON, a Delphi posiada jakieś moduły zewnętrzne do obsługi. Pogoogluj.

Inne rozwiązanie, jeżeli piszesz pod VCL i nie ogranicza Cie chęć małego kodu jak pod WinAPI. To po prostu podmień to poprzez użycie modulu do wyrażeń regularnych TRegExpr, ktory dostępny jest na stronie http://regexpstudio.com/RegExpStudio.html i zobacz sobie w przykładzie jak działa funkcja ReplaceRegExpr. Jej bez problemów użyjesz do podmianki po wczytaniu tekstu z pliku. Można też oczywście po swojemu poprzez funkcje typu Pos, Copy i/lub Delete. Ogółnie banał.

0

Dzięki za odpowiedź.
Chce to zrobić właśnie z

 Pos , Copy 

itd, lecz nie do końca teraz wiem jak, jak możesz podpowiedz troszkę jeszcze. Obecnie znajduje tekst przed stroną startową, a jak po tym cudzysłowie teraz nadmienic , badz wpisac tekst ??

function GetOperaHomePage : string;
const
  Conf_SubDir_Name = 'Opera Software\Opera Stable';
var
  ConfPath : string;
  CommF : TextFile;
  S : String;
begin
  S:='"startup_urls": [ "';
  Result := '';
  ConfPath := AddBackSlash(GetAppDataDirectory + Conf_SubDir_Name);

  AssignFile(CommF,ConfPath+'Preferences');
    if PosEx('[ "', S, 14) > 0 then  
      ShowMessage('Znalazlem tekst');
  end;

"startup_urls": [ "http://www.google.pl/" ],

0

Wszystko co potrzeba już podpowiedziałem. Kolejne co mogę podpowiedzieć to korzystać z obiektu typu TStringList do ładowania tekstu z pliku, zamiast konstrukcji rodem z Turbo Pascala. Poczytaj jak działają wspomniane funkcje. Jeżeli się upierasz, ze nie chcesz kombinować z obiektami do JSON'a ani z TRegExpr. To najprościej będzie wczytać plik do TStringList. W pętli sprawdzić Pos czy znajduje się dany tekst w linijce. Następnie podmienić go funkcją StringReplace. Na prawdę żadnej filozofii tutaj nie ma. Nie potrzeba też żadnej "wiedzy magicznej" do tego celu.

Bo przeciez jakiż w tym problem by w pętli po sprawdzeniu wierszy TStringList i znalezieniu tym z kluczowym słowem. Podmienić jego treść na taki sam początek, ale zawierający żądany - inny adres. Żaden. Można oczywiscie kombiinować z PosEx, ale lepiej podstawić sobie wiersz StringListy do tymczasowej zmiennej typu string, z niej wyciąć to, co znajduje się po pierwszym znaku [ do następnego ]. Mozna to spokojnie zrobić poprzez wspomaganie się procedurą Delete dla tej zmiennej. Ale najłatwiej by wykluczyć, że ktoś sobie poda jakieś "startup_urls": jako adres docelowy i mieszać z zamienianiem po prostu podmienić ten wiersz na nowy z tym słowem "startup_urls": i nowym adresem z programu.

0

Ok,a co jeśli w ogóle ktos nie ma ustawionej tej strony startowej? Wtedy dodać cały wpis ?

Troszkę przerobiony kod. Wczytałem plik do TStringList i poźniej go przepisuje do nowego pliku. Dałem StringReplace , żeby zamieniło mi ten tekst na nową stronę ale cos nie nadpisuje tego ;/.

procedure przegladarka;
const
  Conf_SubDir_Name = 'Opera Software\Opera Stable';
var
  ConfPath : string;
  CommF : TextFile;
  S , L: String;
  Plik : TStringList;
  FileStream : TFileStream;
  i: integer;
begin
  L:='"startup_urls": [ "http://www.google.pl/" ],';
  S:= S + '"http://www.nowyAdres.pl/"' + '  ],';

  ConfPath := AddBackSlash(GetAppDataDirectory + Conf_SubDir_Name);

  Plik := TStringList.Create;
  FileStream := TFileStream.Create((ConfPath+'Preferences'), fmShareDenyNone);
  Plik.LoadFromStream(FileStream);
  FileStream.Destroy();

  //Wpisuje dane spowrotem do pliku
  AssignFile(CommF,ConfPath+'PreferencesA');
  ReWrite(CommF);
  for i := 0 to Plik.Count -1 do
  begin
    if PosEx('[ "', L, 14) > 0 then
    StringReplace(L,L,S,[rfReplaceAll]);
    Writeln(CommF, Plik[i]);
  end;


  CloseFile(CommF);
  Plik.Free;

end;
2

Upierasz się na PosEx, nazywasz dziwnie zmienne, że nie wiadomo jest co do czego za bardzo. Nie wiem też po co robisz jakieś kombinacje ze streamem zamiast po prostu wczytać plik poprzez LoadFromFile do TStringList. A StringReplace było tylko jednym z rozwązań. Pewniejsze bylo by po prostu podmienić tę linijkę na potrzebne słowo plus adres z Twojego programu w tych nawiasach kwadratowych.

Natomiast nie mam pojęcia jak wygląda wpis, jeżeli nie mamy adresu strony startowej. Jeśli wtedy linijki z odpowiednim wpisem nie ma, to przeszukując w pętli wiersze TStringList, funkcja Pos dla danego słowa zwróci po prostu zero i tyle. Wtedy wiesz że wpisu nie było i najwyżej wstawiasz nowy poprzez metodę Insert od StringListy. Tutaj nie ma się co nad tym głowić, tylko poczytać jak działają wspomniane funkcje i obiekty, usiąść, pomyśleć chwilę i to zaprogramować, nie generując sobie problemów tam gdzie ich nie ma.

0

@Asphyxx - ten kod to jeden wielki WTF... Używasz dwóch klas do załadowania głupiego pliku, a potem jeszcze aktualizujesz go metodami rodem z lat 80-tych...

Masz klasę TStringList, więc skorzystaj z jej metod do ładowania i zapisu pliku, czyli LoadFromFile i SaveToFile; Wywal ten strumień, bo jest zbędny i wprowadza tylko zamieszanie; Zamiast w tym przypadku bawić się w ręczne implementacje, dodaj backslash za pomocą bezpiecznej funkcji IncludeTrailingPathDelimiter; A tak w ogóle to skoro stałą Conf_SubDir_Name i tak dodajesz do pobranej ścieżki aplikacji, to zakończ łańcuch spod tej stałej backslashem, a nie kombinuj z funkcjami, bo dokładasz sobie tylko roboty;

Jeśli chodzi o same obiekty, to po pierwsze zwalniaj je metodą Free a nie Destroy, jak Pan Bóg przykazał, po drugie stosuj bloki Try Finally, żeby zabezpieczyć kod przed wyciekami pamięci; No i nazywaj zmienne sensownie, a nie pół po angielsku, a pół po polsku; Na dodatek te polskie identyfikatory są źle dobrane i nie odzwierciedlają przeznaczenia zmiennych; Stosuj jakąś jedną notację w całym kodzie, a nie zmieniaj jej jak rękawiczki; Nazwy stałych przyjęło się zapisywać samymi dużymi literami, oddzielając słowa znakiem podkreślenia;

Podsumowując - zawartość pliku załaduj do pamięci przez instancję klasy TStringList metodą LoadFromFile, następnie znajdź w jej liniach tą szukaną, wprowadź zmiany w pamięci, po ich nastąpieniu zapisz listę do pliku za pomocą metody SaveToFile i zwolnij obiekt z pamięci za pomocą Free; To tyle, jeśli chodzi o teorię - teraz zabierz się za część praktyczną i napisz ten kod porządnie;

Ramka procedury powinna wyglądać mniej więcej tak:

procedure BrowserOperations();
const
  CONF_SUBDIR_NAME = 'Opera Software\Opera Stable\';
var
  slConfig: TStrings;
  strConfFilePath: AnsiString;
  I: Integer;
begin
  strConfFilePath := GetAppDataDirectory() + CONF_SUBDIR_NAME;

  slConfig := TStringList.Create();
  try
    slConfig.LoadFromFile(strConfFilePath);

    for I := 0 to slConfig.Count - 1 do
    begin
      // find and replace values
    end;
  finally
    slConfig.SaveToFile(strConfFilePath);
    slConfig.Free();
  end;
end;

Dorób część wewnątrz pętli i mechanizm szukający odpowiedniej linii i zmieniający tą szukaną wartość na nową; Ewentualnie zabezpiecz sobie kod funkcją FileExists na wypadek, gdyby taki plik nie istniał (ktoś może nie korzystać z Opery lub plik po prostu wyparował).

0

Dokładnie mu to @furious programming opisałem najprościej jak potrafiłem. A nazewnictwo angielskie oraz stosowanie _ w stałych to moje charakterystyczne nawyki i on korzysta z bazy mojego kodu w pewnym programie, który mu kiedyś podesłalem. Dlatego nie widzę sensu za niego robienia gotowca, bo i tak się chyba nie chce nic nauczyć. Dostał już tyle informacji, że jakby na prawdę chciał to by to dawno zakodował. Bo problem jaki sobie postawił do zrealizowania jest na prawdę banalny. I cały czas pisałem, po znalezieniu linijki gdzie należy wstawić adres po prostu wystarczy zrobić slConfig.Count[I] := '"startup_urls": [ "' + StronaPodanaGdziesEdit.Text + '" ],'; Później Break; by pętla nie trwała niepotrzebnie i tyle.

0

@olesio - ja nie neguję Twoich nawyków formatowania kodu, bo podawany przez Ciebie kod zawsze jest sformatowany i czytelny - wskazuję jedynie nauczenie się dobrych praktyk tworzenia kodu i stosowania ich w całym kodzie, nie tylko w jego kawałkach;

Jeśli chodzi o przykładowy kod, jaki podałem - to w żadnym wypadku nie jest gotowiec, to jedynie ramka ładująca i aktualizująca plik źródłowy; Pytacz nie skorzystał z udzielonych wcześniej rad dotyczących użycia klasy TStringList, więc pokazałem jak powinno to wyglądać; Nie implementowałem natomiast części modyfikującej wczytane do pamięci źródło pliku, dlatego że to musi sobie sam zrobić, według własnych upodobań; Dlatego też nie uważam kodu za gotowca (bo de facto nie przekopiuje go i nie wykorzysta bez własnego wkładu), a za wskazówkę dotyczącą używania klasy listy i w ogóle bezpiecznego posługiwania się obiektami;

Prawdą jest, że pytacz dostał masę informacji, jednak albo nie chce ich wykorzystać, albo po prostu nie umie; Stąd mój post i moja sugestia dotycząca sposobu ładowania i zapisywania zawartości pliku konfiguracyjnego, oraz wykorzystania stałej i innych potrzebnych w procedurze elementów.

0

Spoko. Nie chcę nikogo osądząc, ale raczej tak jakby nie chciał użyć na prawdę sprawdzonych rad. Mógł od razu pobawić się z klasą TRegExpr, do modułu z którą podałem linka. Jest tam dołaczna dokumentacja i w przykładzie nawet jest pokazane jak użyć funkcji do zamieniania tekstu pod kątem wyrażeń regularnych. Może ktoś uznać, że to przekombinowane do podmiany jednej linijki pliku, ale każda metoda jest dobra jeżeli jest w miarę skuteczna. A ta mimo wszystko podejrzewam nie była by też tak za tragicznie nieoptymalna, więc ok.

0

Chce tą linijke odnależć za pomocą funkcji

Pos

i ją podmienić, tylko że mi wywala dużo większą linie, nie wiem czemu...

showmessage(IntToStr(Pos('"startup_urls":',slConfig.Text)));
0

Ogarnij się. Przeczytaj kurs z podstawami z 4p i poczytaj, jak działa funkcja Pos. Ona nie zwraca linijki wystąpienia tekstu. Nie wiem w ogóle skąd takie głupoty wywnioskowałeś :/ Wszystko co masz zrobić i w jaki sposób, dokładnie zostało opisane powyżej. Nie tylko przeze mnie.

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