用raspberry pi 實現微博開關燈

hack總喜歡在虛擬的網絡世界控制現實世界,好比《生活大爆炸》裏的遠程開燈,英國IT宅男用twitter喂狗。利用待業在家的閒暇時間,在raspberry pi 上實現了用微博開關燈。實現過程比代碼更有趣。html

發條微博開燈能夠分爲三步:1, 用戶發微博,好比: raspberry pi 開燈,我5分鐘後到家。2,raspberry pi 獲取用戶發的微博,並分析是否有包含開燈指令的微博 3,若是包含指令,執行開燈動做。python

在PC、手機上發微博都很是方便,黑白屏手機還能夠經過短信發微博,第一步徹底不須要編寫任何代碼。外國的牛人貢獻了python版本的raspberry pi GPIO庫函數,只需三五行python就能實現開關燈。若是,咱們得到了用戶的最新的微博,只需用個簡單的正則表達式搜索微博內容,就能夠知道微博是否包含開燈指令。web

整個項目最難的是如何獲取用戶的微博。不想去啃微博的API文檔,用Google找了幾份代碼,用本身申請的 APP KEY測試,全部的代碼都不可用。在CSND上發現一份wx編寫的發送微博測試代碼,這個代碼是能用的,把源碼裏面的APP KEY和APP SECRET換成本身申請的,就不能發送微博了。看來是,我創建的微博應用「樹莓派robot」沒有經過審覈,APP KEY和APP SECRET不可用。正則表達式

將網上的幾段代碼拼湊在一塊兒,稍加修飾就完成了獲取指定帳戶最近20條微博的python程序,在這個程序上加上正則、GPIO操做等輔助代碼就實現了發微博控制檯燈的功能。我只花了三個小時寫這個程序。下面是完整的源碼api

jk.py (控制檯燈代碼)網絡

   
import time import RPi.GPIO as GPIO class jk: pin = 0 def __init__ (self,jk): self.pin = jk GPIO.setmode(GPIO.BCM) GPIO.setup(self.pin,GPIO.OUT) GPIO.output(self.pin,GPIO.LOW) def turn_on(self): GPIO.output(self.pin,GPIO.HIGH) def turn_off(self): GPIO.output(self.pin,GPIO.LOW) if __name__ == " __main__ " : lamp = jk( 17 ) while 1 : lamp.turn_on() time.sleep( 10 ) lamp.turn_off() time.sleep( 10 )

http_time.py (校時代碼)app

   
# -*-coding:utf8 -*- import httplib as client import time import os def get_webservertime(host): conn = client.HTTPConnection(host) conn.request( " GET " , " / " ) r = conn.getresponse() ts = r.getheader( ' date ' ) # 獲取http頭date部分 # 將GMT時間轉換成北京時間 local_time = time.mktime(time.strptime(ts[ 5 :], " %d %b %Y %H:%M:%S GMT " )) + ( 8 * 60 * 60 ) ltime = time.gmtime(local_time) # 使用date設置時間 dat = ' date -u -s "%d-%d-%d %d:%d:%d" ' % (ltime.tm_year,ltime.tm_mon,ltime.tm_mday,ltime.tm_hour,ltime.tm_min,ltime.tm_sec) os.system(dat) if __name__ == " __main__ " get_webservertime( ' www.baidu.com ' )

demo.py (主程序)函數

   
# !/usr/bin/env python # -*- coding: utf8 -*- # generated by wxGlade 0.6.5 on Thu Jul 05 00:17:55 2012 import urllib, urllib2, re from weibo1 import APIClient, OAuthToken # 經過提供的帳號和密碼,返回APIClient對象實例 def GetBlogClient(uname, passw): APP_KEY = u ' 783190658 ' # app key APP_SECRET = u ' 7f63ae9eb3c1438e9f8932748ca8a341 ' # app secret # 實例化APIClient client = APIClient(app_key = APP_KEY, app_secret = APP_SECRET) # 獲取OAuth request token reqToken = client.get_request_token() # 用戶受權url auth_url = client.get_authorize_url(reqToken) post_data = urllib.urlencode({ " action " : " submit " , " forcelogin " : "" , " from " : "" , " oauth_callback " : " http://api.weibo.com/oauth2/default.html " , " oauth_token " : reqToken.oauth_token, " passwd " : passw, " regCallback " : "" , " ssoDoor " : "" , " userId " : uname, " vdCheckflag " : 1 , " vsnval " : "" }) mat = re.search( r ' &oauth_verifier=(.+) ' , urllib2.urlopen(urllib2.Request( " http://api.t.sina.com.cn/oauth/authorize " , post_data, headers = { ' User-Agent ' : ' Mozilla/5.0 (Windows NT 6.1) ' , ' Referer ' : auth_url } )).url ) if mat: client = APIClient( APP_KEY, APP_SECRET, OAuthToken( reqToken.oauth_token, reqToken.oauth_token_secret, mat.group( 1 ) )) # 返回APIClient return APIClient(APP_KEY, APP_SECRET, client.get_access_token()) else : raise Exception() import time from jk import jk import http_time if __name__ == " __main__ " : api = GetBlogClient( ' 你的weibo賬號 ' , ' 你的密碼 ' ) # 例如,api = GetBlogClient('123456@qq.com','123456') # 獲取uid account = api.account__verify_credentials() uid = account.id open_pattern = re.compile(u ' @樹莓派 開燈 ' .encode( ' UTF-8 ' )) close_pattern = re.compile(u ' @樹莓派 關燈 ' .encode( ' UTF-8 ' )) # 只相應10分鐘之內的最新weibo指令,指令只被執行一次 # 校準系統時間 http_time.get_webservertime( ' www.baidu.com ' ) created_time = time.time() order_time = time.time() - 60000 # 初始化硬件 lamp = jk( 17 ) while 1 : weibos = api.statuses__user_timeline(status = uid) for weibo in weibos: # 計算weibo創建時間 created_time = time.mktime(time.strptime(weibo.created_at, " %a %b %d %H:%M:%S +0800 %Y " )) if created_time > order_time: content = weibo.text # weibo.text.encode('UTF-8')報錯 match = open_pattern.search(content.encode( ' UTF-8 ' )) if match is not None: print ' 收到開燈指令weibo ' lamp.turn_on() order_time = created_time break match = close_pattern.search(content.encode( ' UTF-8 ' )) if match is not None: print ' 收到關燈指令weibo ' lamp.turn_off() order_time = created_time break else : break time.sleep( 10 )

源碼在這裏,須要修改 demo.py 中的api = GetBlogClient('你的weibo賬號','你的密碼')post

若是你的微博賬號登入時須要輸入驗證碼,這個程序不能正常的得到受權,不能自動讀取你的微博。測試

 

ps.附上自制的raspberry pi 繼電器擴展版靚照一張,須要完整資料的朋友請留言。

image

相關文章
相關標籤/搜索