logo

domenica 14 ottobre 2012

Arduino e Facebook

Costruire un cassetta della posta che ci avvisa dell'arrivo di una notifica di facebook.
Per costruire il nostro notificatore di facebook, ci servono: cartoncino blu, giallo, marrone e bianco, erbetta sintetica, un servo motore, un led blu e ovviamente il nostro arduino.


Alcune immagini del progetto Arduino-FB

La galleria di immagini che illustra i vari passaggi per la costruzione del nostro FB Notifier


Adesso veniamo al codice, suddiviso in due parti, una parte in python e l'altra in arduino.

Codice PYTHON:


import mechanize
import cookielib
import serial
import sys
import time
import warnings
 
''' VERSIONE 2.3
A differenza della versione 2.0, in questa implementazione:
Invece che contare partendo dai 2 tag HTML presenti di default <div class="c">, e' possibile clikkare il link:
clikka su Clear Notifications (restera' solo un <div class="c">)
e iniziare a contare per i > 1
 
In questo modo evita di contare inviti ad eventi o avvisi di compleanno come fossero notifiche.
'''
 
warnings.filterwarnings("ignore") #nasconde eventuali warning
 
SERIALPORT = raw_input("Inserire la porta seriale a cui e' connesso il dispositivo: ")
# Set up serial port
try:
 ser = serial.Serial(SERIALPORT, 9600)
 ser.timeout = None #Non imposta alcun tempo di timeout
except serial.SerialException:
 print "No device connected - exiting..."
 time.sleep(4)
 sys.exit()
 
 
#In alternativa si puo' andare su facebook.com/notifications.php e appoggiarsi al feed rss (utilizzando poi la libreria python: feedparser).
# Browser
br = mechanize.Browser()
 
# Cookie Jar
cj = cookielib.LWPCookieJar()
br.set_cookiejar(cj)
 
# Browser options
br.set_handle_equiv(True)
br.set_handle_gzip(True)
br.set_handle_redirect(True)
br.set_handle_referer(True)
br.set_handle_robots(False)
 
# Follows refresh 0 but not hangs on refresh > 0
#br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
 
 
 
# User-Agent (this is cheating, ok?)
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
 
 
# Open some site, let's pick a random one, the first that pops in mind:
r = br.open('http://m.facebook.com')
#html = r.read()
 
# Show the source
#print html
# or
#print br.response().read()
 
# Show the html title
print "- Connesso a: " + br.title()
 
# Select the first (index zero) form
br.select_form(nr=0)
 
try:
  attesa = input("\nOgni quanti secondi vuoi controllare la presenza di nuove notifiche? ")
  while(attesa < 5):
      attesa = input("\n- E' consigliato un valore non sotto i 5 secondi.\nInserisci nuovamente un valore: ")
except:
  print "E' necessario inserire un valore numerico, non una stringa.\nChiusura programma..."
  time.sleep(5)
  sys.exit()
 
print "\n- Inserisci i tuoi dati di accesso per Facebook:\n"
# Let's search
br.form['email']='%s' % raw_input("Inserisci Email: ")
br.form['pass']='%s' % raw_input("Inserisci Password: ")
 
br.submit()
x = br.response().read()
z = x.count("Combinazione e-mail/password errata.")
 
while z:
  print "Impossibile effettuare l'accesso, password o username errati. Riprovare:\n"
  go = False
  br.select_form(nr=0)
  br.form['email']='%s' % raw_input("Inserisci Email: ")
  br.form['pass']='%s' % raw_input("Inserisci Password: ")
  br.submit()
  x = br.response().read()
  z = x.count("Combinazione e-mail/password errata.")
else:
  #siamo perfettamente loggati. (z = 0)
  go = True
  stato = False #stato della bandierina, False = abbassata
  try:
    br.follow_link(text='Elimina notifiche', nr=0) #Pulisce le notifiche precedenti
  except:
    print "\n Nessuna Notifica! \n"
  print "\n- Contrassegnate come lette, tutte le precedenti notifiche...\n"
  ser.write("n") #riportiamo il servo alla posizione iniziale.
 
while True and go:
  try:
    #br.reload()
    #print br.response().read()
    x = br.open('http://m.facebook.com/home.php?refid=0').read()
    i = x.count('<div class="c">') #Questo campo HTML viene ripetuto piu' di 1 volta se c'e' una notifica nuova (prima pero' vengono lette tutte le notifiche quali eventi etc.).
  except:
      print "Ritardo nel ricaricare la pagina, 3 secondi di attesa applicati..\n"
      time.sleep(3)
  if i >= 1:
      notifica = True #Notifiche da leggere
  else:
      i = 0
      notifica = False #Nessuna notifica da leggere
#controllo:
  if notifica == True:
      if stato == False: #Se la bandierina e' abbassata
       ser.write("m")
       print "Nuova notifica su Facebook, sollevamento bandierina..."
       stato = True
      else:
       print "Sono presenti notifiche ancora da visionare..."
 
  elif stato == False:
       print "Zzz..." #Bandierina gia' abbassata, nessuna notifica da visionare
 
  else:
       ser.write("n")
       print "Nessuna nuova notifica, bandierina in discesa..."
       stato = False     
 
  time.sleep(attesa) #Attesa prima di controllare la presenza di nuove notifiche
 
 
#END


Codice ARDUINO:


#include <MsTimer2.h>
#include <Servo.h>
Servo myservo;
int val;
int pos;
void flash() {
static boolean output = HIGH;
digitalWrite(9, output);
output = !output;
}
void setup()
{
pinMode(9, OUTPUT);
Serial.begin(9600);
Serial.flush();
myservo.attach(10); //pin segnale servo connesso al pin digitale 10
}
void loop()
{
if (Serial.available())
{
val = Serial.read();
Serial.println(val, BYTE);
if (val == 110) // n = 110 in dec
{
pinMode(9,0);
pos = 0;
}
else if (val == 109) //109 = m in dec
{
pinMode(9, OUTPUT);
 
MsTimer2::set(150, flash); // 150ms periodo
MsTimer2::start();
pos =110; //110 gradi di rotazione perchè non essendo nel mio caso preciso il servo non arrivava a 90 gradi esatti ma si fermava poco prima
}    
}
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(23);
}


Fonte del Facebook notifier

Nessun commento:

Posta un commento