歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> web.py實戰(開發新浪微博應用)

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

日期:2017/3/1 10:19:48   编辑:Linux編程

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

主要代碼如下:

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

效果如下:




點擊用微博賬號登陸:



首頁:



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

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


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

Copyright © Linux教程網 All Rights Reserved