Affichage des articles dont le libellé est api. Afficher tous les articles
Affichage des articles dont le libellé est api. Afficher tous les articles

dimanche 17 janvier 2010

Interface Sinatra en #ruby pour #twitter


Sinatra (lien ici) est un framework léger pour ruby. Léger n'est pas un terme galvaudé pour un framework de moins de 2000 lignes de code. Il repose sur le produit 'Rack' pour la partie serveur WEB.

L'installation se fait par un gemme : gem install sinatra

Et voci le code d'une page minimaliste:
a) Lancer le programme suivant:
(imsinatra.rb)
require 'rubygems'
require 'sinatra'
get '/' do
"Hello,I'm Sinatra!"
end

Puis pointer votre navigateur sur
http://localhost:4567
Sinatra n'est un framework MVC comme Rails , simplement il décompose et traduit une URL en appel de fonction du programme en Ruby.

Le programme en question est composé de clause de type
'ordre HTTP' 'motif' do
#some actions here
end

Ex :
get '/about' do
"exemple de page"
end

Un peu à la manière des langages fonctionnel, c'est la première reconnaissance de motif valide qui traitera la requête. Il faut donc veiller bien ordonnée ses clauses.
Le système est construit sur des routes de type REST, à savoir:
L'url /projets/lemonldap pourra est interceptée par :
get '/projets:nom_du_projet'
#ici la variable params[:nom_du_projet] aura la valeur "lemonldap"


Il est possible d'enrichir la recherche de motif par l'utilisation de mot clé comme :capture combiné avec des expressions régulières.
Ex: get %r{motif_a_rechercher}
puis params[:captures]

Et d'utiliser des caractères 'joker' comme '*' avec le symbole :splat

La reconnaissance de motif peut s'utiliser en conjonction avec le contenu des entêtes HTTP comme par exemple le header 'User-Agent' lié à la variable :agent , et le header 'accept' lié au symbole :provides.
Il est possible d'appeler des vues et des templates depuis un script Sinatra et même de se servir Activerecord pour gérer ses accès aux bases de données. C'est peut là où doit s'arrêter l'usage de Sinatra pour passer à une infrastructure MVC avec Ruby On Rails.
A mon avis Sinatra doit être réservé à l'écriture d'interface web de configuration ou comme frontal à des applications sans base de données.
On peut l'utiliser pour visualiser les tweets collectés sur l'échantillon twitter.

voici un exemple:
On commence par lancer la commande curl de cette manière:
rl http://stream.twitter.com/1/statuses/sample.json -uuser:password -o /tmp/twitter.json


Puis lancer le script suivant:


#!/usr/bin/ruby
require 'rubygems'
require 'json'
require 'tweet'
require 'sinatra'
get '/' do
chaine="<html><body>"
File.open("/tmp/twitter.json" ).each_line do |line|
line.chomp!

next if !line[-1].respond_to?(:chr)

if (line[-1].chr == "}") then
jo= JSON.parse(line)
my_tweet=Tweet.new do |t|
t.tweet = jo
end
if (my_tweet.text) then
chaine += "<p><hr>"
chaine += my_tweet.user["screen_name"]
chaine +="(#{my_tweet.user["followers_count"]}):"
chaine += my_tweet.text

end
end
end
chaine+="</body></html>"
chaine
end

(remarque : la classe 'tweet' a déja détaillée dans des posts précédents)
Ci tout va bien vous devez voir ceci :(clic pour élargir)



Ou ce bon message d'erreur:(clic pour élargir)

mardi 12 janvier 2010

Les interfaces de twitter (API) #twitter




Le circuit sur twitter est le suivant:
a) Un message arrive sur le réseau Twitter.
b) Il est injecté dans la base de données Twitter
c) S'il répond à certains critères (réputation,pertinance,hastag ) il est rentré dans la base de recherche.
I) Le 'sample' est l'échantillonnage offert aux utilisateurs de twitter ('gardenhose')
II) Le 'filter' est l'interface de recherche basé sur des mots clés , de la geolocalisation, tous les tweets sont candidats à cette recherche.

Il faut ajouter à cela le 'firehose' qui est flux issu directement des tweets (plus exhautif que le sample).

Ceci est issu du blog suivant:Social Media Analytics Research Toolkit

jeudi 31 décembre 2009

La suite des manipulations des API #twitter et #Ruby

Dans ce post j'explique comment récupérer les informations publiques d'un utilisateur sur twitter.
Pour cela j'utilise l'API :
"http://twitter.com/users/show.json?user_id=nnnnn"
.

