python---全文上下查找
原创
夕陌©著作权
文章标签 html 导包 参数说明 文章分类 Python 后端开发
©著作权归作者所有:来自51CTO博客作者夕陌的原创作品,请联系作者获取转载授权,否则将追究法律责任
''' drag_and_drop(source,target):拖动到某个元素然后松开,属于ActionChains类 参数说明: source:鼠标拖动的原始元素 target:鼠标拖动到另一个元素的位置 需求: 进入爱卡汽车首页 窗口最大化 定位原始元素位置:XCAR爱卡 页面需要滑动到的元素位置:爱咖号 点击爱咖号链接,测试爱咖号点击功能 退出浏览器'''# 导包from selenium import webdriverfrom selenium.webdriver.common.action_chains import ActionChains# 设置时间import time# 浏览器设置,网页设置driver = webdriver.Chrome()driver.get("https://www.xcar.com.cn")# 爱卡窗口最大化driver.maximize_window()# 设置进入下一步时间time.sleep(1)# 定位元素初始位置:XCAR爱卡source=driver.find_element_by_xpath('//*[@id="totop"]/div/a')# 设置进入下一步时间time.sleep(2)# 定位查询元素位置:爱咖号target=driver.find_element_by_xpath("/html/body/div[1]/div[13]/div[1]/div[2]/h1/a[1]")#ActionChains调用driver,从爱卡log拖到到爱咖号,执行所有元素ActionChains(driver).drag_and_drop(source,target).perform()# 进入下一步time.sleep(3)# 点击链接driver.find_element_by_xpath("/html/body/div[1]/div[13]/div[1]/div[2]/h1/a[1]").click()# 进入下一步time.sleep(3)# 退出浏览器driver.quit()
- 赞
- 收藏
- 评论
- *举报
上一篇:python---滚动条滑动
下一篇:python---网页全文/window.scrollTo(xpos,ypos)
Original: https://blog.51cto.com/u_15722979/5485159
Author: 夕陌
Title: python---全文上下查找
相关阅读1
Title: 【JS 逆向百例】Ether Rock 空投接口 AES256 加密分析
关注微信公众号:K哥爬虫,持续分享爬虫进阶、JS/安卓逆向等技术干货!
声明
本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除!
逆向目标
- 目标:Ether Rock(一种数字货币)空投接口 AES256 加密分析
- 主页:
aHR0cHM6Ly9ldGhlcnJvY2submV0L2FpcmRyb3Av
- 接口:
aHR0cHM6Ly9ldGhlcnJvY2submV0L2FpcmRyb3Atc3VibWl0
- 逆向参数:Form Data:
content: U2FsdGVkX1/XnffSPZONOHb...
key: jrwBwX2ll38bu/FFql+bAUYrRG8Ij...
逆向分析
来到空投页面,随便输入一个 ETH 钱包地址,点击提交,可抓包到提交接口,POST 请求,Form Data 里 content 和 key 参数均经过了加密处理,如下图所示:
老方法,尝试直接搜索,结果很多,不利于快速定位,XHR 断点,很容易定位到加密位置,如下图所示:
一步一步分析,首先定义了 content 对象:
var content={
address:$(this).find('input[name=address]').val(),
ref:$(this).find('input[name=ref]').val(),
uuid:uuid,
tz:tz,
tz_offset:tz_offset,
screen:window.screen.width+'x'+window.screen.height+'x'+window.screen.colorDepth,
user_agent:navigator.userAgent,
cpu:navigator.hardwareConcurrency,
lang:navigator.language||navigator.userLanguage,
};
address 是钱包地址,ref、uuid 为空,tz 是时区,tz_offset 是时区偏移量,即当前时区与格林尼治标准时间(GMT)的差,screen 是屏幕相关信息,user_agent 是浏览器信息,cpu 是处理器数量,lang 是语言。这些值除了 address 以外都可以固定。
接下来定义了一个 key: var key=random_string(36);
,跟进 random_string()
方法,可以看到是进行了一些取随机值和幂运算,可以直接 copy 下来,如下图所示:
接着将定义的 content 和生成的 key 进行了一个叫做 AES256 的加密: content=AES256.encrypt(JSON.stringify(content),key);
这里 AES256 一般是指的密钥长度为 32 bytes(256 bit / 8)的 AES 加密,但是不要被名称迷惑,我们跟进去看看:
可以看到实际上是调用了 h.AES.encrypt()
方法,往上看这个 h,可以看到是引用了 node-cryptojs-aes,支持 AES 对称密钥加密,这里就比较简单了,我们在本地也直接引入这个库即可,至此,content 的加密方式就找到了。
接下来看 key 值,这个就更简单了,很明显用的是 jsencrypt 库,对原来生成的 36 位字符串的 key 进行了 RSA 加密,同样在本地直接引用库即可。
完整代码
GitHub 关注 K 哥爬虫,持续分享爬虫相关代码!欢迎 star !https://github.com/kgepachong/
以下只演示部分关键代码,不能直接运行! 完整代码仓库地址:https://github.com/kgepachong/crawler/
JavaScript 加密代码
function randomString(N) {
if (!parseInt(N, 10)) N = 6;
var rs = Math.floor(Math.pow(36, N) * Math.random()).toString(36);
return (Math.pow(10, N) + rs).substr(-N);
}
var h = require("node-cryptojs-aes").CryptoJS
, p = {
stringify: function (b) {
var e = h.enc.Hex.parse(b.salt.toString()).toString(h.enc.Latin1);
b = b.ciphertext.toString(h.enc.Latin1);
return h.enc.Latin1.parse("Salted__" + e + b).toString(h.enc.Base64)
},
parse: function (b) {
b = h.enc.Base64.parse(b).toString(h.enc.Latin1);
if ("Salted__" !== b.substr(0, 8))
throw Error("Error parsing salt");
var e = b.substr(8, 8);
b = b.substr(16);
return h.lib.CipherParams.create({
ciphertext: h.enc.Latin1.parse(b),
salt: h.enc.Latin1.parse(e)
})
}
};
var e = randomString(36);
function getContent(address) {
var b = JSON.stringify({
"address": address,
"ref": "",
"uuid": "",
"tz": "Asia/Shanghai",
"tz_offset": 8,
"screen": "1920x1080x24",
"user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
"cpu": 8,
"lang": "zh"
})
return h.AES.encrypt(b, e, {
format: p
}).toString()
}
function getKey() {
JSEncrypt = require("jsencrypt")
var crypt = new JSEncrypt();
var pub = [
'-----BEGIN PUBLIC KEY-----',
'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVmYQhCYTnnkTPRMI5Ad3vfad9',
'lhjzOU92FZ3reUiN/vmqP/wC1DKKExYDsqa+w5xBP0AjGkfDWk3q4PlWu0UsBGZx',
'62Gvt0ds75u8FnmLv+ufMimF4962/9Lx7uyh9g1H3/ze5ZXscWYy3gtts9d2Ga0R',
'pl0X49Cz0JhYYicuGwIDAQAB',
'-----END PUBLIC KEY-----',
];
crypt.setPublicKey(pub.join('\n'));
key = crypt.encrypt(e);
return key
}
function getContentAndKey(address) {
result = {
"key": getKey(),
"content": getContent(address)
}
return result
}
// 测试样例
// console.log(getContentAndKey("xxxxxxxxxxxxxxxx"))
Python 代码
==================================
--*-- coding: utf-8 --*--
@Time : 2021-11-24
@Author : 微信公众号:K哥爬虫
@FileName: airdrop_submit.py
@Software: PyCharm
==================================
import execjs
import requests
def get_content_and_key(address):
with open("get_content_and_key.js", encoding="utf-8") as f:
ether_rock_js = f.read()
content_and_key_dict = execjs.compile(ether_rock_js).call('getContentAndKey', address)
return content_and_key_dict
def airdrop_submit(content_and_key_dict):
submit_url = "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler"
headers = {
"Accept": "text/html, */*; q=0.01",
"Accept-Language": "zh,zh-CN;q=0.9,en-US;q=0.8,en;q=0.7",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
"Host": "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler",
"Origin": "脱敏处理,完整代码关注 GitHub:https://github.com/kgepachong/crawler",
}
data = {
"content": content_and_key_dict["content"],
"key": content_and_key_dict["key"]
}
response = requests.post(url=submit_url, data=data, headers=headers)
print(response.text)
def main():
address = input("请输入ETH钱包地址领取空投: ")
content_and_key_dict = get_content_and_key(address)
airdrop_submit(content_and_key_dict)
if __name__ == '__main__':
main()
Original: https://www.cnblogs.com/ikdl/p/15599297.html
Author: K哥爬虫
Title: 【JS 逆向百例】Ether Rock 空投接口 AES256 加密分析
相关阅读2
5</span
Title: JS_简单的效果-鼠标移动、点击、定位元素、修改颜色等
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Titletitle> 6 head> 7 <body> 8 <p id="p1">p> 9 <h1 id="header">h1> 10 <img id="image" src="landscape1.jpg" width="160" height="120"> 11 <hr> 12 <p id="p2">Hello World!p> 13 <p id="p3">Hello World!p> 14 <button type="button" onclick="document.getElementById('p2').style.color = 'red'">点击改变上面的Hello World!的颜色button> 15 <input type="button" value="隐藏文本" onclick="document.getElementById('p2').style.visibility='hidden'"/> 16 <input type="button" value="显示文本" onclick="document.getElementById('p2').style.visibility='visible'"/> 17 18 <hr> 19 <button id="myBtn">点这里button> 20 <p id="demo">p> 21 <hr> 22 <input type="text" id="fname" onchange="myFunction()" placeholder="离开输入框后,小写字母转为大写字母"> 23 <hr><h1>鼠标放在元素上,改变内容h1> 24 <div onmouseover="mOver(this)" onmouseout="mOut(this)" style="background-color: green;width: 120px;height: 30px;padding: 40px;">鼠标移动上面div> 25 26 <hr><h1>实例使用 addEventListener() 方法在同一个按钮中添加多个事件h1> 27 <button id="myBtn1">点我改变button> 28 <p id="demo1">不同的事件,不同的改变p> 29 30 <hr><h1>添加和移除元素(节点)h1> 31 <div id="div1"> 32 <p id="p4">这是一个段落p> 33 div> 34 <hr><h1>修改所有 < p > 元素的背景颜色h1> 35 <p>点击按钮修改p元素的背景颜色p> 36 <button onclick="myFunction4()">点击改变p元素颜色button> 37 38 39 <script> 40 document.write(Date());//绝对不要在文档(DOM)加载完成之后使用 document.write()。这会覆盖该文档 41 document.getElementById("p1").innerHTML = "新文本!";//改变 HTML 元素的内容 42 document.getElementById("header").innerHTML = "新标题!"; 43 document.getElementById("image").src = "landscape.jpg";//改变了 元素的 src 属性 44 //改变元素的样式
45 document.getElementById("p3").style.color = "blue"; 46 document.getElementById("p3").style.fontFamily = "Arial"; 47 document.getElementById("p3").style.fontSize = "larger"; 48 49 document.getElementById("myBtn").onclick = function () {displayDate()}; 50 function displayDate() { 51 document.getElementById("demo").innerHTML=Date(); 52 } 53 function myFunction() { 54 var x = document.getElementById("fname"); 55 x.value = x.value.toLocaleUpperCase(); 56 } 57 function mOver(obj) { 58 obj.innerHTML = "谢谢"; 59 obj.style.color = "yellow" 60 61 } 62 function mOut(obj) { 63 obj.innerHTML = "你的鼠标已离开"; 64 obj.style.color = "white" 65 } 66 67 var x = document.getElementById("myBtn1"); 68 x.addEventListener("mouseover",myFunction1); 69 x.addEventListener("click",myFunction2); 70 x.addEventListener("mouseout",myFunction3); 71 function myFunction1() { 72 document.getElementById("demo1").innerHTML += "鼠标放上来了
"; 73 document.getElementById("demo1").style.color = "blue" 74 } 75 function myFunction2() { 76 document.getElementById("demo1").innerHTML +="点击了鼠标
"; 77 document.getElementById("demo1").style.color = "red" 78 } 79 function myFunction3() { 80 document.getElementById("demo1").innerHTML +="鼠标移走了
"; 81 document.getElementById("demo1").style.color = "black" 82 } 83 window.addEventListener("resize",function () {//重置浏览器的窗口触发 "resize" 事件句柄 84 document.getElementById("demo1").innerHTML = Math.random(); 85 }); 86 87 var para = document.createElement("p");//用于创建元素
88 var node = document.createTextNode("这是一个新的段落");//为元素创建一个新的文本节点
89 para.appendChild(node);//将文本节点添加到元素中
90 var element=document.getElementById("div1");//查找已存在的元素 91 element.appendChild(para);//在一个已存在的元素中添加 p 元素 92 var child = document.getElementById("p4"); 93 element.insertBefore(para,child);//将新元素添加到开始位置 94 95 function myFunction4() { 96 var myCollection = document.getElementsByTagName("p"); 97 for(var i = 0; i<myCollection.length; i++){ 98 myCollection[i].style.color = "red"; 99 } 100 } 101 102 103 script> 104 body> 105 html>
Original: https://www.cnblogs.com/chunfang/p/13490143.html
Author: 白月如初12138
Title: JS_简单的效果-鼠标移动、点击、定位元素、修改颜色等
相关阅读3
Title: 居然长得的还没一只熊好看?用Python做一个颜值检测,结果就离了大谱
准备工作
在写代码之前,你需要先在Baidu开发者平台申请权限,步骤如下:
登录百度智能云
- https://cloud.baidu.com/?from=console,没有Baidu账号的注册一个
- 第一次进入会有这样一个页面,你自己随意填
; 通过界面右上角进入控制台
进入控制台后点击左上角的菜单栏
; 选中产品服务
点击创建应用
- 应用名称随便填
- 接口选择默认
- 应用归属选个人
- 应用描述随便填
- 然后点击立即创建
; 创建完毕后点击返回应用列表
重点点击领取免费资源
进行实名认证后领取服务类型里面的所有内容
实名认证需要一定时间
; 领取完毕之后回到应用列表
复制API Key和Secret Key里的内容,用于后期的接口认证
先去要一些美女的照片素材回来做颜值检测
开发环境
- Python 3.8
- Pycharm 2021.2
- 会使用API接口 百度云接口
模块使用
- requests >>> pip install requests
- tqdm >>> pip install tqdm
- os
- base64
第一个阶段 去采集主播照片数据
请求数据
url = f'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=2168&tagAll=0&page=1'
# headers 请求头 伪装Python的代码 不被识别出来是爬虫程序...
# headers 是一个字典数据类型
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'
}
# 通过requests模块去对url地址发送请求
response = requests.get(url=url, headers=headers)
解析数据,提取我们想要数据内容,主播名字,主播封面图url地址
# json数据提取内容 根据冒号左边的内容 提取冒号右边内容
data_list = response.json()['data']['datas']
for index in data_list:
# pprint.pprint(index)
name = index['nick']
img_url = index['screenshot']
翻页
for page in range(1, 11):
url = f'https://www.huya.com/cache.php?m=LiveList&do=getLiveListByPage&gameId=2168&tagAll=0&page={page}'
保存图片数据内容
img_content = requests.get(url=img_url, headers=headers).content
# 'img\\' 文件路径 name 文件名字 '.jpg' 文件后缀 >>> 文件名
# mode 保存方式 wb 二进制模式写入
# as 重命名 为 f
filename = 'img_1\\'
if not os.path.exists(filename):
os.mkdir(filename)
with open(filename + name + '.jpg', mode='wb') as f:
f.write(img_content) # 写入数据
print('正在保存: ', name)
颜值检测
调用接口进行识别
def get_beauty(img_base64):
host = 'https://aip.baidubce.com/oauth/2.0/token'
data = {
'grant_type': 'client_credentials',
'client_id': 'vXONiwhiVGlBaI2nRRIYLgz5',
'client_secret': 'ouZMTMuCGLi7pbeg734ftNxn9h3qN7R4'
}
response = requests.get(url=host, params=data)
token = response.json()['access_token']
# print(token)
'''
人脸检测与属性分析
'''
request_url = f"https://aip.baidubce.com/rest/2.0/face/v3/detect?access_token={token}"
params = {
"image": img_base64, # 需要传递 图片 base64
"image_type": "BASE64",
"face_field": "beauty"
}
headers = {'content-type': 'application/json'}
response = requests.post(request_url, data=params, headers=headers)
try:
beauty = response.json()['result']['face_list'][0]['beauty']
return beauty
except:
return '识别失败'
获取所有图片,进行排名
lis = []
files = os.listdir('img_1\\')
print('正在识别人脸, 颜值检测中, 请稍后.....')
for file in tqdm(files):
img_file = 'img_1\\' + file
img_name = file.split('.')[0]
# print(img_file)
f = open(img_file, mode='rb') # 读取一张图片内容
img_base64 = base64.b64encode(f.read())
beauty = get_beauty(img_base64)
if beauty != '识别失败':
dit = {
'主播': img_name,
'颜值': beauty,
}
lis.append(dit) # 把字典添加到空列表里面
# print(f'{img_name}颜值评分是{beauty}')
lis.sort(key=lambda x:x['颜值'], reverse=True)
num = 1
# 前10张照片的颜值排名
for index in lis:
print(f'颜值排名第{num}的是{index["主播"]}, 颜值评分是{index["颜值"]}')
num += 1
看看排名情况
前三名
emmm。。。。。。
; 然我看来看看最后三名
我不服,最后一名居然输给了一只熊和一个男的,而且才得22分?
看了下官方的文档,最后一名可能是因为手挡住了脸部,但被一只熊给打败了,就离谱
Original: https://www.cnblogs.com/qshhl/p/15775020.html
Author: 松鼠爱吃饼干
Title: 居然长得的还没一只熊好看?用Python做一个颜值检测,结果就离了大谱