[Public] Python und Twitter, ein Trauerspiel
Thomas Darimont
thomas.darimont at googlemail.com
Do Jun 13 23:24:26 CEST 2013
Hallo zusammen,
hier noch für die, die es interessiert ein "kleiner" Twitter-Client für
Pflanzen und sonstige Mitteilungsfreudigen Erdbewohner.
Dazu benötigt man folgende dependencies:
httplib2-0.8
python-oauth2
python-twitter-1.0
setuptools-0.7.2
simplejson-3.3.0
[code]
__author__ = 'Tom'
import sys
import time
import twitter
import simplejson
import datetime
class PlantTwitterClient(object):
PLANT_STATE_NEED_WATER = "need_water"
PLANT_STATE_FINE = "fine"
STATE_TO_TWEET_MAP = {
PLANT_STATE_NEED_WATER: "%s hat Durst!"
, PLANT_STATE_FINE: "%s geht es gut!"
}
def __init__(self, configPath):
self.loadConfig(configPath)
self.plantName = self.config["plant"]["name"]
self.plantHealthCheckIntervalInSeconds =
self.config["plant"]["healthCheckIntervalInSeconds"]
self.twitterClient = self.newTwitterClient()
def log(self, msg):
now = datetime.datetime.now()
print "[%s]: %s" % (now.strftime("%Y-%m-%d %H:%M"), msg)
def loadConfig(self, configPath):
try:
self.log("Load config from %s" % configPath)
self.config = simplejson.load(open(configPath))
except:
self.log("Could not load config from: %s -> Problem was: %s" %
(configPath, sys.exc_info()[0]))
sys.exit(-1)
def newTwitterClient(self):
twitterClient =
twitter.Api(consumer_key=self.config["twitter"]["consumer_key"]
, consumer_secret=self.config["twitter"]["consumer_secret"]
, access_token_key=self.config["twitter"]["access_token_key"]
,
access_token_secret=self.config["twitter"]["access_token_secret"])
return twitterClient
def readPlantState(self):
#insert code for real sensor reading here :)
#faking random sensor values...
import random
plantState = random.choice((self.PLANT_STATE_NEED_WATER,
self.PLANT_STATE_FINE))
return plantState
def composeTweet(self, state):
tweet = self.STATE_TO_TWEET_MAP[state] % (self.plantName)
now = datetime.datetime.now()
return "[%s] %s" % (now.strftime("%H:%M:%S"), tweet)
def sendTweetForState(self, state):
now = datetime.datetime.now()
tweet = self.composeTweet(state)
if self.config["twitter"]["enabled"]:
self.log("Sending Twitter Update: %s" % tweet)
self.twitterClient.PostUpdate(tweet)
else:
self.log("Twitter is disabled - just logging tweet instead: %s"
% tweet)
def handlePlantStateChange(self, oldPlantState, newPlantState):
self.log("Plant State Changed! %s -> %s" % (oldPlantState,
newPlantState))
self.sendTweetForState(newPlantState)
def run(self):
oldPlantState = None
while True:
try:
newPlantState = self.readPlantState()
if oldPlantState != newPlantState:
self.handlePlantStateChange(oldPlantState,
newPlantState)
oldPlantState = newPlantState
time.sleep(self.plantHealthCheckIntervalInSeconds)
except KeyboardInterrupt:
self.log("Exit [ctrl+c]")
sys.exit(0)
except:
self.log("Unknown Error occured: %s" % sys.exc_info()[0])
if __name__ == "__main__":
if len(sys.argv) < 2:
print "Missing config path argument is required!"
print '''Usage:
python PlantTwitterClient.py path/to/config.json
'''
sys.exit(0)
plantTwitterClient = PlantTwitterClient(configPath=str(sys.argv[1]))
plantTwitterClient.run()
[/code]
Gruß Thomas
Am 13. Juni 2013 21:54 schrieb Thomas Darimont <
thomas.darimont at googlemail.com>:
> Hallo Michael,
>
> wenn du mir mal Bertas Twitter-Credentials schickst kann ich mal danach
> schauen.
>
> Gruß Thomas
>
> Am 13.06.2013 21:27 schrieb "Michael Ganster" <mganster at freenet.de>:
>
> Heyho alle miteinander,
>>
>> wie einige schon wissen, hat unser Space eine neue Bewohnerin, Bertha,
>> ein Bogenhanf. Bertha hat auch Twitter. Leider aber keine Arme samt
>> Händen und daran hängenden Fingern zum tippen. Also ist Bertha auf
>> unsere Hilfe angewiesen. Da unter Umständen immer wieder jemand Anderes
>> anwesend ist, wenn Bertha den Zwitscherbefehl erteilt, ist es nicht
>> praktikabel, sich immer bei Twitter anzumelden. Es soll also eine
>> Bertha-Base her, die nach Antriggern postet, was auch immer gepostet
>> werden muss. Realisierbar ist das wohl ganz nett in Python mittels
>> Twitter-Modul.
>>
>> Nunja, im Moment bin ich an den ersten Tests und ich bin sowohl in
>> Sachen Twitter als auch in Python ein Anfänger. Daher mal schnell die
>> Webtutorials gewälzt, die alle auf die gleiche Quelle verweisen und
>> daher alle gleich aussehen und die ich soweit übernommen hab. Alle
>> zwischendurch aufgetretenen Fehler sind behoben, das Ding läuft ohne
>> Fehler ab. Nur leider erscheint kein Tweet für unseren Bogenhanf. Hier
>> mal, was ich so abgesetzt hab:
>>
>> >>> import twitter
>> >>> api = twitter.Api(consumer_key='key_censored', consumer_secret='so
>> is this one', access_token_key='no one should care about this',
>> access_token_secret='look anywhere else, it's my secret!')
>> >>>out = bertha.PostUpdate('Python knows triggering twitter!')
>> >>> print out.text
>> None
>> >>> print out
>> {}
>>
>>
>> Es erscheint also weder ein Tweet noch eine Fehlermeldung. Hat
>> irgendjemand eine Idee?
>>
>> LG
>> Micha
>>
>> _______________________________________________
>> Public mailing list
>> Public at lists.hacksaar.de
>> http://lists.hacksaar.de/cgi-bin/mailman/listinfo/public
>>
>
-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://lists.hacksaar.de/pipermail/public/attachments/20130613/237ba9a8/attachment.html>
More information about the Public
mailing list