Cookie登录小妙招 ---- by.广州组
评论
收藏

Cookie登录小妙招 ---- by.广州组

经验分享
驿站
2023-08-14 12:58·浏览量:4122
驿站
发布于 2023-08-14 11:36更新于 2023-08-14 12:584122浏览

登录又多了一种选择,不过方便的同时要注意保护好登录信息~


〇、演示效果


一、实现原理

通过保存当前网站的Cookie信息和本地存储,再下次登录时添加Cookie和本地存储实现登录操作


1.保存Cookie我们可以直接用自带接口,需要把过期时间转为时间戳

2.保存本地存储,用JS脚本实现

3.然后将Cookie和本地存储保存到指定文件路径即可,当然,你也可以扩展保存到数据库或者其他地方,完整代码如下


import xbot
import xbot_visual
from xbot_visual.web import get_cookies, set_cookie, remove_cookie
from xbot import print, sleep
from . import package
from .package import variables as glv
import datetime

import json
import re

print = [lambda *_, **__: None, print][__package__ == "xbot_robot" or hasattr(xbot, "__log")]


def extract_domain_from_url(url):
pattern = r"(?:://)(?:www\.)?([a-zA-Z0-9-\.]+)(?=/)"
match = re.search(pattern, url)
if match:
domain = match.group(1)
return domain
else:
return None


def save_login_info(web_page, save_path):
"""
保存登录信息
:param web_page: 网页对象
:param save_path: 保存路径
:return: 登录信息
"""
url = web_page.get_url()
cookies = get_cookies(url_type="auto", browser=web_page, web_type=None, url=None, name=None, domain=None, path=None,
filter_secure=False, secure=False, filter_session=False, session=False)
for cookie in cookies:
cookie['expires'] = None
if cookie['expirationDate']:
dt = datetime.datetime.strptime(cookie['expirationDate'], "%Y/%m/%d %H:%M:%S")
cookie['expires'] = int(datetime.datetime.timestamp(dt))
cookie['sessionCookie'] = not bool(cookie['expires'])
cookie.pop('expirationDate')

local_storage = web_page.execute_javascript('''
function (ele, input) {
let local_storage = {}
for (let i = 0; i < localStorage.length; i++) {
let key = localStorage.key(i);
let value = localStorage.getItem(key);
local_storage[key] = value
}
return local_storage
}
''')

login_info = {
"url": url,
"cookies": cookies,
"local_storage": local_storage
}

login_info = json.dumps(login_info, ensure_ascii=False, indent=4)
with open(save_path, 'w', encoding="u8") as f:
f.write(login_info)

return login_info


def login(web_page, login_info_path, *, add_local_storage=False):
"""
使用Cookie和本地存储登录
:param web_page: 网页对象
:param login_info_path: 登录信息文件路径
:param add_local_storage: 是否添加本地存储
:return:
"""
with open(login_info_path, 'r', encoding="u8") as f:
login_info = json.load(f)

url = login_info.get("url", "")
cookies = login_info.get('cookies', [])
local_storage = login_info.get('local_storage', {})

if extract_domain_from_url(web_page.get_url()) not in url:
web_page.navigate(url)

logout(web_page)
for cookie in cookies:
if cookie['name'] == "":
continue
try:
set_cookie(url_type="auto", browser=web_page, web_type=None, url=None, **cookie)
except Exception as e:
print(e)

if add_local_storage:
print("添加本地存储")
for k, v in local_storage.items():
try:
if isinstance(v, str):
v = f'`{v}`'
web_page.execute_javascript('''
function (ele, input) {
localStorage.removeItem(`%s`);
localStorage.setItem(`%s`, %s);
}
''' % (k, k, v))
except Exception as e:
print('add_local_storage', e)

try:
# web_page.reload(load_timeout=5)
web_page.navigate(url, load_timeout=5)
except:
pass


def logout(web_page, del_local_storage=False):
"""
通过删除Cookie和本地存储实现退出登录操作
:param web_page: 网页对象
:param del_local_storage: 是否删除本地存储
:return:
"""
cookies = get_cookies(url_type="auto", browser=web_page, web_type=None, url=None, name=None, domain=None, path=None,
filter_secure=False, secure=False, filter_session=False, session=False)
for cookie in cookies:
if cookie['name'] == "":
continue
remove_cookie(url_type="auto", browser=web_page, web_type="cef", url=None, remove_type="appoint_cookie",
name=cookie['name'])

if del_local_storage:
web_page.execute_javascript('''
function (ele, input) {
localStorage.clear();
}
''')



二、调用示例

1.代码调用


def main(args):
path = "你的保存路径"
# 保存登录信息
web_page = xbot.web.get_active('chrome')
save_login_info(web_page, path)

# Cookie登录
web_page = xbot.web.get_active('chrome')
login(web_page, path, add_local_storage=True)

2.封装成指令调用

    保存


    登录




收藏13
全部评论1
最新
发布评论
评论