Accueil > > > AUTO-FOLLOW/UNFOLLOW [TWITTER] EN [PERL] UTILISANT NET::TWITTER AVEC INTERFACE GRAPHIQUE TK
AUTO-FOLLOW/UNFOLLOW [TWITTER] EN [PERL] UTILISANT NET::TWITTER AVEC INTERFACE GRAPHIQUE TK
Information sur la source
Description
Petit script en Perl qui auto-follow les gens qui vous suivent et unfollow ceux qui arrêtent de vous suivre. Il utilise l'API Twitter et le module Net::Twitter C'est pas très évolué, mais c'est juste pour montrer comment creer une application "Desktop" utilisant l'API Twitter en Perl, et rien de plus. Je l'améliorerais surement avec Thread et une interface graphique, mais pas maintenant :P En espérant que ça puisse aider qqun à un peu mieux comprendre le fonctionnement de l'API Twitter ^^ Edit : En fait l'interface Tk est op ;)
Source
- #!/usr/bin/perl
-
- use warnings;
- use strict;
- use Net::Twitter;
- use Tk;
- use threads;
- use threads::shared;
-
- my @tfollowers : shared;
- my @tlogs : shared;
- my $tnbf : shared;
- my $heure : shared = "Mise à jour des followers";
- my ($nt, $auth, $frameb, $authCode);
- my ($access_token, $access_token_secret, $user_id, $screen_name);
-
- # Fenetre principale.
- my $fenetre = MainWindow->new(-title => "Auto-follow/unfollow by DynasyX");
- my $frameh = $fenetre->Frame(-relief => "raised")->pack(-side => "top");
- my $framehg = $frameh->Frame(-relief => 'raised')->pack(-side => "left");
- my $nbf = $framehg->Label(-text => "Followers : ");$nbf->pack();
- my $listf = $framehg->Scrolled('Listbox', -scrollbars => "e", -height=>"20")->pack();
- my $framehd = $frameh->Frame()->pack(-fill => "y", -expand => 1);
- $framehd->Label(-text => "Logs des changements :")->pack();
- my $logs = $framehd->Listbox(-width => 50);$logs->pack(-fill => "y", -expand => 1);
- my $dmaj = $fenetre->Label(-text => $heure);$dmaj->pack(-side => "left");
-
-
- # Connection a twitter.
- $nt = Net::Twitter->new(
- traits => ['API::REST', 'OAuth'],
- consumer_key => "XXXXXXXxxxxxxxXXXXXXXxxxxxxx",
- consumer_secret => "XXXXXXXXXXXXXxxxxxxxxxxxxXXXXXXXXXXXX");
-
- # Demande d'autorisation de gestion du compte twitter par l'application.
- # Si on a deja autorisé l'application, on continue, on lance les threads.
- ($access_token, $access_token_secret) = restore_tokens();
- if ($access_token && $access_token_secret) {
- $nt->access_token($access_token);
- $nt->access_token_secret($access_token_secret);
- $fenetre->repeat(1000, \&AfficherNews);
- threads->create(\&FoncTwit)->detach();
- }
- # Si l'application n'a pas encore été autorisée par l'utilisateur, on le fait.
- unless ( $nt->authorized ) {
- # On affiche la fenetre secondaire $auth.
- $fenetre->withdraw();
- $auth = $fenetre->Toplevel(-title => "Autorisation de l'application par twitter");
- $auth->protocol( "WM_DELETE_WINDOW", sub { exit; } );
- $auth->Label(-text => "Veuillez confirmer a Twitter que vous autoriser\n".
- "l'application a acceder a votre compte via\n".
- "la fenetre de votre navigateur qui va s'ouvrir.\n\n".
- "Notez le code que Twitter va fournir et entrez le ci-dessous.")->pack();
- $frameb = $auth->Frame()->pack(-pady => 30);
- $authCode = $frameb->Entry()->pack(-side => "left", -padx => 10);
- $frameb->Button(-text => "Valider le code", -command => \&ValidAuth)->pack(-padx => 10);
- # On demande a twitter d'afficher la page web d'autorisation.
- my $lien = $nt->get_authorization_url;
- system("start $lien");
- $auth->Popup();
- }
-
- MainLoop();
-
- # Lors de la validation du code d'authentification
- sub ValidAuth{
- # On verifie le code entré.
- ($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $authCode->get());
- # Enregistrement des tokens pour une prochaine execution du programme.
- save_tokens($access_token, $access_token_secret);
- # On detruit la fenetre authentification et on affiche la principale.
- $auth->destroy();
- $fenetre->raise();
- $fenetre->Popup();
- # On lance les 2 threads.
- $fenetre->repeat(1000, \&AfficherNews);
- threads->create(\&FoncTwit)->detach();
- }
-
- # Thread Tk toutes les secondes.
- sub AfficherNews{
- # Si l'heure de la mise a jour à changer,
- # on actualise l'heure / la liste des followers /
- # le nombre de followers / le log des changements.
- my $temp = $dmaj->cget(-text);
- if ($temp ne $heure){
- $listf->delete(0, "end");
- foreach (@tfollowers){
- $listf->insert('end', $_);
- }
- $logs->delete(0, "end");
- foreach (@tlogs){
- $logs->insert('end', $_);
- }
- $tnbf = "Followers : ".scalar(@tfollowers);
- $nbf->configure(-text => $tnbf);
- $nbf->update();
- $dmaj->configure(-text => $heure);
- $dmaj->update();
- }
- }
-
- # Thread principal.
- sub FoncTwit{
- while(1){
- # Mise a jour liste followers
- boucle_principale($nt);
- # Mise a jour de l'heure
- $heure = "Heure derniere maj : ";
- my ($sec, $min, $hour) = localtime(time);
- if ($hour<10){
- $heure.= "0";
- }
- $heure.= $hour.":";
- if ($min<10){
- $heure.="0";
- }
- $heure.= $min;
- # Toutes les 5 minutes
- sleep(300);
- }
- }
-
- sub boucle_principale{
- my ($nt) = @_;
- my ($rfollowers, @followers, %user, @oldf, $count);
- $rfollowers = $nt->followers();
- # Pour chaque follower, on note son nom dans un tableau.
- # Si on ne le suit pas encore, on le follow maintenant.
- foreach (@$rfollowers){
- %user = %$_;
- push(@followers, $user{screen_name});
- if ($user{following}!=1){
- push(@tlogs, "$user{screen_name} : Nouveau follower !");
- $nt->create_friend($user{screen_name});
- push(@tlogs, "Maintenant vous le suivez egalement.");
- }
- };
- # On regarde si tous vos anciens followers vous suivent toujours.
- # Si non, on unfollow :)
- @oldf = old_followers();
- $count = 0;
- if(@oldf>0){
- foreach (@oldf){
- if(!(join(" ", @followers) =~ m/$_/)){
- #L'ancien nom ne vous suit plus. On l'unfollow aussi !
- eval{
- $nt->destroy_friend($_);
- };
- if ($@){
- push(@tlogs, "$_ a changé de nom ou a supprimé son compte.");
- };
- push(@tlogs, "$_ ne vous suit plus. Utilisateur unfollow a son tour.");
- $count ++;
- }
- }
- }
- if($count != 0){
- push(@tlogs, "Vous avez perdu $count followers. RIP.");
- }else{
- push(@tlogs, "Vous n'avez perdu aucun follower.");
- }
- # On enregistre notre nouveau fichier :)
- save_followers(@followers);
- @tfollowers = @followers;
- }
- sub save_followers{
- open(FILE, ">followers.txt");
- foreach (@_){
- print FILE $_."\n";
- }
- close FILE;
- }
- sub old_followers{
- open(FILE, "followers.txt") or return;
- my @list = <FILE>;
- foreach (@list){
- chomp($_);
- }
- close FILE;
- return @list;
- }
- sub save_tokens{
- open(FILE, ">tokens.txt") || die "Erreur E/S:$!\n";
- print FILE "$_[0] $_[1]";
- close FILE;
- }
- sub restore_tokens{
- open(FILE , "tokens.txt") || return;
- my (@fichier) = <FILE>;
- close FILE;
- my ($a, $b) = split(/ /, $fichier[0]);
- return ($a, $b);
- }
#!/usr/bin/perl
use warnings;
use strict;
use Net::Twitter;
use Tk;
use threads;
use threads::shared;
my @tfollowers : shared;
my @tlogs : shared;
my $tnbf : shared;
my $heure : shared = "Mise à jour des followers";
my ($nt, $auth, $frameb, $authCode);
my ($access_token, $access_token_secret, $user_id, $screen_name);
# Fenetre principale.
my $fenetre = MainWindow->new(-title => "Auto-follow/unfollow by DynasyX");
my $frameh = $fenetre->Frame(-relief => "raised")->pack(-side => "top");
my $framehg = $frameh->Frame(-relief => 'raised')->pack(-side => "left");
my $nbf = $framehg->Label(-text => "Followers : ");$nbf->pack();
my $listf = $framehg->Scrolled('Listbox', -scrollbars => "e", -height=>"20")->pack();
my $framehd = $frameh->Frame()->pack(-fill => "y", -expand => 1);
$framehd->Label(-text => "Logs des changements :")->pack();
my $logs = $framehd->Listbox(-width => 50);$logs->pack(-fill => "y", -expand => 1);
my $dmaj = $fenetre->Label(-text => $heure);$dmaj->pack(-side => "left");
# Connection a twitter.
$nt = Net::Twitter->new(
traits => ['API::REST', 'OAuth'],
consumer_key => "XXXXXXXxxxxxxxXXXXXXXxxxxxxx",
consumer_secret => "XXXXXXXXXXXXXxxxxxxxxxxxxXXXXXXXXXXXX");
# Demande d'autorisation de gestion du compte twitter par l'application.
# Si on a deja autorisé l'application, on continue, on lance les threads.
($access_token, $access_token_secret) = restore_tokens();
if ($access_token && $access_token_secret) {
$nt->access_token($access_token);
$nt->access_token_secret($access_token_secret);
$fenetre->repeat(1000, \&AfficherNews);
threads->create(\&FoncTwit)->detach();
}
# Si l'application n'a pas encore été autorisée par l'utilisateur, on le fait.
unless ( $nt->authorized ) {
# On affiche la fenetre secondaire $auth.
$fenetre->withdraw();
$auth = $fenetre->Toplevel(-title => "Autorisation de l'application par twitter");
$auth->protocol( "WM_DELETE_WINDOW", sub { exit; } );
$auth->Label(-text => "Veuillez confirmer a Twitter que vous autoriser\n".
"l'application a acceder a votre compte via\n".
"la fenetre de votre navigateur qui va s'ouvrir.\n\n".
"Notez le code que Twitter va fournir et entrez le ci-dessous.")->pack();
$frameb = $auth->Frame()->pack(-pady => 30);
$authCode = $frameb->Entry()->pack(-side => "left", -padx => 10);
$frameb->Button(-text => "Valider le code", -command => \&ValidAuth)->pack(-padx => 10);
# On demande a twitter d'afficher la page web d'autorisation.
my $lien = $nt->get_authorization_url;
system("start $lien");
$auth->Popup();
}
MainLoop();
# Lors de la validation du code d'authentification
sub ValidAuth{
# On verifie le code entré.
($access_token, $access_token_secret, $user_id, $screen_name) = $nt->request_access_token(verifier => $authCode->get());
# Enregistrement des tokens pour une prochaine execution du programme.
save_tokens($access_token, $access_token_secret);
# On detruit la fenetre authentification et on affiche la principale.
$auth->destroy();
$fenetre->raise();
$fenetre->Popup();
# On lance les 2 threads.
$fenetre->repeat(1000, \&AfficherNews);
threads->create(\&FoncTwit)->detach();
}
# Thread Tk toutes les secondes.
sub AfficherNews{
# Si l'heure de la mise a jour à changer,
# on actualise l'heure / la liste des followers /
# le nombre de followers / le log des changements.
my $temp = $dmaj->cget(-text);
if ($temp ne $heure){
$listf->delete(0, "end");
foreach (@tfollowers){
$listf->insert('end', $_);
}
$logs->delete(0, "end");
foreach (@tlogs){
$logs->insert('end', $_);
}
$tnbf = "Followers : ".scalar(@tfollowers);
$nbf->configure(-text => $tnbf);
$nbf->update();
$dmaj->configure(-text => $heure);
$dmaj->update();
}
}
# Thread principal.
sub FoncTwit{
while(1){
# Mise a jour liste followers
boucle_principale($nt);
# Mise a jour de l'heure
$heure = "Heure derniere maj : ";
my ($sec, $min, $hour) = localtime(time);
if ($hour<10){
$heure.= "0";
}
$heure.= $hour.":";
if ($min<10){
$heure.="0";
}
$heure.= $min;
# Toutes les 5 minutes
sleep(300);
}
}
sub boucle_principale{
my ($nt) = @_;
my ($rfollowers, @followers, %user, @oldf, $count);
$rfollowers = $nt->followers();
# Pour chaque follower, on note son nom dans un tableau.
# Si on ne le suit pas encore, on le follow maintenant.
foreach (@$rfollowers){
%user = %$_;
push(@followers, $user{screen_name});
if ($user{following}!=1){
push(@tlogs, "$user{screen_name} : Nouveau follower !");
$nt->create_friend($user{screen_name});
push(@tlogs, "Maintenant vous le suivez egalement.");
}
};
# On regarde si tous vos anciens followers vous suivent toujours.
# Si non, on unfollow :)
@oldf = old_followers();
$count = 0;
if(@oldf>0){
foreach (@oldf){
if(!(join(" ", @followers) =~ m/$_/)){
#L'ancien nom ne vous suit plus. On l'unfollow aussi !
eval{
$nt->destroy_friend($_);
};
if ($@){
push(@tlogs, "$_ a changé de nom ou a supprimé son compte.");
};
push(@tlogs, "$_ ne vous suit plus. Utilisateur unfollow a son tour.");
$count ++;
}
}
}
if($count != 0){
push(@tlogs, "Vous avez perdu $count followers. RIP.");
}else{
push(@tlogs, "Vous n'avez perdu aucun follower.");
}
# On enregistre notre nouveau fichier :)
save_followers(@followers);
@tfollowers = @followers;
}
sub save_followers{
open(FILE, ">followers.txt");
foreach (@_){
print FILE $_."\n";
}
close FILE;
}
sub old_followers{
open(FILE, "followers.txt") or return;
my @list = <FILE>;
foreach (@list){
chomp($_);
}
close FILE;
return @list;
}
sub save_tokens{
open(FILE, ">tokens.txt") || die "Erreur E/S:$!\n";
print FILE "$_[0] $_[1]";
close FILE;
}
sub restore_tokens{
open(FILE , "tokens.txt") || return;
my (@fichier) = <FILE>;
close FILE;
my ($a, $b) = split(/ /, $fichier[0]);
return ($a, $b);
}
Conclusion
Bon je sais que je suis dans la section Python et que le code est écrit en perl, mais je ne savais pas où le mettre d'autre :P
Historique
- 11 mars 2011 03:00:41 :
- Petite erreur d'upload ^^
- 11 mars 2011 03:02:46 :
- Il est a noter que consumer_key => "xxxxxxxxxxxxxxxxxx",
et consumer_secret => "XXXXXXXXXXXXxxxxxXXXXXXXXXXXXX"
sont à remplacer par les valeurs fournies par twitter lors de l'enregistrement de l'application sur twitter, évidement.
- 13 mars 2011 04:28:58 :
- Ajout d'un thread et d'une interface Tk.
- 23 mars 2011 14:49:42 :
- Gestion d'une exception lorsque l'utilisateur a changé de screen_name. Le programme plantait lors de $nt->destroy_friend($_);
C'est maintenant reglé avec le bloc eval :)
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Python er Threads [ par dirthangel ]
Salut a tous je suis programmeur perl, j'aimerais savoir si les threads en python sont stable ? car c'est un vraie problème en Perl merci !!!
prog perl [ par msrs ]
bonjour,svp, j'ai un projet qui sert a aspirer les urls qui existent ds une page web en langage perl, aidez moi svp car j'ai aucune idée sur perl.merc
Perl to Python [ par mike1310 ]
Bonjour,je ne savais pas trop ou poster mon message étant donné qu'il n'y a pas de codes sources pour Perl.J'ai en fait un code en Perl que je dois re
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
974 Application Server (12.2.4.0)974 APPLICATION SERVER (12.2.4.0)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP mySongBook Player (1.0.0)MYSONGBOOK PLAYER (1.0.0)mySongBook Player est un logiciel gratuit permettant l'accès à une archive de tablatures/partitio... Cliquez pour télécharger mySongBook Player
|