首页 > 编程技术 > php

PHP curl模仿用户登陆新浪微博发微博例子

发布时间:2016-11-25 16:19

现在用php做模仿用户登录我们都会使用到PHP curl函数了,因为只有它才可以实现像用户一样的去访问别人网站了,下面给大家介绍一下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数组

 代码如下 复制代码


$password = $p;
$username = base64_encode($u);
$loginUrl = 'https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1403138799543';
$loginData['entry'] = 'sso';
$loginData['gateway'] = '1';
$loginData['from'] = 'null';
$loginData['savestate'] = '30';
$loginData['useticket'] = '0';
$loginData['pagerefer'] = '';
$loginData['vsnf'] = '1';
$loginData['su'] = base64_encode($u);
$loginData['service'] = 'sso';
$loginData['sp'] = $password;
$loginData['sr'] = '1920*1080';
$loginData['encoding'] = 'UTF-8';
$loginData['cdult'] = '3';
$loginData['domain'] = 'sina.com.cn';
$loginData['prelt'] = '0';
$loginData['returntype'] = 'TEXT';

//var_dump($loginData);exit;

$login = json_decode(loginPost($loginUrl,$loginData),true);
var_dump($login);exit;function loginPost($url,$data){
global $cookie_file ;
//echo $cookie_file ;exit;
$tmp = '';
if(is_array($data)){
foreach($data as $key =>$value){
$tmp .= $key."=".$value."&";
}
$post = trim($tmp,"&");
}else{
$post = $data;
}
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file);
$return = curl_exec($ch);
$info = curl_getinfo($ch);
curl_close($ch);
return $return;

 }返回的是一个json数据转成数组即可

 代码如下 复制代码

 

array (size=4)
  'retcode' => string '0' (length=1)
  'uid' => string '1920109964' (length=10)
  'nick' => string '毕姥爷讲故事' (length=18)
  'crossDomainUrlList' =>
    array (size=2)
      0 => string 'https://passport.weibo.com/wbsso/login?ticket=ST-MTkyMDEwOTk2NA%3D%3D-1403228192-gz-AB37DC0C18BA3BFCD90AEFAC6115149D&ssosavestate=1434764192' (length=140)
      1 => string 'https://crosdom.weicaifu.com/sso/crosdom?action=login&savestate=1434764192' (length=74)

这个时候说明我们登录成功了,但是其实我们的微博首页的地址并不是weibo,com,而是 http://weibo.com/bipeng0405/home?wvr=5 这样地址,我们怎么获取这个地址了,很简单,直接抓取weibo。com然后他会自动给你跳转回去的,你只需要把跳转的地址记录下来即可

 代码如下 复制代码


$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,"http://weibo.com"); 
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch,CURLOPT_COOKIEFILE, $cookie_file); 
curl_setopt($ch,CURLOPT_COOKIEJAR,$cookie_file); 

$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的对象
/*
通过ZipArchive的对象处理zip文件
$zip->open这个方法的参数表示处理的zip文件名。
如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
*/
if ($zip->open('test.zip') === TRUE)
{
$zip->extractTo('images');//假设解压缩到在当前路径下images文件夹的子文件夹php
$zip->close();//关闭处理的zip文件
}

二、将文件压缩成zip文件

 代码如下 复制代码

$zip = new ZipArchive;
/*
$zip->open这个方法第一个参数表示处理的zip文件名。
第二个参数表示处理模式,ZipArchive::OVERWRITE表示如果zip文件存在,就覆盖掉原来的zip文件。
如果参数使用ZIPARCHIVE::CREATE,系统就会往原来的zip文件里添加内容。
如果不是为了多次添加内容到zip文件,建议使用ZipArchive::OVERWRITE。
使用这两个参数,如果zip文件不存在,系统都会自动新建。
如果对zip文件对象操作成功,$zip->open这个方法会返回TRUE
*/
if ($zip->open('test.zip', ZipArchive::OVERWRITE) === TRUE)
{
$zip->addFile('image.txt');//假设加入的文件名是image.txt,在当前路径下
$zip->close();
}

三、文件追加内容添加到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;
}
?>

———————————————————————————————————–
php实现购物车程序代码

上面电子商务课程的时候做的一个简单的程序了,就是一个在线购物,不过还是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('关闭异常');
}
}
?>

效果截图:php实现购物车程序代码

前面写过了一篇文章是图片反盗链的,我自己弄得单独的页面就采用了sina的短连接,对于短连接来说还是方便的,地址太长占地方。下面分享源码,有注释,非原创
 代码如下 复制代码

<?php
//Sina App_Key
define('SINA_APPKEY', '31641035');

function curlQuery($url) {
 //设置附加HTTP头
 $addHead = array(
 "Content-type: application/json"
 );

 //初始化curl,当然,你也可以用fsockopen代替
 $curl_obj = curl_init();

 //设置网址
 curl_setopt($curl_obj, CURLOPT_URL, $url);

 //附加Head内容
 curl_setopt($curl_obj, CURLOPT_HTTPHEADER, $addHead);

 //是否输出返回头信息
 curl_setopt($curl_obj, CURLOPT_HEADER, 0);

 //将curl_exec的结果返回
 curl_setopt($curl_obj, CURLOPT_RETURNTRANSFER, 1);

 //设置超时时间
 curl_setopt($curl_obj, CURLOPT_TIMEOUT, 15);

 //执行
 $result = curl_exec($curl_obj);

 //关闭curl回话
 curl_close($curl_obj);

 return $result;
}

//简单处理下url,sina对于没有协议(http://)开头的和不规范的地址会返回错误
function filterUrl($url = '') {
 $url = trim(strtolower($url));
 $url = trim(preg_replace('/^http:///', '', $url));
 if ($url == '')
 return false;
 else
 return urlencode('http://' . $url);
}

//根据长网址获取短网址
function sinaShortenUrl($long_url) {
 //拼接请求地址,此地址你可以在官方的文档中查看到
 $url = 'http://api.t.sina.com.cn/short_url/shorten.json?source=' . SINA_APPKEY . '&url_long=' . $long_url;

 //获取请求结果
 $result = curlQuery($url);

 //下面这行注释用于调试,你可以把注释去掉看看从sina返回的信息是什么东西
 //print_r($result);exit();

 //解析json
 $json = json_decode($result);

 //异常情况返回false
 if (isset($json->error) || !isset($json[0]->url_short) || $json[0]->url_short == '')
 return false;
 else
 return $json[0]->url_short;
}

//根据短网址获取长网址,此函数重用了不少sinaShortenUrl中的代码,以方便你阅读对比,你可以自行合并两个函数
function sinaExpandUrl($short_url) {
 //拼接请求地址,此地址你可以在官方的文档中查看到
 $url = 'http://api.t.sina.com.cn/short_url/expand.json?source=' . SINA_APPKEY . '&url_short=' . $short_url;

 //获取请求结果
 $result = curlQuery($url);

 //下面这行注释用于调试,你可以把注释去掉看看从sina返回的信息是什么东西
 //print_r($result);exit();

 //解析json
 $json = json_decode($result);

 //异常情况返回false
 if (isset($json->error) || !isset($json[0]->url_long) || $json[0]->url_long == '')
 return false;
 else
 return $json[0]->url_long;
}

//要缩短的网址
$url = $long; //这里自己看着办,修改成你要缩短的网址还是获取post的数据还是怎么滴。

$url = filterUrl($url);
$short = sinaShortenUrl($url);
$ulong = sinaExpandUrl($short);
?>

本文中短连接已经附带的一个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');
标签:[!--infotagslink--]

您可能感兴趣的文章: