Club Python Almería: Taller sobre bots y API de Telegram (28-04-2016)

En 2.7 perfecto. Pero en la 3.5 me da este error el feedparser:

MacBook-de-David:feedparser-5.2.1 baldboy$ python3
Python 3.5.1 (v3.5.1:37a07cee5969, Dec 5 2015, 21:12:44)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type “help”, “copyright”, “credits” or “license” for more information.

import feedparser
Traceback (most recent call last):
File “”, line 1, in
File “”, line 969, in _find_and_load
File “”, line 954, in _find_and_load_unlocked
File “”, line 896, in _find_spec
File “”, line 1136, in find_spec
File “”, line 1112, in _get_spec
File “”, line 1093, in _legacy_get_spec
File “”, line 444, in spec_from_loader
File “”, line 530, in spec_from_file_location
File “/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/feedparser-5.2.1-py3.5.egg/feedparser.py”, line 316
raise KeyError, “object doesn’t have key ‘category’”
^
SyntaxError: invalid syntax

La instalación me da esto:
MacBook-de-David:feedparser-5.2.1 baldboy$ sudo python3 setup.py install
running install
running bdist_egg
running egg_info
writing feedparser/feedparser.egg-info/PKG-INFO
writing dependency_links to feedparser/feedparser.egg-info/dependency_links.txt
writing top-level names to feedparser/feedparser.egg-info/top_level.txt
reading manifest file ‘feedparser/feedparser.egg-info/SOURCES.txt’
reading manifest template ‘MANIFEST.in’
writing manifest file ‘feedparser/feedparser.egg-info/SOURCES.txt’
installing library code to build/bdist.macosx-10.6-intel/egg
running install_lib
running build_py
creating build/bdist.macosx-10.6-intel/egg
copying build/lib/feedparser.py -> build/bdist.macosx-10.6-intel/egg
byte-compiling build/bdist.macosx-10.6-intel/egg/feedparser.py to feedparser.cpython-35.pyc
File “build/bdist.macosx-10.6-intel/egg/feedparser.py”, line 316
raise KeyError, “object doesn’t have key ‘category’”
^
SyntaxError: invalid syntax

creating build/bdist.macosx-10.6-intel/egg/EGG-INFO
copying feedparser/feedparser.egg-info/PKG-INFO -> build/bdist.macosx-10.6-intel/egg/EGG-INFO
copying feedparser/feedparser.egg-info/SOURCES.txt -> build/bdist.macosx-10.6-intel/egg/EGG-INFO
copying feedparser/feedparser.egg-info/dependency_links.txt -> build/bdist.macosx-10.6-intel/egg/EGG-INFO
copying feedparser/feedparser.egg-info/top_level.txt -> build/bdist.macosx-10.6-intel/egg/EGG-INFO
zip_safe flag not set; analyzing archive contents…
creating ‘dist/feedparser-5.2.1-py3.5.egg’ and adding ‘build/bdist.macosx-10.6-intel/egg’ to it
removing ‘build/bdist.macosx-10.6-intel/egg’ (and everything under it)
Processing feedparser-5.2.1-py3.5.egg
Removing /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/feedparser-5.2.1-py3.5.egg
Copying feedparser-5.2.1-py3.5.egg to /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages
feedparser 5.2.1 is already the active version in easy-install.pth

Installed /Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/feedparser-5.2.1-py3.5.egg
Processing dependencies for feedparser==5.2.1
Finished processing dependencies for feedparser==5.2.1

Uhmm. Estás en entorno Mac. En principio si te has bajado todo para la versión Mac, no debería haber ningún problema. Como casi ya salgo para el sitio del taller. Mejor lo vemos allí. Chao

Buenas señor@s, una cosilla, ahora como seria para que otros usuarios pudieran interactuar con nuestro bot? desde mi cuenta puedo, pero no desde la de mi colega.

PD: enhorabuena por el taller

2 Me gusta

Para que escriban en tu bot y sólo pueden hacer eso, pues tu tienes sus identificaciones: Token y ChatID, tan solo diles como se llama y lo busquen el buscador de Telegram y que pulsen sobre el y así ya se han subscrito. Al pulsar sobre Iniciar, ya todo lo que hagas ahí, lo verán y si escribe algo tu lo verás y con lo que escribas puedes programar respuestas
Si el dice hola tu puedes programar que le diga algo a ese hola
Suerte. Saludos

Recordar que una vez que tengáis vuestro Bot, tenéis que activarlo pulsando sobre y iniciarlo. En ese momento ya podéis enviarle lo que querías, cambiado el TOKEN del taller por el vuestro y obtener vuestro chatID usando el ejercicio del directorio 01 - ChatBot y cambiando el token del ejercicio 10-ChatID.py. Ese ejercicio es sólo para obtener el chatID. Cuando lo tengáis lo usáis en todos vuestro ejercicio, cambiando el que hay ahora mismo que es el del taller…

Espero que según os vaya yendo, lo pongáis aquí. Sí llegáis al Hola bot…
ya todo lo demás es sólo cambiar Token y chatID de los ejercicios por los de vuestro bots

