微信公众平台之CURL应用

来源:互联网 发布:验证域名所有权的方法 编辑:程序博客网 时间:2024/05/19 22:50

使用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 "登录微信系统成功<br />";


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状态码,默认行为是忽略编号小于等于400HTTP信息。

 

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时禁用EPRTLPRT,使用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

启用时会设置HTTPmethodGET,因为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_INFILECURLOPT_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

启用时会汇报所有的信息,存放在STDERR或指定的CURLOPT_STDERR中。

 

对于下面的这些option的可选参数,value应该被设置一个integer类型的值:

 

选项

可选value

备注

CURLOPT_BUFFERSIZE

每次获取的数据中读入缓存的大小,但是不保证这个值每次都会被填满。

cURL 7.10中被加入。

CURLOPT_CLOSEPOLICY

不是CURLCLOSEPOLICY_LEAST_RECENTLY_USED就是CURLCLOSEPOLICY_OLDEST,还存在另外三个CURLCLOSEPOLICY_,但是cURL暂时还不支持。

 

CURLOPT_CONNECTTIMEOUT

在发起连接前等待的时间,如果设置为0,则无限等待。

 

CURLOPT_CONNECTTIMEOUT_MS

尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。

cURL 7.16.2中被加入。从PHP 5.2.3开始可用。

CURLOPT_DNS_CACHE_TIMEOUT

设置在内存中保存DNS信息的时间,默认为120秒。

 

CURLOPT_FTPSSLAUTH

FTP验证方式:CURLFTPAUTH_SSL (首先尝试SSL)CURLFTPAUTH_TLS (首先尝试TLS)CURLFTPAUTH_DEFAULT (cURL自动决定)

cURL 7.12.2中被加入。

CURLOPT_HTTP_VERSION

CURL_HTTP_VERSION_NONE(默认值,让cURL自己判断使用哪个版本)CURL_HTTP_VERSION_1_0 (强制使用 HTTP/1.0)CURL_HTTP_VERSION_1_1 (强制使用 HTTP/1.1)

 

CURLOPT_HTTPAUTH

使用的HTTP验证方法,可选的值有:CURLAUTH_BASICCURLAUTH_DIGESTCURLAUTH_GSSNEGOTIATECURLAUTH_NTLMCURLAUTH_ANYCURLAUTH_ANYSAFE。 可以使用|位域()操作符分隔多个值,cURL让服务器选择一个支持最好的值。CURLAUTH_ANY等价于CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLMCURLAUTH_ANYSAFE等价于CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM.

 

CURLOPT_INFILESIZE

设定上传文件的大小限制,字节(byte)为单位。

 

CURLOPT_LOW_SPEED_LIMIT

当传输速度小于CURLOPT_LOW_SPEED_LIMIT(bytes/sec)PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

 

CURLOPT_LOW_SPEED_TIME

当传输速度小于CURLOPT_LOW_SPEED_LIMIT(bytes/sec)PHP会根据CURLOPT_LOW_SPEED_TIME来判断是否因太慢而取消传输。

 

CURLOPT_MAXCONNECTS

允许的最大连接数量,超过是会通过CURLOPT_CLOSEPOLICY决定应该停止哪些连接。

 

CURLOPT_MAXREDIRS

指定最多的HTTP重定向的数量,这个选项是和CURLOPT_FOLLOWLOCATION一起使用的。

 

CURLOPT_PORT

用来指定连接端口。(可选项)

 

CURLOPT_PROTOCOLS

CURLPROTO_*的位域指。如果被启用,位域值会限定libcurl在传输过程中有哪些可使用的协议。这将允许你在编译libcurl时支持众多协议,但是限制只是用它们中被允许使用的一个子集。默认libcurl将会使用全部它支持的协议。参见CURLOPT_REDIR_PROTOCOLS可用的协议选项为:CURLPROTO_HTTPCURLPROTO_HTTPSCURLPROTO_FTPCURLPROTO_FTPSCURLPROTO_SCPCURLPROTO_SFTPCURLPROTO_TELNETCURLPROTO_LDAPCURLPROTO_LDAPSCURLPROTO_DICTCURLPROTO_FILECURLPROTO_TFTPCURLPROTO_ALL

cURL 7.19.4中被加入。

CURLOPT_PROXYAUTH

HTTP代理连接的验证方式。使用在CURLOPT_HTTPAUTH中的位域标志来设置相应选项。对于代理验证只有CURLAUTH_BASICCURLAUTH_NTLM当前被支持。

cURL 7.10.7中被加入。

CURLOPT_PROXYPORT

