[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