Dans le post précedent j'exposais comment faire correspondre un nom twitter avec l'user_id.



germanlinux: "25286531"
woork: "9689232"


Ces informations sont stockées dans un fichier au format yaml et le programme suivant va l'exploiter comme ceci :

require 'rubygems'
require 'json'
require 'tweet'
require 'net/http'
require 'uri'

twitters = open('radar.yaml') do |input|
YAML.load input
end
my_array = Array.new
twitters.each_value do |id_user|
my_id_user= id_user.to_i
cible = "http://twitter.com/users/show.json?user_id=" + id_user
response = Net::HTTP.get URI.parse(cible)
jo= JSON.parse(response)
my_tweet=Tweet.new do |t|
t.tweet = jo
end
ma_chaine= my_tweet.resume(['screen_name','name','friends_count','followers_count','statuses_count','created_at','profile_image_url?','url?','verified'])
puts ma_chaine
end



La méthode tweet#resume va faire un appel de méthode éponyme pour chaque clé.


def resume(fields)
my_string=""
fields.each do |a_field|
my_string+= self.send(a_field).to_s
my_string+=","
end
my_string
end

Le point d'interrogation ajouté à un nom de méthode permet de retourner un booléen sur la présence ou non d'une valeur associée à une clé. J'implemente ce sucre de syntaxe comme ceci :

def method_missing(m, *args, &block)

meth= "#{m}"
if meth[-1].chr == '?' then
meth.slice!(-1)
if @tweet[meth] then true.to_s else false.to_s end
else
@tweet["#{m}"]
end

end


Les Clés disponibles sont :

#profile_sidebar_fill_color ==> e0ff92
#name
#profile_background_tile ==> false
#profile_sidebar_border_color ==> 87bc44
#created_at ==> Sat Jun 27 12:59:27 +0000 2009
#location ==> Paris
#profile_image_url ==> http://a3.twimg.com
#profile_link_color ==> 0000ff
#url ==> http://
#favourites_count ==> 0
#utc_offset ==> -10800
#id ==> 51431032
#followers_count ==> 565
#protected ==> false
#profile_text_color ==> 000000
#profile_background_color ==> 9ae4e8
#geo_enabled ==> false
#verified ==> false
#notifications ==> false
#description ==>
#time_zone ==> Greenland
#friends_count ==> 5
#statuses_count ==> 0
#profile_background_image_url ==> http://s.twimg.com/a/1261519751/images/themes/theme1/bg.png
#screen_name ==> Er
#following ==> false

L'excécution du programme donne:


germanlinux,eric german,32,29,168,Thu Mar 19 13:01:16 +0000 2009,true,true,false,
Woork,Antonio Lupetti,133,12952,135,Thu Oct 25 17:38:34 +0000 2007,true,true,false

Il ne reste plus qu'a exporter ces lignes dans un tableur pour s'amuser à faire des statistiques.

mercredi 30 décembre 2009

#Ruby #twitter API, Comment recuperer le user_id twitter à partir du nom d'utilisateur

Lorsqu'on travaille avec les API twitter, il faut faire attention aux limitations mise en place par twitter. Des limites existent sur le nombre de requetes venant d'une adresse IP , pour un utilisateur authentifié etc (ici le détail de leur politique). L'idée est d'utiliser les ressources les plus accessibles.

Un certains nombres d'information ne sont disponibles qu'a partir du user_id. cette donnée est numérique et elle n'est pas affichée directement.

Ce programme permet d'effectuer la correspondance entre un nom twitter (screen_name) et son user_id. Il utilise des requetes simples HTTP non authentifiées, sans risque de blocage.
Je remplie un fichier avec des noms twitter , le programme va rechercher la page twitter, la parse et retrouve le user_id. En sortie le programme sauvegarde les information dans un fichier au format YAML.

require 'rubygems'
require 'net/http'
require 'uri'

my_hash =Hash.new
## read standard input
ARGF.each_line do |line|
line.chomp!
cible = "http://twitter.com/" + line
response = Net::HTTP.get URI.parse(cible)
## sorry I have arrived from Perl
response=~ /user_(\d+)/
id_user=$1
my_hash[line] =id_user
end
# dump hash in yaml file
File.open('radar.yaml','w') do |out|
YAML.dump my_hash,out
end


En entrée:

germanlinux
woork


En sortie:

---
germanlinux: "25286531"
woork: "9689232"


L'étape suivante consistera à utiliser ces user_id dans l'API:

http://twitter.com/users/show.json?user_id=nnnn


Mais c'est un autre post.