⑴ js中如何設置cookie的保存時間呢
設置cookie的保存時間,通過cookie的expires性質指定一個終止時間就可以了。也就是說,你在設置cookie的時候,你的cookie字串要像下面這樣組合:
vard=newDate();
d.setHours(d.getHours()+(24*30));//保存一個月
document.cookie="visited=yes;expires="+d.toGMTString();
這樣你的cookie就能保存一個月了,下面是我測試用的代碼,你自己看看是否有其他幫助,有的話盡管拿去:
<html>
<head>
<scriptlanguage="javascript">
functionWindow_Load(){
setCookie("name","111");//臨時cookie
setCookie("age","222",24*7);//保存7天
setCookie("address","333",24,"/");//保存1天,path為根目錄
//設定cookie為安全的(secure=true),只能在HTTPS或與其他安全協議
//連接在一起的時候才被傳輸
setCookie("phone","444",24,"/",".",false);
alert(document.cookie);
alert(getCookie("age"));
//刪除名稱為"age"的cookie
removeCookie("age")
alert(document.cookie);
//刪除名稱為"address"的cookie,因為設置時設定的path,所以刪除
//時也需要傳入對應path
removeCookie("address","/")
alert(document.cookie);
}
functionsetCookie(name,value,hours,path,domain,secure){
varcdata=name+"="+value;
if(hours){
vard=newDate();
d.setHours(d.getHours()+hours);
cdata+=";expires="+d.toGMTString();
}
cdata+=path?(";path="+path):"";
cdata+=domain?(";domain="+domain):"";
cdata+=secure?(";secure="+secure):"";
document.cookie=cdata;
}
functiongetCookie(name){
varreg=eval("/(?:^|;\s*)"+name+"=([^=]+)(?:;|$)/");
returnreg.test(document.cookie)?RegExp.$1:"";
}
functionremoveCookie(name,path,domain){
this.setCookie(name,"",-1,path,domain);
}
</script>
</head>
<bodyonload="Window_Load();">
</body>
</html>
⑵ JS如何賦值給文本框
<script>
function ReadCookie(){
alert(getCookie("UserEmail").split(","));
}
function getCookie(objName){//獲取指定名稱的cookie的值
var arrStr = document.cookie.split("; ");
for(var i = 0;i < arrStr.length;i ++){
var temp = arrStr[i].split("=");
if(temp[0] == objName) return unescape(temp[1]);
}
}
var cookie_val = getCookie("UserEmail");
window.onload = ReadCookie();
</script>
<form name="addform" action="" method="get">
<input type="button" value="查看保存的COOKIES值" onclick="ReadCookie()">
<input type="text" id="txt1" value="" name="mail" onclick="ReadCookie()">
</form>
這樣就能把cookie_val 的值賦給下面那個的文本框,直接顯示出來
⑶ 爬今日頭條,各種失敗經驗,之後成功了
最近研究了一下js加密,發現今日頭條比較適合練手,在頭條獲取數據的XHR中request參數有一項_signature參數,這個是就是經過js加密的數據。解決方案在最後。
先說尋找邏輯,叫順藤摸瓜,藤是params中的key,瓜是js函數,在哪裡摸,我用的是chrome F12,全局查找,就是在網址ctrl+f,注意看結果,前面有url這種一般都是在headers之類帶著沒什麼價值,要看出來具體數據的。
然後在preview里,格式化看得清楚,還是查找signature。
這樣就成功一大半了。順便還找到了as和cp
as: e.as,cp: e.cp,
這個e也在前面定義了var e = ascp.getHoney(),然後在搜索getHoney,就找到了。
把這段復制進pycharm的zhu.js文件里,然後新建一個python文件來運行,nodejs直接運行也行。
額,報錯了,execjs._exceptions.ProgramError: ReferenceError: md5 is not defined
趕緊查了一下md5是個加密模塊, nodejs安裝MD5 ,然後改裝了改裝一下,增加了var md5 = require('md5-node');運行成功。
然後就到了signature, _signature: i,i = TAC.sign("refresh" === t ? 0 : r.params.max_behot_time_tmp))
params.max_behot_time_tmp應該是在回傳的數據里的max_behot_time了。
首次請求是0,後來的是根據前一次請求的後傳數據繼續請求。
不知所雲,但還是按照老辦法試試看能不能運行。
execjs._exceptions.ProgramError: TypeError: Cannot read property 'userAgent' of undefined。
這回我參考一下 別人怎麼辦
原來要加useagent,
global.navigator={};
global.navigator.userAgent=
然後變成這樣
調用發現又有錯誤:
好像說的是var data = TAC.sign(0);之前出現了一個不該出現的逗號,把它改成分號,果然成功了,
滿懷欣喜的把signature,cp,as找到拼接成url發送,結果並不能返回數據。
有些憂郁的又看看別人怎麼辦, 用selenium獲取參數 ,phantomjs不維護了,聽說chrome headless可以替代之, 別人家說這么用 ,chrome還是打開窗口了,後來發現chromedriver.exe版本與chrome有嚴格的對應關系。 官網這樣說
總算是chrome是無頭的了,現在只差跟著up主把參數弄出來就行了,因為有了前面的查找,selenium執行的函數名稱也很清楚,
signature = brower.execute_script('return TAC.sign(0)')
果然出來一個參數,開心的拼接url發送請求還是沒數據回來。。。
憂傷的想了好久,嘗試了多次,終於在手機版里發現可以不用cp和as參數,用哪裡生成的signature都能拼接出結果,只是max_behot_time是藏在前一頁最後一項的信息里
用requests的session或者scrapy都能連續爬取了。不過m站將返回數量20寫進了js里,更改params的參數也不能控制一次的爬取量還是很是遺憾。
結果
好像必須帶著cookie才能爬取後續的,不然永遠都只能爬取第一頁的內容,獲取cookie用request的session都不行可能只能用selenium獲取cookie之後再來。憂傷。。。
⑷ 關於js用cookie保存帳號和密碼的安全性
加密是可以的,但是不要用js來做,因為js是客戶端可以查看的,別人查看一下js代碼,然後就可以從cookie裡面還原密碼了。
建議使用md5加密,有伺服器腳本對密碼md5之後,設置cookie保存在客戶機瀏覽器裡面,瀏覽器發送登錄信息的時候,如果密碼為空則嚴重md5密碼。