-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathuutuushaku.py
executable file
·113 lines (100 loc) · 5.62 KB
/
uutuushaku.py
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# moduuli komentoriviparametrien käsittelyyn
import argparse
import time
import os
import logging
# luokka uutuusluetteloiden käsittelyyn
from uutuusluettelo import Uutuusluettelo
# luokka kirjanpitämiseen edellisen luettelon luontikerran kirjoista
from kasitellyt import Käsitellyt
# luokka luetteloiden lähettämiseen sähköpostilla
from posti import Postittaja
def kysyPostitetaanko( luettelo ):
'''Postitus vaiheessa käytettävä funktio
Jos käyttäjä määrittää komentoriviparametrilla, että häneltä kysytään postitetaanko luettelot,
käytetään tätä funktiota käyttäjältä luvan kysymiseen jokaisen luettelon postituksesta.'''
# käyttäjän vastaus kysymykseen
vastaus = ''
# kysytään kunnes käyttäjä vastaa k tai e
while vastaus not in [ 'k', 'e' ]:
vastaus = input( 'Lähetetäänkö ' +luettelo['tiedosto'] + ' sähköpostilla. Vastaa k tai e: ' )
return vastaus == 'k'
# määritetään ohjelman komentorivi parametrit
komentorivi = argparse.ArgumentParser()
# määritetään -p valitsin, jolla valitaan miten luetteloiden sähköpostilla lähetyksen kanssa toimitaan
komentorivi.add_argument( '-p', '--posti',
choices = [ 'kyllä', 'ei', 'kysy', 'heti' ],
default = 'ei',
help = 'Määrittele miten luettelot postitetaan' )
# käsitellään komentoriviparametrit
parametrit = komentorivi.parse_args()
# hakemisto josta ohjelman tiedostot luetaan. Hakemisto on tämän koodi tiedoston hakemisto.
hakemisto = os.path.dirname( os.path.abspath( __file__ )) +'/'
# määritellään ohjelma kirjoittamaan tulosteitaan konsolille ja tiedostoon
# käytetään logging moduulia. Luodaan Logger olio, jota
# käytetään tulosteiden kirjoittamiseen. Määritetään käsittelijät (handler) kirjoitamaan tiedostoon ja konsolille.
loki = logging.getLogger( 'celia-uutuudet' )
# tulostetaan kaikki mahdolliset loki viestit
loki.setLevel( logging.DEBUG )
konsoliKäsittelijä = logging.StreamHandler()
loki.addHandler( konsoliKäsittelijä )
tiedostoKäsittelijä = logging.FileHandler( hakemisto +'uutuushaku.log', encoding = 'utf-8' )
# oletuksena konsolille tulostuu vain viesti. Tiedostoon haluamme myös ajan ja tyypin.
# Tulostettavan viestin muoto määritellään Formatter oliolla
muotoilija = logging.Formatter('%(asctime)s %(levelname)s - %(message)s')
tiedostoKäsittelijä.setFormatter( muotoilija )
loki.addHandler( tiedostoKäsittelijä )
# napataan ohjelman suorituksen aikana syntyvät odottamattomat poikkeukset
try:
# määritetään mitä uutuusluetteloita käsitellään
# luettelosta määritetään osoite mistä uutuudet löytyvät
# tiedosto, johon ne tallennetaan, luettelon nimi ja luokka, jonka instanssilla luettelo käsitellään
luettelot = [
{
'url': 'https://www.celianet.fi/kirjavinkit/uutuuskirjat-aikuisille/',
'otsikko': 'Aikuisten uutuudet',
'tiedosto': 'aikuisten_uutuudet.txt',
'luettelo': Uutuusluettelo
},
{
'url': 'https://www.celianet.fi/kirjavinkit/lasten-uutuuskirjat/',
'otsikko': 'Lasten ja nuorten uutuudet',
'tiedosto': 'lasten_ja_nuorten_uutuudet.txt',
'luettelo': Uutuusluettelo
}
]
# jos käyttäjä haluaa postittaa aikaisemmin luodut luettelot ei luoda niitä nyt
if parametrit.posti != 'heti':
# olio, josta luetaan edellisen luettelon luonti kerran uusimmat kirjat eri kategorioista, joita vanhempia
# kirjoja ei lisätä nyt luotaviin luetteloihin.
# tähän myös tallennetaan tällä hetkellä uusimmat kirjat eri kategorioista, jolloin niitä ei luetteloida ensi kerralla
# tiedot luetaan ja tallennetaan json muodossa vanhat.json tiedostoon
vanhat = Käsitellyt( hakemisto +"vanhat.json" )
# käsitellään jokainen luettelo
loki.info( 'luodaan luetteloita.' )
for luettelo in luettelot:
# luodaan luettelon käsittely luokasta instanssi, jolle annetaan osoite, josta luettelo löytyy, nimi tiedostolle, johon uutuudet tallennetaan, tiedot käsitellyistä kirjoista,
# sekä hakemisto luettelotiedostolle
hakija = luettelo['luettelo']( luettelo['url'], luettelo['tiedosto'], vanhat, hakemisto )
# haetaan kirjat ja tallennetaan tiedostoon
hakija.haeKirjat()
# tallennetaan tämän luettelon eri kategorioiden uusimmat seuraavaa kertaa varten
vanhat.tallenna()
# postitetaan luettelot jos käyttäjä niin halusi
if parametrit.posti in [ 'kyllä', 'kysy', 'heti' ]:
# luodaan postin lähettäjä konfiguraation pohjalta
postittaja = Postittaja( hakemisto )
# käydään luettelot läpi
for luettelo in luettelot:
# postitetaan luettelo heti jos käyttäjä niin halusi muuten kysytään jokaisen luettelon kohdalla haluaako käyttäjä sen lähettää
if parametrit.posti in [ 'kyllä', 'heti' ] or kysyPostitetaanko( luettelo ):
loki.info( 'Postitetaan {}'.format( luettelo['otsikko'] ))
postittaja.postita( luettelo )
# odotetaan 5 sekuntia ennen seuraava postitusta
# nopeasti peräkkäin lähetettävät viestit saattavat aiheuttaa ongelmia THP:n sähköpostilistoilla
time.sleep( 5 )
except Exception as virhe:
# kirjoitetaan odottamattoman virheen tiedot lokiin
loki.exception( "tapahtui odottamaton virhe" )