Facebook connect with python

 

A few weeks ago I've discover Facebook Connect. So I decide to try to use it in a new project. It look like an easy way for new user to register in my application.

The first step is to follow the Quick start guide. Then whe need to take care of Facebook in our application. There is already a cool python library to play with Facebook called pyfacebook. So you need to install it.

In my project I aleady use repoze.what for authentification. It just rocks. So i decide to write an IIDentifier plugin for Facebook:

import sha
import facebook
from webob import Request
from zope.interface import implements
from repoze.who.interfaces import IIdentifier

DEFAULT_FIELDS = ['uid', 'name', 'first_name', 'birthday', 'relationship_status',
                  'proxied_email', 'sex', 'hometown_location',
                  'pic', 'pic_big', 'pic_small', 'pic_square']

class Params(dict):
    def __getattr__(self, attr):
        return self.get(attr, '')
    def __html__(self):
        return repr(self)

class Facebook(object):
    implements(IIdentifier)

    def __init__(self, api_key, secret_key):
        self.api_key = api_key
        self.secret_key = secret_key

    def identify(self, environ):
        req = Request(environ)

        # initialize the api object
        fbapi = facebook.Facebook(self.api_key, self.secret_key) # init pyfacebook instance
        if fbapi.check_session(req):
            environ['repoze.who.fb'] = fbapi
            user = fbapi.users.getInfo([fbapi.uid], DEFAULT_FIELDS)[0]

            # we used the proxied_email and a generated password to retriave
            # the user from our DB
            user.update(
                login=user['proxied_email'],
                email=user['proxied_email'],
                password=sha.new('%s%s' % (fbapi.uid, self.secret_key)).hexdigest(),
                )

            # we store the facebook data in environ
            environ['repoze.who.fbuser'] = Params(user.items())
            return user

    def remember(self, environ, identity): pass
    def forget(self, environ, identity): pass

At the first time there is no user in our DB. So the user isn't really connected to our interface. The trick is to use a javascript callback to show a registration form to the user with fields pre-filled with Facebook's data.

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
  <head></head>
  <body>
   <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript">
   </script>
   <fb:login-button onlogin="facebook_onlogin();"></fb:login-button>
   <script type="text/javascript">
     FB.init("YOUR_API_KEY_HERE", "xd_receiver.htm");
     var facebook_onlogin() function() {
         // here is the trick
         window.location.href = '/register/facebook';
     }
   </script>
</body> </html>

When the form is submitted, you need to create the real user in your application. That's all !

collective.releaser rocks !

 

Tarek have made some great works on collective.releaser and collective.dist the last months. There is currently a refactor branch.

The goal of collective.releaser is to normalize the release process of a buildout based project.

I've worked on it the last week to implement the latest needed steps to allow an easy way to release a buildout project.

So here is how it works. collective.releaser came with a paster template to generate a buildout skel. You got a dev.cfg for development with a develop option with all your develop eggs in it and a prod.cfg for production without develop and all versions fixed in the versions section.

I've modified the project_release so you just need to run:

$ bin/project_release --version=1.0

This will release eggs founded in the dev.cfg's develop option on a pypi server and fix the versions in buildout.cfg. If no version is founded for an egg in the versions section of the prod.cfg then the egg is released at the version passed to the command line. If a version is founded then the egg is released at this version. Here is an example:

The dev.cfg:

[buildout]
parts = eggs

develop =
  ../collective.releaser
  ../my.project

[eggs]
recipe = zc.recipe.egg
eggs =
  collective.releaser
  my.project

The prod.cfg:

[buildout]
parts = eggs
versions = versions

[versions]
collective.releaser=0.6.1

[eggs]
recipe = zc.recipe.egg
eggs =
  collective.releaser
  my.project

collective.releaser package is already at 0.6.1 so no release is needed. my.project as no versions specified so a new 1.0 release is generated and uploaded on your pypi server.

The generated buildout.cfg will look like this:

[buildout]
extends = prod.cfg
versions = versions

[versions]
collective.releaser=0.6.1
my.project=1.0

After all eggs are released, project_release will generate a tarball with the tagged version of the project and all eggs founded in the develop option.

Then to upgrade your project you just need to untar the archive on your production server. Launch bin/buildout. And that's it.

This will probably make life easier for developers ! Hope we can make a new self generated release soon :)

HADOPI - Le symbole du vite fait mal fait

 

Cela faisait longtemps que je n'avais pas posté un billet. Pourtant, je ne cesse de m'exprimer sur cette foutue loi qu'est l'HADOPI. Voici un billet plus posé, bénéficiant des éléments extérieurs que j'ai pu lire ces derniers temps.

Nicolas Sarkozi a payé jeudi dernier sa politique de réforme vite fait mal faite. On (chez les geeks) parlent beaucoup de l'HADOPI. En fait, le problème est plus général.

J'avais été frappé par cet article paru dans Challenges.fr. Qui révèle combien la politique actuelle c'est du vite fait mal fait.

Après l'épisode "Christine baisée par 21 gus dans une assemblée", on repousse une loi sur l'inceste pour faire passer de force cette loi sur l'HADOPI. Je crois que cette loi sera le symbole du régime du vite fait mal fait tant cette loi est absurde et inapplicable (+7000 résultats dans google). On sait déjà que cette loi ne résoudra pas le problème. Le gouvernement en est conscient, et l'admet. C'est totalement aberrant.