代理服务器的端口。端口也可以在CURLOPT_PROXY中进行设置。

 

CURLOPT_PROXYTYPE

不是CURLPROXY_HTTP (默认值就是CURLPROXY_SOCKS5

cURL 7.10中被加入。

CURLOPT_REDIR_PROTOCOLS

CURLPROTO_*中的位域值。如果被启用,位域值将会限制传输线程在CURLOPT_FOLLOWLOCATION开启时跟随某个重定向时可使用的协议。这将使你对重定向时限制传输线程使用被允许的协议子集默认libcurl将会允许除FILESCP之外的全部协议。这个和7.19.4预发布版本种无条件地跟随所有支持的协议有一些不同。关于协议常量,请参照CURLOPT_PROTOCOLS

cURL 7.19.4中被加入。

CURLOPT_RESUME_FROM

在恢复传输时传递一个字节偏移量(用来断点续传)。

 

CURLOPT_SSL_VERIFYHOST

检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)检查公用名是否存在,并且是否与提供的主机名匹配。

 

CURLOPT_SSLVERSION

使用的SSL版本(2 或 3)。默认情况下PHP会自己检测这个值,尽管有些情况下需要手动地进行设置。

 

CURLOPT_TIMECONDITION

如果在CURLOPT_TIMEVALUE指定的某个时间以后被编辑过,则使用CURL_TIMECOND_IFMODSINCE返回页面,如果没有被修改过,并且CURLOPT_HEADERtrue,则返回一个"304 Not Modified"header, CURLOPT_HEADERfalse,则使用CURL_TIMECOND_IFUNMODSINCE,默认值为CURL_TIMECOND_IFUNMODSINCE

 

CURLOPT_TIMEOUT

设置cURL允许执行的最长秒数。

 

CURLOPT_TIMEOUT_MS

设置cURL允许执行的最长毫秒数。

cURL 7.16.2中被加入。从PHP 5.2.3起可使用。

CURLOPT_TIMEVALUE

设置一个CURLOPT_TIMECONDITION使用的时间戳,在默认状态下使用的是CURL_TIMECOND_IFMODSINCE

 

对于下面的这些option的可选参数,value应该被设置一个string类型的值:

 

选项

可选value

备注

CURLOPT_CAINFO

一个保存着1个或多个用来让服务端验证的证书的文件名。这个参数仅仅在和CURLOPT_SSL_VERIFYPEER一起使用时才有意义。 .

 

CURLOPT_CAPATH

一个保存着多个CA证书的目录。这个选项是和CURLOPT_SSL_VERIFYPEER一起使用的。

 

CURLOPT_COOKIE

设定HTTP请求中"Cookie: "部分的内容。多个cookie用分号分隔,分号后带一个空格(例如, "fruit=apple; colour=red")

 

CURLOPT_COOKIEFILE

包含cookie数据的文件名,cookie文件的格式可以是Netscape格式,或者只是纯HTTP头部信息存入文件。

 

CURLOPT_COOKIEJAR

连接结束后保存cookie信息的文件。

 

CURLOPT_CUSTOMREQUEST

使用一个自定义的请求信息来代替"GET""HEAD"作为HTTP请求。这对于执行"DELETE" 或者其他更隐蔽的HTTP请求。有效值如"GET""POST""CONNECT"等等。也就是说,不要在这里输入整个HTTP请求。例如输入"GET /index.html HTTP/1.0rnrn"是不正确的。

Note在确定服务器支持这个自定义请求的方法前不要使用。

 

 

CURLOPT_EGDSOCKET

类似CURLOPT_RANDOM_FILE,除了一个Entropy Gathering Daemon套接字。

 

CURLOPT_ENCODING

HTTP请求头中"Accept-Encoding: "的值。支持的编码有"identity""deflate""gzip"。如果为空字符串"",请求头会发送所有支持的编码类型。

cURL 7.10中被加入。

CURLOPT_FTPPORT

这个值将被用来获取供FTP"POST"指令所需要的IP地址。"POST"指令告诉远程服务器连接到我们指定的IP地址。这个字符串可以是纯文本的IP地址、主机名、一个网络接口名(UNIX下)或者只是一个'-'来使用默认的IP地址。

 

CURLOPT_INTERFACE

网络发送接口名,可以是一个接口名、IP地址或者是一个主机名。

 

CURLOPT_KRB4LEVEL

KRB4 (Kerberos 4) 安全级别。下面的任何值都是有效的(从低到高的顺序)"clear""safe""confidential""private".。如果字符串和这些都不匹配,将使用"private"。这个选项设置为NULL时将禁用KRB4 安全认证。目前KRB4 安全认证只能用于FTP传输。

 

