歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

web.py實戰(開發新浪微博應用)

剛剛接觸web.py,喜歡它的簡潔與簡單......於是打算實踐一下,就有了下面的東西.感覺寫的很不好,不要笑我,我害羞....

主要代碼如下:

  1. #coding=utf-8   
  2. """ 
  3. 本應用主要功能 
  4. 1.用戶選擇喜歡的標簽加關注 
  5. 2.獲取用戶粉絲中自己還沒有關注的,->加關注,提高粉絲穩定性 
  6. 3.獲取用戶關注列表中沒有回粉的,並可以一鍵取消關注 
  7. 2,3兩個功能基本實現,有一缺點,數據量一大,很慢很慢 
  8. 1功能不太好,主要是通過一個線程去搜索數據,把感興趣的用戶放入數據庫,當用戶選擇加關注標簽時,從數據庫中取數據, 
  9. 以前用sqlite3比較少,一用發現還是有好多值得研究的地方,主要是線程安全....,慢慢研究.... 
  10. """  
  11.   
  12. import os  
  13. import sys  
  14. import key  
  15. import web  
  16. import threading  
  17. import sqlite3  
  18. import time  
  19. from weibopy.auth import OAuthHandler  
  20. from weibopy.api import API  
  21. from jinja2 import Environment,FileSystemLoader  
  22.   
  23. """ 
  24. url配置 
  25. """  
  26. urls = (  
  27.      '/''Login',  
  28.      '/index','Index',  
  29.      '/callback','CallBack',  
  30.      '/logout','LogOut',  
  31.      '/(.*)/''Redirect',  
  32.      '/tag''Tag',  
  33.      '/noattention','Noattention',  
  34.      '/fensiattention','Fensiattention',  
  35.      '/minusattention','Minusattention',  
  36.      '/delattention','Delattention'  
  37.  )  
  38.   
  39. app=web.application(urls,globals())  
  40.   
  41. if web.config.get('_session'is None:  
  42.      session = web.session.Session(app,web.session.DiskStore("sina"))  
  43.      web.config._session = session  
  44. else:  
  45.      session = web.config._session  
  46.   
  47. """ 
  48.    用jinja2模板渲染文件 
  49. """  
  50. def render_template(template_name,**context):  
  51.      extensions=context.pop('extensions',[])  
  52.      globals=context.pop("globals",{})  
  53.      jinja_env=Environment(  
  54.          loader=FileSystemLoader(os.path.join(os.path.dirname(__file__),'templates')),  
  55.          extensions=extensions)  
  56.      jinja_env.globals.update(globals)  
  57.      return jinja_env.get_template(template_name).render(context)  
  58.   
  59.   
  60. """ 
  61. 定義404請求頁面 
  62. """  
  63. def notfound():  
  64.      info="親,您所請求的頁面不存在,系統在3秒後自動返回..."  
  65.      return web.notfound(render_template('error.html',info=info.decode('utf-8')))  
  66.   
  67. db=web.database(dbn='sqlite',db='tag.s3db')  
  68.   
  69. """ 
  70. 要求tag 
  71. """  
  72. tagdict={'水瓶座':1,'雙魚座':2,'白羊座':3,'金牛座':4,'雙子座':5,'巨蟹座':6,'獅子座':7,'處女座':8,'天秤座':9,'天蠍座':10,'射手座':11,  
  73.          '摩羯座':12,'吃':13,'聽歌':14,'淘寶':15,'網購':16,'數碼':17,'攝影':18,'睡覺':19,'旅游':20,'體育':21,'動漫':22,'游戲':23,  
  74.          '股票':24,'交友':25,'宅女':26,'宅男':27,'時尚':28,'浪漫':29,'美女':30,'創業':31,'IT':32,'媒體':33,'營銷':34}  
  75. systag=['水瓶座','雙魚座','白羊座','金牛座','雙子座','巨蟹座','獅子座','處女座','天秤座','天蠍座','射手座','摩羯座','吃','聽歌','淘寶',  
  76.         '網購','數碼','攝影','睡覺','旅游','體育','動漫','游戲','股票','交友','宅女','宅男','時尚','浪漫','美女','創業','IT','媒體','營銷']  
  77.   
  78. conn=sqlite3.connect('tag.s3db',check_same_thread=False) #允許其它線程使用這個連接   
  79. conn.text_factory = str  
  80. cursor=conn.cursor()  
  81.   
  82. class Setag(threading.Thread):  
  83.     """ 
  84. 這個線程主要是用來搜索用戶tag,如果滿足tag要求就寫入數據庫中, 
  85.     """  
  86.     def authorization(self):  
  87.         """ 
  88.         開發者認證 
  89.         """  
  90.         auth = OAuthHandler(key.CONSUME_KEY, key.CONSUME_SECRET)  
  91.         auth.setToken(key.TOKEN,key.TOKEN_SECRET)  
  92.         self.api = API(auth)  
  93.         self.cursor=cursor  
  94.   
  95.     def adduser(self,uid):  
  96.         """ 
  97.         遍歷uid用戶的tag,滿足條件加入數據庫 
  98.         """  
  99.         try:  
  100.             fan=self.api.followers_ids(uid)  
  101.             fanuid=fan.ids  
  102.             for id in fanuid:  
  103.                 tags=self.api.tags(id)  
  104.                 tt=[]  
  105.                 for t in tags:  
  106.                     tagid=t.__getattribute__('id')  
  107.                     value=t.__getattribute__(tagid)  
  108.                     tt.append(value.encode('utf-8'))  
  109.                 """ 
  110.                 獲取用戶tag與要求標簽的交集 
  111.                 """  
  112.                 common=set(tt).intersection(set(systag))  
  113.                 if len(common)==0:  
  114.                     continue  
  115.                 else:  
  116.                     for t in common:  
  117.                         """ 
  118.                         獲取tag對應的tagid 
  119.                         """  
  120.                         tagindex=tagdict[t]  
  121.                         try:  
  122.                             self.cursor.execute("insert into taginfo(uid,tagid) values(%d,%d)" %(int(id),int(tagindex)))  
  123.                             conn.commit()  
  124.                         except:  
  125.                             continue  
  126.         except:  
  127.             time.sleep(120)  
  128.             pass  
  129.         finally:  
  130.             time.sleep(60)  
  131.             """ 
  132.             將uid用戶的第一個粉絲uid傳給adduser 
  133.             """  
  134.             return self.adduser(fanuid[0])  
  135.   
  136.     def run(self):  
  137.         self.authorization()  
  138.         me=self.api.verify_credentials()  
  139.         """ 
  140.         將我自己的uid給adduser 
  141.         """  
  142.         self.adduser(me.id)  
  143.   
  144. """ 
  145. 定義404請求頁面 
  146. """  
  147. app.notfound= notfound  
  148.  #首頁   
  149.  #首先從session中獲取access_token,沒有就轉向新浪微博頁面認證   
  150.  #認證成功後將access_token保存在session中   
  151. """ 
  152. 首頁是登陸頁面,通過新浪微博授權 
  153. """  
  154. class Login:  
  155.     def GET(self):  
  156.         return render_template('login.html')  
  157.   
  158. """ 
  159. 新浪微博授權原理: 
  160. 首先首頁判斷有無用戶session信息,如果有則跳轉到相應地址, 
  161. 沒有則引導用戶跳轉到授權uri,授權後自動跳轉到永遠自定義的回調地址, 
  162. 回調地址保存用戶session信息,跳轉到首頁,這時已有用戶session信息,干壞事吧.... 
  163. """  
  164. class Index:  
  165.      def GET(self):  
  166.          access_token=session.get('access_token',None)  
  167.          if not access_token:  
  168.              """ 
  169.              key.py中放置了開發者的信息 
  170.              """  
  171.              auth = OAuthHandler(key.CONSUME_KEY, key.CONSUME_SECRET,web.ctx.get('homedomain')+'/callback')  
  172.              #獲取授權url   
  173.              auth_url = auth.get_authorization_url()  
  174.              session.request_token=auth.request_token  
  175.              web.seeother(auth_url)  
  176.          else:  
  177.              auth = OAuthHandler(key.CONSUME_KEY, key.CONSUME_SECRET)  
  178.              auth.access_token=access_token  
  179.              api=API(auth)  
  180.              user=api.verify_credentials()  
  181.              return render_template('index.html',user=user)  
  182.   
  183.   
  184. """ 
  185.  頁面回調,新浪微博驗證成功後會返回本頁面 
  186. """  
  187. class CallBack:  
  188.      def GET(self):  
  189.          try:  
  190.              ins=web.input()  
  191.              oauth_verifier=ins.get('oauth_verifier',None)  
  192.              request_token=session.get('request_token',None)  
  193.              auth=OAuthHandler(key.CONSUME_KEY, key.CONSUME_SECRET)  
  194.              auth.request_token=request_token  
  195.              access_token=auth.get_access_token(oauth_verifier)  
  196.              session.access_token=access_token  
  197.              web.seeother("/index")  
  198.          except Exception:  
  199.              info="親,系統繁忙,請稍後再試......,系統在3秒後自動返回..."  
  200.              return render_template('error.html',info=info.decode('utf-8'))  
  201.   
  202. """ 
  203. 重定向用戶輸入uri後的/ 
  204. """  
  205. class Redirect:  
  206.     def GET(self,path):  
  207.         web.seeother('/'+path)  
  208.   
  209. class Tag:  
  210.     """ 
  211.     獲取用戶選擇加關注的tag 
  212.     """  
  213.     def GET(self):  
  214.         data=web.input()  
  215.         try:  
  216.             select=data.star  
  217.         except:  
  218.             try:  
  219.                 select=data.hobby  
  220.             except:  
  221.                 try:  
  222.                     select=data.personality  
  223.                 except:  
  224.                     select=data.job  
  225.         try:  
  226.             auth = OAuthHandler(key.CONSUME_KEY, key.CONSUME_SECRET)  
  227.             auth.access_token=session['access_token']  
  228.             api=API(auth)  
  229.             seuid=[]  
  230.             nu=0  
  231.             """ 
  232.             這裡寫的很不好..... 
  233.             """  
  234.             while True:  
  235.                 re=cursor.execute('select uid from taginfo where tagid=%d limit 20' %select).fetchall()  
  236.                 for r in re:  
  237.                     seuid.append(r[0])  
  238.                 for s in seuid:  
  239.                     try:  
  240.                         api.create_friendship(user_id=s)  
  241.                         nu+=1  
  242.                     except:  
  243.                         continue  
  244.                 if nu>=50:  
  245.                     break  
  246.   
  247.             info="恭喜您已成功關注%d位用戶....." %nu  
  248.             return render_template('success.html',info=info.decode('utf-8'))  
  249.         except:  
  250.             info="親,系統繁忙,請稍後再試......,系統在3秒後自動返回..."  
  251.             return render_template('error.html',info=info.decode('utf-8'))  
  252.   
  253. class Noattention:  
  254.     """ 
  255.     獲取我的粉絲中我沒有加關注的,把數據傳給noattention.html頁面顯示... 
  256.     """  
  257.     def GET(self):  
  258.         try:  
  259.             auth=OAuthHandler(key.CONSUME_KEY,key.CONSUME_SECRET)  
  260.             auth.access_token=session['access_token']  
  261.             api=API(auth)  
  262.             user=api.verify_credentials()  
  263.             fan=[]  
  264.             next_cursor=-1  
  265.             while next_cursor!=0:  
  266.                 timeline=api.followers(user.id,'','','',next_cursor)  
  267.                 if isinstance(timeline,tuple):  
  268.                     next_cursor=timeline[1]  
  269.                     for line in timeline[0]:  
  270.                         fid=line.__getattribute__("id")  
  271.                         fname=line.__getattribute__("screen_name")  
  272.                         fan.append((fid,fname))  
  273.   
  274.                 else:  
  275.                     next_cursor=0  
  276.                     for line in timeline:  
  277.                         fid=line.__getattribute__("id")  
  278.                         fname=line.__getattribute__("screen_name")  
  279.                         fan.append((fid,fname))  
  280.   
  281.             friend=[]  
  282.             next_cursor=-1  
  283.             while next_cursor!=0:  
  284.                 timeline=api.friends(user.id,'','','',next_cursor)  
  285.                 if isinstance(timeline,tuple):  
  286.                     next_cursor=timeline[1]  
  287.                     for line in timeline[0]:  
  288.                         frid=line.__getattribute__("id")  
  289.                         frname=line.__getattribute__("screen_name")  
  290.                         friend.append((frid,frname))  
  291.                 else:  
  292.                     next_cursor=0  
  293.                     for line in timeline:  
  294.                         frid=line.__getattribute__("id")  
  295.                         frname=line.__getattribute__("screen_name")  
  296.                         friend.append((frid,frname))  
  297.             #獲取我的粉絲中還不是我的關注對象   
  298.             fanNotAttention=list(set(fan).difference(set(friend)))  
  299.             nu=len(fanNotAttention)  
  300.             if nu==0:  
  301.                 return render_template('noattentionok.html',nu=nu)  
  302.             else:  
  303.                 return render_template('noattention.html',nu=nu,fanNotAttention=fanNotAttention)  
  304.   
  305.         except:  
  306.             info="親,系統繁忙,請稍後再試......,系統在3秒後自動返回..."  
  307.             return render_template('error.html',info=info.decode('utf-8'))  
  308.   
  309. class Fensiattention:  
  310.     """ 
  311.     對未加關注的粉絲加關注 
  312.     """  
  313.     def GET(self):  
  314.         #獲取noattentionok.html傳過來的數據   
  315.         data=web.input()  
  316.         on=[]  
  317.         try:  
  318.             auth=OAuthHandler(key.CONSUME_KEY,key.CONSUME_SECRET)  
  319.             auth.access_token=session['access_token']  
  320.             api=API(auth)  
  321.             """ 
  322.             獲取noattention.html頁面傳過來的uid,通過checkbox,由於有一個全選按鈕,如果點擊,則去掉 
  323.             """  
  324.             for x in data:  
  325.                 on.append(x)  
  326.             try:  
  327.                 on.remove('checkbox2')  
  328.             except:  
  329.                 pass  
  330.             nu=len(on)  
  331.             if nu==0:  
  332.                 pass  
  333.             if nu>60:  
  334.                 on=on[:60]  
  335.                 nu=60  
  336.             """ 
  337.             一次最多加60次關注 
  338.             """  
  339.             map(api.create_friendship,on)  
  340.             info="恭喜您已成功關注%d位用戶....." %nu  
  341.             return render_template('success.html',info=info.decode('utf-8'))  
  342.         except:  
  343.              info="親,系統繁忙,請稍後再試......,系統在3秒後自動返回..."  
  344.              return render_template('error.html',info=info.decode('utf-8'))  
  345.   
  346.   
  347. class Minusattention:  
  348.     """ 
  349.     獲取我的關注中不是我粉絲的,即不回粉的家伙,把數據傳給attentionnotfan.html顯示... 
  350.     """  
  351.     def GET(self):  
  352.         try:  
  353.             auth=OAuthHandler(key.CONSUME_KEY,key.CONSUME_SECRET)  
  354.             auth.access_token=session['access_token']  
  355.             api=API(auth)  
  356.             user=api.verify_credentials()  
  357.             fan=[]  
  358.             next_cursor=-1  
  359.             while next_cursor!=0:  
  360.                 timeline=api.followers(user.id,'','','',next_cursor)  
  361.                 if isinstance(timeline,tuple):  
  362.                     next_cursor=timeline[1]  
  363.                     for line in timeline[0]:  
  364.                         fid=line.__getattribute__("id")  
  365.                         fname=line.__getattribute__("screen_name")  
  366.                         fan.append((fid,fname))  
  367.   
  368.                 else:  
  369.                     next_cursor=0  
  370.                     for line in timeline:  
  371.                         fid=line.__getattribute__("id")  
  372.                         fname=line.__getattribute__("screen_name")  
  373.                         fan.append((fid,fname))  
  374.   
  375.             friend=[]  
  376.             next_cursor=-1  
  377.             while next_cursor!=0:  
  378.                 timeline=api.friends(user.id,'','','',next_cursor)  
  379.                 if isinstance(timeline,tuple):  
  380.                     next_cursor=timeline[1]  
  381.                     for line in timeline[0]:  
  382.                         frid=line.__getattribute__("id")  
  383.                         frname=line.__getattribute__("screen_name")  
  384.                         friend.append((frid,frname))  
  385.                 else:  
  386.                     next_cursor=0  
  387.                     for line in timeline:  
  388.                         frid=line.__getattribute__("id")  
  389.                         frname=line.__getattribute__("screen_name")  
  390.                         friend.append((frid,frname))  
  391.             attentionNotFan=list(set(friend).difference(set(fan)))  
  392.             nu=len(attentionNotFan)  
  393.             if nu==0:  
  394.                 return render_template('attentionnotfanok.html',nu=nu)  
  395.             else:  
  396.                 return render_template('attentionnotfan.html',nu=nu,attentionNotFan=attentionNotFan)  
  397.   
  398.         except:  
  399.              info="親,系統繁忙,請稍後再試......,系統在3秒後自動返回..."  
  400.              return render_template('error.html',info=info.decode('utf-8'))  
  401.   
  402.   
  403. class Delattention:  
  404.     """ 
  405.     獲取attentionnotfan.html頁面選擇的用戶,並一鍵取消關注 
  406.     """  
  407.     def GET(self):  
  408.         #獲取attentionnotfan.html傳過來的數據   
  409.         data=web.input()  
  410.         on=[]  
  411.         try:  
  412.             auth=OAuthHandler(key.CONSUME_KEY,key.CONSUME_SECRET)  
  413.             auth.access_token=session['access_token']  
  414.             api=API(auth)  
  415.             for x in data:  
  416.                 on.append(x)  
  417.             try:  
  418.                 #同理,由於有全選按鈕.....   
  419.                 on.remove('checkbox2')  
  420.             except:  
  421.                 pass  
  422.             nu=len(on)  
  423.             if nu==0:  
  424.                 pass  
  425.             #取消關注   
  426.             map(api.destroy_friendship,on)  
  427.             info="恭喜您已成功取消關注%d位用戶....." %nu  
  428.             return render_template('success.html',info=info.decode('utf-8'))  
  429.         except:  
  430.              info="親,系統繁忙,請稍後再試......,系統在3秒後自動返回..."  
  431.              return render_template('error.html',info=info.decode('utf-8'))  
  432.   
  433. if __name__=='__main__':  
  434.      """ 
  435.      啟動app,啟動s線程去搜索數據 
  436.      """  
  437.      s=Setag()  
  438.      s.start()  
  439.      app.run()  

效果如下:




點擊用微博賬號登陸:



首頁:



由於太長.所以圖沒截好,大家懂的...

當點擊互粉按鈕時.....


功能還有很多需要完善的地方......

Copyright © Linux教程網 All Rights Reserved