2020-12-19 myluzh
import itchat import requests import random import time def get_response(msg): url = 'http://i.itpk.cn/api.php'#自动回复API接口 data = { #接口参数 'api_key': 'xxxx', # Tuling Key,API的值 'api_secret': 'xxxx', # Tuling Key,API的值 'question': msg, # 发出去的消息 'type':'普通文本', 'limit':'8' } print('提出问题',msg) rqq = requests.post(url, data=data) # 当自动检测编码不正确时,手动指定编码 rqq.encoding = 'utf-8' print('响应内容:', rqq.text) time.sleep(random.randint(3,8))#随机延迟3-8秒 return (rqq.text) @itchat.msg_register(itchat.content.TEXT) # 用于接收来自朋友间的对话消息 def print_content(msg): return get_response(msg['Text']) itchat.auto_login(hotReload=True,enableCmdQR=True) # 通过微信扫描二维码登录 itchat.run()
2020-11-26 myluzh
import sys import os, re, shutil, time, collections, json from html.parser import HTMLParser from xml.etree import ElementTree as ETree import itchat from itchat.content import * msg_store = collections.OrderedDict() timeout = 600 sending_type = {'Picture': 'img', 'Video': 'vid'} data_path = 'data' nickname = '' bot = None if __name__ == '__main__': if not os.path.exists(data_path): os.mkdir(data_path) # if the QR code doesn't show correctly, you can try to change the value # of enableCdmQR to 1 or -1 or -2. It nothing works, you can change it to # enableCmdQR=True and a picture will show up. bot = itchat.new_instance() bot.auto_login(hotReload=True, enableCmdQR=2) nickname = bot.loginInfo['User']['NickName'] def clear_timeouted_message(): now = time.time() count = 0 for k, v in list(msg_store.items()): if now - v['ReceivedTime'] > timeout: count += 1 else: break for i in range(count): item = msg_store.popitem(last=False) def get_sender_receiver(msg): sender = nickname receiver = nickname if msg['FromUserName'][0:2] == '@@': # group chat sender = msg['ActualNickName'] m = bot.search_chatrooms(userName=msg['FromUserName']) if m is not None: receiver = m['NickName'] elif msg['ToUserName'][0:2] == '@@': # group chat by myself if 'ActualNickName' in msg: sender = msg['ActualNickName'] else: m = bot.search_friends(userName=msg['FromUserName']) if m is not None: sender = m['NickName'] m = bot.search_chatrooms(userName=msg['ToUserName']) if m is not None: receiver = m['NickName'] else: # personal chat m = bot.search_friends(userName=msg['FromUserName']) if m is not None: sender = m['NickName'] m = bot.search_friends(userName=msg['ToUserName']) if m is not None: receiver = m['NickName'] return HTMLParser().unescape(sender), HTMLParser().unescape(receiver) def print_msg(msg): msg_str = ' '.join(msg) print(msg_str) return msg_str def get_whole_msg(msg, download=False): sender, receiver = get_sender_receiver(msg) if len(msg['FileName']) > 0 and len(msg['Url']) == 0: if download: # download the file into data_path directory fn = os.path.join(data_path, msg['FileName']) msg['Text'](fn) if os.path.getsize(fn) == 0: return [] c = '@%s@%s' % (sending_type.get(msg['Type'], 'fil'), fn) else: c = '@%s@%s' % (sending_type.get(msg['Type'], 'fil'), msg['FileName']) return ['[%s]->[%s]:' % (sender, receiver), c] c = msg['Text'] if len(msg['Url']) > 0: try: # handle map label content_tree = ETree.fromstring(msg['OriContent']) if content_tree is not None: map_label = content_tree.find('location') if map_label is not None: c += ' ' + map_label.attrib['poiname'] c += ' ' + map_label.attrib['label'] except: pass url = HTMLParser().unescape(msg['Url']) c += ' ' + url return ['[%s]->[%s]: %s' % (sender, receiver, c)] @bot.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO, FRIENDS], isFriendChat=True, isGroupChat=True) def normal_msg(msg): print_msg(get_whole_msg(msg)) now = time.time() msg['ReceivedTime'] = now msg_id = msg['MsgId'] msg_store[msg_id] = msg clear_timeouted_message() @bot.msg_register([NOTE], isFriendChat=True, isGroupChat=True) def note_msg(msg): print_msg(get_whole_msg(msg)) content = HTMLParser().unescape(msg['Content']) try: content_tree = ETree.fromstring(content) except Exception: # invent/remove to chatroom return if content_tree is None: return revoked = content_tree.find('revokemsg') if revoked is None: return old_msg_id = revoked.find('msgid').text old_msg = msg_store.get(old_msg_id) if old_msg is None: return msg_send = get_whole_msg(old_msg, download=True) for m in msg_send: bot.send(m, toUserName='filehelper') clear_timeouted_message() if __name__ == '__main__': bot.run()
2020-10-9 myluzh
0x01
Github项目地址:https://github.com/PHPMailer/PHPMailer/
0x02
菜鸟教程实例:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require './src/Exception.php'; require './src/PHPMailer.php'; require './src/SMTP.php'; $mail = new PHPMailer(true); // Passing `true` enables exceptions try { //服务器配置 $mail->CharSet ="UTF-8"; //设定邮件编码 $mail->SMTPDebug = 0; // 调试模式输出 $mail->isSMTP(); // 使用SMTP $mail->Host = 'smtp.163.com'; // SMTP服务器 $mail->SMTPAuth = true; // 允许 SMTP 认证 $mail->Username = '邮箱用户名'; // SMTP 用户名 即邮箱的用户名 $mail->Password = '密码或者授权码'; // SMTP 密码 部分邮箱是授权码(例如163邮箱) $mail->SMTPSecure = 'ssl'; // 允许 TLS 或者ssl协议 $mail->Port = 465; // 服务器端口 25 或者465 具体要看邮箱服务器支持 $mail->setFrom('xxxx@163.com', 'Mailer'); //发件人 $mail->addAddress('aaaa@126.com', 'Joe'); // 收件人 //$mail->addAddress('ellen@example.com'); // 可添加多个收件人 $mail->addReplyTo('xxxx@163.com', 'info'); //回复的时候回复给哪个邮箱 建议和发件人一致 //$mail->addCC('cc@example.com'); //抄送 //$mail->addBCC('bcc@example.com'); //密送 //发送附件 // $mail->addAttachment('../xy.zip'); // 添加附件 // $mail->addAttachment('../thumb-1.jpg', 'new.jpg'); // 发送附件并且重命名 //Content $mail->isHTML(true); // 是否以HTML文档格式发送 发送后客户端可直接显示对应HTML内容 $mail->Subject = '这里是邮件标题' . time(); $mail->Body = '<h1>这里是邮件内容</h1>' . date('Y-m-d H:i:s'); $mail->AltBody = '如果邮件客户端不支持HTML则显示此内容'; $mail->send(); echo '邮件发送成功'; } catch (Exception $e) { echo '邮件发送失败: ', $mail->ErrorInfo; }
0x03 其他 (过程中遇到的问题,以及解决方案)
1.邮箱服务器搭建后无法发送邮件
解决方案:服务器提供商封掉了25端口,部分云厂商(如:阿里云,腾讯云)默认关闭25端口,需联系厂商开通25端口后才能正常使用邮局服务。
2.自建邮局,配置完PHPMailer(端口为25)运行后报错:发信SMTP Error: Could not connect to SMTP host.
解决方案:在服务器配置中加入下面代码:
$mail->SMTPOptions = array( 'ssl' => array( 'verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true ) );
2020-9-28 myluzh
function randomkeys($length) { $pattern = '1234567890ABCDEFGHIJKLOMNOPQRSTUVWXYZ'; $key = null; for($i=0;$i<$length;$i++) { $key.= $pattern[mt_rand(0,strlen($pattern)-1)]; //生成php随机数 } return $key; } $Code=randomkeys(6); //生成6位随机 echo $Code;
标签: php
2020-7-13 myluzh
<?php /** * 获取一张图片的主要颜色 * @param string $imgUrl 图片的本地路径或者在线路径 * @param boolean $isHex 是否获取16进制的主要颜色 */ function getMainColor($imgUrl,$isHex=false) { $imageInfo = getimagesize($imgUrl); //图片类型 $imgType = strtolower(substr(image_type_to_extension($imageInfo[2]), 1)); //对应函数 $imageFun = 'imagecreatefrom' . ($imgType == 'jpg' ? 'jpeg' : $imgType); $i = $imageFun($imgUrl); //循环色值 $rColorNum=$gColorNum=$bColorNum=$total=0; for ($x=0;$x<imagesx($i);$x++) { for ($y=0;$y<imagesy($i);$y++) { $rgb = imagecolorat($i,$x,$y); //三通道 $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; $rColorNum += $r; $gColorNum += $g; $bColorNum += $b; $total++; } } $rgb = array(); $r = round($rColorNum/$total); $g = round($gColorNum/$total); $b = round($bColorNum/$total); if($isHex){ return rgb2Hex($r, $g, $b); } return "rgb($r, $g, $b)"; } /** * RGB颜色转16进制颜色 * @param int|array $r * @param int $g * @param int $b */ function rgb2Hex($r, $g=-1, $b=-1) { if (is_array($r) && sizeof($r) == 3) list($r, $g, $b) = $r; $r = intval($r); $g = intval($g); $b = intval($b); $r = dechex($r<0?0:($r>255?255:$r)); $g = dechex($g<0?0:($g>255?255:$g)); $b = dechex($b<0?0:($b>255?255:$b)); $color = (strlen($r) < 2?'0':'').$r; $color .= (strlen($g) < 2?'0':'').$g; $color .= (strlen($b) < 2?'0':'').$b; return "#$color"; } echo getMainColor('https://cn.bing.com/th?id=OHR.AbuSimbelSunFest_EN-CN8625936842_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp'); //输出rgb(103, 54, 12) echo getMainColor('https://cn.bing.com/th?id=OHR.AbuSimbelSunFest_EN-CN8625936842_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp',1); //输出#67360c
标签: php
2020-6-12 myluzh
0x01 ==和===的问题
==是比较运算,它不会去检查条件式的表达式的类型。
===是恒等,它会检查查表达式的值与类型是否相等。
NULL,0,”0”,array()使用==和false比较时,都是会返回true的,而使用===却不会。
1.比较操作
一个数字和一个字符串进行比较,PHP会把字符串转换成数字再进行比较。PHP转换的规则的是:若字符串以数字开头,则取开头数字作为转换结果,若无则输出0。例如:123abc转换后应该是123,而abc则为0,0==0这当然是成立的啦!所以,0 ==’abc’是成立的。当有一个对比参数是整数的时候,会把另外一个参数强制转换为整数。
2.Hash比较
"0e132456789"=="0e7124511451155" //true "0e123456abc"=="0e1dddada" //false "0e1abc"=="0" //true
在进行比较运算时,如果遇到了0e\d+这种字符串,就会将这种字符串解析为科学计数法。所以上面例子中2个数的值都是0因而就相等了。如果不满足0e\d+这种模式就不会相等。
3.md5比较
<?php $a = md5('240610708'); // = 0e462097431906509019562988736854 $b = md5('QNKCDZO'); // = 0e830400451993494058024219903391 var_dump($a == $b); ?>
返回结果bool(true)
240610708 和 QNKCDZO md5值类型相似,但并不相同,在“==”相等操作符的运算下,结果返回了true。这是个经典的漏洞,只需要找到md5值为0exxx(xxx全为数字,共30位),这里我提供4个都可以通过的值:240610708、QNKCDZO、aabg7XSs、aabC9RqS
扩展:
先注册密码为240610708的用户A。
然后用密码QNKCDZO尝试登录用户A。
倘若成功登录,则证明此网站采用了不完备的加密体制md5一次加密。
先注册密码为0E33455555的用户A。
然后用密码0E234230570345尝试登录用户A。
倘若成功登录,则证明此网站采用了明文进行存储密码!
0x02 转换问题
1.类型转换
string转int:intval()函数
var_dump(intval('2')) //2 var_dump(intval('3abcd')) //3 var_dump(intval('abcd')) //0
说明intval()转换的时候,会将从字符串的开始进行转换知道遇到一个非数字的字符。即使出现无法转换的字符串,intval()不会报错而是返回0。
2.十六进制转换
"0x1e240"=="123456" //true "0x1e240"==123456 //true "0x1e240"=="1e240" //false
当其中的一个字符串是0x开头的时候,ox开头表示16进制,PHP会将此字符串解析成为十进制然后再进行比较,0×1e240解析成为十进制就是123456,所以与int类型和string类型的123456比较都是相等。
这样在不让输入数字但是后面还要和一串数字比较的情况下可以使用这种方法,将后面要比较的数字转为16进制,这样就可以绕过。
0x03 数组问题
if (isset($_GET['name']) and isset($_GET['password'])) { if ($_GET['name'] == $_GET['password']) print 'Your password can not be your name.'; else if (sha1($_GET['name']) === sha1($_GET['password'])) die('Flag: '.$flag); else print 'Invalid password';
name和password的值不能相同,其次,sha1加密之后的name和password的值又必须完全相同 我们知道,在php中,$a[] = 1;代表着$a[x] = 1;所以name[] = 1和password[]= 2相比较,可以跳过第一个判断,而如果使用sha1对一个数组进行加密,返回的将是NULL,NULL===NULL,这是成立的,所以构造两个数组绕过
0x04 常见函数问题
md5()
string md5 ( string $str [, bool $raw_output = false ] )
md5()中需要传入的是一个string类型的参数,当我们传递一个array时,它是不会报错的,函数无法求出array的MD5值,这样导致任意两个array的MD5值都相等,从而绕过输入数值的判断,在ctf代码审计中经常遇见。
strcmp()
int strcmp ( string $str1 , string $str2 )
进行字符串长度的比较,传入两个string的参数。如果str1小于str2,返回-1,相等返回0,否则返回1。strcmp函数比较字符串的本质是将两个变量转换为ascii,然后进行减法运算,然后根据运算结果来决定返回值。如果传入的参数为数字或数组
例1:
$array=[1,2,3]; var_dump(strcmp($array,'123')); //null,在某种意义上null也就是相当于false。
例2:
if (isset($_GET['password'])) { if (strcmp($_GET['password'], $flag) == 0) die('Flag: '.$flag); else print 'Invalid password'; }
此处使用strcmp()对pass和flag进行判断,如果==0,则输出flag。但是strcmp()函数只有在相等的情况下返回0。那么我们传入一个数组,它会返回NULL,而判断使用了==,而NULL==0是bool(true),这样就成功绕过。
switch()
如果switch是数字类型的case的判断时,switch会将其中的参数转换为int类型。
in_array()
bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
如果strict参数没有提供,那么in_array就会使用松散比较来判断$needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同。
$array=[0,1,2,'3']; var_dump(in_array('abc', $array)); //true var_dump(in_array('1bc', $array)); //true
可以看到上面的情况返回的都是true,因为’abc’会转换为0,’1bc’转换为1。
ereg()
int ereg(string pattern, string string, array [regs]);
字符串对比解析,ereg函数存在NULL截断漏洞,当ereg读取字符串string时,如果遇到了%00,后面的字符串就不会被解析。
bool类型的true跟任意字符串可以弱类型相等
内容参考原文:http://zjw.dropsec.xyz/
2020-5-23 myluzh
0x01 前言
今天在看一个网站JS代码的时候发现,JS代码为一串颜文字,而且还能被解析使用,搜索后得知为aaencode加密,此加密能把js代码转化成颜文字。
原作者的aaencode编码地址 https://utf-8.jp/public/aaencode.html
0x02编码过程
网页源码里可以查看到具体的编码过程,摘录如下。
function aaencode( text ) { var t; var b = [ "(c^_^o)", "(゚Θ゚)", "((o^_^o) - (゚Θ゚))", "(o^_^o)", "(゚ー゚)", "((゚ー゚) + (゚Θ゚))", "((o^_^o) +(o^_^o))", "((゚ー゚) + (o^_^o))", "((゚ー゚) + (゚ー゚))", "((゚ー゚) + (゚ー゚) + (゚Θ゚))", "(゚Д゚) .゚ω゚ノ", "(゚Д゚) .゚Θ゚ノ", "(゚Д゚) ['c']", "(゚Д゚) .゚ー゚ノ", "(゚Д゚) .゚Д゚ノ", "(゚Д゚) [゚Θ゚]" ]; var r = "゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); "; if( /ひだまりスケッチ×(365|356)\s*来週も見てくださいね[!!]/.test( text ) ){ r += "X=_=3; "; r += "\r\n\r\n X / _ / X < \"来週も見てくださいね!\";\r\n\r\n"; } r += "(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);"+ "(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] "+ ",゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] "+ ",゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];"+ "(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];"+ "(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];"+ "(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + "+ "((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+"+ "((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+"+ "((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+"+ "((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];"+ "(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+"+ "((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+"+ "((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; "+ "(゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\\\'; "+ "(゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];"+ "(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];"+//TODO "(゚Д゚) [゚o゚]='\\\"';"+ "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+"; r += "(゚Д゚)[゚o゚]+ "; for( var i = 0; i < text.length; i++ ){ n = text.charCodeAt( i ); t = "(゚Д゚)[゚ε゚]+"; if( n <= 127 ){ t += n.toString( 8 ).replace( /[0-7]/g, function(c){ return b[ c ] + "+ "; } ); }else{ var m = /[0-9a-f]{4}$/.exec( "000" + n.toString(16 ) )[0]; t += "(o゚ー゚o)+ " + m.replace( /[0-9a-f]/gi, function(c){ return b[ parseInt( c,16 ) ] + "+ "; } ); } r += t; } r += "(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');"; return r; }
0x03 PHP加解密脚本
<?php //实现两个PHP没有的JS常用函数,兼容中文。 function charCodeAt($str, $index) { $char = mb_substr($str, $index, 1, 'UTF-8'); if (mb_check_encoding($char, 'UTF-8')) { $ret = mb_convert_encoding($char, 'UTF-32BE', 'UTF-8'); return hexdec(bin2hex($ret)); } else { return null; } } function uchr ($codes) { if (is_scalar($codes)) $codes= func_get_args(); $str= ''; foreach ($codes as $code){ $buf = html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8'); $buf == '&#'.$code.';' && ($buf = mb_convert_encoding('&#' . intval($code) . ';', 'UTF-8', 'HTML-ENTITIES')); $str.= $buf; } return $str; } $b = [ "(c^_^o)", "(゚Θ゚)", "((o^_^o) - (゚Θ゚))", "(o^_^o)", "(゚ー゚)", "((゚ー゚) + (゚Θ゚))", "((o^_^o) +(o^_^o))", "((゚ー゚) + (o^_^o))", "((゚ー゚) + (゚ー゚))", "((゚ー゚) + (゚ー゚) + (゚Θ゚))", "(゚Д゚) .゚ω゚ノ", "(゚Д゚) .゚Θ゚ノ", "(゚Д゚) ['c']", "(゚Д゚) .゚ー゚ノ", "(゚Д゚) .゚Д゚ノ", "(゚Д゚) [゚Θ゚]" ]; //编码的过程 function aaencode($text){ global $b; $r = "゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); "; if(preg_match('/ひだまりスケッチ×(365|356)\s*来週も見てくださいね[!!]/', $text)){ $r .= "X=_=3; "; $r .= "\r\n\r\n X / _ / X < \"来週も見てくださいね!\";\r\n\r\n"; } $r .= "(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);". "(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ". ",゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ". ",゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];". "(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];". "(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];". "(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ". "((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+". "((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+". "((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+". "((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];". "(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+". "((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+". "((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; ". "(゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\\\'; ". "(゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];". "(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];". "(゚Д゚) [゚o゚]='\\\"';". "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+"; $r .= "(゚Д゚)[゚o゚]+ "; for( $i = 0; $i < mb_strlen($text); $i++ ){ $n = charCodeAt($text,$i); $t = "(゚Д゚)[゚ε゚]+"; if( $n <= 127 ){ $t .= preg_replace_callback('/[0-7]/', function($c)use ($b){ return $b[$c[0]]."+ "; }, ((string)decoct($n))); }else{ if(preg_match('/[0-9a-f]{4}$/', '000'.((string)dechex($n)),$result)){ $m = $result[0]; }else{ $m = ''; } $t .= "(o゚ー゚o)+ " . preg_replace_callback('/[0-9a-f]/i',function($c)use ($b){ return $b[ hexdec($c[0]) ] . "+ "; },$m); } $r .= $t; } $r .= "(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');"; return $r; } //解码的过程 function aadecode($text){ global $b; $text = strtr($text, ["(゚Д゚)[゚o゚]) (゚Θ゚)) ('_');" => '']); for($i=0;$i<count($b);$i++){ $buf = $b[$i]; if($i <=7){ //8进制逆向 $str = (($i)); $text = strtr($text, [$buf."+ "=>$str]); }else{ //16进制逆向 $text = strtr($text, [$buf."+ " => dechex($i)]); } } $text = preg_replace_callback('/\(゚Д゚\)\[゚ε゚\]\+(\d+)/', function($c){ return uchr(octdec($c[1])); }, $text); $text = preg_replace_callback('/\(゚Д゚\)\[゚ε゚\]\+\(o゚ー゚o\)\+\s+([0-9a-f]{4})/', function($c){ return uchr(hexdec($c[1])); }, $text); $pre = [ "゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚) =_=3; c=(゚Θ゚) =(゚ー゚)-(゚ー゚); ", "X=_=3; ", "\r\n\r\n X / _ / X < \"来週も見てくださいね!\";\r\n\r\n", "(゚Д゚) =(゚Θ゚)= (o^_^o)/ (o^_^o);", "(゚Д゚)={゚Θ゚: '_' ,゚ω゚ノ : ((゚ω゚ノ==3) +'_') [゚Θ゚] ", ",゚ー゚ノ :(゚ω゚ノ+ '_')[o^_^o -(゚Θ゚)] ", ",゚Д゚ノ:((゚ー゚==3) +'_')[゚ー゚] }; (゚Д゚) [゚Θ゚] =((゚ω゚ノ==3) +'_') [c^_^o];", "(゚Д゚) ['c'] = ((゚Д゚)+'_') [ (゚ー゚)+(゚ー゚)-(゚Θ゚) ];", "(゚Д゚) ['o'] = ((゚Д゚)+'_') [゚Θ゚];", "(゚o゚)=(゚Д゚) ['c']+(゚Д゚) ['o']+(゚ω゚ノ +'_')[゚Θ゚]+ ((゚ω゚ノ==3) +'_') [゚ー゚] + ", "((゚Д゚) +'_') [(゚ー゚)+(゚ー゚)]+ ((゚ー゚==3) +'_') [゚Θ゚]+", "((゚ー゚==3) +'_') [(゚ー゚) - (゚Θ゚)]+(゚Д゚) ['c']+", "((゚Д゚)+'_') [(゚ー゚)+(゚ー゚)]+ (゚Д゚) ['o']+", "((゚ー゚==3) +'_') [゚Θ゚];(゚Д゚) ['_'] =(o^_^o) [゚o゚] [゚o゚];", "(゚ε゚)=((゚ー゚==3) +'_') [゚Θ゚]+ (゚Д゚) .゚Д゚ノ+", "((゚Д゚)+'_') [(゚ー゚) + (゚ー゚)]+((゚ー゚==3) +'_') [o^_^o -゚Θ゚]+", "((゚ー゚==3) +'_') [゚Θ゚]+ (゚ω゚ノ +'_') [゚Θ゚]; ", "(゚ー゚)+=(゚Θ゚); (゚Д゚)[゚ε゚]='\\\\'; ", "(゚Д゚).゚Θ゚ノ=(゚Д゚+ ゚ー゚)[o^_^o -(゚Θ゚)];", "(o゚ー゚o)=(゚ω゚ノ +'_')[c^_^o];", "(゚Д゚) [゚o゚]='\\\"';", "(゚Д゚) ['_'] ( (゚Д゚) ['_'] (゚ε゚+", "(゚Д゚)[゚o゚]+ ", ]; $rA = []; foreach($pre as $val){ $rA[$val] = ''; } $text = strtr($text,$rA); return $text; } //加密 $crytext = aaencode('console.log("唐宋元明清");'); echo $crytext;//゚ω゚ノ= /`m´)ノ ~┻━┻ //*´∇`*/ ['_']; o=(゚ー゚)...... //解密 echo aadecode($crytext);//console.log("唐宋元明清");
2020-4-15 myluzh
requests是原生的http库,比urllib3更容易使用,语法格式如下:
requests.request.method(url,**kwargs)
参数 | 说明 |
methodw |
接收string。表示请求类型,例如GET,无默认值 |
url |
接收string。表示请求的URL,无默认值 |
**kwargs |
接收dict或其他python类型数据。根据具体需要添加的参数 |
实例:
import requests url = 'http://www.xxx.com/index.html' head = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'} rqq = requests.get(url, headers=head,timeout=2.0) #当自动检测编码不正确时,手动指定编码 rqq.encoding = 'utf-8' print('响应码:', rqq.status_code) print('编码:', rqq.encoding) print('请求头:', rqq.headers) print('响应实体:', rqq.text)
2020-4-15 myluzh
使用urllib3库生成一个完整的http请求,请求应该包含请求方式、请求连接、请求头、超时时间和重试次数。通过request方法可以创建一个请求,该方法返回http响应对象,语法如下:
urllib3.request(method,url,headers,timeout)
参数 | 说明 |
method |
接收string。表示请求类型,例如GET,无默认值 |
url |
接收string。表示请求的URL,无默认值 |
headers |
接收dict。请求头,默认为None |
data |
接收dict。POST提交的数据 |
timeout |
接收float。设置请求超时时间 |
fields |
接收dict。表示所请求类型自带参数,默认为None |
**urlopen_kw |
接收dict或者其他python中类型的数据。根据具体需要可添加的参数,无默认值 |
实例:
import urllib3 # 发送请求实例 http = urllib3.PoolManager() # 请求网址 url = 'http://www.xxx.com/index.html' # 请求头 head = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'} # 超时时间(connect连接超时时间,read读取超时时间) tm = urllib3.Timeout(connect=1.0, read=3.0) # retries重试次数,redirect重定向次数 rq = http.request('GET', url=url, headers=head, timeout=tm, retries=5, redirect=4) print('服务器响应码:', rq.status) print('响应实体', rq.data.decode('utf-8'))
2020-4-11 myluzh
# 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 输入待加密字符串 str = input('Please enter the string to be MD5 encrypted:\n') # 创建md5对象 m = hashlib.md5() # Tips # 此处必须encode # 若写法为m.update(str) 报错为: Unicode-objects must be encoded before hashing # 因为python3里默认的str是unicode # 或者 b = bytes(str, encoding='utf-8'),作用相同,都是encode为bytes b = str.encode(encoding='utf-8') m.update(b) str_md5 = m.hexdigest() #输出md5加密后的值 print('After MD5 encryption:\n' + str_md5)