關於qq和新浪微博的第三方登陸|python|flask


前些日子研究了一下qq和新浪微博的第三方登陸的東西,發現其實難度並不大。來給大家分享一下我的經驗和流程。

不論是qq還是新浪微博的第三方登陸都是用了Oauth2.0授權流程,唯一不同的是qq多了一個openid的獲取,多了一步。

 

先介紹一下Oauth2.0的大致授權流程。在授權過程中大致有三個對象。一個是服務提供方(第三方網站)、一個是用戶(將資源放在服務提供方存放的對象)、還有一個就是客戶端(向服務提供放請求用戶資源的對象)。首先,客戶端向服務提供方發起請求,請求服務提供方的一個臨時令牌,這個臨時令牌是進行下一步的基礎,服務提供方先要驗證一下客戶端的身份,驗證成功后會給客戶端所要的臨時令牌。接下來客戶端會引導用戶進行授權操作,用戶進入服務提供方提供的頁面,完成授權以后服務提供方會給客戶端一個訪問令牌並調轉回客戶端的網頁。通過訪問令牌,客戶端就可以獲得用戶在服務提供方上的若干權限。

 

 

 

了解了Oauth2.0的授權機制,下面就開始介紹實例。顯示新浪微博的。

首先,要成為新浪微博的開發者,http://open.weibo.com/wiki/%E6%96%B0%E6%89%8B%E6%8C%87%E5%8D%97,這是申請開發者的大致流程,申請完成后就可以創建應用,然后新浪微博就會給你你的app_id和app_secret,這兩樣東西就是你的網站認證新浪微博的憑證,根據這個憑證你才能引導用戶到新浪微博的授權界面。

 

第一步,在你的網站上引導用戶進入授權界面,實際上這一步包含了你的網站向服務提供方申請臨時令牌和用戶完成授權這兩步。引導用戶進入https://api.weibo.com/oauth2/authorize?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&response_type=code&redirect_url=YOUR_REGISTERDE_REDIRECT_URL

上面的紅字部分是要自己填入的信息。其他地方不用改動。用戶輸入用戶名和密碼,完成授權,之后會跳轉到YOUR_REGISTERDE_REDIRECT_URL,並且會在url上多出”code=~~~~~~“的信息,這些是可以在后台通過GET方法獲得的。

 

第二步,通過第一步的code向服務提供方換取訪問令牌,在新浪微博上就是access_token。在后台完成向https://api.weibo.com/oauth2/access_token?client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET&grant_type=authorization_code&redirect_url=YOUR_REDIRECT_URL&code=CODE的請求。

以上的紅字是自己要填入的。通過上面的網址實際上是在用GET方法發起請求。響應會發回一個json字典,其中就有我們想要的access_token,字典中還有其他項,包括用戶id,access_token的有效時間(秒為單位)等信息。

實際上完成上邊的兩步后,我們就已經獲得了我們想要的權限了。http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI,通過這個網址上的信息,再加上我們完成上邊兩步后所獲的的東西,我們就可以實現想要的目的了。

 

 1 #-*-coding:utf8 -*-
 2 import urllib
 3 import urllib2
 4 import json
 5 data1 = {"client_id":"","client_secret":""}
 6 data1 = urllib.urlencode(data1)
 7 url1 = "https://api.weibo.com/oauth2/access_token?grant_type=authorization_code&redirect_uri=&code=854e96627e23b6a31fea50cd242a681e"
 8 #上邊url1中的code是我手動在瀏覽器上運行授權url獲取的,實際開發中是可以在網站后台獲取的,就不用人工的去獲取了
 9 
10 
11 req1 = urllib2.Request(url1,data1)
12 response1 = urllib2.urlopen(req1)
13 #這里返回的是一個json格式的數據,通過解析可以從中獲取access_token
14 response1 = json.loads(response1.read()) 15 access_token = response1['access_token'] 16 #print(access_token)
17
18 19 #一下是一個例子,以用戶的名義發一條新浪微博 20 url2 = "https://api.weibo.com/2/statuses/update.json" 21 status = u"這是用來測試的,請直接忽略!" 22 status = status.encode("utf8") 23 data2 ={"source":"","access_token":access_token,"status":status} 24 #這里要注意source其實就是app_id 25 data2 = urllib.urlencode(data2) 26 req2 = urllib2.Request(url2,data2) 27 response2 = urllib2.urlopen(req2) 28 response2=json.loads(response2.read()) 29 print(response2) 30 #這里用來獲取響應信息

 

 

 

 

 

 

下面介紹一下qq的流程,熟悉了新浪微博的授權流程,qq的流程就要好理解的多。qq的官方文檔寫得要比新浪微博的清楚明了的多,我就借用一下qq的文檔。

開始下面操作之前,你要去qq那里申請開發者許可,並申請要開發的網站或者應用以得到client_id和client_secret,還有你的redirect_url

第一步,請求臨時令牌,並引導用戶授權。

url:https://graph.qq.com/oauth2.0/authorize

method:GET

 

這一步的重點在獲取code。

 

第二步,請求訪問令牌access_token

url:https://graph.qq.com/oauth2.0/access_token

method:GET

 

這一步的重點在於獲得access_token

 

第三步,獲得open_id,這是qq與新浪微博所不同的,也是多了這一步。

url:https://graph.qq.com/oauth2.0/me

method:GET

完成了這一步就已經獲得了所有要用到的參數,這樣就可以完成我想要的所有權限了。

http://wiki.open.qq.com/wiki/website/API%E5%88%97%E8%A1%A8,這是qq提供的所有能用的api,使用說明也都有,所有會用到的參數上面三步都已經得到了。這樣工作就完成了。

#-*-coding:utf8-*-
import urllib
import urllib2
import json

response_type = "code"
client_id = ""
client_secret = ""
redirect_uri = ""
#以上的信息是要自己去申請開發網站時給開發者分配的 url_code = "authorization code" url1 = "https://graph.qq.com/oauth2.0/token"
url1 = url1+"?grant_type=authorization_code&"+ \ "client_id="+client_id+ \ "&client_secret="+client_secret+ \ "&code=5CB3DB81F0718CE44ADD33A78F53E4A0"+ \ "&redirect_uri="+redirect_uri
#上面的code是我自己現在瀏覽器上手動完成第一步得到的,如果能在服務器上的話,是可以在后台完成對code的獲取的,就不用這么麻煩了 req1
=urllib2.Request(url1) response1=urllib2.urlopen(req1) m=((response1.read()).split('&'))[0] access_token=(m.split('='))[1] #print access_token
#這里由於返回的是一個字符串,所以對返回的字符串操作,從中獲取access_token

url2="https://graph.qq.com/oauth2.0/me" url2=url2+"?access_token="+access_token req2=urllib2.Request(url2) response2=urllib2.urlopen(req2) dic=(response2.read())[10:-3] ajson=json.loads(dic) openid=ajson['openid']
#這里返回的是一個json字典,所以可以通過json模塊解析其中的信息,以獲得openid

#一下是一個例子,用來獲取用戶的基本信息 url3
="https://graph.qq.com/user/get_user_info?"+ \ "access_token="+access_token+ \ "&oauth_consumer_key="+client_id+ \ "&openid="+openid req3=urllib2.Request(url3) response3=urllib2.urlopen(req3) #data_dic=json.loads(response3.read()) print (response3.read()).encode('GB2312')

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM