当然,远程抓取微信公共平台数据的想法就油然而生,当然第一个想到了CURL。
CURL可以远程提交表达,我感觉微信是提议让我们怎么的,只要不是恶意刷接口,就不会出现验证码。
主要注意的几个问题
1.远程登录接口是时候的HTTPS协议。
2.登录成功后页面有跳转。
3.返回的HTML页面是可以直接输出的。
下面展示了一个CURL的具体写法
代码如下 | 复制代码 |
//微信远程登录绑定账号 public function Curl_login($username,$pwd){ $config_token = "XiaoDengPHP"; $pwd = md5($pwd); $url = "https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN"; $postArray = array("username=".$username,"pwd=".$pwd,"imgcode=","f=json"); $fields = implode("&", $postArray); $filedir = $_SERVER['DOCUMENT_ROOT']."/Cookies"; $cookie_file = $filedir."/cookie.txt"; $ch = curl_init(); www.111cn.net curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); //表示是https协议提交 curl_setopt($ch, CURLOPT_HEADER, 0); //不返回header部分 curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $fields); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); //生产Cookies并保存在指定目录下 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //将curl_exec()获取的信息以文件流的形式返回,而不是直接输出。 curl_setopt($ch, CURLOPT_REFERER,"https://mp.weixin.qq.com/cgi-bin/login?lang=zh_CN"); //跳转指向 $result = curl_exec($ch); return json_decode($result); // 关闭CURL会话 curl_close($ch); } |
上面这个方法就实现了,远程登录微信公共平台,接下来的事,就是去让账号变成开发者模式,一样的CURL。
注意这次的curl要带上cookies而不是生产cookies
重点代码在于验证服务器的相应,你需要设置一个服务器的连接和一个token
代码如下 | 复制代码 |
public function auth($token) { $data = array( $_GET['timestamp'], $_GET['nonce'], $token); $sign = $_GET['signature']; sort($data); $signature = sha1(implode($data)); if($signature === $sign){ echo ($_GET['echostr']); exit; }else{ return false; } } |
这样如果开通成功了,应该会返回一个MES=302的json数据和一个微信平台认证的token的信息。
只要你细心,你就会发现,微信连接里面TOKEN是一个动态变化的,但有是在一段时间内不变的。
所以你需要这个token来构造URL,来获取其他页面信息。
但开发现过程中,你一定遇到一个很崩溃的问题。
今天把网站换了台服务器结果发现UCenter打开时提示UCenter info: Can not connect to MySQL server 了,但通信是没有问题,只是注册时提示错误,这个不用说就是数据库配置文章的问题,修改下Discuz的配置文件罗。找到
安装目录/config/config_global.php 及 安装目录/uc_server/data/config.inc.php修改。
OK,没有出现错误了,但是不管是点击注册,还是登录,都会出现“内部错误,无法显示此内容”,然后再点击这个错误提示,又出现上面的“UCenter info:Can not connect to MySQL server。不能连接数据库了。
蛮奇怪,但是通过http://localhost/bbs/uc_server/登录UCenter是没问题的,看到应用设置里面也是显示通信成功的,我下载数据之后也进入这里修改了域名绑定的了。
主要错误:
UCenter info: Can not connect to MySQL server
Error:
Errno:0
需要修改的文件是以下三个:
安装目录/config/config_global.php
安装目录/config/config_ucenter.php
安装目录/uc_server/data/config.inc.php
具体怎么改我给个例子
代码如下 | 复制代码 |
config_global
|
config_ucenter
代码如下 | 复制代码 |
<?php
define('UC_DBHOST', 'localhost'); define('UC_CHARSET', 'utf-8'); |
config.inc
代码如下 | 复制代码 |
<?php |
今天要弄个用户订阅就给推送一个消息的功能,却发现不知道如何判断用户是订阅的操作,还是取消订阅,还是发消息
代码如下 | 复制代码 |
public function responseMsg() |
发现$postStr是之前没有封装的字符串,直接打印,即可知道用户的行为了。
测试输出的文件如下
代码如下 | 复制代码 |
<xml><ToUserName><![CDATA[gh_a64528aca3b]]></ToUserName> |
MsgType即可判断用户行为text表示用户输入了一条文本信息。
如果是订阅,那么就是event 大家自己测试吧。
一个新用户关注公众账号发送的消息的例子
代码如下 | 复制代码 |
<xml><ToUserName><![CDATA[gh_a5218aca3b]]></ToUserName> <FromUserName><![CDATA[oSgH_jveTxJSlFK_6QSiGeVyk]]></FromUserName> <CreateTime>1394706271</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[subscribe]]></Event> <EventKey><![CDATA[]]></EventKey> </xml> |
这样就可以得到具体的事件类型了。
$msgtype = $postObj->MsgType;能判断用户的行为,后续的操作就方便多了。
附上写入日志文件的代码
/*
‘r’ 只读方式打开,将文件指针指向文件头。
‘r+’ 读写方式打开,将文件指针指向文件头。
‘w’ 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘w+’ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
‘a’ 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
‘a+’ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
*/
代码如下 | 复制代码 |
function writeover2($filename,$data,$method="rb+",$iflock=1) { @touch($filename);/*文件不存在则创建之.可以采用file_exists验证并其他创建文件函数代替.测试结果效率相当*/ $handle=@fopen($filename,$method); if($iflock){ flock($handle,LOCK_EX); } fwrite($handle,$data); if($method=="rb+") ftruncate($handle,strlen($data)); fclose($handle); } |
有自己的主机一般都会设计"防盗链", 其实包括图片防盗链,和下载防盗链等,如:
使用.htaccess设置防盗链
代码如下 | 复制代码 |
RewriteEngine on |
nginx设置防盗链
代码如下 | 复制代码 |
location ~* .(gif|jpg|png|swf|flv)$ { |
但怎么破解防盗链呢? 一般的防盗链是判断来路是否为自己的域名, 我们可以使用 php 内置的 file_get_contents 方法来请求这个图片(当然别的后端语言也有类似的方法), 如:
//getImg.php?url=目标图片连接
代码如下 | 复制代码 |
<?php header('Content-type: image/jpeg'); echo file_get_contents(isset($_GET["url"])?$_GET["url"]:'http://xxxx域名 /images/v1/loading-16-16.gif'); ?> |
php代码片段看例子:
1, 直接加载防盗链图片:
2, 通过php读取图片:
扩展 Overlay 模块头部显示用户头像实例
在你的自定义模块中加入overlay脚本JS文件,通过overlay的钩子:
代码如下 | 复制代码 |
function mymodule_overlay_child_initialize() { /** |
在overlay-child.js文件中加入以下Javascript 代码:
代码如下 | 复制代码 |
(function ($) { |
完成后,你就可以看到如上面的图片的效果。
修改overlay覆盖层的宽度和隐藏元素实例
下面这个例子向你展示如何修改overlay (覆盖层) 内的内容,当一个指定的节点类型(test)被展示在overlay 覆盖层。这个脚本向你展示修改overlay层的宽度为450px 和 隐藏一些不想见到的元素。
在你的模块中同样需要想上面的例子那样加入overlay-child.js脚本。
在overlay-child.js文件中加入以下Javascript 代码:
代码如下 | 复制代码 |
(function ($) { |
如果你想修改所有overlay层里的布局,请找到overlay.tpl.php然后修改它。