forked from jvetvicka/scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmediacheck.py
198 lines (173 loc) · 8.72 KB
/
mediacheck.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
import feedparser
import time
import requests
import concurrent.futures
import feedparser
from bs4 import BeautifulSoup
from datetime import datetime, timedelta
from dateutil.parser import parse as dateparse
import pytz
import json
import os
from urllib.parse import urlparse
from dotenv import load_dotenv
from keywords import KEYWORDS_SEARCH_TABLE as KEYWORDS, NEGATIVE_KEYWORDS
from classes.rss_feed import RssFeed
from social import publish_articles_to_social_media
NUM_THREADS = 5
results = []
load_dotenv()
# Funkce pro kontrolu, zda článek obsahuje daná klíčová slova
def contains_keywords(text):
text = text.lower()
# Vynech článek pokud obsahuje negativní klíčová slova
for negative_keyword in NEGATIVE_KEYWORDS:
if negative_keyword in text:
return None
for key, full_word in KEYWORDS.items():
if key in text:
return full_word
return None
# Funkce pro získání textu z entry summary
def get_summary_text(entry):
summary_text = entry.summary if 'summary' in entry else ''
return summary_text
# Funkce pro získání názvu serveru z URL (bez 'www.')
def get_server_name(url):
parsed_url = urlparse(url)
netloc = parsed_url.netloc
if netloc.startswith('www.'):
netloc = netloc[4:]
return netloc
# Načtení a filtrování článků z RSS kanálů
def fetch_and_filter_rss(feed: RssFeed, start_date, end_date):
articles = []
feed_content = feedparser.parse(feed.url)
for entry in feed_content.entries:
if not hasattr(entry, 'published'):
continue # Přeskočit články bez atributu 'published'
article_date = dateparse(entry.published).replace(tzinfo=pytz.UTC)
if start_date <= article_date <= end_date:
summary_text = get_summary_text(entry)
content = entry.title + ' ' + summary_text
keyword_found = feed.tag_to_enforce or contains_keywords(content)
link = entry.link
source = get_server_name(link)
if feed.save_all_articles or keyword_found:
# escape HTML entities such as
escaped_title = BeautifulSoup(entry.title, 'html.parser').get_text()
escaped_summary = BeautifulSoup(summary_text, 'html.parser').get_text()
articles.append({
'title': escaped_title,
'link': link,
'published': entry.published,
'content': escaped_summary,
'source': source, # Přidání serveru do slovníku
'keyword': keyword_found # Přidání klíčového slova do slovníku
})
return articles
# Zobrazení filtrovaných článků na obrazovku
def display_articles_to_console(articles):
for article in articles:
source = article.get('source', 'unknown') # Zajištění, že klíč 'source' vždy existuje
keyword = article.get('keyword', 'N/A') # Zajištění, že klíč 'keyword' vždy existuje
published_date = dateparse(article['published']).strftime("%d.%m")
line = f"- {article['title']} ({source}, {published_date} - {keyword})"
print(line)
# Uložení filtrovaných článků do souboru monitoring.md
def save_articles_to_file(articles, output_file):
with open(output_file, 'w', encoding='utf-8') as f:
for article in articles:
source = article.get('source', 'unknown') # Zajištění, že klíč 'source' vždy existuje
keyword = article.get('keyword', 'N/A') # Zajištění, že klíč 'keyword' vždy existuje
published_date = dateparse(article['published']).strftime("%d.%m")
line = f'<li class="novinka" data-keywords="{keyword}"><a href="{article["link"]}" target="_blank">{article["title"]}</a> <small>({source})</small> <code class="highlighter-rouge">{keyword}</code></li>\n'
f.write(line)
def scrape_feed_to_results(feed: RssFeed, start_date, end_date):
print(f'scraping feed {feed.url} at {time.strftime("%H:%M:%S", time.gmtime())}')
try:
results.extend(fetch_and_filter_rss(feed, start_date, end_date))
except Exception as e:
print(f'error scraping feed {feed.url}: {e})')
print(f'done scraping feed {feed.url} at {time.strftime("%H:%M:%S", time.gmtime())}')
# Hlavní program
if __name__ == "__main__":
# Seznam RSS kanálů
feeds = []
feeds.append(RssFeed('https://ct24.ceskatelevize.cz/rss/tema/hlavni-zpravy-84313')), # A
feeds.append(RssFeed('https://www.ceskenoviny.cz/sluzby/rss/cr.php')), # A
feeds.append(RssFeed('https://www.ceskenoviny.cz/sluzby/rss/svet.php')), # A
feeds.append(RssFeed('https://denikn.cz/minuta/feed/')), # A
feeds.append(RssFeed('https://denikn.cz/rss/')), # A
feeds.append(RssFeed('https://dennikn.sk/rss/')),
feeds.append(RssFeed('https://dennikn.sk/minuta/feed')),
feeds.append(RssFeed('https://denikreferendum.cz/rss.xml')), # A - New
feeds.append(RssFeed('https://www.e15.cz/rss')), # A - New
feeds.append(RssFeed('https://hlidacipes.org/feed/')), # A
feeds.append(RssFeed('https://domaci.hn.cz/?m=rss')), # A
feeds.append(RssFeed('https://zahranicni.hn.cz/?m=rss')), # A
feeds.append(RssFeed('https://www.irozhlas.cz/rss/irozhlas/tag/7708693',
save_all_articles=True,
tag_to_enforce='fact-checking')), # A - Ověřovna (vše)
feeds.append(RssFeed('https://www.irozhlas.cz/rss/irozhlas/section/zpravy-domov')), # A
feeds.append(RssFeed('https://www.irozhlas.cz/rss/irozhlas/section/zpravy-svet')), # A
feeds.append(RssFeed('https://refresher.cz/rss')), # A
feeds.append(RssFeed('https://refresher.sk/rss')),
feeds.append(RssFeed('https://www.respekt.cz/api/rss?type=articles&unlocked=1')), # A
feeds.append(RssFeed('https://www.seznamzpravy.cz/rss')), # A
feeds.append(RssFeed('https://www.voxpot.cz/feed/')), # A
feeds.append(RssFeed('https://zpravy.aktualne.cz/rss/')), # A-
feeds.append(RssFeed('https://www.denik.cz/rss/zpravy.html')), # A-
feeds.append(RssFeed('https://www.reflex.cz/rss')), # A-
feeds.append(RssFeed('https://servis.idnes.cz/rss.aspx?c=zpravodaj', )) # B+
feeds.append(RssFeed('https://www.novinky.cz/rss')), # B+
# SK média
feeds.append(RssFeed('https://www.aktuality.sk/rss/')),
feeds.append(RssFeed('https://www.sme.sk/rss-title')),
feeds.append(RssFeed('https://www.tyzden.sk/feed/')),
feeds.append(RssFeed('https://hnonline.sk/feed')),
feeds.append(RssFeed('http://www.teraz.sk/rss/slovensko.rss')),
feeds.append(RssFeed('http://www.teraz.sk/rss/zahranicie.rss')),
# 'https://spravy.rtvs.sk/feed/', Odstraněno - přechod na státní STVR
# Ostatní
feeds.append(RssFeed('https://www.mvcr.cz/chh/SCRIPT/rss.aspx?nid=')),
feeds.append(RssFeed('https://cedmohub.eu/cs/feed/',
save_all_articles=True)),
feeds.append(RssFeed('https://europeanvalues.cz/cs/feed/')),
feeds.append(RssFeed('https://www.lupa.cz/rss/clanky/')),
feeds.append(RssFeed('https://euractiv.cz/feed/')),
feeds.append(RssFeed('https://euractiv.sk/feed/')),
feeds.append(RssFeed('https://cc.cz/feed/')),
feeds.append(RssFeed('https://www.zive.cz/rss/sc-47/')),
feeds.append(RssFeed('https://www.investigace.cz/feed/')),
feeds.append(RssFeed('https://pepikhipik.com/feed/')), # New
feeds.append(RssFeed('https://www.wired.cz/atom/feed.xml')), # New
feeds.append(RssFeed('https://cesti-elfove.cz/feed/',
save_all_articles=True,
tag_to_enforce='fact-checking')), # New (vše)
# Přidejte další RSS kanály podle potřeby
# Datumové rozmezí (datumy s časovou zónou UTC)
now = datetime.now().astimezone(pytz.UTC)
start_date = now - timedelta(hours=4)
end_date = now
with concurrent.futures.ThreadPoolExecutor(max_workers=NUM_THREADS) as executor:
executor.map(
scrape_feed_to_results,
feeds,
[start_date] * len(feeds),
[end_date] * len(feeds))
filtered_articles = [
article for article in results
if contains_keywords(article['content']) and
start_date <= dateparse(article['published']).replace(tzinfo=pytz.UTC) <= end_date
]
post_url = os.getenv('POST_ARTICLES_URL')
api_secret = os.getenv('API_SECRET')
res = requests.post(post_url, json=filtered_articles, headers={'X-Api-Key': api_secret})
print(res.status_code)
print(res.content)
if res.status_code == 200:
new_article_urls = json.loads(res.content)
new_articles = [article for article in filtered_articles if
article['link'] in new_article_urls]
publish_articles_to_social_media(new_articles)