La tâche semble simple lorsque vous n'en savez rien et que vous décidez.
Un jour «merveilleux», j'ai réalisé que je ne souhaitais pas participer à de nombreux forums, mais je voulais créer ma propre chaîne et partager ma «sagesse».
J'aime les fonctionnalités de Telegram intégrées, y compris les bots, donc la chaîne sous forme de blog a été créée là-bas. Il a commencé à chercher des robots pour aider à écrire des messages ... et comme je veux pas le trouver. Eh bien, écris-le toi-même. Les personnes intelligentes sont invitées à écrire en Python.
J'ai lu le premier tutoriel sur Internet sur 149 pages. Je connais Pascal, FoxPro, Interbase et même (ha ha 3 fois) il y a 20 ans j'ai vendu mes programmes, et puis ça n'a pas marché, je me suis lancé dans le commerce. Au fait, travailler en tant que programmeur m'a beaucoup aidé à définir des tâches pour les codeurs. Mais revenons à Python, il semble, rien de compliqué, car il était également possible de programmer sur BASIC, et ce n'est pas mon diplôme universitaire avec un complexe matériel-logiciel du générateur de vérification MIG sur Assembler. Un problème, c'était il y a longtemps, donc revenons aux gros titres - il semble que ce soit simple, car je ne sais encore rien de la tâche, mais ça vaut le coup d'essayer.
J'ai décidé qu'il est plus pratique de faire un projet depuis un smartphone vers Android, car il est toujours à portée de main. Donc, mettez:
- Pydroid 3 - IDE pour Python 3 En fait Python pour Android.
- @BotFather, Dans Telegram, nous installons le père de tous les bots - vous en aurez besoin pour obtenir l'identifiant de votre bot et effectuer les réglages de base.
- Rebootr Application pour lancer un projet sur heroku.
- GIT Une application pour l'hébergement en ligne de référentiels.
- Windscribe sans VPN n'importe où?
- Émulateur de terminal Termux et environnement Linux.
Et quel est le résultat net? La programmation sur un smartphone est possible en théorie, mais impossible en pratique. Vérifiez le code autant que possible, corrigez l'erreur, examinez les performances.
Une si longue introduction et ce que je voulais obtenir de mon bot. Au début, il m'a semblé suffisant d'ajouter un hashtag à la fin du message. Puis la pensée est venue de le "couvrir" avec un lien vers ma chaîne, donc avec republication il y aura un attrait supplémentaire pour la source de la chaîne. Ensuite, il a ajouté l'automatisation du lien source, d'où je reçois le message. Ensuite, je vais faire une digression. La publicité est bien sûr le moteur du progrès. Mais parfois, son montant passe par le toit. Telegram a été choisi par moi, entre autres, parce qu'il y a une opportunité de combattre ce dernier. Je respecte les lecteurs de ma chaîne et je nettoie donc les nouvelles intéressantes trouvées sur Ineta de la publicité et les envoie à la chaîne. Dans le même temps, je respecte les auteurs et donne presque toujours un lien vers la source sous forme de «Lire la suite ...». En raison de l'aversion pour la publicité, je télécharge du contenu de YouTube et le télécharge dans ma chaîne en tant que fichier vidéo. À un certain moment, le bot qui a téléchargé la vidéo est devenu fou et a commencé à m'envoyer des annonces toutes les heures. Donc, dans mon bot, il y avait une opportunité de télécharger une vidéo depuis YouTube. Récemment, au fait, j'ai rencontré l'auteur de ce bot, il a été très surpris, car Selon lui, il n'envoie des annonces "que" 20 fois par mois. La même chose s'est produite avec le bot qui fait le filigrane - il a été envoyé au four, et j'ai eu l'occasion de faire un filigrane.
Afin d'écrire un programme à partir de zéro, j'ai dû rechercher beaucoup d'informations sur Internet. J'espère que ceux qui suivront mes traces m'aideront. Alors d'où ai-je obtenu les informations et qu'ai-je utilisé:
- Les articles sur Habrr m'ont vraiment aidé. Par conséquent, je ne réécrirai pas comment et quoi installer. Tout y est. Au fait, j'ai contacté les auteurs de manière personnelle et ils n'ont jamais refusé mon aide.
- github Un service d'hébergement de référentiel en ligne avec toutes les fonctionnalités de contrôle de version distribué et de contrôle de source. Apprêt
- heroku est une plate-forme PaaS basée sur le cloud qui prend en charge un certain nombre de langages de programmation. L'abandonna très rapidement.
- pyTelegramBotAPI - L'une des bibliothèques principales lors de l'écriture d'un bot pour Telegrams.
- Tutoriel d'orthographe de bot
- Python 3 pour débutants
- Bots: informations pour les développeurs
- Référence HTML
- Nulle part sans VPN?
Un deuxième plan de digression ou de guerre apparaîtra. Quand j'ai commencé à écrire le bot, la première chose que j'ai regardée était les codes de quelqu'un d'autre. S'il n'y a pas de kamenty, on peut difficilement comprendre:
La terre tremblait comme nos seins
Chevaux mélangés en groupe, gens,
Et des volées de mille fusils
Fusionné en un long hurlement ...
Lermontov a écrit sur le code. Le tas contient des fonctions, des décorateurs. Il n'y a pas de code beauté, personne ne se soucie des ressources. Bien que la beauté soit probablement vue par le masochiste bizarre. Le sens de la phrase d'un programmeur familier «Regardez le programme, vous pouvez peut-être le comprendre» m'a très rapidement atteint. L'explosion cérébrale la plus importante que j'ai eue a été lorsque j'ai finalement réalisé que le code était piloté par les événements et non séquentiel. Il s'agit d'un niveau différent.
Le deuxième problème est le manque de bonne documentation. Même à Basurm. Je vais vous donner un exemple. J'envoie une photo aux télégrammes, et il la secoue sans vergogne. Il s'est avéré qu'un argument non valide a été écrit dans la ligne:
file_info = bot.get_file(message.photo[-1].file_id)
Et quelle est la documentation? Nous allons à la source


