La tarea parece simple cuando no sabes nada al respecto y cuando decides.
En un día "maravilloso", me di cuenta de que no estoy interesado en sentarme en numerosos foros, pero quiero crear mi propio canal y compartir "sabiduría".
Me gustan las funciones de Telegram integradas, incluidos los bots, por lo que el canal en forma de blog se creó allí. Comenzó a buscar bots para ayudar a escribir mensajes ... y como no quiero encontrarlo. Bueno, escríbelo tú mismo. Se aconseja a las personas inteligentes que escriban en Python.
Leí el primer tutorial en Internet en 149 páginas. Estoy familiarizado con Pascal, FoxPro, Interbase e incluso (ja, ja 3 veces) hace 20 años vendí mis programas, y luego de alguna manera no funcionó, entré en el comercio. Trabajar como programador me ayudó mucho a establecer tareas para codificadores por cierto. Pero volviendo a Python, parece que no es nada complicado, porque también fue posible programar en BASIC, y este no es mi diploma universitario con un complejo de hardware y software del generador de verificación MIG en Assembler. Un problema, todo fue hace mucho tiempo, así que volviendo al encabezado, parece que es simple, porque todavía no sé nada sobre la tarea, pero vale la pena intentarlo.
Decidí que es más conveniente hacer un proyecto desde un teléfono inteligente a Android, porque siempre está a mano. Entonces pon:
- Pydroid 3 - IDE para Python 3 Realmente Python para Android.
- @BotFather, en Telegram, instalamos el padre de todos los bots; lo necesitará para obtener el identificador de su bot y realizar configuraciones básicas.
- Rebootr Aplicación para lanzar un proyecto en heroku.
- GIT Una aplicación para el alojamiento en línea de repositorios.
- Windscribe sin VPN en cualquier lugar?
- Termux Terminal emulador y entorno Linux.
¿Y cuál es el resultado final? La programación en un teléfono inteligente es posible en teoría, pero imposible en la práctica. Verifique el código tanto como sea posible, corrija el error, investigue el rendimiento.
Una introducción tan larga y lo que quería obtener de mi bot. Al principio me pareció suficiente agregar un Hashtag al final del mensaje. Entonces se me ocurrió "cubrirlo" con un enlace a mi canal, por lo que con la nueva publicación habrá una incitación adicional a la fuente del canal. Luego, agregó la automatización del enlace de origen, de donde obtengo el mensaje. A continuación, haré una digresión. La publicidad, por supuesto, es el motor del progreso. Pero a veces su cantidad se dispara. Telegram fue elegido por mí, entre otras cosas, porque existe la oportunidad de luchar contra este último. Respeto a los lectores de mi canal y, por lo tanto, limpio las noticias interesantes que se encuentran en Ineta de la publicidad y las envío al canal. Al mismo tiempo, respeto a los autores y casi siempre doy un enlace a la fuente en forma de "Leer más ...". Debido a la aversión a la publicidad, descargo contenido de YouTube y lo subo a mi canal como un archivo de video. En cierto momento, el bot que descargó el video se volvió loco y comenzó a enviarme anuncios cada hora. Entonces, en mi bot, tuve la oportunidad de descargar videos de YouTube. Recientemente, por cierto, conocí al autor de este bot, estaba muy sorprendido, porque Según él, envía anuncios "solo" 20 veces al mes. Lo mismo sucedió con el bot que hace la marca de agua: se envió al horno y tuve la oportunidad de hacer una marca de agua.
Para escribir un programa desde cero, tuve que buscar mucha información en Internet. Espero que aquellos que sigan mis pasos me ayuden. Entonces, ¿de dónde obtuve la información y qué utilicé?
- Los artículos sobre Habrr realmente me ayudaron. Por lo tanto, no volveré a escribir cómo y qué instalar. Todo esta ahi. Por cierto, contacté a los autores de manera personal y nunca me negaron mi ayuda.
- github Un servicio de alojamiento de repositorio en línea con todas las funciones de control de versiones distribuidas y funcionalidad de control de fuente. Cartilla
- heroku es una plataforma PaaS basada en la nube que admite varios lenguajes de programación. Muy rápidamente lo abandonó.
- pyTelegramBotAPI : una de las bibliotecas principales al escribir un bot para Telegrams.
- Tutorial de ortografía de bot
- Python 3 para principiantes
- Bots: información para desarrolladores
- Referencia HTML
- ¿En ninguna parte sin una VPN?
Se mostrará una segunda digresión o plan de guerra. Cuando comencé a escribir el bot, lo primero que miré fueron los códigos de otra persona. Si no hay kamenty, difícilmente se puede entender:
La tierra tembló como nuestros senos
Caballos mezclados en un montón, gente,
Y voleas de mil cañones
Fundido en un largo aullido ...
Lermontov escribió sobre el código. El montón contiene funciones, decoradores. No hay código de belleza, a nadie le importan los recursos. Aunque es muy probable que la belleza sea vista por el raro masoquista. El significado de la frase de un programador familiar "Mira el programa, tal vez puedas resolverlo" me llegó muy rápidamente. La explosión cerebral más importante que tuve fue cuando finalmente me di cuenta de que el código es impulsado por eventos, no secuencial. Este es un nivel diferente.
El segundo problema es la falta de buena documentación. Incluso en Basurm. Daré un ejemplo. Le envío una foto a telegramas, y él la sacude descaradamente. Resultó que se escribió un argumento no válido en la línea:
file_info = bot.get_file(message.photo[-1].file_id)
¿Y cuál es la documentación? Vamos a la fuente


