Toon posts:

PHP MySql - Hulp bij uitlezen RSS feed en Pushover

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hoi,

Ik loop ergens vast op het uitwerken van een idee.
De intentie is dat er een p2000 RSS feed wordt uitgelezen en indien deze een bepaalde waarde bevat er een Pushover notificatie uit gaat.

De trigger waardes staan in een Mysql database. Mijn code staat hieronder. Ik moet alleen nog het stukje Pushover erin bouwen maar dat is niet zo spannend.

Waar ik mee zit is dat ik dit script in een cronjob wil laten draaien en dan iedere minuut bijvoorbeeld.
Ik ben nu bang dat het als volgt gaat:
- 13.00 lees RSS feed uit, geen match
- 13.01 lees RSS feed uit, Hey! we hebben een match, stuur Pushover
- 13.02 lees RSS feed uit, Hey! we hebben een match, dezelfde als daarnet, who cares?! stuur Pushover
- 13.03 lees RSS feed uit, Hey! we hebben een match, dezelfde als daarnet, who cares?! stuur Pushover

En dat ik dus binnen 10 minuten knettergek ben geworden 8)7

Wat zou een idee kunnen zijn om hetgeen wat uitgelezen is, te bewaren en te vergelijken met het vorige resultaat en vanuit daar verder te checken, maar hoe kan ik dit het beste aanpakken?

Mijn code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
        //Feed URLs
        $feeds = array(
            "https://XYZ.rss",
            "https://ZYX.rss"

        );

        //Read each feed's items
        $entries = array();
        foreach($feeds as $feed) {
            $xml = simplexml_load_file($feed);
            $entries = array_merge($entries, $xml->xpath("//item"));
        }

        //Sort feed entries by pubDate
        usort($entries, function ($feed1, $feed2) {
            return strtotime($feed2->pubDate) - strtotime($feed1->pubDate);
        });


        // Start defineer sql connectie
        $con=mysqli_connect("localhost", "XXX", "XXX", "XXX");
        if (mysqli_connect_errno()) {
          echo "Failed to connect to MySQL: " . mysqli_connect_error();
        exit();
        }



        //Print all the entries

        foreach($entries as $entry){

            echo "<br><br>";
            $tijdstip= strftime('%d-%m-%Y %H:%M:%S', strtotime($entry->pubDate));
            echo $tijdstip;
            echo "<br>";
            $titel= $entry->title;
            echo $titel;
            echo "<br>";
            $bericht = $entry->description;
            echo $bericht;
            $alles = $tijdstip . " " . $titel  . " " . $bericht;
            //echo $alles;



                      $result = mysqli_query($con,"SELECT * FROM zoekwaarde");
                      while ($row =  mysqli_fetch_array($result))
                      {
                      $term = $row['term'];
                                      if (strpos($alles, $term) == TRUE) {
                                        echo '--->true';
                                          
                                      }

                      }

        }
        mysqli_close($con);

        ?>

Beste antwoord (via Verwijderd op 03-08-2018 09:23)


  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 16:28

AW_Bos

Liefhebber van nostalgie... 🕰️

Je kan toch in de database bijhouden of deze verstuurd is via Pushover met een simpele flag?
Zo ja, stuur hem dan niet nogmaals. Je moet er wel een unieke identifier aan hangen natuurlijk, zoals de tijd.