Ceci est un tableau. Vous pouvez le parcourir, étudier où revient la taille. Merci, les gens intelligents ont suggéré quoi prescrire.
Bien que de quoi je parle, même si les gourous sont perdus.
Lorsque j'ai écrit le code du filigrane, j'ai utilisé une police gratuite et pour le mettre en gras, j'ai appliqué la solution à l'affichage du message trois fois avec un décalage de pixel, je ne sais pas à quel point la solution est belle, mais cela fonctionne.
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 position, comme vous pouvez le voir, est sélectionnée en fonction de la taille de l'image, de la hauteur de police également. Je suis immédiatement tombé sur un point intéressant: bien que la police fasse partie intégrante de la bibliothèque PIL, puisque la première ligne indique qu'elle fonctionne localement, mais dans Docker, ce n'est pas le cas. La solution consiste à le télécharger dans le référentiel, à ajouter le chemin d'accès au fichier d'environnement et à écrire un autre chemin dans le programme.
Une autre chose incompréhensible pour moi est arrivée à l'image après le traitement à l'aide de la bibliothèque PIL (immédiatement après le filigrane). Je l'envoie à mon bot:
with open(photo_path, 'rb') as fi: bot.send_photo(message.chat.id, fi)
Tout est super, j'aime bien la photo. Ensuite, je dois ajouter un commentaire à l'image et voir si tout est beau ensemble? Nous écrivons:
bot.send_photo(message.chat.id, message.photo[-1].file_id, caption=' ')
Pour une raison quelconque, l'image originale non traitée entre dans le bot. Eh bien, essayons de tromper: getupdates.offset -1 aucun sens, Telegram est sûr que c'est la même photo. Ok, on fait ça:
with open(photo_path, 'rb') as fi: info = bot.send_photo(message.chat.id, fi)
Réécrire:
bot.send_photo(message.chat.id, info.photo[-1].file_id, caption=' ')
Le résultat est le même - l'image d'origine s'affiche. Et seul le remplacement du message dans le premier argument par info a donné le résultat souhaité.
Je vais également vous donner un morceau de code d'entrée de gamme intéressant de YouTube (NB: sans vérification d'erreur):
elif message.entities:
Pour moi, la pierre d'achoppement était que les entités sont un tableau de tableaux et vous devez «parcourir» l'ensemble du tableau pour que le bot comprenne que nous travaillons avec un lien. Il s'est également avéré que les utilisateurs envoient le lien vers le bot en tant que «Partager» à partir de YouTube, donc «youtu.be» est également écrit dans l'exemple. Je n'ai pas trouvé de moyen d'envoyer immédiatement un fichier à Telegram, nous l'enregistrons donc, l'envoyons puis le supprimons. Pendant les tests, j'ai été immédiatement informé que les gens commenceraient à télécharger des fichiers géants - plus tard, j'ai dû introduire une restriction.
Avant la libération du bot, il est soudain devenu clair que je n'avais pas de contrôle des droits d'accès à la chaîne. Par exemple, connaissant ma chaîne, tout utilisateur de bot pourrait y envoyer un message, car Le bot est un administrateur. J'ai dû faire d'urgence un contrôle:
if message.from_user.id in [adm_obj.user.id for adm_obj in bot.get_chat_administrators(chat_id)]:
Ici, nous obtenons la liste des administrateurs du canal et voyons si l'auteur du message est également un administrateur.
Quelques mots sur la façon dont vous avez dû vous battre avec Roskomnadzor. Étant donné que l'accès à l'API est bloqué, pour développer le bot localement, vous devez en quelque sorte faire passer le trafic via nos vaillants défenseurs. Vous pouvez le faire de deux manières: via un VPN ou via un proxy. Le moyen le plus simple et le plus rapide et «normal» est le tunnel ssh: nous établissons une connexion entre le client et le serveur proxy, nous obtenons un port sur l'hôte local où le trafic peut être envoyé de notre côté, et il sortira de l'autre côté (déjà quelque part en Allemagne). Pour plus de commodité, vous pouvez ajouter un semblant d'automatisation de cette connexion - un script et un raccourci sur le bureau, qui le lancera, si nécessaire. Par la méthode «normale», j'entends ici la situation où nous contrôlons nous-mêmes les points d'entrée et de sortie - à gauche se trouve notre ordinateur portable, à droite se trouve le VPS en Allemagne. au milieu, le trafic peut être intercepté autant que souhaité, il est crypté, et à la sortie nous nous retrouvons sous la juridiction d'un autre État, et les lois de la Fédération de Russie ne s'appliquent pas à lui. En plus, nous obtenons une garantie supplémentaire que le serveur proxy ne sera pas changé ou éteint jusqu'à ce que nous le fassions nous-mêmes. C'est-à-dire contrairement à tout oncle VPN, nous avons la tranquillité d'esprit et la confiance en l'avenir.
Script
/home/user/proxy.sh
Code de script
Une fois que nous avons établi une connexion avec le serveur et que le port est ouvert, nous devons en quelque sorte y diriger le trafic. En marchant sur le chemin de la moindre résistance et afin de ne pas penser à la façon de configurer les proxys dans IDE \ docker \ python, vous pouvez faire un paramètre du tout, les proxychains seront un tel paramètre. Si vous exécutez un logiciel à l'aide de cet utilitaire, il redirigera le trafic via la chaîne proxy qui est enregistré dans la configuration.
/etc/proxychains.conf
Dans notre cas, il s'agit d'une chaîne et l'écriture n'est pas difficile.
socks5 127.0.0.1 1080
et une autre béquille qui a été prise pour ne pas configurer VPN (sarcasme) est un moyen de lancer une application Python à partir de PyCharm. Dans le cas simple, pour exécuter l'application via des chaînes proxy, il suffit d'écrire proxychains app.py et c'est tout. Mais l'IDE a toujours besoin d'un interprète. Il est facile de contourner cela - créez une nouvelle "configuration d'exécution", sélectionnez un script shell. et remplissez les champs

