Titelzeile von Firefox auslese

Anfängerfragen zum Programmieren mit PureBasic.
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Titelzeile von Firefox auslese

Beitrag von teamO »

Hi Leute,

Ich habe vor kurzem den Entschluss gefasst meine Zeit auf zeitfressenden Seiten (facebook youtube, ect.) zu beschränken.
Das ganze würde ich gerne programmiertechnisch lösen. Sodass diese Seiten nur für eine gewisse Zeit geöffnet sein dürfen und danach irgendeine Strafe kommt ^^

Ich hab allerdings keine Ahnung, wie ich erkennen kann, welche websiten gerade geöffnet sind. Ein Ansatz wäre die Titelzeile des momentan geöffneten Fensters auszulesn und zu schauen ob bestimmte Schlagwörter vorkommen. Geht das auslesen mit purebasic bordmitteln? Gibt es bessere Möglichkeiten?
das ganze sollte unter ubuntu laufen. Es wäre schön, wenn es auch unter windows ging, ist aber nicht essentiell.

Hat jemand eine Idee?

Danke,
teamO
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Titelzeile von Firefox auslese

Beitrag von RSBasic »

teamO hat geschrieben:Geht das auslesen mit purebasic bordmitteln?
Leider nein. Ich hätte ein WinAPI-Befehl vorgeschlagen, aber du möchtest ja lieber unter Ubuntu ermitteln.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Titelzeile von Firefox auslese

Beitrag von teamO »

für ubuntu müsste es auch was wie die winAPI geben, oder?

ist es für normalsterbliche möglich damit umzugehen?
im Zweifelsfall würde ich es jetzt nur für ubuntu programmieren. Wäre auch schon ein Anfang.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Titelzeile von Firefox auslese

Beitrag von RSBasic »

Ja für Ubuntu (Linux) gibt es auch eine API-Schnittstelle, aber damit kenn' ich mich nicht aus und kann dir auch nicht helfen.
Wenn du zwar APIs verwenden möchtest, aber dennoch gewährleisten möchtest, dass spezifische Funktionen überall angeboten werden, kannst du dein Code etwa so aufbauen:

Code: Alles auswählen

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Windows
    ;Win32 API[...]
  CompilerCase #PB_OS_Linux
    ;Linux API[...]   
CompilerEndSelect
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Titelzeile von Firefox auslese

Beitrag von ts-soft »

Warum nicht einfach einen eigenen Browser programmieren? WebGadget bietet doch viele Möglichkeiten.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Titelzeile von Firefox auslese

Beitrag von DarkDragon »

Unter Linux gibts Xlib für X-Server. Da Ubuntu aber ja was ganz eigenes sein will hat man auf einen X-Server verzichtet und Unity eingebaut. D.h. da musst du wieder zwischen 2 APIs unterscheiden :lol: . Viel spaß. Bin schon am Wrappen der Xlib aus Motivationsgründen gescheitert. Da nutze ich doch lieber eine Programmiersprache in der es bereits Anbindungen dafür gibt.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Dark
Beiträge: 93
Registriert: 24.08.2007 20:36
Kontaktdaten:

Re: Titelzeile von Firefox auslese

Beitrag von Dark »

Ich habe einfach mal mein Ubuntu 10.10 in VirtualBox gestartet und einen Versuch gewagt. Der Code funktioniert bei mir und sollte auch noch unter Ubuntu 11.04 funktionieren, da hier Standardmäßig ein X Server verwendet wird. Die Umstellung auf Wayland (dem XServer Ersatz) ist noch nicht vollzogen kann aber optional installiert werden.

Damit der Code funktioniert, brauchst du noch die passenden Libs, welche mit folgendem Befehl installiert werden können:

Code: Alles auswählen

sudo apt-get install xorg-dev
Und hier der Code:

Code: Alles auswählen

EnableExplicit

Structure children
  *window[0]
EndStructure

Structure XTextProperty 
  *value
  enconding.i
  format.i
  nitems.l
EndStructure

ImportC "/usr/lib/libX11.a"
  XOpenDisplay        (*Display_name)
  XDefaultRootWindow  (*Display)
  XQueryTree          (*Display, *Window, *root_return, *parent_return, *children_return.children,  *nchildren_return.i) 
  XFetchName          (*Display, *Window, *Name)
  XInternAtom         (*Display, atom_name.p-ascii, only_if_exists.i)
  XGetWindowProperty  (*Display, *Window, property.i, long_offset.i, long_length.i, delete.i, req_type.i, *actual_type_return.i, *actual_format_return.i, *nitems_return, *bytes_after_return, *prop_return)
  XGetTextProperty    (*Display, *Window, *text_prop_return, property.i)
  XCloseDisplay       (*Display)
  XFree               (*Memory) 
EndImport

;Wir brauchen die libs nur um die Abhängigkeiten aufzulösen
ImportC "/usr/lib/libxcb.a"
EndImport
ImportC "/usr/lib/libXau.a"
EndImport
ImportC "/usr/lib/libXdmcp.a"
EndImport

