首页
直播
壁纸
免责声明
更多
统计
关于
Search
1
一款自动化渗透工具包 TscanPlus
225 阅读
2
获取一张美国虚拟信用卡
223 阅读
3
JS Document.evaluate()的使用
199 阅读
4
Git冲突:Please commit your changes or stash them before you merge
176 阅读
5
Python 31条 pip 命令全解析
164 阅读
默认分类
操作系统
Linux
管理面板
实用工具
开发语言
PHP
Web
python
typecho
ThinkPHP
layui
爬虫
文章分享
登录
Search
标签搜索
python
php
web
linux
Git
js
requests
自动化
宝塔
thinkphp
Centos
adb
html
typecho
layui
jquery
ubuntu
multipass
虚拟机
thikphp
YiYun
累计撰写
54
篇文章
累计收到
21
条评论
首页
栏目
默认分类
操作系统
Linux
管理面板
实用工具
开发语言
PHP
Web
python
typecho
ThinkPHP
layui
爬虫
文章分享
页面
直播
壁纸
免责声明
统计
关于
搜索到
54
篇与
的结果
2024-03-28
python3.6根据m3u8下载mp4视频
这篇文章主要为大家详细介绍了python3.6根据m3u8下载mp4视频,具有一定的参考价值,感兴趣的小伙伴们可以参考一下需要下载某网站的视频,chrome浏览器按F12打开开发者模式,发现视频链接是以"blob:http"开头的链接,打开这个链接后找不到网页,网上查了下,找到了下载方法,在这里做个记录,如果有错误,欢迎指出。程序在Windows 10下运行,不过Linux应该也没问题。使用到的有re模块,requests模块和Crypto模块,其中requests模块和Crypto模块如果没安装可以使用pip命令安装。(Crypto模块安装感觉比较坑,我是从anaconda里拷贝了一份)下面开始正题:注:以下使用的m3u8文件所在的网站是自己搭建用来测试的,链接可能会失效。首先在chrome的network里找到一个m3u8文件的请求,可以通过它下载视频。通过Preview可以看到m3u8文件的内容。这里m3u8文件比较重要的内容有两个。一个是URI后面的链接,这个是加密和解密的秘钥,如果m3u8文件里有这个URI,那么这个视频就是经过了加密的,加密的方法可以看URI前面,这里是AES-128加密算法。另一个是以ts结尾链接,这个是视频片段,如果是没进行加密的,可以直接打开这个链接下载视频片段,下载下来的是后缀为ts的文件,一般可以直接播放,不过时间很短。如果是加密过的,下载后播放会提示视频文件已损坏。知道这些后,就可以进行下载了,先获取m3u8文件的内容,然后解析出秘钥(key)和ts的链接,然后下载key对每一个ts进行解密,保存到一个mp4文件里。下载用的是requests模块,解析key和ts的链接是用的re模块,解密用的是Crypto模块。使用Crypto需要注意三个地方,一个是安装和导入,第二个是Crypto里AES.new的参数,第三个是decrypt方法的参数。下面先看代码。导入模块:import re import requests from Crypto.Cipher import AES初始设置:# 保存的mp4文件名 name = "dream_it_possible.mp4" # m3u8文件的url url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8" # 请求头,不一定需要,看网站更改 headers = { "Referer": "http://www.jiuyi.info/video/dream_it_possible", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", }获取m3u8文件内容,并解析出key和ts文件的url。# 获取m3u8文件内容 r = requests.get(url) # 通过正值表达式获取key和ts的url k = re.compile(r"http://.*?\.key") # key的正则匹配 t = re.compile(r"http://.*?\.ts") # ts的正则匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表下载并解密ts文件,保存为mp4文件。# 下载key key = requests.get(key_url).content # 解密并保存ts for ts_url in ts_urls: ts_name = ts_url.split("/")[-1] # ts文件名 # 解密,new有三个参数, # 第一个是秘钥(key)的二进制数据, # 第二个使用下面这个就好 # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV sprytor = AES.new(key, AES.MODE_CBC, IV=key) # 获取ts文件二进制数据 ts = requests.get(ts_url).content # 密文长度不为16的倍数,则添加二进制"0"直到长度为16的倍数 while len(ts) % 16 != 0: ts += b"0" # 写入mp4文件 with open(name, "ab") as file: # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0" file.write(sprytor.decrypt(ts)) print(name, "下载完成")到这里就下载完成了。完整代码:import re import requests from Crypto.Cipher import AES # 保存的mp4文件名 name = "dream_it_possible.mp4" # m3u8文件的url url = "http://www.jiuyi.info/static/video/secret/dream_it_possible.m3u8" # 请求头,不一定需要,看网站更改 headers = { "Referer": "http://www.jiuyi.info/video/dream_it_possible", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " "(KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36", } print("正在解析:" + url.split("/")[-1]) # 获取m3u8文件内容 r = requests.get(url) # 通过正值表达式获取key和ts的链接 k = re.compile(r"http://.*?\.key") # key的正则匹配 t = re.compile(r"http://.*?\.ts") # ts的正则匹配 key_url = k.findall(r.text)[0] # key的url ts_urls = t.findall(r.text) # ts的url列表 # 下载key的二进制数据 print("正在下载key") key = requests.get(key_url).content # 解密并保存ts for ts_url in ts_urls: ts_name = ts_url.split("/")[-1] # ts文件名 # 解密,new有三个参数, # 第一个是秘钥(key)的二进制数据, # 第二个使用下面这个就好 # 第三个IV在m3u8文件里URI后面会给出,如果没有,可以尝试把秘钥(key)赋值给IV sprytor = AES.new(key, AES.MODE_CBC, IV=key) # 获取ts文件二进制数据 print("正在下载:" + ts_name) ts = requests.get(ts_url).content # 密文长度不为16的倍数,则添加b"0"直到长度为16的倍数 while len(ts) % 16 != 0: ts += b"0" print("正在解密:" + ts_name) # 写入mp4文件 with open(name, "ab") as file: # # decrypt方法的参数需要为16的倍数,如果不是,需要在后面补二进制"0" file.write(sprytor.decrypt(ts)) print("保存成功:" + ts_name) print(name, "下载完成")
2024年03月28日
71 阅读
0 评论
0 点赞
2024-03-28
python爬虫爬取视频时,实现实时进度条显示
一、全部代码展示from contextlib import closing from requests import get url = 'https://v26-web.douyinvod.com/57cdd29ee3a718825bf7b1b14d63955b/615d475f/video/tos/cn/tos-cn-ve-15/72c47fb481464cfda3d415b9759aade7/?a=6383&br=2192&bt=2192&cd=0%7C0%7C0&ch=26&cr=0&cs=0&cv=1&dr=0&ds=4&er=&ft=jal9wj--bz7ThWG4S1ct&l=021633499366600fdbddc0200fff0030a92169a000000490f5507&lr=all&mime_type=video_mp4&net=0&pl=0&qs=0&rc=ank7OzU6ZnRkNjMzNGkzM0ApNmY4aGU8MzwzNzo3ZjNpZWdiYXBtcjQwLXNgLS1kLTBzczYtNS0tMmE1Xi82Yy9gLTE6Yw%3D%3D&vl=&vr=' with closing(get(url, stream=True)) as response: chunk_size = 1024 # 单次请求最大值 # response.headers['content-length']得到的数据类型是str而不是int content_size = int(response.headers['content-length']) # 文件总大小 data_count = 0 # 当前已传输的大小 with open('文件名.mp4', "wb") as file: for data in response.iter_content(chunk_size=chunk_size): file.write(data) done_block = int((data_count / content_size) * 50) # 已经下载的文件大小 data_count = data_count + len(data) # 实时进度条进度 now_jd = (data_count / content_size) * 100 # %% 表示% print("\r [%s%s] %d%% " % (done_block * '█', ' ' * (50 - 1 - done_block), now_jd), end=" ")注:上面的url已过期,需要各位自己去找网页上的视频url二、解释1.with closing我们在日常读取文件资源时,经常会用到with open() as f:的句子。但是使用with语句的时候是需要条件的,任何对象,只要正确实现了上下文管理,就可以使用with语句,实现上下文管理是通过__enter__和__exit__这两个方法实现的。with用法(没有实现上下文管理)class Door(): def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()结果报错了:with用法(实现上下文管理)用__enter__和__exit__实现了上下文管理class Door(): def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close() 结果没报错: closing用法(完美解决上述问题)一个对象没有实现上下文,我们就不能把它用于with语句。这个时候,可以用 contextlib 中的closing()来把该对象变为上下文对象。class Door(): def __enter__(self): print('Begin') return self def __exit__(self, exc_type, exc_value, traceback): if exc_type: print('Error') else: print('End') def open(self): print('Door is opened') def close(self): print('Door is closed') with Door() as d: d.open() d.close()例如:用with语句使用requests中的get(url) 也就是本文中的案例,使用with closing()下载视频(在网页中)2.文件流stream想象一下,如果把文件读取比作向池子里抽水,同步会阻塞程序,异步会等待结果,如果池子非常大呢?因此有了文件流,它就好比你一边抽一边取,不用等池子满了再用,所以对于一些大型文件(几个G的视频)一般会用到这个参数。 (对小型文件也可以使用)3.response.headers['content-length']这表示获取文件的总大小,但是它得到的结果的数据类型是str而不是int,因此需要进行数据类型转换。4.response.iter_content()该方法一般用于从网上下载文件和网页(需要用到requests.get(url))其中chunk_size表示单次请求最大值。5.\r和%\r表示回车(回到行首)%是一种占位符而对于%%,第一个%起到了转义的作用,使结果输出为百分号%
2024年03月28日
99 阅读
0 评论
0 点赞
2024-03-28
分享常用的40个网站制作技巧
将彻底屏蔽鼠标右键οncοntextmenu= "window.event.returnValue=false " 可用于Table<table border οncοntextmenu=return(false)> <td> no </td></table> 取消选取、防止复制<body onselectstart= "return false "> 不准粘贴οnpaste= "return false " 防止复制οncοpy= "return false; " oncut= "return false; " IE地址栏前换成自己的图标<link rel= "Shortcut Icon " href= "favicon.ico ">可以在收藏夹中显示出你的图标<link rel= "Bookmark " href= "favicon.ico "> 关闭输入法<input style= "ime-mode:disabled "> 永远都会带着框架<script language= "JavaScript "> if (window == top)top.location.href = "frames.htm "; //frames.htm为框架网页 </script>防止被人frame<SCRIPT LANGUAGE=JAVASCRIPT> if (top.location != self.location)top.location=self.location; </SCRIPT>网页将不能被另存为<noscript> <iframe src= "/blog/*.html> "; </iframe> </noscript>查看网页源代码<input type=button value=查看网页源代码 οnclick= "window.location = "view-source: "+ "http://www.williamlong.info " ">删除时确认<a href= "javascript:if(confirm( "确实要删除吗? "))location= "boos.asp?&areyou=删除&page=1 " "> 删除 </a>取得控件的绝对位置//Javascript <script language= "Javascript "> function getIE(e){ var t=e.offsetTop; var l=e.offsetLeft; while(e=e.offsetParent) alert( "top= "+t+ "/nleft= "+l); } </script> //VBScript <script language= "VBScript "> function getIE() dim t,l,a,b set a=document.all.img1 t=document.all.img1.offsetTop l=document.all.img1.offsetLeft while a.tagName <> "BODY " set a = a.offsetParent t=t+a.offsetTop l=l+a.offsetLeft wend msgbox "top= "&t&chr(13)& "left= "&l,64, "得到控件的位置 " end function </script>光标是停在文本框文字的最后<script language= "javascript "> function cc() { var e = event.srcElement; var r =e.createTextRange(); r.moveStart( "character ",e.value.length); r.collapse(true); r.select(); } </script> <input type=text name=text1 value= "123 " οnfοcus= "cc() ">判断上一页的来源javascript: document.referrer最小化、最大化、关闭窗口<object id=hh1 classid= "clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11 "> <param name= "Command " value= "Minimize "> </object> <object id=hh2 classid= "clsid:ADB880A6-D8FF-11CF-9377-00AA003B7A11 "> <param name= "Command " value= "Maximize "> </object> <OBJECT id=hh3 classid= "clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11 "> <PARAM NAME= "Command " VALUE= "Close "> </OBJECT> <input type=button value=最小化 οnclick=hh1.Click()> <input type=button value=最大化 οnclick=hh2.Click()> <input type=button value=关闭 οnclick=hh3.Click()> 本例适用于IE屏蔽功能键Shift,Alt,Ctrl<script> function look(){ if(event.shiftKey) alert( "禁止按Shift键! "); //可以换成ALT CTRL } document.οnkeydοwn=look; </script>网页不会被缓存<META HTTP-EQUIV= "pragma " CONTENT= "no-cache "> <META HTTP-EQUIV= "Cache-Control " CONTENT= "no-cache, must-revalidate "> <META HTTP-EQUIV= "expires " CONTENT= "Wed, 26 Feb 1997 08:21:57 GMT "> 或者 <META HTTP-EQUIV= "expires " CONTENT= "0 ">怎样让表单没有凹凸感?<input type=text style= "border:1 solid #000000 "> 或 <input type=text style= "border-left:none; border-right:none; border-top:none; border-bottom:1 solid #000000 "> </textarea>div span layer的区别<div> (division)用来定义大段的页面元素,会产生转行 <span> 用来定义同一行内的元素,跟</div>的唯一区别是不产生转行 </layer> 是ns的标记,ie不支持,相当于 让弹出窗口总是在最上面:<body οnblur= "this.focus(); ">不要滚动条?让竖条没有: <body style= "overflow:scroll;overflow-y:hidden "> </body> 让横条没有: <body style= "overflow:scroll;overflow-x:hidden "> </body> 两个都去掉?更简单了 <body scroll= "no "> </body>怎样去掉图片链接点击后,图片周围的虚线?<a href= "# " onFocus= "this.blur() "> <img src= "/blog/logo.jpg " border=0> </a>电子邮件处理提交表单<form name= "form1 " method= "post " action= "mailto:****@***.com " enctype= "text/plain "> <input type=submit> </form>在打开的子窗口刷新父窗口的代码里如何写?window.opener.location.reload()如何设定打开页面的大小<body οnlοad= "top.resizeTo(300,200); "> 打开页面的位置 <body οnlοad= "top.moveBy(300,200); ">在页面中如何加入不是满铺的背景图片,拉动页面时背景图不动<STYLE> body {background-image:url(/blog/logo.gif); background-repeat:no-repeat; background-position:center;background-attachment: fixed} </STYLE>检查一段字符串是否全由数字组成<script language= "Javascript "> function checkNum(str){return str.match(//D/)==null} alert(checkNum( "1232142141 ")) alert(checkNum( "123214214a1 ")) </script>获得一个窗口的大小document.body.clientWidth; document.body.clientHeight怎么判断是否是字符if (/[^/x00-/xff]/g.test(s)) alert( "含有汉字 "); else alert( "全是字符 ");TEXTAREA自适应文字行数的多少<textarea rows=1 name=s1 cols=27 onpropertychange= "this.style.posHeight=this.scrollHeight "> </textarea>日期减去天数等于第二个日期<script language=Javascript> function cc(dd,dadd) { //可以加上错误处理 var a = new Date(dd) a = a.valueOf() a = a - dadd * 24 * 60 * 60 * 1000 a = new Date(a) alert(a.getFullYear() + "年 " + (a.getMonth() + 1) + "月 " + a.getDate() + "日 ") } cc( "12/23/2002 ",2) </script>选择了哪一个Radio<HTML> <script language= "vbscript "> function checkme() for each ob in radio1 if ob.checked then window.alert ob.value next end function </script> <BODY> <INPUT name= "radio1 " type= "radio " value= "style " checked> Style <INPUT name= "radio1 " type= "radio " value= "barcode "> Barcode <INPUT type= "button " value= "check " οnclick= "checkme() "> </BODY> </HTML>脚本永不出错<SCRIPT LANGUAGE= "JavaScript "> <!-- Hide function killErrors() { return true; } window.onerror = killErrors; // --> </SCRIPT>ENTER键可以让光标移到下一个输入框<input οnkeydοwn= "if(event.keyCode==13)event.keyCode=9 "> 问题点数:0 回复次数:60 显示所有回复显示星级回复显示楼主回复 netnpc cooly 等 级: 发表于:2007-11-14 12:05:271楼 得分:0检测某个网站的链接速度:把如下代码加入 区域中:<script language=Javascript> tim=1 setInterval( "tim++ ",100) b=1 var autourl=new Array() autourl[1]= "www.njcatv.net " autourl[2]= "javacool.3322.net " autourl[3]= "www.sina.com.cn " autourl[4]= "www.nuaa.edu.cn " autourl[5]= "www.cctv.com " function butt(){ document.write( " <form name=autof> ") for(var i=1;i <autourl.length;i++) document.write( " <input type=text name=txt "+i+ " size=10 value= "/blog/测试中......> " =》 <input type=text name=url "+i+ " size=40> =》 <input type=button value=GO οnclick=window.open(this.form.url "+i+ ".value)> <br/> ") document.write( " <input type=submit value=刷新> </form> ") } butt() function auto(url) else b++ } function run(){for(var i=1;i <autourl.length;i++)document.write( " <img src=http:// "+autourl+ "/ "+Math.random()+ " width=1 height=1 οnerrοr=auto( "http:// "+autourl+ " ")> ")} run() </script>各种样式的光标auto :标准光标default :标准箭头hand :手形光标wait :等待光标text :I形光标vertical-text :水平I形光标no-drop :不可拖动光标not-allowed :无效光标help :?帮助光标all-scroll :三角方向标move :移动标crosshair :十字标e-resizen-resizenw-resizew-resizes-resizese-resizesw-resize页面进入和退出的特效进入页面<meta http-equiv= "Page-Enter " content= "revealTrans(duration=x, transition=y) ">推出页面<meta http-equiv= "Page-Exit " content= "revealTrans(duration=x, transition=y) ">这个是页面被载入和调出时的一些特效。duration表示特效的持续时间,以秒为单位。transition表示使用哪种特效,取值为1-23: 0 矩形缩小 1 矩形扩大 2 圆形缩小 3 圆形扩大 4 下到上刷新 5 上到下刷新 6 左到右刷新 7 右到左刷新 8 竖百叶窗 9 横百叶窗 10 错位横百叶窗 11 错位竖百叶窗 12 点扩散 13 左右到中间刷新 14 中间到左右刷新 15 中间到上下 16 上下到中间 17 右下到左上 18 右上到左下 19 左上到右下 20 左下到右上 21 横条 22 竖条 23 以上22种随机选择一种在规定时间内跳转<META http-equiv=V= "REFRESH " content= "5;URL=http://www.williamlong.info ">网页是否被检索<meta name= "ROBOTS " content= "属性值 "> 其中属性值有以下一些: 属性值为 "all ": 文件将被检索,且页上链接可被查询; 属性值为 "none ": 文件不被检索,而且不查询页上的链接; 属性值为 "index ": 文件将被检索; 属性值为 "follow ": 查询页上的链接; 属性值为 "noindex ": 文件不检索,但可被查询链接; 属性值为 "nofollow ": 文件不被检索,但可查询页上的链接。 最大化窗口? <script language= "JavaScript "> <!-- self.moveTo(0,0) self.resizeTo(screen.availWidth,screen.availHeight) //--> </script> 解决问题:由于层与下拉框之间的优先级是:下拉框 > 层,因此在显示的时候,会因为优先级的次序而会出现如上问题。(如果几个元素都是层的话,我们可以通过层的 z-index 属性来设置)解决办法就是:给层中放一个优先级比下拉框更高的元素(iframe),从而解决此问题!具体解决代码如下: <div id= "menu " style= "position:absolute; visibility:hidden; top:20px; left:20px; width:100px; height:200px; background-color:#6699cc; "> <table> <tr> <td> item 1 </td> </tr> <tr> <td> item 2 </td> </tr> <tr> <td> item 3 </td> </tr> <tr> <td> item 4 </td> </tr> <tr> <td> item 5 </td> </tr> </table> <iframe src= "/blog/javascript:false " style= "position:absolute; visibility:inherit; top:0px; left:0px; width:100px; height:200px; z-index:-1; filter= 'progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=0) '; "> </iframe> </div> <a href= "# " οnclick= "document.getElementById( 'menu ').style.visibility= 'visible ' "> menu </a> <form> <select> <option> A form selection list </option> </select> </form> 输入框也可以做的很漂亮了 <div align= "center "> <input type= "hidden " name= "hao " value= "yes "> 外向数: <input name=answer style= "color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192) "> 没回答的题数: <input name=unanswer id= "unanswer " style= "color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192) "> <br/> 总得分: <input name=score id= "score " style= "color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192) "> 结 论: <input name=xgjg id= "xgjg " style= "color: rgb(255,0,0); border-left: medium none; border-right: medium none; border-top: medium none; border-bottom: 1px solid rgb(192,192,192) "> <br/> <br/> <input onClick=processForm(this.form) style= "FONT-FAMILY: 宋体; FONT-SIZE: 9pt " type=button value=查看结果 name= "button "> <input type= "reset " name= "Submit " value= "重做 "> </div> 注意:修改 <body> 为 <body οnlοad= "max.Click() "> 即为打开最大 化窗口,而如果改为 <body οnlοad= "min.Click() "> 就变为窗口一打开就最小化 <object id= "min " type= "application/x-oleobject " classid= "clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11 "> <param name= "Command " value= "Minimize "> </object> <object id= "max " type= "application/x-oleobject " classid= "clsid:adb880a6-d8ff-11cf-9377-00aa003b7a11 "> <param name= "Command " value= "Maximize "> </object> </body> 页面自动刷新(说明) 当你做网页时,是不是有的时候想让你的网页自动不停刷新,或者过一段时间自动跳转到另外一个你自己设定的页面?其实实现这个效果非常地简单,而且这个效果甚至不能称之为特效。你只要把如下代码加入你的网页中就可以了。 1,页面自动刷新:把如下代码加入 <head> 区域中 <meta http-equiv= "refresh " content= "20 "> ,其中20指每隔20秒刷新一次页面. 2,页面自动跳转:把如下代码加入 <head> 区域中 <meta http-equiv= "refresh " content= "20;url=http://www.williamlong.info "> ,其中20指隔20秒后跳转到http://www.williamlong.info页面。 页面自动关闭 5000是指时间 <body onLoad= "setTimeout(window.close, 5000) "> 弹出窗口自动关闭 10秒后弹出窗口自动关闭 注意:在新的tan.htm的body中要加 <onLoad= "closeit() "> head <script language= "JavaScript "> <!-- var gt = unescape( '%3e '); var popup = null; var over = "Launch Pop-up Navigator "; popup = window.open( ' ', 'popupnav ', 'width=225,height=235,resizable=1,scrollbars=auto '); if (popup != null) { if (popup.opener == null) { popup.opener = self; } popup.location.href = 'tan.htm '; } // --> </script> <body> 注意:这段代码是在新建文件中的 <script language= "JavaScript "> function closeit() </script> 这个可不是 <iframe> (引用)呀。是直接调用的。以下代码加入 <body> 区域 <object type= "text/x-scriptlet " width= "800 " height= "1000 " data= "../index.htm "> </object>原文出处: 分享常用的40个网站制作技巧
2024年03月28日
71 阅读
0 评论
0 点赞
2024-03-28
adb(Android Debug Bridge)安装使用教程
一、说明adb的db是debug bridge而不是和gdb一样指debug,这意思是说adb不能像gdb那样能一步步调试代码,但可以启到一些类似调试的功能。下面就针对这些功能进行介绍,本文根据官方文档“http://adbshell.com/commands”整理而成。这种烂大街的文章本不该再写了,但无耐每次自己用都得搜索筛选一藩,索性写下来权当就给自己看。二、安装如果安装了android sdk那么在sdk的platform-tools文件夹下就已经有adb了(使用时有点问题,我选择直接去下了一个)。如果没有安装android sdk,那么也可以直接下载adb,解压即可使用。为了方便建议将解压到的目录加入环境变量。三、使用3.1 启动调试设备模拟器----直接启动模拟手机真机----通过usb线把手机接到电脑3.2 查看当前有哪些设备adb devices第一列是设备序列号;其中“ip:port”组合的是模拟设备,“e6466a68”这种开头的是usb连接上来的真实手机。如果只有一台设备,那么所有下面介绍的命令会自动在该设备上执行,如果有多个设备那么需要通过-s指定设备序列号不然会报“error: more than one device/emulator”(adb -s device_serial_number command形式)。为了方便,在介绍后续命令前我将关掉上图中序列号为192.168.225.101:5555的模拟设备。3.3 安装软件包adb install /path/to/apk.apk安装时有些手机可能要在手机上点击确认进行安装,不然会拒绝安装导致安装失败(报错:INSTALL_FAILED_USER_RESTRICTED: Install canceled by user)。如果报错“error: unknown host service”,那有可能是360手机助手等占用了连接,通过任务管理器将其关闭即可。3.4 查看已安装的软件包adb shell pm list packages此时会列出手机中所有已安装的转件包,为了快速找到自己想要的软件的包名,可以使用grep/findstr等命令进行过滤。3.5 卸载已安装软件包卸载不能通过安装apk时的apk文件名进行卸卸,需要指定软件完整包名进行卸载,包名可通过3.4介绍的办法进行查找adb uninstall package_name3.6 查看apk数据存放位置adb shell pm path package_name3.7 清空apk数据adb shell pm clear package_name3.8 查看当前所在目录adb shell pwd3.9 查看根目录下有哪些文件(夹)adb shell ls /3.10 查看磁盘挂载情况adb shell df -h3.11 上传文件到手机adb push /local/path/to/file/filename /phone/file/path/to/save路径linux用斜框windows用反斜杠3.12 从手机下载文件到本地adb pull /phone/path/to/file/filename /local/file/path/to/save3.13 执行其他linux命令要执行诸如cd、rm、mkdir、touch、cp、mv等等命令,都使用以下格式即可;如要带参数和在shell中使用一样直接带后面即可adb shell command parameters当然也可以直接使用adb shell进入交互shell,不用每次都带abd shell头;退出使用exit。如下图所示:不过有些命令使用adb shell形式和进入交互shell形式,输出是不一样的,没有深究。3.14 查看系统参数adb shell dumpsys system_parameter参考 :https://blog.csdn.net/gaojinshan/article/details/9455193原文出处: adb(Android Debug Bridge)安装使用教程
2024年03月28日
61 阅读
0 评论
0 点赞
2024-03-28
requests 模块笔记
导入模块import requests请求方式: requests.get("https://www.baidu.com") requests.post("http://httpbin.org/post") requests.put("http://httpbin.org/put") requests.delete("http://httpbin.org/delete") requests.head("http://httpbin.org/get") requests.options("http://httpbin.org/get")获取数据: r = requests.get('http://www.baidu.com') #像目标url地址发送get请求,返回一个response对象 response.text返回的是Unicode格式,通常需要转换为utf-8格式。 response.content是二进制模式,可以下载视频之类的,如果想看的话需要decode成utf-8格式。 # response.content.decode("utf-8) 或 response.encoding="utf-8" 转码 print(r.text) # 返回响应的内容 print(r.content) # 这样获取的数据是二进制数据 print(r.url) # 打印请求网址的地址 print(r.status_code) # 打印请求页面的状态(状态码)# r.ok的布尔值便可以知道是否登陆成功 print(r.cookies) # 打印请求网址的cookies信息 print(r.headers) # 打印请求网址的headers所有信息 print(r.encoding) # 获取/修改网页编码 print(r.json()) # 返回json数据 print(r.history) # 打印请求的历史记录(以列表的形式显示)下载图片 response = requests.get("https://github.com/favicon.ico") with open('favicon.ico', 'wb') as f: f.write(response.content)例子:往请求链接中添加一些数据(data、headers、cookies、proxies...): import requests data = {'name': 'germey', 'age': '22'} cookie = {'key':'value'} headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36'} proxies = {"http": "http://127.0.0.1:9743} requests.get(url='https://www.baidu.com/baidu', params={'wd': 'python',}) # 为url传递参数 https://www.baidu.com/baidu?wd=python response = requests.post( "https://www.zhihu.com/explore", data=data, # 如果传递的是string而不是dict,需要先调用dumps方法格式化一下 cookies=cookie, headers=headers, proxies=proxies) print (response.headers.get('content-type')) #访问响应头部分内容 补: requests.get(url, allow_redirects=False) # 不允许重定向,默认True # verify=False # 关闭证书验证其他操作会话维持cookie的一个作用就是可以用于模拟登陆,做会话维持 import requests session = requests.session() session.get('http://httpbin.org/cookies/set/number/12456') response = session.get('http://httpbin.org/cookies') print(response.text)代理设置 import requests proxies = { "http": "http://127.0.0.1:9743", # 设置普通代理 "https": "https://127.0.0.1:9743", # 设置普通代理 "http": "http://user:password@127.0.0.1:9743/", # 设置用户名和密码代理 } response = requests.get("https://www.taobao.com", proxies=proxies) print(response.status_code)设置socks代理安装socks模块 pip3 install 'requests[socks]' import requests proxies = { 'http': 'socks5://127.0.0.1:9742', 'https': 'socks5://127.0.0.1:9742' } response = requests.get("https://www.taobao.com", proxies=proxies) print(response.status_code)超时设置 import requests from requests.exceptions import ReadTimeout try: response = requests.get("http://httpbin.org/get", timeout = 0.5)#设置秒数超时,仅对于连接有效 print(response.status_code) except ReadTimeout: print('Timeout')获取cookie import requests response = requests.get("https://www.baidu.com") print(response.cookies) for key, value in response.cookies.items(): print(key + '=' + value)文件上传 import requests files = {'file': open('favicon.ico', 'rb')} response = requests.post("http://httpbin.org/post", files=files) print(response.text)认证设置 import requests from requests.auth import HTTPBasicAuth r = requests.get('http://120.27.34.24:9001', auth=HTTPBasicAuth('user', '123')) # r = requests.get('http://120.27.34.24:9001', auth=('user', '123')) print(r.status_code)关闭证书验证 import requests response = requests.get('https://www.12306.cn',verify=False) print(response.status_code)消除验证证书的警报 from requests.packages import urllib3 import requests urllib3.disable_warnings() response = requests.get('https://www.12306.cn',verify=False) print(response.status_code)手动设置证书 import requests response = requests.get('https://www.12306.cn', cert=('/path/server.crt', '/path/key')) print(response.status_code)异常处理 # RequestException继承IOError, # HTTPError,ConnectionError,Timeout继承RequestionException # ProxyError,SSLError继承ConnectionError # ReadTimeout继承Timeout异常 import requests from requests.exceptions import ReadTimeout, ConnectionError, RequestException try: response = requests.get("http://httpbin.org/get", timeout = 0.5) print(response.status_code) except ReadTimeout: print('Timeout') except ConnectionError: print('Connection error') except RequestException: print('Error') # RequestException # 发送一个模糊的异常 # ConnectionError # 发生连接错误时的异常 # HTTPError # 发生HTTP错误时的异常 # URLRequired # URL错误时的异常 # ConnectTimeout # 连接服务器是请求超时 # ReadTimeout # 服务器没有在指定的时间内发送数据 # Timeout # 请求超时原文出处: requests 模块笔记
2024年03月28日
69 阅读
0 评论
0 点赞
1
...
7
8
9
...
11