亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP 基于laravel框架獲取微博數據之一 模擬新浪微博登錄

發布時間:2020-08-05 12:15:09 來源:網絡 閱讀:1369 作者:daweilang 欄目:web開發

參考資料:
http://www.csuldw.com/2016/11/10/2016-11-10-simulate-sina-login/
http://blog.csdn.net/fly_leopard/article/details/51148904
http://www.tuicool.com/articles/uIJzYff

http://blog.csdn.net/u010029983/article/details/46364113


模擬新浪微博登錄是抓取新浪數據的基礎,網上的參考資料大多介紹的是用Python開發,有一篇使用php模擬登錄的資料還是在phpcms中實現的,也沒有太深入分析。

PS:網上資料來源比較亂,不知道phpcms實現模擬微博登錄的原作是不是csdn的t0mCl0nes,本篇介紹php模擬登錄的核心借鑒的就是這篇文章。以下提及這篇文章以phpcms方案指代。


使用PHP模擬登錄新浪微博和Python還是有些區別的,其中也存在一些問題,在這里我就簡單分析一下PHP模擬新浪微博登錄的過程和存在的問題。


項目地址:

https://github.com/daweilang/GetWeiBoCookie


標題名“基于laravel框架”,因為整個獲取新浪微博數據的系統是用的lavarel框架搭建的,使用了lavarel隊列、命令等等工具。其實模擬新浪微博登錄這部分完全可以用簡單php程序頁面實現,希望我下面的分析能夠幫助感興趣的朋友實現自己的模擬登錄程序。

PS:App\Http\Controllers\Admin\AuthorizeController控制器是本文的主程序,以下提及的代碼都在github該程序中。


這里所介紹的模擬新浪微博登錄,具體是指通過新浪通行證模擬登錄。新浪通行證是新浪的統一登錄模式,新浪網(sina.com.cn)和微博(weibo.com)是兩個不同的頂級域,正是通過新浪通行證,微博實現了跨域登錄。對于跨域登錄了解不多,不過新浪網使用的這種方式技術上應該是很深入的。


具體登錄參數的抓包分析請參考上面和網上的一些文章,其中固定參數可以參考我的代碼“config/weibo.php”的curl數組。


這里主要對預登錄和預登錄返回的參數結合PHP程序進一步說明。

當用戶輸入用戶名并且焦點離開輸入框后,登錄頁面會向“http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=%s”發送一次GET請求,其中用戶名是經過base64_encode加密的,最后是個毫秒級的時間戳,其他參數可以固定。


該請求返回了一些參數,網上資料已經介紹了后面主要用到了"servertime"、”nonce"和"rsakv"這三個參數,不過其實“showpin”和“pcid”這兩個參數也很重要,showpin為1的時候代表需要填寫驗證碼,而驗證碼的生成需要“pcid”這個參數。

phpcms方案中將這些參數儲存到cookie中,我的代碼是儲存到文件中,參數的取得和儲存代碼參見GetWeiboCookie的getPreUrl方法。


下面介紹的是使用PHP模擬登錄新浪微博的核心,也是與Python模擬登錄最大的不同,密碼加密。

網上的文章都已經介紹了微博密碼加密原理,使用RSA2算法,“首先創建一個 rsa 公鑰,公鑰的兩個參數都是固定值,第一個參數是登錄過程中 prelogin.php 中的 pubkey ,第二個參數是加密的 js 文件中指定的”10001”(這兩個值需要先從16進制轉換成10進制,把“10001”轉成十進制為“65537”)。最后再加入 servertimenonce 進行進一步加密。”

新浪通行證的流程是,在用戶填寫完用戶名和密碼提交后,請求“https://login.sina.com.cn/js/sso/ssologin.js”頁面,這個js頁面里就是上面的加密算法,使用js將密碼加密。


這個流程使用Python模擬的代碼是這樣的:

      RSAKey = rsa.PublicKey(rsaPubkey, 65537) #創建公鑰
      #根據js拼接方式構造明文
      codeStr = str(servertime) + '\t' + str(nonce) + '\n' + str(password) 
      pwd = rsa.encrypt(codeStr, RSAKey)  #使用rsa進行加密

