electron實(shí)現(xiàn)qq快捷登錄的方法示例
之前本來(lái)想不寫(xiě)這個(gè)功能的,結(jié)果客戶死活要qq登錄! 實(shí)在沒(méi)辦法就寫(xiě)了,順便寫(xiě)個(gè)文章!
在寫(xiě)之前有兩個(gè)問(wèn)題:
1: 打開(kāi)qq授權(quán)頁(yè)面點(diǎn)擊頁(yè)面中的鏈接會(huì)又打開(kāi)一個(gè)頁(yè)面! .....
2: 授權(quán)之后是否成功很難去判斷
不過(guò)腦海中有一個(gè)想法就是,electron就是一個(gè)類(lèi)似于瀏覽器一樣,既然是瀏覽器那肯定可以阻止鏈接的點(diǎn)擊 也可以判斷狀態(tài)!
就去啃文檔了!!!
推薦大家去w3c去看文檔 比較全 而且速度較快 文檔也比較新:https://www.w3cschool.cn/electronmanual/
https://electronjs.org/docs 這里面的響應(yīng)速度比較慢 里面很多文檔都很久了 參數(shù)也有失效的!!!
言歸正傳 說(shuō)qq登錄!
后端是使用PHP實(shí)現(xiàn)的 沒(méi)什么難度,主要的就是客戶端的一些處理!
演示
放置qq登錄按鈕
<template> <div> <button @click="qqLogin">qq登錄</button> </div> </template> <script> export default { name: "home", mounted() { this.$electron.ipcRenderer.on('reply', (e, data) => { console.log(data) let httpCode = data.request_code[0]; if (httpCode === '1') { alert(data.token[0]) } }) }, methods: { qqLogin() { //請(qǐng)求服務(wù)器獲取授權(quán)頁(yè)面和參數(shù) this.$http.get('xxxxx') .then((result) => { if (result.data.status === 1) { this.$electron.ipcRenderer.send('qqLogin', {url: result.data.data}); } }) .catch() }, } } </script>
問(wèn)題解決
點(diǎn)擊a鏈接會(huì)打開(kāi)一個(gè)新窗口
解決打開(kāi)qq授權(quán)頁(yè)面點(diǎn)擊頁(yè)面中的鏈接會(huì)又打開(kāi)一個(gè)窗口的問(wèn)題 使用webContents 的 new-window 事件 組織默認(rèn)事件 調(diào)用Shell利用默認(rèn)瀏覽器打開(kāi)就行了!
loginWindow.webContents.on('new-window', (event, url) => { event.preventDefault(); shell.openExternal(url); });
授權(quán)后是否成功很難去判斷
到這個(gè)問(wèn)題后我就想到一個(gè)詞 那就是 Response 和 code 然后就去搜索了嘛 結(jié)果在 webContents找到了! did-get-redirect-request
事件 !
但是我們不能直接使用他 要在點(diǎn)擊授權(quán)之后再去使用他
loginWindow.webContents.on('will-navigate', (e, url,) => { content.on('did-get-response-details', (e, status, url, originalURL, httpResponseCode, requestMethod, referrer, header) => { if (httpResponseCode === 200) { event.sender.send('reply', header); // loginWindow.close(); } }) });
will-navigate事件解釋:
當(dāng)用戶或 page 想要開(kāi)始導(dǎo)航的時(shí)候發(fā)出事件.它可在當(dāng) window.location 對(duì)象改變或用戶點(diǎn)擊 page 中的鏈接的時(shí)候發(fā)生.
當(dāng)使用 api(如 webContents.loadURL 和 webContents.back) 以編程方式來(lái)啟動(dòng)導(dǎo)航的時(shí)候,這個(gè)事件將不會(huì)發(fā)出.
它也不會(huì)在頁(yè)內(nèi)跳轉(zhuǎn)發(fā)生, 例如點(diǎn)擊錨鏈接或更新 window.location.hash.使用 did-navigate-in-page 事件可以達(dá)到目的
did-get-response-details 事件解釋:
當(dāng)有關(guān)請(qǐng)求資源的詳細(xì)信息可用的時(shí)候發(fā)出事件. status 標(biāo)識(shí)了 socket鏈接來(lái)下載資源.
拿到這兩個(gè)之后我們就可以寫(xiě)代碼啦!
在點(diǎn)擊授權(quán)之后授權(quán)頁(yè)面會(huì)跳轉(zhuǎn)到我們服務(wù)器的一個(gè)回調(diào)地址 在里面做一個(gè)操作 比如獲取用戶token
亂七八糟的! 之后將生成的token
返回給客戶端!
但是要注意這里服務(wù)端返回的數(shù)據(jù)客戶端不能解析 大家可以使用:findInPage
去查詢返回的內(nèi)容!
但是我沒(méi)去這么做
因?yàn)?did-get-response-details
事件返回了:
status
,newURL
,originalURL
,httpResponseCode
,requestMethod
,referrer
,headers
八個(gè)參數(shù)
最后我們只需要判斷httpResponseCode
是200的時(shí)候 將header
里面的參數(shù)從主進(jìn)程返回給渲染進(jìn)程
大概的數(shù)據(jù)是這樣的:
access-control-allow-credentials:["true"] access-control-allow-headers:["token,Origin, X-Requested-With, Content-Type, Accept"] access-control-allow-methods:["POST,GET,DELETE,PUT"] cache-control:["no-store, no-cache, must-revalidate"] connection:["Keep-Alive"] content-type:["application/json; charset=utf-8"] date:["Sun, 21 Oct 2018 14:02:20 GMT"] expires:["Thu, 19 Nov 1981 08:52:00 GMT"] keep-alive:["timeout=5, max=100"] request_code:["1"] msg:["登錄成功"] token:["xxxxxxxx"] pragma:["no-cache"] server:["Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9"] set-cookie:["PHPSESSID=6b0esq5jd8vloess2c96ove86s; path=/; HttpOnly"] transfer-encoding:["chunked"] x-powered-by:["PHP/7.2.1"]
以上參數(shù)中 msg
request_code
token
為自定義參數(shù) 是服務(wù)器代碼生成的!
能得到這些就好辦了!
渲染進(jìn)程拿到header
中的token
根據(jù) token
獲取用戶信息這之后就簡(jiǎn)單的很了!!!
主進(jìn)程代碼:
import {ipcMain, BrowserWindow, shell} from 'electron' ipcMain.on('qqLogin', (event, data) => { const loginWindow = new BrowserWindow({ width: 750, height: 450, resizable: false, minimizable: false, maximizable: false, webPreferences: { devTools: false, } }); loginWindow.setMenu(null); loginWindow.loadURL(data.url); loginWindow.webContents.on('new-window', (event, url) => { event.preventDefault(); shell.openExternal(url); }); const content = loginWindow.webContents; content.on('will-navigate', (e, status, url,) => { content.on('did-get-response-details', (e, status, url, originalURL, httpResponseCode, requestMethod, referrer, header) => { if (httpResponseCode === 200) { event.sender.send('reply', header); loginWindow.close(); } }) }); });
注意點(diǎn)
返回的header里面是一個(gè)數(shù)組 這種寫(xiě)法真是坑爹啊! 還要去寫(xiě)一個(gè) header.token[0]
這種寫(xiě)法有點(diǎn)不喜歡 但是沒(méi)法子!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
layui lay-verify form表單自定義驗(yàn)證規(guī)則詳解
今天小編就為大家分享一篇layui lay-verify form表單自定義驗(yàn)證規(guī)則詳解,具有很好的參考價(jià)值,相信我對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-09-09JS實(shí)現(xiàn)可以用鍵盤(pán)方向鍵控制的動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了JS實(shí)現(xiàn)可以用鍵盤(pán)方向鍵控制的動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12左側(cè)是表頭的JS表格控件(自寫(xiě),網(wǎng)上沒(méi)有的)
左側(cè)是表頭的JS表格大家有木有遇到過(guò)呀,實(shí)在是沒(méi)有發(fā)現(xiàn),于是自己動(dòng)手豐衣足食,特獻(xiàn)上實(shí)現(xiàn)代碼與大家共享,有類(lèi)似需求的朋友可以參考下哈2013-06-06使用ImageMagick進(jìn)行圖片縮放、合成與裁剪(js+python)
由于需要在服務(wù)器端處理,使用就研究使用imagemagick來(lái)進(jìn)行。同時(shí)準(zhǔn)備封裝了一個(gè)Node.js和Python的方法,主要還是講一下然后使用imagemagick來(lái)對(duì)圖片進(jìn)行縮放、合成后進(jìn)行裁剪吧2013-09-09JS實(shí)現(xiàn)獲取毫秒值及轉(zhuǎn)換成年月日時(shí)分秒的方法
這篇文章主要介紹了JS實(shí)現(xiàn)獲取毫秒值及轉(zhuǎn)換成年月日時(shí)分秒的方法,結(jié)合實(shí)例形式分析了javascript常見(jiàn)的Date()日期時(shí)間獲取、轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2018-08-08JavaScript 產(chǎn)生不重復(fù)的隨機(jī)數(shù)三種實(shí)現(xiàn)思路
在 JavaScript 中,一般產(chǎn)生的隨機(jī)數(shù)會(huì)重復(fù),但是有時(shí)我們需要不重復(fù)的隨機(jī)數(shù),如何實(shí)現(xiàn)?本文給于解決方法,需要的朋友可以參考下2012-12-12解決idea開(kāi)發(fā)遇到j(luò)avascript動(dòng)態(tài)添加html元素時(shí)中文亂碼的問(wèn)題
這篇文章主要介紹了解決idea開(kāi)發(fā)遇到j(luò)avascript動(dòng)態(tài)添加html元素時(shí)中文亂碼的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09JS判斷字符串字節(jié)數(shù)并截取長(zhǎng)度的方法
這篇文章主要介紹了JS判斷字符串字節(jié)數(shù)并截取長(zhǎng)度的方法,涉及JavaScript針對(duì)頁(yè)面元素與字符串的動(dòng)態(tài)操作技巧,需要的朋友可以參考下2016-03-03