这几天工作有大量用curl,curl就是模拟浏览器来传输数据,他支持很多的协议htpp,https,ftp….等等很多协议,在做采集和模拟用户来执行一些操作的时候非常有用的。
使用curl主要是四个步骤:
1、初始化url
2、设置请求的一些参数(cookie,head…)
3、执行请求
4、关闭资源
先说一个简单的采集,一般在获取一个网页的内容的时候我们最方便就是使用file_get_contents()函数来获取,现在我们通过curl来抓取一个网页的内容
代码如下 复制代码
$ch = curl_init();//初始化一个资源
curl_setopt($ch,curlopt_url,”http://www.mapenggang.com”);//设置我们要获取的网页
curl_setopt($ch,curlopt_returntransfer,1);//关闭直接输出
$string= curl_exec($ch);
curl_close($ch);
注:重点在于curl_setopt()这个函数的第二个参数(下面会有一些常用的资料)
这样我们就可以得到这个网页的内容,如果只有curl来做些这就大材小用了,curl其实可以用来做更加神奇的东西。
最近刚到一家创业型的新公司(尼玛,选择这个公司真的是比较纠结,因为手里有好几个offer,但是这边给的工资待遇很低,因为创业型公司吗。我也不知道为什么会选择这家公司,反正是为了选择这家公司,朋友都很不解,其实我也不知道为什么会选择这家,其他公司的工资大概是这家公司的两倍,希望这次没有选错,不然.想死的心都会有,说了这么多废话),做的是现在比较火的微信公众平台的开发,因为微信现在开放的接口特别的少,所以通过接口得到的东西特别的少(尼玛,小马哥你什么时候多放的借口啊!),但是官方提供的操作平台有很多接口中没有数据所以,我们需要去自己去找一些数据了,好吧,主角上场curl。
首先公众平台是要登录才能访问,那我就先登录吧(废话),首先需要抓包分析一下正常提交数据,这里我就不截图了(博客在bae平台上,编辑器还没有时间去理他,不太好使),通过抓包分析得出,微信的公众平台使用的是ajax登录,且密码在提交之前已经进行了md5加密(好像正规应该叫md5散列把,而且标准的md5散列应该是128位的,不过为了方便存储和传输就现在最多的就是32和16位了,刚了解,惭愧),还有很重要一点就是,微信公众平台采用的是https协议进行登录的。最爽的一点就是不用验证码,sogay。不然老费劲了,分析到这就可以了。come on !!!!
代码如下 复制代码
$password = md5($password);//因为刚才抓包发现是md5加密过的,所以这里我们提前把密码加密号
$post = username={$username}&pwd={$password}&f=json&imgcode=;
$loginurl = https://mp.weixin.qq.com/cgi-bin/login?;//微信登录的地址
//这里的头信息都是必须要设置的,这些你都可以在刚才抓包的时候获取到
$headerarray = array(
'accept:application/json, text/javascript, */*',
'content-type:application/x-www-form-urlencoded',
'referer:https://mp.weixin.qq.com/'
);
$ch = curl_init();
curl_setopt($ch,curlopt_url,$loginurl);
// 对认证证书来源的检查,0表示阻止对证书的合法性的检查。
curl_setopt($ch, curlopt_ssl_verifypeer, false);
// 从证书中检查ssl加密算法是否存在
curl_setopt($ch, curlopt_ssl_verifyhost, false);
curl_setopt($ch,curlopt_returntransfer,1);//关闭直接输出
curl_setopt($ch,curlopt_post,1);//使用post提交数据
curl_setopt($ch,curlopt_postfields,$post);//设置 post提交的数据
curl_setopt($ch,curlopt_useragent,'mozilla/5.0 (windows nt 5.1) applewebkit/537.36 (khtml, like gecko) chrome/30.0.1599.69 safari/537.36');//设置用户代理
curl_setopt($ch,curlopt_httpheader,$headerarray);//设置头信息
curl_setopt($ch,curlopt_cookiejar,$cookie_file);//设置cookie的保存目录,这里很重要,你懂的(cookie你都不存,你以为你是麻花腾啊!)
$logindata = curl_exec($ch);//这里会返回token,需要处理一下。
//获取到token的值
$logindata = json_decode($logindata,true);
$token = explode(=,$logindata['errmsg']);
$token = array_pop($token);
echo 登录微信系统成功
;
curl_close($ch);
上边就是登录微信公众平台的代码了,经测试十分好用+_+。
这几天微信公众平台接触的比较多,这个只是万里长征的第一步,后边我会分享一下如何将微信的fakeid 和 openid对应起来,实现自己可以自己的平台上显示用户的完整信息(据我了解,网上现在对于如何fakeid 和 openid对应来没有很好的解决方案,通过好几天的奋斗现在已经可以对应起来的,比较麻烦,且已有的用户是无法对起来的(其实这个理论上是可以的,但是没有做出来不乱说,其实是没有时间去做这个,有机会可以尝试,不过实现需要已有系统的支持,也就是你现在的系统必须记录了和用回的聊天记录(我说什么了?我什么都没有说!)))。
体育老师啊,你说你不好好带你的体育课,没有跑来教我们语文,这几天接触不少能写的东西太多了,所以想到那就写到那了,有点乱,几天主要用的是curl,所以今天说点curl的实例,正好就把手头的登录微信公众平台的东西写上来了,curl到此结束,后边我可能会写更多关于微信公众平台的东西。
附:
选项
可选value值
备注
curlopt_autoreferer
当根据location:重定向时,自动设置header中的referer:信息。
curlopt_binarytransfer
在启用curlopt_returntransfer的时候,返回原生的(raw)输出。
curlopt_cookiesession
启用时curl会仅仅传递一个session cookie,忽略其他的cookie,默认状况下curl会将所有的cookie返回给服务端。session cookie是指那些用来判断服务器端的session是否有效而存在的cookie。
curlopt_crlf
启用时将unix的换行符转换成回车换行符。
curlopt_dns_use_global_cache
启用时会启用一个全局的dns缓存,此项为线程安全的,并且默认启用。
curlopt_failonerror
显示http状态码,默认行为是忽略编号小于等于400的http信息。
curlopt_filetime
启用时会尝试修改远程文档中的信息。结果信息会通过curl_getinfo()函数的curlinfo_filetime选项返回。 curl_getinfo().
curlopt_followlocation
启用时会将服务器服务器返回的location: 放在header中递归的返回给服务器,使用curlopt_maxredirs可以限定递归返回的数量。
curlopt_forbid_reuse
在完成交互以后强迫断开连接,不能重用。
curlopt_fresh_connect
强制获取一个新的连接,替代缓存中的连接。
curlopt_ftp_use_eprt
启用时当ftp下载时,使用eprt (或 lprt)命令。设置为false时禁用eprt和lprt,使用port命令 only.
curlopt_ftp_use_epsv
启用时,在ftp传输过程中回复到pasv模式前首先尝试epsv命令。设置为false时禁用epsv命令。
curlopt_ftpappend
启用时追加写入文件而不是覆盖它。
curlopt_ftpascii
curlopt_transfertext的别名。
curlopt_ftplistonly
启用时只列出ftp目录的名字。
curlopt_header
启用时会将头文件的信息作为数据流输出。
curlinfo_header_out
启用时追踪句柄的请求字符串。
从 php 5.1.3 开始可用。curlinfo_前缀是故意的(intentional)。
curlopt_httpget
启用时会设置http的method为get,因为get是默认是,所以只在被修改的情况下使用。
curlopt_httpproxytunnel
启用时会通过http代理来传输。
curlopt_mute
启用时将curl函数中所有修改过的参数恢复默认值。
curlopt_netrc
在连接建立以后,访问~/.netrc文件获取用户名和密码信息连接远程站点。
curlopt_nobody
启用时将不对html中的body部分进行输出。
curlopt_noprogress
启用时关闭curl传输的进度条,此项的默认设置为启用。
note:php自动地设置这个选项为true,这个选项仅仅应当在以调试为目的时被改变。
curlopt_nosignal
启用时忽略所有的curl传递给php进行的信号。在sapi多线程传输时此项被默认启用。
curl 7.10时被加入。
curlopt_post
启用时会发送一个常规的post请求,类型为:application/x-www-form-urlencoded,就像表单提交的一样。
curlopt_put
启用时允许http发送文件,必须同时设置curlopt_infile和curlopt_infilesize。
curlopt_returntransfer
将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。
curlopt_ssl_verifypeer
禁用后curl将终止从服务端进行验证。使用curlopt_cainfo选项设置证书使用curlopt_capath选项设置证书目录 如果curlopt_ssl_verifypeer(默认值为2)被启用,curlopt_ssl_verifyhost需要被设置成true否则设置为false。
自curl 7.10开始默认为true。从curl 7.10开始默认绑定安装。
curlopt_transfertext
启用后对ftp传输使用ascii模式。对于ldap,它检索纯文本信息而非html。在windows系统上,系统不会把stdout设置成binary模式。
curlopt_unrestricted_auth
在使用curlopt_followlocation产生的header中的多个locations中持续追加用户名和密码信息,即使域名已发生改变。
curlopt_upload
启用后允许文件上传。
curlopt_verbose