短短三行代碼,只需要安裝rsa包。。。


百度了好久,沒有找到php實現生成rsa公鑰方法。

phpcms方案實現了一種解決方法,也就是按照新浪通行證的流程來實現,用ssologin的js方法來加密。phpcms方案對sso加密算法進行了一次封裝,csdn博客上有該段js代碼。我的js水平不高,完全借鑒了這段代碼,在此基礎上將加密算法提取到一個js文件中。

    <script type='text/javascript' src='/js/prelogin.js'></script>
    <script type="text/javascript">
    function getpass(pwd,servicetime,nonce,rsaPubkey){        
        var RSAKey=new sinaSSOEncoder.RSAKey();        
        RSAKey.setPublic(rsaPubkey,'10001');        
        var password=RSAKey.encrypt([servicetime,nonce].join('\\t')+'\\n'+pwd);        
        return password;    
    }
    </script>


這種做法有個很大的缺點,需要一個單獨的頁面來生成加密后的密碼,并且將密碼傳給最后的提交頁面,也就是說頁面需要多次跳轉。

   var encrpt = getpass('{$preParam['sp']}', '{$preParam['servertime']}', '{$preParam['nonce']}', '{$preParam['pubkey']}' );
//     document.write(encrpt);
   window.location.href='/admin/authorize/browserLogin/?sp='+encrpt;

最后將加密的密碼傳遞給最后的提交頁,見getRsaPwd()方法。


我是在最終提交頁browserLogin中將之前儲存在文件中的各種參數提取與加密后的密碼組合,最后post給新浪通行證登錄頁登錄。

這里還有一點是之前介紹過的,需要填寫驗證碼情況,如果預登錄返回的showpin參數為1,需要獲得驗證碼圖片,填寫驗證碼登錄。驗證碼圖片地址是

http://login.sina.com.cn/cgi/pin.php?r={$randInt}&s=0&p={$preParam['pcid']}

r是隨機8位數字,p是預登陸返回的pcid。如果有驗證碼就多了一次手動填寫驗證碼的流程。

具體代碼參考browserLogin()方法。


這種方法與Python相比最大的缺點是不能自動登錄,也就是后臺登錄,Python不需要人為觸發,有用戶名和密碼后完全可以使用程序模擬登錄,而php實現需要人為觸發登錄。

另外,如果需要填寫驗證碼,Python也有工具可以識別驗證碼,做到自動打碼,全程自動登錄,這點php實現起來也比較困難。


之后的curl登錄沒有什么需要特別說明的,應該是在參數里面設置了入口weibo,所以返回的cookie可以直接使用到微博中,理論上這種方式可以在新浪全站模擬登錄,不過我并沒有試過其他子站。新浪只是在密碼核驗上比較嚴格,對于模擬登錄的限制并不多。


綜上,雖然使用PHP實現了模擬新浪微博登錄,但比之Python還是很不方便的,畢竟Python做爬蟲的有很多工具。不過在模擬登錄微博的基礎上獲取微博數據過程中,使用lavarel這種框架實現了很多腳本功能,大大提高了抓取數據效率,這也是我使用lavarel開發這個小項目的原因。



https://github.com/daweilang/GetWeiBoCookie

已經實現模擬新浪微博登錄的功能,之后不再更新。


后續的新浪微博數據抓取分析,請關注 https://github.com/daweilang/GetWB

這個項目還在調整階段,還有很多缺陷需要完善,待功能成熟后,我也會圍繞項目的設計目標,介紹一下實現方案。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安塞县| 轮台县| 五常市| 抚松县| 台安县| 松潘县| 德安县| 通河县| 许昌县| 北京市| 龙江县| 封开县| 巧家县| 镇宁| 河北区| 禹州市| 犍为县| 左权县| 蒙城县| 淮南市| 铜鼓县| 盐城市| 东山县| 古交市| 寿阳县| 大英县| 渝北区| 佳木斯市| 兴国县| 晋城| 榕江县| 海林市| 庆阳市| 瓦房店市| 朝阳区| 错那县| 阿城市| 临高县| 巩义市| 凤山县| 台东市|