Esta es una matriz. Puedes caminar por él, estudiar dónde vuelve el tamaño. Gracias, las personas inteligentes sugirieron qué recetar.
Aunque de qué estoy hablando, incluso si los gurús están perdidos.
Cuando escribí el código de marca de agua, utilicé una fuente gratuita y, para ponerla en negrita, apliqué la solución para mostrar el mensaje tres veces con un desplazamiento de píxeles, no sé cuán hermosa es la solución, pero funciona.
font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", width//20) pos = (width//4, height - height//10) text = skanal drawing.text(pos, text, fill=black, font=font) pos = (1 + width // 4, 1 + height - height // 10) drawing.text(pos, text, fill=black, font=font) pos = (2 + width // 4, 2 + height - height // 10) drawing.text(pos, text, fill=black, font=font)
La posición, como puede ver, se selecciona según el tamaño de la imagen, la altura de la fuente también. Inmediatamente me encontré con un punto interesante: aunque la fuente es una parte integral de la biblioteca PIL, ya que la primera línea dice que funciona localmente, pero en Docker no lo hace. La salida es descargarlo en el repositorio, agregar la ruta al archivo de entorno y escribir otra ruta en el programa.
Otra cosa incomprensible para mí le sucedió a la imagen después de procesarla usando la biblioteca PIL (inmediatamente después de la marca de agua). Lo envío a mi bot:
with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi)
Todo es genial, me gusta la foto. Entonces necesito agregar un comentario a la imagen y ver si todo se ve hermoso juntos. Nosotros escribimos:
bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ')
Por alguna razón, la imagen original sin procesar entra en el bot. Bueno, intentemos engañar: getupdates.offset -1 sin sentido, Telegram está seguro de que esta es la misma foto. Ok, hacemos esto:
with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi)
Reescribir:
bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ')
El resultado es el mismo: se muestra la imagen original. Y solo reemplazar el mensaje en el primer argumento con información dio el resultado deseado.
También te daré una pieza de código de nivel de entrada interesante de YouTube (Nota: sin verificación de errores):
elif message.entities:
Para mí, el escollo era que las entidades son una matriz de matrices y usted debe "revisar" toda la matriz para que el bot entienda que estamos trabajando con un enlace. También resultó que los usuarios envían el enlace al bot como "Compartir" de YouTube, por lo que "youtu.be" también está escrito en el ejemplo. No se me ocurrió una manera de enviar inmediatamente un archivo a Telegram, por lo que lo guardamos, lo enviamos y luego lo eliminamos. Durante las pruebas, me informaron de inmediato que la gente comenzaría a descargar archivos gigantes; más tarde tuve que introducir una restricción.
Antes de que se lanzara el bot, de repente se hizo evidente que no tenía una verificación de los derechos de acceso al canal. Por ejemplo, conociendo mi canal, cualquier usuario de bot podría enviar un mensaje allí, porque El bot es un administrador. Tuve que hacer un chequeo urgentemente:
if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]:
Aquí obtenemos la lista de Administradores del canal y vemos si el autor del mensaje también es un Administrador.
Algunas palabras sobre cómo tuviste que pelear con Roskomnadzor. Dado que el acceso a la API está bloqueado, para desarrollar el bot localmente necesita pasar el tráfico de alguna manera a través de nuestros valientes defensores. Puede hacer esto de dos maneras: a través de una VPN o un proxy. La forma más simple, rápida y "normal" es el túnel ssh: establecemos una conexión entre el cliente y el servidor proxy, obtenemos un puerto en el host local donde se puede enviar el tráfico desde nuestro lado y saldrá desde el otro lado (ya en algún lugar de Alemania). Para mayor comodidad, puede agregar una apariencia de automatización de esta conexión: un script y un acceso directo en el escritorio, que lo iniciará, si es necesario. Por el método "normal", aquí me refiero a la situación en la que controlamos los puntos de entrada y salida nosotros mismos: a la izquierda está nuestra computadora portátil, a la derecha está el VPS en Alemania. en el medio, el tráfico puede ser interceptado tanto como se desee, está encriptado, y a la salida nos encontramos en la jurisdicción de otro estado, y las leyes de la Federación Rusa no se aplican a él. Como ventaja adicional, obtenemos una garantía adicional de que el servidor proxy no se cambiará ni se apagará hasta que lo hagamos por nuestra cuenta. Es decir A diferencia de cualquier tío VPN, tenemos tranquilidad y confianza en el futuro.
Guión
/home/user/proxy.sh
Código de script
Una vez que hemos establecido una conexión con el servidor y el puerto está abierto, necesitamos dirigir el tráfico allí de alguna manera. Caminando por el camino de menor resistencia y para no pensar en cómo configurar el proxy en IDE \ docker \ python, puede hacer una configuración para todos, las cadenas de proxy serán una configuración de este tipo. Si ejecuta algún software con esta utilidad, redirigirá el tráfico a través de la cadena de proxy que está registrada en la configuración.
/etc/proxychains.conf
En nuestro caso, esta es una cadena y escribirla no es difícil.
socks5 127.0.0.1 1080
y otra muleta que se tomó para no configurar VPN (sarcasmo) es una forma de iniciar una aplicación Python desde PyCharm. En el caso simple, para ejecutar la aplicación a través de proxychains, simplemente escriba proxychains app.py y listo. Pero el IDE siempre requiere un intérprete. Es fácil evitar esto: cree una nueva "configuración de ejecución", seleccione un script de shell. y rellena los campos

