¿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()