def DropLinks(): try: Escrever('Drop de todos links. Havia: {}'.format(QtLinks())) db.Links.drop() Escrever('Sucesso no drop! Conferindo quantidade: {}'.format( QtLinks())) except Exception as e: Escrever('Exceção no drop: {}'.format(str(e)))
def InsertPostMany(posts): try: qt = len(posts) Escrever('Posts recebidos para salvar: {}'.format(qt)) result = db.Posts.insert_many(posts) qtResult = len(result.inserted_ids) Escrever('{} posts salvos com sucesso! Qt equivalente: {}'.format( qtResult, str(qt == qtResult))) except Exception as e: Escrever('Exceção no insert post many: {}'.format(str(e)))
def InsertLinkMany(links): try: qt = len(links) Escrever('Links recebidos para salvar: {}'.format(qt)) result = db.Links.insert_many(links) qtResult = len(result.inserted_ids) Escrever('{} links salvos com sucesso! Qt equivalente: {}'.format( qtResult, str(qt == qtResult))) except Exception as e: Escrever('Exceção no insert link many: {}'.format(str(e)))
def GetPage(link, nivel): Escrever('Get Page: {}'.format(link), nivel) response = requests.get(link) Escrever( 'Código do status de resultado: {}. Ok: {}'.format( response.status_code, response.ok), nivel) if response.ok: return response else: Escrever('Página não recuperada...', nivel) return None
def InsertTelegramConversation(nome, user, id): try: db.TelegramBot.insert_one({ "nome": nome, "user": user, "id": id, "status": 1, "criadoEm": GetDate() }) Escrever('ID Telegram salvo com sucesso: {} ({}) - {}!'.format( nome, user, id)) except Exception as e: Escrever('Exceção no InsertTelegramConversation: {}'.format(str(e)))
def InsertLink_(linkObj): try: db.Links.insert_one({ "fonte": linkObj.fonte, "titulo": linkObj.titulo, "postUrl": linkObj.postUrl, "link": linkObj.link, "tipo": linkObj.tipo, "criadoEm": GetDate() }) Escrever('Link ({}) {}: {} de {} salvo com sucesso!'.format( linkObj.tipo, linkObj.titulo, linkObj.link, linkObj.fonte)) except Exception as e: Escrever('Exceção no insert de link: {}'.format(str(e)))
def InsertPost_(Post): try: db.Posts.insert_one({ "titulo": Post.title, "link": Post.link, "data": Post.data, "tags": Post.tags, "origem": Post.origem, "criadoEm": GetDate() }) Escrever('Post {} do {} salvo com sucesso!'.format( Post.title, Post.origem)) except Exception as e: Escrever('Exceção no insert de post: {}'.format(str(e)))
def InsertLog(logObj): try: db.Logs.insert_one(logObj) EscreverTela('Log salvo com sucesso!') except Exception as e: Escrever('Exceção no InsertLog: {}'.format(str(e)))
def ReadPost(): try: posts = db.Posts.find() EscreverTela('Lendo todos posts salvos:') for p in posts: EscreverTela('{} de {}. Em {}'.format(p.title, p.origem, p.data)) except Exception as e: Escrever('Exceção no read: {}'.format(str(e)))
def ReadPostsDaOrigem(origem): try: posts = db.Posts.find({'origem': origem}) EscreverTela('Lendo todos posts com origem:' + origem) for p in posts: EscreverTela('{} de {}. Em {}'.format(p.title, p.origem, p.data)) except Exception as e: Escrever('Exceção no readOrigem: {}'.format(str(e)))
def Crawler(fonteTitulo, postItem, nivel): # Escrever('Crawler da fonte {}'.format(fonteTitulo), nivel) if 'CocaTech' in fonteTitulo: response = GetPage(postItem.link, nivel) if response is not None: # Escrever('Link da página: {}'.format(response.url), nivel) linkAjustado = response.url.split('?', 1)[0] Escrever('Link Ajustado: {}'.format(linkAjustado), nivel) soup = BeautifulSoup(response.content, 'html.parser') Escrever('Página recuperada: {}'.format(soup.title.text), nivel) return GetCocaTech(linkAjustado, soup, nivel + 1) else: return None else: soup = BeautifulSoup(postItem['content'][0].value, 'html.parser') return LinksDefault(fonteTitulo, postItem.link, soup, nivel + 1)
def UpdatePost(link, Post): try: db.Posts.update_one({"link": link}, { "$set": { "titulo": Post.title, "data": Post.data, "tags": Post.tags, "origem": Post.origem } }) EscreverTela("Atualizado!") except Exception as e: Escrever('Exceção no update: {}'.format(str(e)))
def NovoPostEncontrado(titulo, postItem, lstPosts, lstLinks, nivel): try: Escrever( 'Novo post encontrado de {}. Titulo: {}. Link: {}'.format( titulo, postItem.title, postItem.link), nivel) links = Crawler(titulo, postItem, nivel + 1) if links is not None: lstLinks.extend(links) if 'tags' in postItem: post_tags = [] for tag in postItem.tags: post_tags.append(tag['term']) tags = "; ".join(post_tags) else: tags = None if 'published' in postItem: pubDate = postItem.published elif 'pubDate' in postItem: pubDate = postItem.pubDate else: pubDate = None EnviarViaTelegramBot(titulo, postItem.link, postItem.title, links) postItem = PostFeed(postItem.title, tags, postItem.link, pubDate, titulo) lstPosts.append(postItem.toJSON()) return True else: Escrever('Crawler não retornou links', nivel) return False except Exception as e: Erro('Exceção no novo post encontrado. Erro: {}'.format(str(e))) return False
def UsuarioAtivo(id): try: return bool(db.TelegramBot.find_one({'id': id, 'ativo': 1})) except Exception as e: Escrever('Exceção no exists: {}'.format(str(e))) return False
def DeletePost(link): try: db.Posts.delete_many({"link": link}) EscreverTela('Apagado!') except Exception as e: Escrever('Exceção no delete: {}'.format(str(e)))
def ReadAllPosts(): try: return list(db.Posts.find()) except Exception as e: Escrever('Exceção no readAll: {}'.format(str(e)))
def PostExists(link): try: return bool(db.Posts.find_one({'link': link})) except Exception as e: Escrever('Exceção no exists: {}'.format(str(e)))
def InativarTelegramConversation(id): try: db.TelegramBot.delete_one({"id": id}) EscreverTela('Apagado!') except Exception as e: Escrever('Exceção no delete: {}'.format(str(e)))
def ReadAllTelegramUsers(): try: return list(db.TelegramBot.find()) except Exception as e: Escrever('Exceção no ReadAllTelegramUsers: {}'.format(str(e)))
EscreverTela('Qt de posts existentes: {}'.format(ConnectionDB.QtPosts())) EscreverTela('Qt de links existentes: {}'.format(ConnectionDB.QtLinks())) Inicio() novoPostSalvo = False lstLinks = [] lstPosts = [] with open('Fontes.txt') as txt: fontes = txt.readlines() # remove whitespace characters like '\n' at the end of each line fontes = [x.strip() for x in fontes] for fonte in fontes: nivel = 0 Escrever('Acessando a fonte: {}'.format(fonte), nivel) try: nivel += 1 novoPostNesseFeed = False rss = feedparser.parse(fonte) Escrever('Resultado do parse: {}'.format(rss.status), nivel) rssTitle = rss.feed.title if 'updated' in rss: updated = rss.updated elif 'updated' in rss.feed: updated = rss.feed.updated elif 'published' in rss.feed: updated = rss.feed.published qtEntries = len(rss.entries)