Parmi les jeunes langages de scripts à la mode de nos jours on distingue assez clairement deux leaders : le python et le ruby. Le nombre de trolls velus entre ces deux langages est d'ailleurs assez impressionnant ! Personnellement j'utilise le python puisqu'il répond à tout ce que j'attend de la part d'un langage de script (je ne prétend donc pas qu'il soit mieux ou moins bien que le ruby que je n'ai juste pas testé), et quand par hasard une fonctions que j'aurai aimée n'est pas présente de base il est souvent enfantin de la rajouter comme je me propose de vous en donner un exemple dans ce billet !

Oignons - Creative Common from "ILoveButter" on Flickr

L'une des bibliothèques standards du python que j'ai apprécié le plus vite c'est la bibliothèque "urllib"[1] qui permet, entre autres choses, de récupérer une page web en une toute petite ligne de code :

urllib.urlopen("http://www.ozwald.fr").read().

Quand on compare aux dizaines de lignes nécessaires en C pour obtenir la même chose, ça donne des frissons de bonheur ! Avec cette librairie tout ce que l'on peut vouloir faire se fait très simplement : ajout de headers HTTP, lecture des headers HTTP de la réponse, passage par un proxy HTTP, etc. Seulement voilà : une fonction manque à l'appel (à mon gout), c'est la possibilité d'utiliser un proxy SOCKS :( !

Pourquoi vouloir utiliser un proxy SOCKS me direz vous ? Après tout "C'est relativement rare comme besoin et donc certainement contournable". Et bien non, là ça n'est pas contournable puisque le but du jeu c'est de faire passer notre script python par TOR, or TOR vient par défaut en tant que proxy SOCKS :)

Comment faire pour que notre script python passe par TOR du coup ? C'est enfantin : Vous télécharger socksipy, vous enregistrez le fichier que vous venez de télécharger dans le même répertoire que le script que vous voulez TORifier, et dans ce script que vous voulez TORifier vous ajoutez les 4 lignes suivantes :

import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS4,"127.0.0.1",9050,True)
socket.socket = socks.socksocket

Voilà c'est fait :) Vous avez remplacé l'ouverture de socket standard de python par celle de socksipy (qui utilise le proxy TOR que vous avez configuré), donc suite à ces 4 lignes toutes les fonctions de python qui reposent sur des socket sont TORifiées, en particulier les fonctions d'urllib qui vont lire des pages web. Alors, c'était enfantin ou pas ?

Notes

[1] Et son évolution : urllib2