En este artículo, vamos a crear una aplicación web para recibir noticias alegremente usando PyWebio
Como todos descargamos una aplicación para recibir noticias diarias, pero como amantes de python, tratamos de hacer todas estas cosas a través de un script de python. Así que aquí hay un script de python que notifica las noticias diarias. En este script, crearemos una aplicación web usando pywebio que muestra todos los titulares principales como una ventana emergente según el nombre del país y la categoría de noticias ingresadas y seleccionadas por el usuario. Aquí extraeremos una clave API del sitio web para que podamos extraer las últimas noticias y mostrarlas en un bucle después de un intervalo de tiempo particular como una ventana emergente.
Módulo requerido:
- pycountry: pycountry proporciona las bases de datos ISO para los estándares.
pip install pycountry
- pywebio: PyWebIO contiene funciones para obtener entradas y salidas del usuario en el navegador, convirtiendo el navegador en un «terminal de texto enriquecido», y puede usarse para crear aplicaciones web simples o aplicaciones GUI basadas en navegador. Con este módulo, cualquiera puede producir una aplicación web sin ningún conocimiento previo ni sobrecarga de HTML y JS.
pip install pywebio
- newsapi-python: use la biblioteca de cliente de Python no oficial para integrar News API en su aplicación de Python sin tener que realizar requests HTTP directamente.
pip install newsapi-python
Implementación paso a paso:
Paso 1: primero obtenga su clave API de newsapi y luego importe los siguientes módulos.
Python3
from newsapi import NewsApiClient import time import pycountry from pywebio.input import * from pywebio.output import * from pywebio.session import *
Paso 2: cargue una clave API (que haya extraído del sitio web) en una variable y tome el nombre del país como entrada del usuario.
Python3
# copy your api id from website # and paste it here by replacing 'Your API Key' newsapi = NewsApiClient(api_key='Your API Key') # required = True ensures that input can't be empty input_country = input("", placeholder = "Enter Country Name", required = True, validate = Check)
Paso 3: Ahora, esta función verificará si el nombre del país, es decir, proporcionado por el usuario, es válido o no. Comprueba almacenando los códigos ISO de todos los países en un diccionario de países y luego, si el país ingresado no está en el diccionario, devuelve un mensaje de error.
- Almacene el país de entrada en una variable.
- Cree un diccionario y almacene todos los países junto con sus códigos ISO.
- Ahora, si el nombre del país ingresado por el usuario está presente en el diccionario, continúe; de lo contrario, devolverá un mensaje de error para el nombre del país no válido.
Python3
def Check(input_countries): input_countries = [input_countries.strip()] countries = {} for country in pycountry.countries: countries[country.name] = country.alpha_2 codes = [countries.get(country.title(), 'NO')for country in input_countries] if codes[0] == "NO": return "Wrong Country Name: Country not found..." return None
Paso 4: Aquí obtenemos la elección del usuario y guardamos los datos de acuerdo con eso en las variables para mostrarlos más.
- Crea una lista de casillas de elección mediante la función de radio para que el usuario pueda seleccionar la categoría de la que quiere recibir las noticias.
- Luego use la función get_top_headlines y pásele categoría para almacenar todas las noticias más recientes en una variable.
Python3
# create a choice box for # selecting type of news one wants to see option = radio("Which category are you interested in?", options = ['Business', 'Entertainment', 'General', 'Health','Science', 'Technology'], required=True) # extract dictionary of top # headlines including articles etc. top_headlines = newsapi.get_top_headlines(category = f' {option.lower()}', language='en', country=f' {codes[0].lower()}') Headlines = top_headlines['articles']
Paso 5: ahora imprimiremos los principales titulares de noticias y su contenido en un bucle como una ventana emergente después de un intervalo de tiempo determinado (puede configurarlo según su elección en el código a continuación).
Python3
for articles in Headlines: b = articles['title'][::-1].index("-") if "news" in (articles['title'][-b+1:]).lower(): popup(f"{articles['title'][-b+1:]}", [put_html("<h4>"f"{articles['title'][:-b-2]}.""</h4>"), put_buttons(['Close'], onclick=lambda _: close_popup())], implicit_close=True) time.sleep(3) else: popup(f"{articles['title'][-b+1:]} News", [put_html("<h4>"f"{articles['title'][:-b-2]}.""</h4>"), put_buttons(['Close'], onclick=lambda _: close_popup())], implicit_close=True) time.sleep(3)
A continuación se muestra la implementación completa:
Python3
from newsapi import NewsApiClient import time import pycountry from pywebio.input import * from pywebio.output import * from pywebio.session import * def Check(input_countries): input_countries = [input_countries.strip()] countries = {} for country in pycountry.countries: countries[country.name] = country.alpha_2 codes = [countries.get(country.title(), 'NO') for country in input_countries] if codes[0] == "NO": return "Wrong Country Name: Country not found..." return None # this will display the loading gif to create an # attractive interface. def progress(): put_html("<p align=""center"">\ <img src=""https://media0.giphy.com/media/kUTME7ABmhYg5J3psM/200.webp?\ cid=ecf05e47som5hu3l2owou9vmn20hue70j113dgls1ghb1909&rid=200.webp&ct=g""\ width=""120px""></p> ") time.sleep(3) clear() logo() # this will display the image of newspaper to create # an attractive interface. def logo(): put_html("<p align=""left""><h4>\ <img src=""https://image.flaticon.com/icons/png/128/2965/2965879.png" " width=""28px"">NEWS</h4></p> ") # this will display as a pop up in starting. toast('LATEST NEWS NOTIFIER PRESENTED BY ADITYA', position='center', color='#000000', duration=3, onclick=clear) time.sleep(3) # this will run the below code until all # the news headlines are displayed successfully one by one while 1: clear() logo() # paste your unique API id here newsapi = NewsApiClient(api_key='d680fd29ce414518ad6c0585fb00143b') # take name of country as an input from the user input_country = input("", placeholder="Enter Country Name", required=True, validate=Check) progress() input_countries = [f'{input_country.strip()}'] countries = {} for country in pycountry.countries: countries[country.name] = country.alpha_2 codes = [countries.get(country.title(), 'Unknown code')for country in input_countries] option = radio("Which category are you interested in?", options=['Business', 'Entertainment', 'General', 'Health', 'Science', 'Technology'], required=True) progress() top_headlines = newsapi.get_top_headlines(category=f'{option.lower()}', language='en', country=f'{codes[0].lower()}') Headlines = top_headlines['articles'] if Headlines: for articles in Headlines: b = articles['title'][::-1].index("-") if "news" in (articles['title'][-b+1:]).lower(): popup(f"{articles['title'][-b+1:]}", [put_html("<h4>"f"{articles['title'][:-b-2]}.""</h4>"), put_buttons(['Close'], onclick=lambda _: close_popup())], implicit_close=True) time.sleep(3) else: popup(f"{articles['title'][-b+1:]} News", [put_html("<h4>"f"{articles['title'][:-b-2]}.""</h4>"), put_buttons(['Close'], onclick=lambda _: close_popup())], implicit_close=True) time.sleep(3) else: put_error(f"No articles found for {input_country}, Try for others...", closable=True) time.sleep(3) clear() clear() logo() option = radio("Do you want to search again?", options=['Yes', 'No'], required=True) if option == 'Yes': continue else: toast("Thanks For Visiting!") exit()
Producción: