â€č retour

🐍 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.

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.

À 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.


On en discute ?



Billets liés


Feedback (en travaux)

Répondez sur votre propre site, envoyez une Webmention!

🌿 🌿 đŸŒ± 🍂 🌿 🍂 🍂 🌿 🌿 đŸŒ± 🌿 đŸŒ± 🍂 🌿 🍁 đŸŒ± 🍁 🍂 🌿 🌿