Anmelden Registrieren

Badges

Follow Peter Bouda on Google Plus

Feeds

Neueste BlogeinträgeBlog

PyS60: ein einfaches SMS-Twitter-Gateway für euer Nokia-Handy

Bearbeitet am Mittwoch, 16. März 2011, 11:37 Uhr von pbouda

Nachdem ich in einem anderen Beitrag schon beschrieben hatte, wie ihr Python auf Series60-Geräten installieren könnt, geht es dieses Mal ans eingemachte: wir programmieren ein eigenes SMS-nach-Twitter-Gateway für das Mobiltelefon.

Der Sinn ist ungefähr folgender: Jede SMS, die auf dem Telefon ankommt, soll automatisch als Update in einen Twitter-Feed geschrieben werden. Dazu gibt es in PyS60 das inbox-Modul. Dieses Modul erlaubt es dem Skript, eine Callback-Funktion einzurichten (im Code heißt die Funktion sinnigerweise “cb”), die bei jeder empfangenen SMS automatisch aufgerufen wird. Der Rest ist ganz normale Python-Handarbeit: den SMS-Text schreiben wir per Twitter-API in den Feed. Am Anfang des Skripts wird noch eine spezielle Funktion augerufen, und zwar die “btsocket.set_default_access_point()”. Damit wird gleich zu Beginn des Skripts ein für alle Mal der Internet Access Point festgelegt, damit das Handy nicht bei jeder empfangenen SMS danach fragt. “btsocket.select_access_point()” zeigt den Dialog mit allen verfügbaren Access Points an. Auf neueren Series60-Geräten wie dem Nokia 6220 Classic scheint diese Funktion nicht mehr so richtig zu funktionieren: hier wird der Access Point ja sowieso zentral in den Telefoneinstellungen eingerichtet, auch Python richtet sich dann nach dieser Einstellung. Wenn ihr eine Standardverbindung für das Telefon eingerichtet habt, dann werdet ihr nur nach der ersten SMS einmal gefragt, ob ihr dem Skript den Internetzugang erlauben wollt. Danach baut das Skript alle weiteren Internetverbindungen automatisch auf (und um die Verwirrung komplett zu machen wird die erste SMS auch nicht nach Twitter geschrieben; hier darf das Skript anscheinend noch keine Internetverbindung aufbauen). Bei Nokia frage ich mich schon lange nicht mehr nach Sinn und Zweck bestimmter Einstellungen…

Hier aber nun der Code:

import inbox
import httplib, urllib
import base64
import string
import appuifw
import e32
import btsocket

server = 'twitter.com'
action = '/statuses/update.xml'
userid = "mein_twitter_benutzername"
passwd = "mein_twitter_passwort"

auth = 'Basic ' + string.strip(base64.encodestring(userid + ':' + passwd))

def cb(id_cb):
local_inbox = inbox.Inbox()
print id_cb
sender = local_inbox.address(id_cb)
read_text = local_inbox.content(id_cb)
print read_text

# jetzt Twitter aufrufen
params = { 'status': read_text }
params_string = urllib.urlencode(params)
conn = httplib.HTTPConnection(server)
headers = { "Authorization": auth } 
conn.request("POST", action, params_string, headers)
r0 = conn.getresponse()
data0 = r0.read()
conn.close()

def quit():
app_lock.signal()
appuifw.app.set_exit()

app_lock = e32.Ao_lock()

# evtl. nicht mehr nötig auf neueren S60-Geräten: da gibts ne zentrale Einstellung
btsocket.set_default_access_point(btsocket.access_point(btsocket.select_access_point()))

i=inbox.Inbox()
i.bind(cb)
print u"Inbox bound..."

appuifw.app.title = u"SMS2Twitter"
appuifw.app.menu = [(u"Quit",quit)]
appuifw.app.exit_key_handler = quit

app_lock.wait()