V er medlem hos BOB og samler ansiennitet for å ha muligheten til å kunne leie billig hos BOB en gang det trengs. Nettsiden de har for å liste opp hvilke leiligheter som er til utleie link er helt uten muligheter for å kunne få beskjed når det er kommet nye leiligheter, så etter (veldig lite) mas fra min side dro Ove dette ut av hatten:

BOB_sjekker.py


> #!/usr/bin/env python3

import json
import re
import smtplib
import sys
from email.mime.text import MIMEText

import requests
from bs4 import BeautifulSoup as bs4

url = "http://www.bob.no/for-deg/boligmarkedet/ledige-leiligheter"

SMTP       = "smtp.domene.no"
SMTP_PORT     = "587"
SMTP_USERNAME   = "AzureDiamond"
SMTP_PASSWORD   = "hunter2"
sender       = "bruker@eksempel.no"

# For å sende epost til en adresse
#receiver = "bruker@eksempel.no"

# For å sende til to adresser
receivers = ["bruker1@eksempel.no", "bruker2@eksempel.no"]


def send_mail(message):
    # Fjerner unødvendige newlines
    message = re.sub(r'(?<!\n)\n(?!\n)|\n{3,}', '', message)

    msg = MIMEText(message, _charset="utf-8")
    msg['Subject'] = "Oppdaget forskjell pa {}".format(url)
    msg['From'] = sender

    s = smtplib.SMTP(SMTP, SMTP_PORT)
    s.login(SMTP_USERNAME, SMTP_PASSWORD)

    # For å sende epost til en adresse
    #msg['To'] = receiver
      #s.sendmail(sender, receiver, msg.as_string())


    # For å sende til to adresser
    for receiver in receivers:
        msg['To'] = receiver
        s.sendmail(sender, receiver, msg.as_string())

# Last ned siden, kræsj hvis vi ikke får HTTP/200,
# parse HTMLen og finn tabellen med leilighetene.
r = requests.get(url)
r.raise_for_status()
soup = bs4(r.text)
kolB = soup.find('div', {'id' : 'kolB'})

# Finn lengden på teksten med leilighetene
length = len(kolB.text)

# Hvis scriptet kjøres med ekstra argumenter, så avslutter vi og printer
# JSON-filen med nåverende lengde på teksten.
if len(sys.argv) != 1:
    sys.exit('{{"current": {}}}'.format(length))

with open('len.json', 'r') as f:
    data = json.load(f)

# Hvis det er forskjell
if length != data['current']:
    print('Forskjellig lengde pa tekst. Sender email.')
    send_mail(kolB.text)
    print('Epost sendt!')

    # Hvis vi kom så langt, så klarte vi sikkert å sende mailen,
    # og da kan vi også skrive den nye verdien til JSON filen
    data['current'] = length
    with open('len.json', 'w') as f:
        json.dump(data, f)

Og sammen med en len.json

{ "current": 618 }

Og en BOB_sjekker.sh

#!/usr/bin/env bash
cd /home/fredrik/BOB_sjekker
python3 BOB_sjekker.py

Og så en linje i crontab

0 * * * * /home/fredrik/BOB_sjekker/BOB_cron.sh

Og da sjekkes det hver time og jeg og V får en fin mail hvis det har skjedd noen endringer. I tillegg er det utrolig greit å litt historikk så jeg kan se hvor mye det er vanlig å koste og hvor ofte og hvor mange leiligheter kommer ut :-)

Filene

BOB_sjekker.sh - len.json - BOB_sjekker.py