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