Après cela, le lancement du point de vue IDE prend la forme suivante: proxychains python3 app.py - c'est exactement ce dont nous avons besoin. Ainsi, lorsque nous voulons démarrer un projet, tout ce que nous devons faire est d'exécuter le script sur le bureau, puis d'appuyer sur le bouton "play" pour lancer le bot. Le reste de la magie se fera par proxychains et ssh.
Enfin, le bot est écrit, testé. Et ensuite? D'une part, je veux me déclarer, d'autre part, je pense que cela peut vraiment être utile pour quelqu'un. Et ici, nous sommes confrontés à un autre problème de télégramme; il n'a pas un seul catalogue de chaînes et de bots. Il est fort possible qu'un bot similaire au mien existe, mais je répète que je ne l'ai pas trouvé. Et quelque part dans le tram, un homme est assis et souffre, qui veut joliment organiser un message dans le canal et il fait tout avec des stylos.
Si vous avez déjà exécuté mon bot, vous avez vu qu'il existe un hashtag #Advertising. Comment ça? - demandez-vous. Et ici, j'ai abordé le problème avec les utilisateurs finaux - de nombreux messages publicitaires sur leurs chaînes et se sont rapidement habitués à écrire des messages en utilisant le bot, ils m'ont demandé d'ajouter. Vous n'aimez peut-être pas la publicité, combattez-la, mais ce sont des réalités dures et nécessaires pour les utilisateurs.
Le projet est à but non lucratif, donc je pense que vous pouvez appeler le bot lui-même @SGK_espace_bot.
Et voici la vidéo comment utiliserJe serais reconnaissant pour toute critique constructive.