[ Voor 3% gewijzigd door AW_Bos op 02-08-2018 22:26 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes

Alle reacties


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 06-10 17:29

Matis

Rubber Rocket

Ik denk dat het zinnig is om (een klein stuk van) de RSS feed te tonen.
Misschien zitten hier unieke velden in waarop je zou kunnen selecteren.

Is het niet slimmer om te abonneren op een websocket (push) dan om telkens te pollen (pull)?

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Matis schreef op donderdag 2 augustus 2018 @ 22:18:
Ik denk dat het zinnig is om (een klein stuk van) de RSS feed te tonen.
Misschien zitten hier unieke velden in waarop je zou kunnen selecteren.
Stukje resultaat:

code:
1
2
3
4
5
6
7
02-08-2018 22:12:03
a2 dia: 163,0 : n2 n eindhoven obj: rit: 92312
Ambulance met gepaste spoed naar Eindhoven--->true

02-08-2018 22:11:29
a1 5707ha : wesselmanlaan helmond obj: ziekenhuizen 8610 el elk afd 1 geboorten gezin rit: 92311
Ambulance met spoed naar Wesselmanlaan in Helmond
Is het niet slimmer om te abonneren op een website (push) dan om telkens te pollen (pull)?
Deze snap ik niet, wat bedoel je precies?

Acties:
  • 0 Henk 'm!

  • CurlyMo
  • Registratie: Februari 2011
  • Laatst online: 16:37
Verwijderd schreef op donderdag 2 augustus 2018 @ 22:20:
[...]
Deze snap ik niet, wat bedoel je precies?
Pollen:
He maat, ben je al thuis?
He maat, ben je al thuis?
He maat, ben je al thuis?
He maat, ben je al thuis?
He maat, ben je al thuis?

Pushen:
He maat, bel even als je thuis bent.

Sinds de 2 dagen regel reageer ik hier niet meer


Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 16:28

AW_Bos

Liefhebber van nostalgie... 🕰️

Je kan toch in de database bijhouden of deze verstuurd is via Pushover met een simpele flag?
Zo ja, stuur hem dan niet nogmaals. Je moet er wel een unieke identifier aan hangen natuurlijk, zoals de tijd.

[ Voor 3% gewijzigd door AW_Bos op 02-08-2018 22:26 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 06-10 17:29

Matis

Rubber Rocket

Verwijderd schreef op donderdag 2 augustus 2018 @ 22:20:
Stukje resultaat:

code:
1
2
3
4
5
6
7
02-08-2018 22:12:03
a2 dia: 163,0 : n2 n eindhoven obj: rit: 92312
Ambulance met gepaste spoed naar Eindhoven--->true

02-08-2018 22:11:29
a1 5707ha : wesselmanlaan helmond obj: ziekenhuizen 8610 el elk afd 1 geboorten gezin rit: 92311
Ambulance met spoed naar Wesselmanlaan in Helmond
Is het een idee om het tijdstip van het bericht op te slaan op het moment dat je het naar Pushover stuurt. Mocht je daarna hetzelfde bericht nogmaals matchen, zie je dat het al verstuurd is.
Deze snap ik niet, wat bedoel je precies?
Ik bedoelde websocket en niet website. Typefout, ik heb mijn originele bericht aangepast.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
AW_Bos schreef op donderdag 2 augustus 2018 @ 22:25:
Je kan toch in de database bijhouden of deze verstuurd is via Pushover met een simpele flag?
Zo ja, stuur hem dan niet nogmaals. Je moet er wel een unieke identifier aan hangen natuurlijk, zoals de tijd.
:/ Dus je zegt eigenlijk...

code:
1
2
3
4
5
6
7
8
if (strpos($alles, $term) == TRUE) {
                                        echo '--->true';
                                        select count rijen met dezelfde tijd en datum
                                           if count = 0 (rij bestaat niet):
                                                      stuur pushmelding
                                                      sla tijd en datum op
                                           einde if
                                      }


Maar dan krijg je toch na maanden een dikke SQL table, ok kun je ook wel weer omzeilen door deze na x tijd te verwijderen.

Op zich nog best een goed idee :)
Ik bedoelde websocket en niet website. Typefout, ik heb mijn originele bericht aangepast.
Dat zou kunnen alleen heb ik geen waar te beginnen hiermee en 0,0 ervaring met websockets.

Ik zat zelfs nog te bedenken om in Bash een live rss feed ticker te checken en dan met Bash (of Python) iedere nieuwe toegevoegde feed te controleren en indien match een Pushover eruit te gooien.

Je hoeft dan niet met 'opslaan' van data te werken. Hij checkt ze dan live. Alleen kan ik geen echte makkelijke Bash rss readers vinden.

Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 16:28

AW_Bos

Liefhebber van nostalgie... 🕰️

Bij de eerste keer dat je een incident uit je buurt vanuit RSS in je database plaatst, laat je direct via de PushOver API een notificatie sturen. Direct daarna kijkje of die API een 'okee, het is gelukt' ter geeft (ik neem aan dat die dat kan) en dan dat item in je database markeren als 'genotificeerd'.

Kijkt je cron opnieuw en pakt hij weer dat incident, dan moet hij hem niet plaatsen. Gewoon een controle op een enkel veld. En je database wordt echt niet super groot hoor, en dan alsnog maakt het geen bal uit.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • +1 Henk 'm!

  • spone
  • Registratie: Mei 2002
  • Niet online
Kan je niet gewoon ergens de timestamp van het laatst verstuurde rss item opslaan. De volgende keer dat je langs komt kijk je of er nieuwere items zijn dan waar je gebleven bent en die verwerk je dan.

i5-14600K | 32GB DDR5-6000 | RTX 5070 - MacBook Pro M1 Pro 14" 16/512


Acties:
  • +1 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

AW_Bos schreef op donderdag 2 augustus 2018 @ 22:25:
Je kan toch in de database bijhouden of deze verstuurd is via Pushover met een simpele flag?
Zo ja, stuur hem dan niet nogmaals. Je moet er wel een unieke identifier aan hangen natuurlijk, zoals de tijd.
Ik zou dan de timestamp van het laatste bericht opslaan, dan weet je dat alles ervoor ook geweest is. ;)

