Amusons-nous un peu avec Python et Instagram

Ou, comment passer une semaine de chômage à apprendre comment développer le back-end d'une application web.

Joachim Joachim

Il y a une semaine exactement je sortais de la douche avec une idée ; depuis j’y travaille, et c’est intéressant.

Un peu de contexte : depuis le mois dernier je n’ai plus mon emploi de designer / graphiste / intégrateur. Outre la recherche et la paperasse liée à mon changement d’occupation (je fais aussi un peu de freelance à côté, si ça vous dit), je me consacre à des projets perso. Le site que j’ai récemment refait pour la chanteuse-romancière-hôtesse-de-podcast Sylvia Hansel en est un exemple.

Parallèlement, je suis en train de supprimer mes comptes Facebook et Instagram (c’est une conséquence directe de mes billets de ces derniers mois sur le sujet). Supprimer Facebook c’est pas trop dur, seule la messagerie m’est utile. En revanche, j’aime bien Instagram, pour voir les publications de mes contacts (beaucoup de photographes, de magazines photo, d’illustrateurs, de tatoueurs…), et pour poster mes photos. Je ne donne pas de lien vers mon compte, étant donné qu’il va bientôt disparaitre. En revanche, je teste une alternative au réseau social photo, qui est sur le même principe de fédération que Mastodon, et qui souhaite donner une plate-forme aux photographes, illustrateurs, amateurs ou pro. Ça s’appelle Pixelfed, et c’est plutôt prometteur. Mon compte sur l’instance principale, c’est @joachim@pixelfed.social (mais je songe déjà à installer une instance perso avec un nom de domaine sympa).

Oui, mais… pour suivre les publications de mes contacts encore sur Instagram, je fais quoi ? C’est là que la douche m’a été utile jeudi dernier : je me suis dit que je pouvais développer un outil, qui m’afficherait les photos.

Bref, en quelques heures j’avais un prototype du scraper, et au bout de quelques jours l’outil est utilisable.

Voilà Pyctogram.

Le code est en license libre (AGPLv3), disponible pour l’instant sur GitHub (en attendant que j’en déménage).

Pourquoi ce nom ? Parce que c’est écrit dans le langage informatique Python, qu’il y a des images (le latin n’avait pas de mot pour photographie, mais peinture sur dit pictura), et pour enfoncer le clou, -gram vient du grec γράμμα qui veut désigne ce qui est dessiné ou peint, on retrouve ce suffixe dans photogramme ou dans… Instagram.

L’outil Pyctogram a encore peu de capacités. On peut :

  • importer des nouveaux contacts, via le fichier connections.json présent dans l’export Instagram, via un fichier texte ou en les rentrant à la main
  • voir apparaître les photos sur le feed principal
  • sauver des photos dans la memory (les photos sont alors téléchargées sur le disque dur dans un dossier du programme)
  • faire des listes de contacts pour les regrouper par thèmes et voir un feed spécifique
  • consulter les feeds des contacts
  • et c’est à peu près tout

Techniquement, l’importation des contacts et des média marche avec un scraper : l’outil prend la liste des contacts qui sont dans la base de donnée, puis télécharge les pages une à une, et regarde ce qui y a été publié depuis la dernière fois.

Je ne voulais pas passer par l’API officielle d’Instagram, parce que ça requiert un compte sur le réseau social, et que je compte supprimer le mien.

Le problème d’un scraper comme ça, c’est que chaque contact nécessite une requête, et chaque requête prend du temps. L’importation de ma liste, soit 800 contacts, m’a pris une vingtaine de minutes. C’est loin d’être idéal.

Je ne suis pas développeur back-end. Ma formation c’est designer, mon dernier poste c’était de l’intégration (HTML et CSS). Pour faire simple, le développement front c'est la transformation des maquettes graphiques en pages web, par opposition au développement back, qui conduit toute l'action du serveur pour répondre aux requettes : les bases de données, les API, etc.

Jusque là je touchais un peu au Javascript pour des sites ou carrément des extensions web, et j’ai commencé à toucher au langage Python il y a un an. J’avais juste fait une ou deux centaines de lignes de code, pour des projets pas très sérieux, borderline inutiles, ou juste utiles pour moi.

Ce projet m’a permis de vraiment comprendre comment marche une application Web. J’ai appris à utiliser des bases de données, des classes & objets, et le framework Flask. C’était intéressant de sortir de mon domaine de compétence pour comprendre toute la partie en amont de ma spécialité. Lors de mon expérience pro la plus récente, mes collègues du back-end utilisent PHP et Symfony ; et même si c’est pas le même langage j’ai retrouvé les logiques sous-jacentes. Dans mes prochaines collaborations avec des développeurs back-end je pourrai mieux saisir les tenants et les aboutissants des choix de développement… ce qui ne peut qu’améliorer ma pratique du design et de l’intégration dans une équipe de développeurs back.

L’outil n’est pas fini. Outre quelques petites modifications cosmétiques, l’ajout de commentaires dans le code et diverses petites refactorisations, je voudrais ajouter des fonctionnalités.

Tout d’abord, il faut que l’outil soit le plus simple possible à télécharger / installer / utiliser. C’est à dire que rien ne doit passer par la ligne de commande. Ni l’installation de Python 3 et ses dépendances, ni l’initialisation de la base de donnée, ni le démarrage de l’app web. En plus de ça, il faut un moyen de consulter l’app web sur mobile (smartphone ou tablette), pour ça il faut que l’ordinateur la serve sur le réseau local (hum) ou que l’outil soit installé sur un serveur internet (mouais). Je n’ai aucune connaissance ni expérience dans ces choses-là donc je vais devoir m’abstenir pour l’instant.

J’aimerais aussi pouvoir gérer plusieurs utilisateurs sur la même installation. C’est pas la partie la plus facile (surtout au niveau sécurité). De même pour savoir comment concevoir le rapatriement des médias. Le script pourrait être appelé tous les jours (via une action automatisée, comme cron), mais j’aimerais pouvoir déclencher le rapatriement depuis l’interface web. À 800 contacts, ça met 20 minutes, c’est pas jouable. Ou bien j’améliore le scraper (trois requêtes à la fois ?) ce qui pourrait me pénaliser auprès d’Instagram (ce genre de requêtes automatisées, c’est jamais très bien vu), ou je trouve le moyen d’exécuter le rapatriement en tâche de fond, avec une barre de progression—mais ça c’est une partie de JS et de requêtes que je ne maitrise absolument pas.

Donc la suite, c’est pas pour maintenant. Je vais avancer à mon rythme, et tenter de résoudre mes problèmes un par un. Et qui sait, si des développeurs Python passent par là et jettent un coup d’œil à mon code, qu’ils n’hésitent pas à me dire ce qui est mal pensé, conçu ou implémenté, et s’ils ont des idées sur les problèmes qui se présentent à moi, faut pas hésiter non plus. C’est l’intérêt du Logiciel Libre, ceux qui le désirent peuvent contribuer.

Participez aux discussions sur Twitter et sur Mastodon

À propos : Je suis à la recherche d'un emploi, accessible à vélo depuis l'est parisien, dans le design et/ou l'intégration (markup + styles). Je suis pour un Web de qualité et respectueux des utilisateurs, et j'ai pas de problème avec le télétravail. Mon book n'est absolument pas à jour.