PHP curl模仿用户登陆新浪微博发微博例子
前天接到一个需求需要模拟登陆微博然后进行发微博,以前干过很多的模拟登录阿里妈妈,微信,还有些其他的内部系统,至今没有出现不能登录的,哈哈,所以也就没有当一回事情,可是当分析新浪的登陆过程的时候才感觉到压力,?澹?苈氲募用芊绞礁悴欢ò。??虾芏嗟亩际侵?暗募用芩惴 sha1(sha1(sha1(pwd)).once.servertime) ,肯定都用不了,主要使这个加密算法搞不定所以密码都搞不定别谈登录的,接着就在网上各种找代码,一个小时毫无所获,?辶耍?獯胃迷趺窗炷兀?氨吲6即党鋈チ恕M蝗幌氲降锹嫉氖焙蛴幸桓龃?so,是不是我用微博的帐号密码也能登录到新浪邮箱或者其他新浪产品去,感觉希望很大,哈哈,果然微博的帐号可以直接登录所有的新浪产品,再次访问微博我已经在登录状态了,证明这个有神马用呢?
其实吧很有用的,一个大公司在一个项目投入的技术和这个项目盈利和前景有很大关系,微博他可以花很大的心思去做,但是其他不一定就,哈哈,万一找到那个地方的密码没有加密那岂不是很好说了。(PS:对网络安全比较感兴趣,这个方式对黑客来说叫做旁注,旁注就是,当黑客在攻击一个网站的时候,这个网站安全做的非常好,没有什么已知漏洞,攻破难度较大,所以黑客会找找该网站下服务器下其他网站,然后找一个比较容易攻破的,通过这个网站挂马,shell,提权,然后目标网站也就沦陷,以为在同一个服务器,所以….目标就是拿到目标站,无论哪种方法只要拿下就行,很淫荡的想法有没有)
https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543简单抓抓包发现密码并没有加密,哈哈,我们不是能模拟登录了吗? 嗯,其实这里高兴的有点早了
先登录新浪的吧,代码分分钟就搞定了。返回的是一个json数组
代码如下 | 复制代码 |
//var_dump($loginData);exit; $login = json_decode(loginPost($loginUrl,$loginData),true); |
}返回的是一个json数据转成数组即可
代码如下 | 复制代码 |
array (size=4) |
这个时候说明我们登录成功了,但是其实我们的微博首页的地址并不是weibo,com,而是 http://weibo.com/bipeng0405/home?wvr=5 这样地址,我们怎么获取这个地址了,很简单,直接抓取weibo。com然后他会自动给你跳转回去的,你只需要把跳转的地址记录下来即可
代码如下 | 复制代码 |
$return = curl_exec($ch); $info = curl_getinfo($ch); |
curl_close($ch);这里还有一个问题,这个时候你可能发现没有跳转到自己微博的首页,这是什么原因呢,可以看看登陆时候有两个连接地址,其中有一个weibo域下的一个地址,猜测应该是进行了cookie的设置所以先获取一边他吧。
代码如下 | 复制代码 |
get($login['crossDomainUrlList'][0]); |
这个代码要在刚才weibo.com获取之前,否则会出现问题的哦
这就是登录的逻辑了,过程很漫长花了差不多一天的时候,唉。。没有心情写文章了
原文来自:http://www.mapenggang.com
ZipArchive类是一个文件压缩解压类是一个php自来的zip类,我们可以直接简单创建一个类然后就能实现打包了,下面一聚教程小编给各位介绍一下吧,有需要了解的朋友可进入参考。
这里我采用的是php自带的ZipArchive类
a) 我们只需要new一个ZipArchive对象,然后使用open方法创建一个zip文件,接着使用addFile方法,将要打包的文件写入刚刚创建的zip文件中,最好还得记得关闭该对象。
b) 注意点:使用open方法的时候,第二个参数$flags是可选的,$flags用来指定对打开的zip文件的处理方式,共有四种情况
i.ZIPARCHIVE::OVERWRITE 总是创建一个新的文件,如果指定的zip文件存在,则会覆盖掉
ii. ZIPARCHIVE::CREATE如果指定的zip文件不存在,则新建一个
iii. ZIPARCHIVE::EXCL 如果指定的zip文件存在,则会报错
iv. ZIPARCHIVE::CHECKCONS
一、解压缩zip文件
代码如下 | 复制代码 |
$zip = new ZipArchive;//新建一个ZipArchive的对象 |
二、将文件压缩成zip文件
代码如下 | 复制代码 |
$zip = new ZipArchive; |
三、文件追加内容添加到zip文件
代码如下 | 复制代码 |
$zip = new ZipArchive; $res = $zip->open('test.zip', ZipArchive::CREATE); if ($res === TRUE) { $zip->addFromString('test.txt', 'file content goes here'); $zip->close(); echo 'ok'; } else { echo 'failed'; } |
例子
执行打包代码:
代码如下 | 复制代码 |
import('ORG.Util.FileToZip'); // 打包下载 $cur_file =getcwd().'/dimg/2014052916/'; $handler = opendir($cur_file); //$cur_file 文件所在目录 $download_file = array(); $i = 0; while( ($filename = readdir($handler)) !== false ) { if($filename != '.' && $filename != '..') { $download_file[$i++] = $filename; } } closedir($handler); $scandir=new traverseDir($cur_file,$save_path); //$save_path zip包文件目录 $scandir->tozip($download_file); |
FileToZip 类:
代码如下 | 复制代码 |
<?php /** * 遍历目录,打包成zip格式 */ class traverseDir{ public $currentdir;//当前目录 public $filename;//文件名 public $fileinfo;//用于保存当前目录下的所有文件名和目录名以及文件大小 public $savepath; public function __construct($curpath,$savepath){ $this->currentdir=$curpath;//返回当前目录 $this->savepath=$savepath;//返回当前目录 } //遍历目录 public function scandir($filepath){ if (is_dir($filepath)){ $arr=scandir($filepath); foreach ($arr as $k=>$v){ $this->fileinfo[$v][]=$this->getfilesize($v); } }else { echo "<script>alert('当前目录不是有效目录');</script>"; } } /** * 返回文件的大小 * * @param string $filename 文件名 * @return 文件大小(KB) */ public function getfilesize($fname){ return filesize($fname)/1024; } /** * 压缩文件(zip格式) */ public function tozip($items){ $zip=new ZipArchive(); $zipname=date('YmdHis',time()); if (!file_exists($zipname)){ $zip->open($savepath.$zipname.'.zip',ZipArchive::OVERWRITE);//创建一个空的zip文件 for ($i=0;$i<count($items);$i++){ $zip->addFile($this->currentdir.'/'.$items[$i],$items[$i]); } $zip->close(); $dw=new download($zipname.'.zip',$savepath); //下载文件 $dw->getfiles(); unlink($savepath.$zipname.'.zip'); //下载完成后要进行删除 } } } /** * 下载文件 * */ class download{ protected $_filename; protected $_filepath; protected $_filesize;//文件大小 protected $savepath;//文件大小 public function __construct($filename,$savepath){ $this->_filename=$filename; $this->_filepath=$savepath.$filename; } //获取文件名 public function getfilename(){ return $this->_filename; } //获取文件路径(包含文件名) public function getfilepath(){ return $this->_filepath; } //获取文件大小 public function getfilesize(){ return $this->_filesize=number_format(filesize($this->_filepath)/(1024*1024),2);//去小数点后两位 } //下载文件的功能 public function getfiles(){ //检查文件是否存在 if (file_exists($this->_filepath)){ //打开文件 $file = fopen($this->_filepath,"r"); //返回的文件类型 Header("Content-type: application/octet-stream"); //按照字节大小返回 Header("Accept-Ranges: bytes"); //返回文件的大小 Header("Accept-Length: ".filesize($this->_filepath)); //这里对客户端的弹出对话框,对应的文件名 Header("Content-Disposition: attachment; filename=".$this->_filename); //修改之前,一次性将数据传输给客户端 echo fread($file, filesize($this->_filepath)); //修改之后,一次只传输1024个字节的数据给客户端 //向客户端回送数据 $buffer=1024;// //判断文件是否读完 while (!feof($file)) { //将文件读入内存 $file_data=fread($file,$buffer); //每次向客户端回送1024个字节的数据 echo $file_data; } fclose($file); }else { echo "<script>alert('对不起,您要下载的文件不存在');</script>"; } } } |
例子1
最近在写一个电子商务的网站,在做购物车的时候才发现php里面没有map这种数据结构,我们不能简单的通过一个hashmap来实现购物车,于是我想到到数组,通过数组的值的格式化来进行编写。
也就是说,我们是通过循环数组的值,通过拆分值来判断数据是不是重复,比如我现在浏览的商品的id是4,添加的数量是3,我就在数组里面存放4-3,以后如果当遇到是id是4的时候,我们只是需要时改变数组里面这个位置的数值,如果id在数组里面拆分比较都不存在,则往数组里面添加数据。删除购物车制定id 的商品也是循环数组,这个值,使用unset()来释放这个值。
具体的实现代码:
—————————————————————————————————————————–
代码如下 | 复制代码 |
<?php session_start(); if($_SESSION['carts']==””){ $carts=array(); array_push($carts, “0-0″); $_SESSION['carts']=$carts; } $method=$_GET['method']; if($method==”add”){ $productId=$_GET['productid']; $number=$_GET['number']; $carts=$_SESSION['carts']; $flag=”false”; for($i=0;$i<sizeof($carts);$i++){ $pn=$carts[$i]; $pns=split(“-”, $pn); if($pns[0]==$productId){ $carts[$i]=$productId.”-”.$number; $flag=”true”; $location=$i; } } if($flag==”true”){ $carts[$location]=$productId.”-”.$number; }else{ array_push($carts, $productId.”-”.$number); } $_SESSION['carts']=$carts; } if($method==”delete”){ $productId=$_GET['productid']; $carts=$_SESSION['carts']; for($i=0;$i<sizeof($carts);$i++){ $pn=$carts[$i]; $pns=split(“-”, $pn); if($pns[0]==$productId){ unset($carts[$i]); } } $_SESSION['carts']=$carts; } ?> |
———————————————————————————————————–
上面电子商务课程的时候做的一个简单的程序了,就是一个在线购物,不过还是90多分的哦!~ 其实只要是这种类似的程序,都是简单的增删改查系统,无非就是就对数据库的操作,我们要做的就是很好的实现这个业务逻辑,以及能很好的设计相关的字段来控制,比如是商品的状态的控制,是上线还是下线,还是推荐的。
现在看看连接数据库的代码吧!~
数据库配置代码,其实这个可以在xml配置文件里面设置:
代码如下 | 复制代码 |
class DbConfig{ var $databaseAddress="180.153.178.89"; var $dataBaseUser="pantingwen"; var $databasePassword="753116"; var $database="sqlpantingwen"; /** * @return the $databaseAddress */ public function getDatabaseAddress() { return $this->databaseAddress; } /** * @return the $dataBaseUser */ public function getDataBaseUser() { return $this->dataBaseUser; } /** * @return the $databasePassword */ public function getDatabasePassword() { return $this->databasePassword; } /** * @return the $database */ public function getDatabase() { return $this->database; } /** * @param field_type $databaseAddress */ public function setDatabaseAddress($databaseAddress) { $this->databaseAddress = $databaseAddress; } /** * @param field_type $dataBaseUser */ public function setDataBaseUser($dataBaseUser) { $this->dataBaseUser = $dataBaseUser; } /** * @param field_type $databasePassword */ public function setDatabasePassword($databasePassword) { $this->databasePassword = $databasePassword; } /** * @param field_type $database */ public function setDatabase($database) { $this->database = $database; } } ?> 数据库连接代码: include_once 'DbConfig.php'; define("conn", getcon()); function getcon(){ $dbConfig=new DbConfig(); $con=mysql_connect($dbConfig->getDatabaseAddress(),$dbConfig->getDataBaseUser(),$dbConfig->getDatabasePassword()); return $con; } /** * 选择一款数据库 * Enter description here ... */ function _select_db(){ $dbConfig=new DbConfig(); if(!mysql_select_db($dbConfig->getDatabase())){ exit('找不到指定的数据库'); } } /** * 设置字符集 * Enter description here ... */ function _set_names(){ if(!mysql_query('set names utf8')){ exit('字符集错误'); } } function _query($_sql){ _select_db(); _set_names(); if(!$result=mysql_query($_sql,conn)){ echo mysql_error(); } return $result; } /** * 只能是获取一个数据组 * Enter description here ... * @param unknown_type $_sql */ function _fetch_array($_sql){ return mysql_fetch_array(_query($_sql),MYSQL_ASSOC); } /** * 返回数据组 * Enter description here ... * @param unknown_type $_sql */ function _fetch_array_list($_result){ return mysql_fetch_array($_result,MYSQL_ASSOC); } /** * 影响到到的记录数 * Enter description here ... */ function _affect_rows(){ return mysql_affected_rows(); } /** * 判断是不是存在数据 * Enter description here ... * @param unknown_type $_sql * @param unknown_type $_info */ function _is_repeat($_sql,$_info){ if(_fetch_array($_sql)){ } } function _close(){ if(!mysql_close(_conn)){ exit('关闭异常'); } } ?> |
效果截图:
前面写过了一篇文章是图片反盗链的,我自己弄得单独的页面就采用了sina的短连接,对于短连接来说还是方便的,地址太长占地方。下面分享源码,有注释,非原创代码如下 | 复制代码 |
<?php function curlQuery($url) { //初始化curl,当然,你也可以用fsockopen代替 //设置网址 //附加Head内容 //是否输出返回头信息 //将curl_exec的结果返回 //设置超时时间 //执行 //关闭curl回话 return $result; //简单处理下url,sina对于没有协议(http://)开头的和不规范的地址会返回错误 //根据长网址获取短网址 //获取请求结果 //下面这行注释用于调试,你可以把注释去掉看看从sina返回的信息是什么东西 //解析json //异常情况返回false //根据短网址获取长网址,此函数重用了不少sinaShortenUrl中的代码,以方便你阅读对比,你可以自行合并两个函数 //获取请求结果 //下面这行注释用于调试,你可以把注释去掉看看从sina返回的信息是什么东西 //解析json //异常情况返回false //要缩短的网址 $url = filterUrl($url); |
本文中短连接已经附带的一个appkey不用再自己申请KEY当然你如果需要使用你自己的您也可以自己去替换。至于用法就看你了,镶入到其他程序使用啊?单独做个生成短连接的页面都不管我的事啊。使用方法不多说。最近比较懒。
本方法使用PHPEXCEL插件读取excel文件转化为数组了,后期还有没有完成的我们可以把转换成数组之后再保存到mysql数据库这个就非常的方便了。代码如下 | 复制代码 |
<?php /** * @desc PHPEXCEL导入 * return array(); */ function importExcel($file) { require_once 'PHPExcel.php'; require_once 'PHPExcel/IOFactory.php'; require_once 'PHPExcel/Reader/Excel5.php'; $objReader = PHPExcel_IOFactory::createReader('Excel5');//use excel2007 for 2007 format $objPHPExcel = $objReader->load($file); $sheet = $objPHPExcel->getSheet(0); $highestRow = $sheet->getHighestRow(); // 取得总行数 $highestColumn = $sheet->getHighestColumn(); // 取得总列数 $objWorksheet = $objPHPExcel->getActiveSheet(); $highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn); $excelData = array(); for ($row = 1; $row <= $highestRow; $row++) { for ($col = 0; $col < $highestColumnIndex; $col++) { $excelData[$row][] =(string)$objWorksheet->getCellByColumnAndRow($col, $row)->getValue(); } } return $excelData; } //用法: importExcel('test.xsl'); |
相关文章
- php 获取用户IP与IE信息程序 function onlineip() { global $_SERVER; if(getenv('HTTP_CLIENT_IP')) { $onlineip = getenv('HTTP_CLIENT_IP');...2016-11-25
- php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p> </p> <p> </p> <form name="form1...2016-11-25
- 先还是要说明本例的业务流程: 1、前端用户输入内容,并对输入的内容字数进行实时统计。 2、用户提交数据,jQuery实现通过Ajax向后台发送数据。 3、后台PHP接收提交表单的数据,并对数据进行必要的安全过滤。 4、后台PHP连接...2015-10-21
- 当来访者浏览器语言是中文就进入中文版面,国外的用户默认浏览器不是中文的就跳转英文页面。 <?php $lan = substr( $HTTP_ACCEPT_LANGUAGE,0,5); if ($lan == "zh-cn") print("<meta http-equiv='refresh' c...2015-11-08
- 首先来看下流程:流程原理: 1.通过code获得access_token通过授权,并获取用户的信息(包括用户u_id)(这个u_id在后面的第三方登录表里面叫sina_id,那个表是需要自己建的) 2.查询第三方登录表,如果不存在用户sina_id,分2...2014-05-31
- 【问题描述】:同一用户在同一时间多次登录如果不能检测出来,是危险的。因为,你无法知道是否有其他用户在登录你的账户。如何禁止同一用户多次登录呢? 【解决方案】 (1) 每次登录,身份认证成功后,重新产生一个session_id。 s...2015-11-24
- 一个用Javascript检测用户输入密码强度的效果代码,以下代码主要是从以下四个方面检测用户输入的密码的强度的,有兴趣的朋友可以自己添加或修改成自己想要的形式! 1. 如果输入的密码位数少于5位,那么就判定为弱。 2. 如果...2015-10-23
- 这是注册程序是一款当用户输入完用户名是,就会自动去数据库中查询用户要注册的用户名是否己经被注册了,如果是返回提示否则提示可以注册。 conn.php文件 代...2016-11-25
- 一、功能简述 正是微博如火如荼的时节,其中各个微博的分享功能是网站推广产品的好东东啊,此时如何方便快捷的使用微博的分享功能就显得比较重要了。我的站点每篇文章的底部有一些分享的链接: 不过我觉得这些分享基本上...2015-11-08
- 这篇文章主要给大家介绍了关于微信小程序用户授权最佳实践的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-08
- cookie 的用途之一是存储用户在特定网站上的密码和 id。另外,也用于存储起始页的首选项。在提供个人化查看的网站上,将要求阁下的网络浏览器利用阁下计算机硬驱上的少量...2016-11-25
- 知识归纳因为MySQL是使用User和Host两个字段来确定用户身份的,这样就带来一个问题,就是一个客户端到底属于哪个host。 如果一个客户端同时匹配几个Host,对用户的确定将按照下面的优先级来排 基本观点越精确的匹配越优先...2015-11-08
- 这篇文章主要介绍了sqlserver添加sa用户和密码的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-05-07
- 注册页面是大多数网站必备的页面,所以很有必要对自己的注册页面做些精心的设计。下面三张图,第一张是注册的展示页面,第二张思维导图就一个简单的逻辑,第三张是通过firebug查看调用的JS文件。 一、给每个输入框写下说明在...2015-11-24
- 装完数据库清理一些默认账号的时候不小心把root删除了,flush privileges 之后的新 root 忘了grant任何权限,查看mysqld选项里面有个 −−skip-grant-tables复制代码 代码如下: #/usr/libexec/mysqld --verbos...2015-03-15
Win2012服务器 远程桌面帐户允许多用户同时登录的配置方法
这篇文章主要介绍了Win2012服务器 远程桌面帐户允许多用户同时登录的配置方法,需要的朋友可以参考下...2016-11-01- 第一,网站的内容;请各位站长朋友不要一天到晚只想着出什么好的绝招来推广网站,却忽略了网站的内容;其实网站的内容是极为重要的,因为这是你的本,你的根!网站的内容只有不断...2017-07-06
- 这篇文章主要介绍了关于JSP用户登录连接数据库的相关资料,需要的朋友可以参考下面文章内容...2021-09-07
- 一位站长译的一个国外的如何判断用户是否访问过某个网址文章,个人感觉写得非常不错,下面分享一下。 我们经常有这样的需求:想知道用户之前有没有访问过某个网址。有...2016-09-20
- 我们先来看下效果图CSS* { padding: 0; margin: 0; }li { list-style: none; }body { background: #eee; }#t_sina { width: 390px; padding: 10px; background: #fff; margin: 50px auto 0; font-size: 12px; border...2015-10-21