Acties:
  • +1 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
CH4OS schreef op donderdag 2 augustus 2018 @ 22:57:
[...]
Ik zou dan de timestamp van het laatste bericht opslaan, dan weet je dat alles ervoor ook geweest is. ;)
Ik weet niet of p2000 nog iets veranderd is de laatste paar jaren, maar vroeger kende het prioriteiten waardoor een lage prio bericht er achteraf pas ingevoerd kon worden als er een hoge prio net achteraan kwam.

Waardoor je dus een kans hebt dat je berichten mist als je enkel de laatste datetime pakt.

Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Gomez12 schreef op vrijdag 3 augustus 2018 @ 00:04:
[...]

Ik weet niet of p2000 nog iets veranderd is de laatste paar jaren, maar vroeger kende het prioriteiten waardoor een lage prio bericht er achteraf pas ingevoerd kon worden als er een hoge prio net achteraan kwam.

Waardoor je dus een kans hebt dat je berichten mist als je enkel de laatste datetime pakt.
Ah, in dat geval heeft @AW_Bos dan wel weer een punt. Ik weet wat p2000 is en dat is het dan wel, hahaha!

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 06-10 17:29

Matis

Rubber Rocket

P2000 is niet zo heel spannend hoor. Ik heb namelijk een aantal maanden geleden precies zo'n zelfde use case gehad.
Ik heb in Python (maar had ook prima in PHP) een service geschreven welke zich abonneert op een websocket waar P2000 berichten (JSON) op gespushed worden.
Daarachter een eenvoudige parser welke de berichten ontleedde en daarachter weer een (aantal) validators welke keken of het bericht aan mijn wensen voldeed. Indien het bericht door alle validators heen kwam, werd er een commando gestuurd naar een API.

Het grote voordeel hiervan was dat je niet iedere X tijd hoeft te gaan pollen, maar door de websocket realtime de data binnenkrijgt. Daarnaast hoef je je ook niet druk te maken om bij te houden welke berichten je wel en niet gevalideerd hebt, want ze komen gewoon stuk voor stuk binnen. Zodra het bericht door de validators heen is, kun je het vergeten, want het komt nooit meer terug.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 16:28

