1. 程式人生 > >新浪開放平臺---oauth2認證流程 casperjs自動登入和授權 api需要注意的問題及bug

新浪開放平臺---oauth2認證流程 casperjs自動登入和授權 api需要注意的問題及bug

轉自:http://blog.csdn.net/xiarendeniao/article/details/7482533

一、OAuth認證流程

 

1.      使用者發起對應用MyApp的訪問

2.      MyApp檢驗使用者是否已經授權MyApp獲取其微博資料(或者授權是否過期),如沒有(或過期)則重定向到SinaAPI使用者授權頁面,並把MyApp的url作為使用者授權後SinaAPI要跳轉的連結(該url需要跟開發者“站內應用”的“應用實際地址”保持一致)

3.      填寫並提交SinaAPI的使用者資訊表格

4.      SinaAPI驗證使用者賬號密碼之後返回code並重定向到MyApp

5.      MyApp拿著code去SinaAPI驗證

6.      SinaAPI給MyApp返回一個token串,MyApp依據這個token串和MyApp的“App Key”及“App Secret”來做後續的使用者資訊查詢和操作

 測試階段,微博使用者的賬號需要通過“測試使用者UID”手動新增到SinaAPI才可以使用

使用OAuth2.0呼叫API介面有兩種方式:

2. 在header裡傳遞 形式為在header裡新增Authorization:OAuth2空格abcd 這裡的abcd假定為Access Token的值


