Script en Python para recibir por email las últimas noticias de Hacker News | Programador Web Valencia

Script en Python para recibir por email las últimas noticias de Hacker News

2 minutos

¿Te gusta estar informado de las últimas tendencias en Hacker News? ¿No tienes tiempo? Con este script podrás recibir por email las 5 noticias que están en el top en ese momento.

Guarda el siguiente código como hackernews.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request as urllib2
import json
import cgi
import smtplib

# Variables
urlAPITop = "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"
urlAPIItem = "https://hacker-news.firebaseio.com/v0/item/%s.json?print=pretty"
emailFrom = 'correo@del.servidor'
emailTo = ['tu@correo.com']
subject = 'Top Hacker news'
maxNews = 5

# Cabecera de email
textEmail = ("From: %s\r\nTo: %s\r\nSubject: %s\r\nContent-Type: text/html\r\n\r"
               % (emailFrom, ", ".join(emailTo), subject))
textEmail += '<h1>Hacker News</h1><table>'

# Obtiene todos los elementos
f = urllib2.urlopen(urlAPITop)
response = json.loads(f.read().decode())
f.close()

# Deja solo los maxNews primeros
itemsIds = []
for i in range(maxNews):
    itemsIds.append(response[i])

# Obtiene toda la información de cada id
for i in range(len(itemsIds)):
    f = urllib2.urlopen(urlAPIItem % itemsIds[i])
    response = json.loads(f.read().decode())
    f.close()
    textEmail += '<tr>'
    textEmail += '<td>%s</td>\n' % str(i + 1)
    textEmail += '<td><a href="%s">%s</a></td>\n' % (response['url'], cgi.escape(response['title']))
    textEmail += '</tr>'

textEmail += '</table>'

# Envia email
server = smtplib.SMTP('localhost')
server.sendmail(emailFrom, emailTo, str.encode(textEmail))
server.quit()

Necesitarás tener un servidor de email instalado (como Postfix) y Python3 instalado. Después solo deberás ejecutar:

python3 hackernews.py

Y listo. Recibirás por email una estructura similar a esta:

hacker news

¿Se puede mejorar?

Claro, cambia maxNews para recibir más noticias.Además que puedes añadir más emails para que lo reciban más personas.

Yo personalmente lo he configurado con cron para que cada mañana se ejecute y así poder leerlas antes de ponerme a trabajar.

Acepto cualquier sugerencia o ampliación :)

Actualización: Reddit implementado

Solo debes añadir tus subreddits favoritos en lSubreddits. Modifica las variables en las sección de Variables.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request as urllib2
import json
import html
import smtplib
import praw

# statics
URL_API_HACKER_NEWS_TOP = "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty"
URL_API_HACKER_NEWS_ITEM = "https://hacker-news.firebaseio.com/v0/item/%s.json?print=pretty"

# variables
emailfrom = 'correo@servidor.com'
emailto = ['tu@correo.com']
subject = 'Top noticias'
maxNews = 5
lSubreddits = ['python',
        'postgreSQL',
        'javascript',
        'django',
        'programming',
        'vim',
        'backbonejs',
        'learnprogramming',
        'InternetIsBeatiful',
        'GameDeals',]

# cabecera de email
textemail = ("from: %s\r\nto: %s\r\nsubject: %s\r\ncontent-type: text/html\r\n\r"
               % (emailfrom, ", ".join(emailto), subject))

## Hacker News
textemail += '<h1>Hacker news</h1><table>'

# obtiene todos los elementos
f = urllib2.urlopen(URL_API_HACKER_NEWS_TOP)
response = json.loads(f.read().decode())
f.close()

# deja solo los maxNews primeros
itemsids = []
for i in range(maxNews):
    itemsids.append(response[i])

# obtiene toda la información de cada id
for i in range(len(itemsids)):
    f = urllib2.urlopen(URL_API_HACKER_NEWS_ITEM % itemsids[i])
    response = json.loads(f.read().decode())
    f.close()
    textemail += '<tr>'
    textemail += '<td>%s</td>\n' % str(i + 1)
    textemail += '<td><a href="%s">%s</a></td>\n' % (response['url'], html.escape(response['title']))
    textemail += '</tr>'

textemail += '</table>'

## Reddit
r = praw.Reddit(user_agent='my_cool_application')
textemail += '<h1>Reddit</h1><table>'
for i in range(len(lSubreddits)):
    iNum = 1
    textemail += '<tr><td colspan="2"><h2>%s</h2></td></tr>' % lSubreddits[i]
    submissions = r.get_subreddit(lSubreddits[i]).get_hot(limit=maxNews)
    for submission in submissions:
        textemail += '<tr>'
        textemail += '<td>%s</td>\n' % str(iNum)
        textemail += '<td><a href="%s">%s</a></td>\n' % (submission.url, html.escape(submission.title))
        textemail += '</tr><tr><td colspan="2"> </td></tr>'
        iNum += 1

textemail += '</table>'


# Envia email
server = smtplib.SMTP('localhost')
server.sendmail(emailfrom, emailto, str.encode(textemail))
server.quit()

Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivadas 4.0 Internacional.

Atribución/Reconocimiento-NoComercial-SinDerivados 4.0 Internacional

¿Me ayudas?

Comprame un café
Pulsa sobre la imagen

No te sientas obligado a realizar una donación, pero cada aportación mantiene el sitio en activo logrando que continúe existiendo y sea accesible para otras personas. Además me motiva a crear nuevo contenido.

Comentarios

{{ comments.length }} comentarios

Nuevo comentario

Nueva replica  {{ formatEllipsisAuthor(replyComment.author) }}

Acepto la política de Protección de Datos.

Escribe el primer comentario

Tal vez también te interese...