AW_Bos

Liefhebber van nostalgie... 🕰️

Houdt wel rekening dat P2000 in de dichtbije toekomst gecodeerd door de lucht gaat.

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Matis schreef op vrijdag 3 augustus 2018 @ 07:35:
P2000 is niet zo heel spannend hoor. Ik heb namelijk een aantal maanden geleden precies zo'n zelfde use case gehad.
Ik heb in Python (maar had ook prima in PHP) een service geschreven welke zich abonneert op een websocket waar P2000 berichten (JSON) op gespushed worden.
Daarachter een eenvoudige parser welke de berichten ontleedde en daarachter weer een (aantal) validators welke keken of het bericht aan mijn wensen voldeed. Indien het bericht door alle validators heen kwam, werd er een commando gestuurd naar een API.

Het grote voordeel hiervan was dat je niet iedere X tijd hoeft te gaan pollen, maar door de websocket realtime de data binnenkrijgt. Daarnaast hoef je je ook niet druk te maken om bij te houden welke berichten je wel en niet gevalideerd hebt, want ze komen gewoon stuk voor stuk binnen. Zodra het bericht door de validators heen is, kun je het vergeten, want het komt nooit meer terug.
Dit zou eigenlijk ideaal zijn... ik ben echter totaal niet bekend met websockets dus daar zou ik in moeten duiken. Care to share?

Meanwhile ga ik aan de slag met AW_Bos' idee.

Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 06-10 17:29

Matis

Rubber Rocket

Verwijderd schreef op vrijdag 3 augustus 2018 @ 08:38:
Dit zou eigenlijk ideaal zijn... ik ben echter totaal niet bekend met websockets dus daar zou ik in moeten duiken. Care to share?
De code zelf ga ik niet delen. Ten eerste is het Python, ten tweede is het een stream die je alleen middels gebruikersnaam en wachtwoord kunt bekijken. Maar er is genoeg te vinden [google]php websocket client[/google].
Meanwhile ga ik aan de slag met AW_Bos' idee.
Dat is ook een prima werkwijze.

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Prima!

Thanks all, ik ga wat rommelen weer!

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ok, ben overgestapt naar Python en so far hieronder mijn code.
Werkt eigenlijk top maar het enige waar ik niet aan uitkom is het feit dat hij nu maar één url raadpleegt.
Ik zou dit graag willen uitbreiden naar meerdere feeds.

Nou heb ik dit al gevonden:
https://stackoverflow.com...urls-in-feedparser-python

Maar ik snap niet hoe ik dit makkelijk ingebouwd krijg in onderstaande code.


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#!/usr/bin/python
import feedparser
import os
import time
import httplib, urllib

# Pushover, send start-up notify
#conn = httplib.HTTPSConnection("api.pushover.net:443")
#conn.request("POST", "/1/messages.json",
#  urllib.urlencode({
#    "token": "ZZZ",
#    "user": "ZZZZ",
#    "title": "P2000",
#    "message": "Meldingen gestart",
#  }), { "Content-type": "application/x-www-form-urlencoded" })
#conn.getresponse()


# Reset old_message
old_message = ""

# Reset flag
flag = 0