二、前段時間研究了一下如何跳過新浪授權的頁面

        需求:

        我交出自己的微博賬號和密碼,委託app每天自動幫我做一些事情(具體神馬事情就不透漏了,你懂的)

        app拿到的跟該使用者對應的access_token有過期時間,每次過期後都需要使用者重新授權,而使用者(其實就是我自己)的本意是交給app來處理這些事情,不想過問,更不想每過段時間就來重新授權(輸入使用者名稱密碼也是很麻煩的撒)

        解決過程:

        鳥人通過firebug抓取授權時瀏覽器像sina伺服器傳送的資料,發現除了使用者名稱、密碼之類的東東外還有一個名為“ticket”的字串,據鳥人推測,該串是由js(

https://static.weibo.com/open/oauth/js/web/login.js)生成,用於伺服器驗證,而該js不但巨長巨複雜,貌似還被打亂了,你說這是搞嘛玩意兒...

        事已至此,找出每次生成的ticket,用程式把username:passwd和ticket通過http request提交給伺服器,從而跳過授權頁面的方式放棄了

         這兩個url有人在討論這個事情,貌似用V1認證的時候他們做到了,現在sina推V2,還沒見人做到

         好吧,出法寶了,哈哈哈

         http://casperjs.org/ 這個casperjs巨牛無比,可以模擬瀏覽器行為,填表單、提交表單、點選按鈕,我已經成功的用該工具登入到新浪微博上面了,哈哈...接下來馬上就嘗試跳過授權頁面的事情

         casperjs是基於phantomjs的軟體,而phantomjs是基於webkit的軟體,看吧,大部分牛逼的孩子都有個牛逼的爸爸....

          下面貼出我自動登入到新浪微博的程式碼,挺簡單的,就用了幾個casperjs的api而已

  1. //sina_login.js  
  2. var casper = require('casper').create();  
  3. casper.start('http://www.weibo.com/', function() {  
  4.         this.test.assertExists('input[class="name"]', 'input[class="name"] is found');  
  5.         this.test.assertExists('input[class="pass"]', 'input[class="pass"] is found');  
  6.         this.test.assertExists('a[class="W_btn_d"]', 'submit button is found');  
  7.         this.echo("inputs of name and pass both exists.");  
  8.         this.echo('name=' + this.fetchText('input[class="name'));  
  9.         this.echo('pass=' + this.fetchText('input[class="pass"]'));  
  10.         this.echo('first location is ' + this.getCurrentUrl());  
  11.         this.capture("login.png");  
  12.         }  
  13. );  
  14. casper.then(function() {  
  15.         this.wait(10000,function() {  
  16.                 this.echo("I've waited for 10 seconds");  
  17.         });  
  18. });  
  19. casper.then(function() {  
  20.         this.fill('input[class="name"]', {'loginname':'[email protected]'}, false);  
  21.         this.fill('input[class="pass"]', {'password':'secret'}, false);  
  22.         this.click('a[class="W_btn_d"]');  
  23.         this.echo('clicked...');  
  24. });  
  25. casper.then(function() {  
  26.         this.wait(10000,function() {  
  27.                 this.echo("I've waited for 10 seconds again");  
  28.         });  
  29. });  
  30. casper.then(function() {  
  31.         this.echo('new location is ' + this.getCurrentUrl());  
  32.         this.capture("logined.png");  
  33. });  
  34. casper.run();  

  1. [[email protected] js_study]$ casperjs sina_login.js  
  2. PASS input[class="name"] is found  
  3. PASS input[class="pass"] is found  
  4. PASS submit button is found  
  5. inputs of name and pass both exists.  
  6. name=  
  7. pass=  
  8. first location is http://www.weibo.com/  
  9. I've waited for 10 seconds  
  10. clicked...  
  11. I've waited for 10 seconds again  
  12. new location is http://www.weibo.com/u/2551537453?wvr=3.6&lf=reg  
登入前後的網頁快照就不貼出來了,太大了


授權頁面也跳過去了 ^ _ ^----2012-05-28

帶驗證碼識別的自動授權也實現了(用驗證碼來防止機器人的方式已經不靠譜了,哈哈哈) ^_^ ----2012-10-08

如果僅僅是照快照的話可以考慮用這個也是基於webkit的python程式,看上去也不錯呢http://bluehua.org/2010/07/23/1397.html ----2012-07-12 1:12

三、個人總結的一些問題及bug

1.statuses/mentions獲取@當前使用者的最新微博,每條資料中的原始微博retweeted_status(如果存在的話)的轉發數reposts_count和評論數comments_count是本次api呼叫時的原創微博的轉發數,不是該轉發行為發生時的轉發數!

   comments/to_me我收到的評論,每條資料中評論針對的微博status的轉發數reposts_count和評論數comments_count是零

   comments/mentions@我的評論,每條資料中評論針對的微博status的轉發數reposts_count和評論數comments_count也是零,好吧,可能他們系統就是這麼設計的

   可能(暫未完全驗證)各個API返回的資料中只有retweeted_status中的轉發和評論數是API呼叫時的值,而status中轉發和評論數不是

2.A轉發B的微博,就算A把微博文本里“//@A...”的內容去掉,B還是可以通過comments/mentions收到這個"提到(@)"

3.轉發自己的微博在頁面上不會收到提醒,但是用comments/mentions查詢還是可以得到這些轉發微博
4.userA原創微博W1----userB轉發---->W2------userC轉發------>W3-----userD轉發----->W4

  分析:

        W1的轉發數是3,W2、W3的轉發數是1,W4的轉發數是0
        statuses/repost_timeline傳入引數W1可以找到W2、W3、W4

        正常情況下,userD轉發W3生成W4的時候,userA、userB、UserC都會收到@提醒

       如果userD把W4中的“//@”全部去掉,則只有直屬父親userC和原創作者userA會收到@提醒

        直接根據W3不能斷定其是否是從W2轉發來的(可以根據文字中的“//@”來判斷,但是這個可能被人為的去掉),可以斷定的是W3從W1轉發來的,因為W1是W3的retweeted_status
5.comments/to_me我收到的評論:a.他人對我微博做出的評論、b.他人回覆我評論產生的評論中text裡"回覆@wo:"文字沒被人工去除的那部分
  comments/mentions提到我的評論:他人或本人text中有“@我”的評論、不包含【他人或本人回覆我評論產生的評論中text裡"回覆@wo:"文字沒被人工去除的那部分】

6.statuses/count批量獲取微博轉發數和評論數,經常會出現傳入x個id,返回結果卻少於x個的現象,再試一次又全都返回了,如何處理自己看著辦吧....

7.個人覺得sina開放平臺最大的bug莫過於:一個app拿到使用者的授權token以後,任意程式都可以用該token獲取使用者的隱私資料(為嘛不能在api加一個app_key的引數,這樣就能稍微限制一些了);其他程式用該token傳送微博的時候“來自”還是顯示使用者授權的那個app的資訊

9.個人感覺comments/reply介面和comments/create介面可以合二為一,前者比後者多了cid和without_mention兩個引數,雞肋呀雞肋!
    如果我把without_mention設定為1(不自動加入“回覆@使用者名稱”,)那麼reply的介面功能和create功能一樣,都變成了對微博的評論(cid無效了),被我們回覆的評論的作者也收不到@提醒(這點跟轉發微博不一樣呀,轉發微博就算把@去掉對方還是會收到提醒的)

10.statuses/repost_timelinestatuses/repost_timeline/ids的引數count最大都是200(結果的列表按照從最新到最老排列),太噁心人了,前者傳輸的資料量大所以200還可以理解,後者就幾個數字居然也限制成200(粉絲列表那裡,獲取id的時候就能一次獲取5k)

11.據個人測試來看在微博的文字text中,@後面微博暱稱是用“字母、數字、短橫線、下劃線”(意思就是說,緊接@的這種型別字元都會被認為是賬號的暱稱)以外的字元為終止符的,預設是空格

[email protected]微博API私信記錄

  1. 10-10 15:24  
  2. 你好,我呼叫statuses__user_timeline獲取某個賬號的微博列表,總是有資料丟失的情況(比如該賬號官方頁面上有2420條微博,而程式只能取到2385條資料),請問這個是怎麼回事?  
  3. 17:47  
  4. 你好,一些微博資訊被判定為廣告或其他資訊被過濾了。 呼叫ids介面不會過濾  
      經測試,獲取粉絲列表(friendships/followers)和粉絲id列表(friendships/followers/ids)時這個也適用,獲取id列表不管是否殭屍粉、廣告粉都把id返回了、沒有被系統遮蔽(但是,拿著id呼叫users/show獲取被系統遮蔽的使用者的資訊,系統返回“20003: User does not exists!”,所以拿到完整的id列表作用也是很有限的)

13.users/show介面返回的使用者資訊裡面有status欄位(最近的微博);其他介面(已驗證的介面:friendships/followers,comments/to_me)中返回資料裡帶使用者資訊(user欄位)時,使用者資訊裡面是不帶status欄位(最近的微博)的(friendships/followers發揮的使用者資訊會帶有最近的微博id,"status_id"欄位)

14.剛驗證了一下,對於同一個app,當一個使用者的token還沒過期的時候該使用者重新授權得到的token跟之前的token是一樣的,只是過期時間延長了一些(這個真是出乎我的意料之外呢,仔細想想也很正常,因為sina以前就有token refresh的機制)

15.friendships/followers獲取粉絲列表中的使用者資訊不是最新的(微博數、粉絲數等資訊是之前某個時間點的資料),users/show獲取的是實時的使用者資訊

16.個人認證:黃V verified為True verified_type為0

      機構認證:藍V verified為True verified_type為2

      微博達人:加星 verified_type為220 (verfied為False)

      根據日誌記錄verified_type居然還有-1、3、5、7等數值,官方沒有文件說明,沒琢磨明白這些值表示什麼

17. 我自己的測試顯示,近期新浪轉發數的策略有做調整(記於2013.8.14)

        以前是這樣的:A->B->C->D->E, A->F->G->H 各微博轉發數如下 A(7) B(1) C(1) D(1) E(0) F(1) G(1) H(0)

        現在是這樣的:A->B->C->D->E, A->F->G->H 各微博轉發數如下 A(7) B(3) C(2) D(1) E(0) F(2) G(1) H(0)

            這個改變帶來的好處是,構建非原創微博的轉發樹變得輕鬆了許多,應該其他的好處,一時之間想不起來

            就算E轉發D的時候把原來的轉發文字全部剔除,ABCD的轉發數還是會加1,D作為E的直接父節點會收到@提醒(雖然文字中沒有@),A作為原創微博也會有@提醒,BC沒有@提醒

            那麼現在有個問題是這樣的,B轉發生成的微博的轉發數增長了,而且該微博的轉發列表也有了新資訊,但是可能沒有任何提示,新浪應該正在解決這個問題~

PS:我為毛要跟著新浪平臺的這些細微調整轉圈圈啊,這簡直是死合同,好沒意思啊啊啊啊!以這種業務為基礎構建的產品太沒前景了,新浪一動我們就得跟著動,而且還得依靠自己的猜測和推理!換了換了...