Le pire je crois, c'est la duperie qu'on nous a fait sur les parachutes dorés. Nous, citoyens, prenons la crise en plein face. Même les fonctionnaires, dont certains sont, il faut bien le dire, pauvres ! Et que fait nôtre président ? Rien de bien concret pour les citoyens Ni même pour les fonctionnaires. Certes, on redresse les banques. Ce n'est pas pour autant que les taux vont baisser... vous imaginez bien. Mais cette loi sur les parachutes dorés, on la remets à plus tard, en espérant probablement que, de toute façon, le soleil aidant, le peuple oubliera. Alors, quelle est l'urgence ? Lutter contre la crise, l'inceste ou faire des citoyens des pirates ?

Et maintenant, rions un peu. Que va-t-il se passer quand des gens mal intentionnés enverrons des mails signé HADOPI ? On sait combien la RFC 2821 (norme des serveurs de mail) est faible et combien il est simple d'envoyer des mails avec un mail que l'on ne détiens pas. L'HADOPI devra-t-elle aussi encaisser les réponses à ces innombrable mails... ? C'est peu-être un point positif, après tout. Cela créera des emplois... Quelques centaines de fonctionnaires nouveaux pauvres !

Bref, on risque de vivre des épisodes très comique ou des députés seront accusés par l'HADOPI d'avoir télécharger illégalement depuis l'assemblée. Ou des citoyens innocent se verront menacés par l'HADOPI (ou pas) de voir leur connexion disparaître. Pour moi, c'est tout bonnement pitoyable tant cette loi frise le ridicule. Espérons que la France ne soit pas dupe bien longtemps...

A bon entendeur !

Pascal Negre est fier de Spotify mais les hackers aussi

 

Lors d'un débat sur LCI, Pascal Nègre était bien content de pouvoir vanter les mérites de Spotify. La nouvelle génération de streaming de musique sur internet. Ce qu'il ignore, c'est que, alors même que Spotify est encore en béta et que les inscriptions ne se font que sur invitations (en fait il suffit de se rendre ici) des hackers se le sont déjà approprié. C'est le cas de despotify, un client pour Spotify open source utilisant ncurse. Ce client tourne sous un majorité de système unix, contrairement au client officiel. Ceci est une chose, mais cela veut aussi dire qu'il est possible de ré-implémenté le protocole de Spotify pour en sauvegarde le flux, et donc, en faire des copies.

C'est d'ailleurs ce que propose SpotSave, un petit logiciel disponible uniquement sous windows qui vous permettra lui de télécharger tout ce que vous écoutez sur le client officiel. Spotify est donc voué à devenir le nouveau emule. Mais un emule qui aura le soutiens des majors !

Alors monsieur Nègre ? Toujours convaincu du bien fondé de ce site ? Même une fois payant, il sera possible de télécharger n'importe quel morceaux de musique pour 10euros par mois. Pourquoi donc ne pas inclure ces frais directement dans l'abonnement de tout internaute ? C'est tout de même plus convivial que de ce faire braquer à chaque téléchargement.

C'est ce que propose la quadrature du net que nôtre gouvernement semble ignorer totalement. Pourtant, il faudra bien l'admettre un jour, ces gens on un discours bien plus censé, réaliste et cohérent par rapport à vos balbutiements.

Une fois de plus, vous qui me lisez, je ne peux que vous inviter à écrire à votre député pour qu'il contribue à mettre un terme à cette mascarade qu'est L'HADOPI. L'april viens aussi récemment de lancer un appel à la mobilisation à la suite d'un rapport rendu par le rapporteur. Lui aussi probablement un vendu à la solde des majors, comme Christine Albanel.

Downloader sur deezer. Ou comment dénoncer l'hypocrisie.

 

Les événements de ces derniers temps concernant l'HADOPI m'avaient depuis longtemps donné envie de m'exprimer. Seulement... la politique et moi, ça ne fait pas forcément deux. Il y a des gens comme bluetouff qui parlent bien mieux que moi de bécassine et de ses compères.

Mais j'ai enfin trouvé. Il suffisait de faire ce que je sais faire: du scripting. J'ai donc chercher le moyen de télécharger de la musique sur deezer.

En fait, le principe est très simple. Lorsque vous écoutez un morceaux sur deezer, il est stocké dans un fichier temporaire. Il suffit de ré-encoder ce fichier flash en mp3. Qui y a t'il d'illégal à utiliser un fichier que l'on met sur mon disque sans me demander mon avis ? Je me le demande bien... Et pourtant, ça l'est.

Voici le principe. Allez sur deezer y écouter votre morceau favori. Une fois la barre de progression du téléchargement arrivée à 100%, lancez la commande suivante:

ffmpeg -i $(lsof | grep -i firefox | grep -i flash | grep private | sed 's/.* \(\/.*\)/\1/g') titre.mp3

Ceci est testé à partir de mon OSX en utilisant ffmpegx mais doit fonctionner sous n'importe quel unix en modifiant un peu la commande.

Ce billet n'a pas pour but d'inciter au téléchargement illégal. Personnellement je ne télécharge plus illégalement depuis que beaucoup de sites proposent d'écouter (Last.fm, deezer, ...) voir de télécharger (jamendo, dogmazic, ...) de la musique gratuitement. Mais malgré cela, je tenais à démontrer la débilité de cette loi. Il y aura toujours un moyen de télécharger de la musique illégalement, même à partir de site légaux... Au lieu de tout baser sur la répression, il serait judicieux de trouver un moyen de légaliser ce type de téléchargement. Bref, l'HADOPI ne passera pas par moi. Faites vous aussi savoir à votre député que vous n'approuvez pas cette loi, écrivez-lui.

Tiens, à ce propos, en changeant de Mac j'ai retrouvé de la musique qu'un pote m'avait déposé depuis son disque dur externe (et oui, il n'y a pas qu'Internet pour faire de la copie illégale...). Je crois que c'est l'occasion de (re)découvrir ce charmant morceau datant de l'époque où nôtre président était encore ministre.