Saludos y suerte :slight_smile:

Acabo de bloquear y eliminar el bot que hemos usado en el Taller.
Ya no funcionará con ninguno de los ejercicios. Usad SÓLO los de
vuestros bots.

Voy a revisar el código del bot del teclado virtual para ver que ha fallado, porque los habías probado todos y funcionaban. Cuando lo tenga os pondré aquí el código correcto.

Saludos

Recordamos los pasos para crear un bot en Telegram
Buscar en el buscador de Telegram, el BotFather
Pulsad sobre él para que os muestre un menú.
Los comandos que necesitamos son /newbot
y /setname si queremos cambiar el nombre, una vez que esté creado
el usuario:
Empezamos con los paso y pongo el texto en inglés y un ejemplo:

Con el menú delante empezamos así:

/newbot Nombrebot

Responderá el bot con esto:
Alright, a new bot. How are we going to call it? Please choose a name for your bot.
En cristiano (Bien, ya tienes un nuevo bot. Cómo lo vas llamar?. Por favor, elige un nombre para tu bot
Y ponemos el nombre teniendo en cuenta que tiene que acabar en “bot”
Por ejemplo escribo

mispruebas_bot

Y si ha ido bien responde con esto:

Done! Congratulations on your new bot. You will find it at telegram.me/Repi_bot. You can now add a description, about section and profile picture for your bot, see /help for a list of commands.
Traducido:
Hecho!. Felicidades por tu nuevo bot. Lo encontraras en telegram.me/vuestrobot. Ahora puedes añadir una descripción, sobre su información (about) y una imagen. Mira la lista de comandos con /help

Si queréis cambiar el nombre del usuario del vuestro bot usáis:

/setname

Y mostrará todos los bot que hay, elegís el vuestro y os pedirá otro nuevo nombre que de nuevo tiene que terminar en “bot”

Use this token to access the HTTP API:
“numero de vuestro token”-
Ese número de tantos caracteres es el TOKEN.

For a description of the Bot API, see this page: https://core.telegram.org/bots/api

Para ver información sobre el API, ir a esa página

Con esto ya lo tenéis hecho. Os subscribí y lo iniciáis. Eso es lo básico

Cualquiera de los ejercicios que hemos hecho ya funcionará cambiado el Token del bot del taller con el que os ha indicado Telegram (ver el mensaje de arriba). Y luego obtener el chatID como he comentado en otro mensaje.

Cualquier duda aquí…

ATENCIÓN
Fallo del ejercicio de teclado virtual

Os comento que ha pasado. La versión 2.0.3 no es compatible con Python 3.5. Esta es la información de las compatibilidades.
This API is tested with Python 2.6, Python 2.7, Python 3.4, Pypy and Pypy 3.

En esa lista si está 2.7, con la que si es compatible. En el taller hemos usado, casi todos, 3.5.1 de Python y 2.0.3 de pyTelegramBotApi

He programado un código básico para crear un teclado y he capturado la excepción de error y es un fallo de API.

Para ver la versión de los paquetes que tenemos. Usad esto:

Pip list

y comprobáis la de pyTelegramBotAPI

Otro modo es así:

Pip search pyTelegramBotApi

Indica también la instalada

He desinstalado la versión 2.0.3, que es la última actualización de Telegram

pip uninstall pyTelegrambotApi

He instalado la 1.4.1 así:

Pip install pyTelegramBotApi==1.4.1 o
Pip install pyTelegramBotApi==1.4.2

Esa es la última de la serie 1.4

¡OJO! no hagáis pip install pyTelegramBotApi --upgrade porque vuelve a instalar la 2.0.3

También he probado instalandola manualmente. Me he bajado esta

Instalada con python setup install desde el directorio principal del archivo descomprimido y sin cambiar nada del código del los ejercicios de los teclados virtuales, sólo el Token, como ya sabéis y el chatID; ha funcionado perfectamente, a la primera

La conclusión que saco es que han cambiado algo en la versión 2.0.3 del API. Probad los teclados virtuales, usando esta versión 1.4.1. La 2.0 salió a mediados de éste mes y yo hasta el día del taller no lo he actualizado. Estaba funcionado sobre la 1.4.1. Habrá que ver que han cambiado para adaptarlo a la 2.0

A todos os pasado igual, habéis actualizado a 2.0 en estos últimos días y por eso os sale el mismo error. Se puede ver por el texto de salida, que es un error de excepción interno: AtrributeError

O volvéis instalar manualmente bajando


y hacéis instalación manual con

python setup install desde el directorio principal del archivo descomprimido

Si aún así os sigue fallando el teclado virtual comentadlo aquí.
Ya veré cuando tenga tiempo que ha cambiado en el API.

Saludos…

Por la parte que me toca. Gracias…
No hemos tenido tiempo de hacer todos los ejercicios pero cualquier duda sobre los últimos me avisáis. Todos funcionaban bien.
Saludos

Ya está solucionado el problema de los ejercicios de los teclados virtuales del API bot 2.0.3 de Telegram
Le paso a Marcos los cambios para que funcionen con la 1.4.x y la 2.0.x y Python 3.5.1. Se subirá a Github. Ya se avisará aquí.

Sí alguien quiere que le envié los 2 casos de teclado virtual como ficheros .py que me lo diga en privado y luego vosotros se los pasáis otros compañeros con los que tengáís contacto y no estén en el foro.

1 me gusta

¿Se supone que el bot puede enviar mensajes diferentes a diversos chats, no? ¿Como se haría para obtener el chatID de cada chat y diferenciarlo de otros chats?
En resumen he introducido el bot en un grupo y me gustaría obtener el chatID de ese grupo, para interactuar con él, pero solo me da el chatID de mi conversación privada con el bot…

Todos los ejercicios son para interactuar con el canal de nuestro propio chat creado.
El chatID es de un sólo chat, el que está asociado a nuestro bot y nuestro TOKEN.
Una de las opciones es poner meterlo en grupo, como tu has hecho. Pero el bot se
comunica con quien tenga el Token y el chatID de tu bot. Para comunicar con los demás
canales tendrías que conocer los token y chatid de esos canales y no son bots.
Recordar que los TOKEN son como un DNI o un número de teléfono, no pueden ser públicos por el problema que supone.
La idea del bot es eso de 1 a muchos. Servir EL a otros que se subscriban, pero el mantenimiento y programación lo llevarías tú que tienes sus datos de TOKEN, sobre todo.
No pueden haber 2 programas haciendo “polling” sobre el mismo bot. Por la experiencia que hemos tenido, el API se rompe y deja de funcionar y no es que esté mal programado es que es lógico. 1 a muchos.

Mira el último API 2.0.3 a ver si te puede ayudar.

Tendré que mirarme un poco la API para ver si puedo hacerlo, gracias por la respuesta.

1 me gusta

Aquí puedes tener una idea de como obtener el chatID del grupo.

Esa información que devuelve el API tiene un valor interesante que es el ID from…

Si tienes el bot como miembro de un grupo y pones algunos de los comandos que empiezan por / que tu tengas programados responden a los usuarios que lo usen. Por ejemplo en unos de los ejercicios de los chatbot. Al escribir /info te daba información del bot.

Prueba a poner /info dentro del grupo y deberás recibir la información del bot si lo tienes activado
Ese es un modo de usarlo en el grupo para que sirva con sus comandos a los miembros.
Enviar un mensaje a cada uno es otro planteamiento que hay que verlo en nueva API 2.0.3 que salió a mediados de abril.

Te dejo esto también:

Usando nuestros ejercicios en vez de usar telegram.send_message(chatID,“mensaje”)
puedes responder no al chatID sino al mensaje, o sea de quien lo envíe. Te hace una réplica
es así:
telegram.reply_to(mensaje,“respuesta”)

no usa el chatID sino responde al usuario que le escribe /info Pruebalo… :slight_smile:

Te pongo este ejemplo de mi bot dentro de un grupo de pruebas
Escribo /info como uno de los miembros y me responde
Nombre_mibot
Mi_alias

Nombre del bot: el nombre del bot
Usuario del bot: usuario del bot
ID: 43432443434 (NO ES el chatID de tu bot, ¿es el del grupo, o el del usuario?)

Recuerda lo que comenté del alias que permite usar Telegram en lugar de tu número de teléfono y que el protocolo MTProto no usa en su API el IMEI del teléfono
Estudia eso…

Fantástico @Quasimodo, gracias por la presteza al corregir dicho problema.

Te pasaré el lunes todo ya actualizado
La versión 2.0.3 salió el día 25 de abril. Lo único que no funciona es el modo de crear un teclado virtual, en la 1.4.x. Pero ya lo adapté a la 2.0.3

Ah, tengo ya probado lo del bot en grupo, que me preguntaba Kamarena: envio al grupo y a cada uno de los miembros.
Lo incluiré también, para subirlo a Github…

2 Me gusta

señores para quitarse el sombrero, muchas gracias de verdad.

el club de python tiene github propio?

Ahora que nos pego un remojo bueno @Quasimodo con el bot, a que nos vamos a dedicar? buscamos un proyecto para trabajarlo en equipo? igual podríamos abrir hasta un hilo para ver cual sería nuestro siguiente paso.

un saludo y una vez más muchas gracias @Quasimodo.

Sí. Pero esto te lo comenta mejor Marcos (@indavelopers).
Para el lunes subiré lo que hicimos en el taller, que ya vistéis el problema que nos dio el cambio de versiones del API (sólo con el teclado virtual) y que ya lo he resuelto y además añadiré alguna cosa más.
La idea es que el taller sirva para darle una aplicación práctica; lo que os comentaba durante la charla.
Si alguno de los taller quiere encargarse de algún o algunos bots concretos que lo comente aquí.
Trabajo siempre hay, jeje. A ver Olea (@olea) que nos dice y está pendiente el bot de HackLab para leer los eventos que ya lo vistéis funcionando. La aplicación práctica sería mantenerlo para HackLab.

Saludos y gracias…