Después de eso, el lanzamiento desde el punto de vista IDE toma esta forma: proxychains python3 app.py: esto es exactamente lo que necesitamos. Por lo tanto, cuando queremos comenzar un proyecto, todo lo que tenemos que hacer es ejecutar el script en el escritorio, y luego presionar el botón "play" in ide para iniciar el bot. El resto de la magia se realizará mediante proxychains y ssh.
Finalmente, el bot está escrito, probado. Que sigue Por un lado, quiero declararme, por otro lado, creo que realmente puede ser útil para alguien. Y aquí nos enfrentamos con otro problema de Telegram; no tiene un solo catálogo de canales y bots. Es muy posible que exista un bot similar al mío, pero repito que no lo encontré. Y en algún lugar del tranvía, un hombre se sienta y sufre, que quiere organizar bellamente un mensaje en el canal y hace todo con bolígrafos.
Si ya ejecutaste mi bot, entonces viste que hay un hashtag #Advertising. ¿Cómo es eso? - usted pregunta Y aquí abordé el problema con los usuarios finales: muchos publicaron anuncios en sus canales y rápidamente se acostumbraron a escribir mensajes usando el bot, me pidieron que agregara. Puede que no le guste la publicidad, luche, pero estas son realidades duras y necesarias para los usuarios.
El proyecto no tiene fines de lucro, por lo que creo que puede llamar al bot en sí mismo @SGK_espace_bot.
Y aquí está el video de cómo usarAgradecería cualquier crítica constructiva.