CURLOPT_POSTFIELDS

全部数据使用HTTP协议中的"POST"操作来发送。要发送文件,在文件名前面加上@前缀并使用完整路径。这个参数可以通过urlencoded后的字符串类似'para1=val1¶2=val2&…'或使用一个以字段名为键值,字段数据为值的数组。如果value是一个数组,Content-Type头将会被设置成multipart/form-data

 

CURLOPT_PROXY

HTTP代理通道。

 

CURLOPT_PROXYUSERPWD

一个用来连接到代理的"[username]:[password]"格式的字符串。

 

CURLOPT_RANDOM_FILE

一个被用来生成SSL随机数种子的文件名。

 

CURLOPT_RANGE

"X-Y"的形式,其中XY都是可选项获取数据的范围,以字节计。HTTP传输线程也支持几个这样的重复项中间用逗号分隔如"X-Y,N-M"

 

CURLOPT_REFERER

HTTP请求头中"Referer: "的内容。

 

CURLOPT_SSL_CIPHER_LIST

一个SSL的加密算法列表。例如RC4-SHATLSv1都是可用的加密列表。

 

CURLOPT_SSLCERT

一个包含PEM格式证书的文件名。

 

CURLOPT_SSLCERTPASSWD

使用CURLOPT_SSLCERT证书需要的密码。

 

CURLOPT_SSLCERTTYPE

证书的类型。支持的格式有"PEM" (默认值), "DER""ENG"

cURL 7.9.3中被加入。

CURLOPT_SSLENGINE

用来在CURLOPT_SSLKEY中指定的SSL私钥的加密引擎变量。

 

CURLOPT_SSLENGINE_DEFAULT

用来做非对称加密操作的变量。

 

CURLOPT_SSLKEY

包含SSL私钥的文件名。

 

CURLOPT_SSLKEYPASSWD

CURLOPT_SSLKEY中指定了的SSL私钥的密码。

Note由于这个选项包含了敏感的密码信息,记得保证这个PHP脚本的安全。

 

 

CURLOPT_SSLKEYTYPE

CURLOPT_SSLKEY中规定的私钥的加密类型,支持的密钥类型为"PEM"(默认值)"DER""ENG"

 

CURLOPT_URL

需要获取的URL地址,也可以在curl_init()函数中设置。

 

CURLOPT_USERAGENT

HTTP请求中包含一个"User-Agent: "头的字符串。

 

CURLOPT_USERPWD

传递一个连接中需要的用户名和密码,格式为:"[username]:[password]"

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小米平板经常出现系统无响应怎么办 淘宝买家被取消运费险了怎么办 新开的淘宝直播店没有流量怎么办 淘宝买的东西一直不发货怎么办 在淘宝上买了东西不发货怎么办 宝贝好几天拉一次吃的也少怎么办 淘宝快递正在运输途中想退货怎么办 淘宝买的东西退货商家拒收怎么办 手机屛上出现了微信图标怎么办 手机用了两年了反应太慢怎么办 魅族手机显示手机已锁定怎么办 为什么微信注册要安全验证码怎么办 微信帐号异常无法领取红包怎么办 帮朋友代付在支付宝被骗怎么办 商家说未收到货拒绝退款怎么办 淘宝商家拒绝退款怎么办还没收货的 拼多多点错确认收货了怎么办 被别人用菜刀砍伤没钱看病怎么办 东京下了订单但不发货怎么办 绑定卷皮钱包的手机号码丢了怎么办 小孩回奶在垫的被子上发霉了怎么办 2个月宝宝不喝母乳只喝奶瓶怎么办 我的扣扣被盗了朋友别被骗了怎么办 我买的股票退市了我的钱怎么办啊 在美食林被门口买宝石的骗了怎么办 在商场买的彪马鞋子皮子裂了怎么办 手机换号了京东钱包里的余额怎么办 寄报销发票给顺丰快递搞丢了怎么办 物流显示揽件但把快递弄丢了怎么办 在李宁商城上买的东西丢了怎么办 我的货发物流都过了好几天怎么办 运动鞋子买小了一码有些挤脚怎么办 媳妇先动手打我我又打媳妇了怎么办 京东商城买个电视没验收破了怎么办 钱充给波克城市游戏还不能玩怎么办 我的魅族账号密保问题忘记了怎么办 在手机店买手机买贵了被骗了怎么办 信翼4g上网宝登录密码忘了怎么办 信翼4g上网宝管理密码忘了怎么办 淘宝上买了货但店铺消失了怎么办啊 微信的版本过低登陆不了微信怎么办