Global _NET_WM_VISIBLE_NAME.i
Global _NET_WM_NAME.i
Global WM_NAME.i
Global UTF8_STRING.i


Procedure.s GetWindowName(*Display, *Window)
  Protected Result.s
  
  If UTF8_STRING
    
    Protected Type.i
    Protected Format.i
    Protected nItems.i
    Protected bytes_after.i
    Protected *Name
      
    If _NET_WM_VISIBLE_NAME
     
      If XGetWindowProperty(*Display, *Window, _NET_WM_VISIBLE_NAME, 0, 256, #False, UTF8_STRING, @Type, @Format, @nItems, @bytes_after, @*Name) = 0
        
        If Type = UTF8_STRING And nItems > 0 And format = 8 
        
          Result = PeekS(*Name, -1, #PB_UTF8)  
          XFree(*Name)
          
          ProcedureReturn Result
          
        EndIf
        
        XFree(*Name)
        
      EndIf  
      
      If XGetWindowProperty(*Display, *Window, _NET_WM_NAME, 0, 256, #False, UTF8_STRING, @Type, @Format, @nItems, @bytes_after, @*Name) = 0
        
        If Type = UTF8_STRING And nItems > 0 And format = 8 
        
          Result = PeekS(*Name, -1, #PB_UTF8)  
          XFree(*Name)
          
          ProcedureReturn Result
          
        EndIf
        
        XFree(*Name)
        
      EndIf 
      
    EndIf
  
  EndIf
  
  Protected Text.XTextProperty
  
  If XGetTextProperty(*Display, *Window, @Text, WM_NAME)
  
    If text\value
    
      If text\format = 8 And text\enconding = UTF8_STRING And text\nitems > 0
        Result = PeekS(text\value, -1, #PB_UTF8)
      EndIf
      
      XFree(text\value)
      
    EndIf
    
  EndIf
    
  ProcedureReturn Result
EndProcedure


Procedure Enumerate(*Display, *Window)

  Protected *childrens.children
  Protected nchildren.i = 256
  Protected *root
  Protected *parent
  
  If XQueryTree(*Display, *Window, @*root, @*parent, @*childrens, @nchildren)
  
    If *childrens
    
      If nchildren > 0
     
        Protected i.i
        For i = 0 To nchildren -1
       
          Protected Name.s = GetWindowName(*Display, *childrens\window[i])
          
          If Name <> ""
          
            If FindString(Name, "Mozilla Firefox", 1)
              Debug ">>>> " + Name
            Else
              Debug Name
            EndIf  
            
          EndIf
          
          Enumerate(*Display, *childrens\window[i])
         
        Next
    
      EndIf
   
      Xfree(*childrens)
 
    EndIf
 
  EndIf
  
EndProcedure

Define *Display = XOpenDisplay(0)

If *Display

  Define *RootWindow = XDefaultRootWindow(*Display)
  
  _NET_WM_VISIBLE_NAME  = XInternAtom(*Display, "_NET_WM_VISIBLE_NAME", #True)
  _NET_WM_NAME          = XInternAtom(*Display, "_NET_WM_NAME",         #True)
  WM_NAME               = XInternAtom(*Display, "WM_NAME",              #True)
  UTF8_STRING           = XInternAtom(*Display, "UTF8_STRING",          #True)
  
  Enumerate(*Display, *RootWindow)
  
  XCloseDisplay(*Display)
  
EndIf
Mfg,
Dark
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Titelzeile von Firefox auslese

Beitrag von ts-soft »

Funktioniert unter Ubuntu 11.04 nicht, libX11.a usw. fehlen.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Titelzeile von Firefox auslese

Beitrag von Shardik »

ts-soft hat geschrieben:Funktioniert unter Ubuntu 11.04 nicht, libX11.a usw. fehlen.
Darks Beispiel funktioniert einwandfrei unter Ubuntu 11.04, wenn man sich ein bißchen
mehr Mühe gibt... :mrgreen:

Neben dem von Dark beschriebenen
Dark hat geschrieben:sudo apt-get install xorg-dev
zur Installation der unbedingt benötigten X-Server Libs muß unter Ubuntu 11.04 noch
der Pfad zu den Libs angepaßt werden. Die 4 Zeilen mit

ImportC "/usr/lib/lib..."

müssen in

ImportC "/usr/lib/i386-linux-gnu/lib..."

abgeändert werden... :wink:
teamO
Beiträge: 56
Registriert: 01.03.2010 20:01

Re: Titelzeile von Firefox auslese

Beitrag von teamO »

@Dark:
wow! gleich ein funktionierender code!
vielen Dank! :D
das hätte meine Fähigkeiten nun doch deutlich überstiegen ^^
ganz verstanden hab ich aber noch nicht, was da abgeht. kommen die Funktionen mit dem X am anfang von dem XServer?
muss mir das ganze noch ein bisschen anschauen und versuchen es nachzuvollziehen ;)

@all: hab es schon mal gesagt, will es aber nochmal sagen: echt eine super community hier!
Antworten