while True:
        # Whipe screen
        os.system('clear')
        # Read RSS Feed
        d = feedparser.parse('https://url1.rss')
        # Gather title
        title = d['entries'][0]['title']
        # Title to uppercase
        title = title.upper()
        # Gather description
        description = d['entries'][0]['description']
        # Description to uppercase
        description = description.upper()

        # Combine title and description to message
        message = title + " || " + description

        # Conditions need to be in capitals
        if message.find("56") != -1:
                 flag = 1

        if message.find("HO") != -1:
                flag = 1

        # If flag = true
        if flag == 1:
                if message != old_message:
                        print("\033[1;31;40m *** Ik stuur een ALERT uit! ***")

                        # Pushover, send start-up notify
                        #conn = httplib.HTTPSConnection("api.pushover.net:443")
                        #conn.request("POST", "/1/messages.json",
                        #  urllib.urlencode({
                        #    "token": "ZZZZ",
                        #    "user": "ZZZZZ",
                        #    "title": "P2000",
                        #    "message": message,
                        #  }), { "Content-type": "application/x-www-form-urlencoded" })
                        #conn.getresponse()

                        old_message = message

        print title
        print description
        print flag
        flag = 0
        print("\033[1;32;40m")

        time.sleep(10)

Acties:
  • 0 Henk 'm!

  • Tjolk
  • Registratie: Juni 2007
  • Laatst online: 06-10 20:26
Waarom schakel je ineens over naar Python? Liep je ergens tegenaan wat PHP niet kan oplossen voor je?

Misschien heb je iets aan mijn feedpostbot extensie (voor phpBB) ter inspiratie: https://github.com/GerB/feedpostbot

Normaliter hebben RSS feeds een guid. Die kun je opslaan. Indien afwezig, dan kun je op basis van de pubDate icm de link ook een unieke identifier maken. Zie ook hoe ik dat hier doe.

Noot: de Feed Post Bot leest zowel RDF als ATOM als RSS feeds en houdt er rekening mee dat er weinig harde afspraken zijn in die ook daadwerkelijk nagekomen worden door feed publishers, dus je komt nogal wat fallbacks tegen.

Tjolk is lekker. overal en altijd.


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
AW_Bos schreef op vrijdag 3 augustus 2018 @ 08:31:
Houdt wel rekening dat P2000 in de dichtbije toekomst gecodeerd door de lucht gaat.
Hier is al zo lang sprake van, dat ik me afvraag wanneer dit nu echt eens gaat gebeuren.. Denk het nog lang niet eigenlijk, vanwege de persvrijheid en technische moeilijkheden.
Verwijderd schreef op vrijdag 3 augustus 2018 @ 17:45:
Maar ik snap niet hoe ik dit makkelijk ingebouwd krijg in onderstaande code.
Je hebt zoals het antwoord daar zegt een extra for-loop nodig. Verder zie ik een probleempje met deze code als er meer dan 1 match is, en P2000 matches komen vaak met meer tegelijkertijd. Je wilt waarschijnlijk iets met een set of dict bijhouden van wat er al geweest is. Daarnaast is foutafhandeling niet aanwezig, en kan me voorstellen dat dit wel handig is als het scriptje langer moet gaan draaien. De kans dat de feed ophalen een keertje niet lukt wordt dan wel erg groot.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • AW_Bos
  • Registratie: April 2002
  • Laatst online: 16:28

AW_Bos

Liefhebber van nostalgie... 🕰️

pedorus schreef op maandag 6 augustus 2018 @ 22:28:
[...]

Hier is al zo lang sprake van, dat ik me afvraag wanneer dit nu echt eens gaat gebeuren.. Denk het nog lang niet eigenlijk, vanwege de persvrijheid en technische moeilijkheden.
Ik heb al begrepen dat er veel apparatuur al wordt omgewisseld of geüpdated.
Ik denk dat pers wel een vrijstelling krijgt voor gebruik van P2000 a.h.v. goedkeuring van NVJ ofzo. Als ze het officieel willen doen lijkt me dit de juiste weg. Maar ja, lichtkranten op kazernes worden aangestuurd, dus het moet wel weer naar digitaal te brengen zijn.

We zullen zien wat de toekomst is......

Verder snap ik totaal niet de omslag naar Python. PHP kan het prima oplossen.

[ Voor 18% gewijzigd door AW_Bos op 06-08-2018 22:34 ]

Telecommunicatie van vroeger
🚅Alles over spoor en treintjes

Pagina: 1