01 juin 2005

Mobile blog

Comme ça peut servir à d'autres, je met ici le code qui me permet d'envoyer des images depuis mon téléphone. Vu que blogger n'héberge pas les images, je passe par flickr pour ça. Il vous faut donc un compte flickr (mais c'est gratuit).

Pour ça, vous avez besoin d'un ordinateur avec une liaison permanente, et de préférence une adresse IP fixe pour recevoir les emails. Au pire une liaison ADSL et DynDNS peut faire l'affaire. Si vous avez ça à disposition, alors il vous faut installer :
Dans flickr-ruby, n'oubliez pas de préciser vos login et mot de passe pour flickr.

Une fois que vous avez installé tout ça, il ne reste plus qu'à mettre le script moblog.rb dans le répertoire de votre choix et créer dans votre serveur mail un alias depuis l'adresse de votre choix vers le script. Par exemple, avec qmail, si vous créez un fichier "/var/qmail/alias/.qmail-mymoblog" qui contient pour unique ligne "| /home/erwan/moblog/moblog.rb", il suffira d'envoyer un email a mymoblog@mamachine.net et le tour est joué !

moblog.rb (pensez a changer $blog, $login et $pass) :

#!/usr/bin/ruby

require 'xmlrpc/client'
require 'flickr-ruby.rb'
require 'rmail'

$blog = "1234567"
$login = "toto"
$pass = "tata"

# Post to my blog
def blogPost(content)
server = XMLRPC::Client.new("plant.blogger.com", "/api/RPC2")
blogger = server.proxy( "blogger" )

blogger.newPost("0123456789ABCDEF",
$blog, $login, $pass,
content, true)
end

# Upload a photo and return the url
def flickPost(path)
flickUp = Upload.new
photo = flickUp.upload(path)
return photo.getURL('Medium', 'source')
end

def get_attachement_filename(message)
result = message.header['Content-Type']
result = result.sub(Regexp.new('.*name="(.*)"', Regexp::MULTILINE), '\1')
result.tr!('^A-Za-z0-9.', '')
return result
end

# Upload photo and post the comment to the blog
def moblogPost(image, text)
photo = flickPost(image)
content = "<p>" + text +
"</p><p style='text-align: center'>"+
"<img src='" + photo + "'/></p>"
blogPost(content)
end

msg = RMail::Parser.read($stdin)
text = ""
imagefile = ""
if msg.multipart?
msg.each_part do |part|
case part.header.media_type
when 'image'
imagefile = "/tmp/"+get_attachement_filename(part)
File.open(imagefile, 'w') {|f|
f.write(part.decode) }
when 'text'
text = part.body
end
end
end

if (imagefile != "")
moblogPost(imagefile, text)
File.delete(imagefile)
end

Aucun commentaire: