微信获取用户列表接口开发教程
当微信公众号数量很多,而我们又需要分析用户信息来进行营销时,您当然可以一个一个的取出用户信息,但是,这样做的非常麻烦,如果有几十个人的话这样取用户信息还可以,但是,当数量达到上万甚至几十万时您还一个一个的取用户信息这是非常不可取的。
微信官方给我们提供了获取用户列表的接口,通过这个接口公众号拥有者可以一次获取最多10000个用户信息。
获取用户列表接口url是:
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
在这个url里面有两个参数一个是access_token,这个好理解了已经非常熟悉了;另一个是next_openid 这个表示的是将要获取的下一个openid,比如,您第一次获取的10000个用户的信息,那么,next_openid再获取10000个用户信息的话,获取到的openid将是类似的OPENID10001、OPENID10002、OPENID10003...这样的一系列openid。
如果在获取用户列表的url里面您不使用next_openid表示从零开始获取最多10000个用户信息。
开发分析
从上面的获取用户列表的url可以看出,上面url最多有两个参数,一个是access_token,一个是next_openid。
要获取access_token比较容易,在微信连的教程“微信接口调用凭据access_token使用详解”里面已经有详细的讲解了解。
要获取next_openid也不难,将会在下面的我们详细讲解。
因为要把access_token和next_openid传给这个接口url,所以,要使用我们在微信连已经写好的http_request。
开发要求:
查询关注微信公众号的粉丝并把这些用户的信息插入到数据库表userinfo2里面,以便以后企业进行数据分析。
编写程序开始
1. 创建数据库表:
userinfo2表的结构是:
CREATE TABLE IF NOT EXISTS userinfo2 ( id int UNSIGNED PRIMARY KEY auto_increment, openid varchar(255) NOT NULL DEFAULT '', nickname varchar(255) NOT NULL DEFAULT '', headurl varchar(255) NOT NULL DEFAULT '', address varchar(255) NOT NULL DEFAULT '', sex varchar(255) NOT NULL DEFAULT '' ) ENGINE = MyISAM DEFAULT CHARSET = utf8;
这里面保存的是每个用户的信息,这些字段分别是:
openid:微信公众号粉丝的fromusername,这是非常重要的。
nickname:用户的呢称,也就是粉丝注册微信时填写的呢称。
headurl:微信头像。
address:用户的注册微信时的地址信息。
sex:粉丝用户的性别。
2. 连接数据库:要把接收过来的用户信息一条一条的插入到数据库表userinfo2里面,就要连接数据库表,就像要进入某个房间先要用钥匙打开这个房间的问一样,如果门打不开的话则无法进入,同样的如果没有连接数据库的话,无法把信息插入到数据库表userinfo2里面。
3. 通过接口url获取用户信息:
$url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={$access_token}"; $res = http_request($url, null);
根据腾讯官方给出的解释,当获取到用户列表后,返回的是一个json数据包:
{"total":2,"count":2,"data":{"openid":["","OPENID1","OPENID2"]},"next_openid":"NEXT_OPENID"}
4. 获取用户的列表的openid:通过上面的调用函数http_reuest(这个函数的代码在教程“微信群发消息接口功能开发下节”里面详细列出来的了)后,获取到的是一个json数据包,要把这个数据包里面的openid1、openid2等一个一个的取出来,然后,再根据这些一个一个的openid,调用腾讯提供的“获取用户信息的接口”来把用户的基本信息获取到。
获取用户基本信息接口url是:
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
所以,现在的问题就转换成了如何从上面的json数据包里面获取到这些openid,可以使用php里面的一个函数json_decode来获取:
$res = json_decode($res);
这个函数如果只有一个参数则会把json数据包转换成对像,如果第二个参数是true则会把json数据转换成数组,我们直接把上面的json结果转换成对象,当然,您也可以转换成数组。
这个我们就可以获取到上面的json里面的一个一个的openid了,即:$res->data->openid
5.遍历循环取出用户信息:
有了一个一个的openid即$res->data->openid,接下来就是通过for循环和获取用户基本信息的接口把一个一个的信息获取到,然后,保存到数据库表userinfo2里面,获取用户基本信息的在教程“获取用户信息的接口开发”里面已经详细进解了这里不再重复。
最终代码是:
<?php header('content-type:text/html;charset=utf-8'); require_once 'get_token.php'; require_once 'common.php'; //连接Mysql数据库,并添加图片信息 $connect = mysql_connect('localhost', 'root', 'root'); mysql_select_db('wxdb', $connect); mysql_query('SET NAMES UTF8'); //把用户的信息,保存到userinfo表 $url = "https://api.weixin.qq.com/cgi-bin/user/get?access_token={$access_token}"; $res = http_request($url, null); //进行一个json解码 $res = json_decode($res); $res = $res->data->openid; $openid_num = count($res); //遍历,循环取出 for($i = 0; $i < $openid_num; $i++) { //这时,我们可以通过openid来获取用户的信息 //指定获取用户的$formUsername $formUsername = $res[$i]; $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$formUsername}"; //发送请求 $res2 = http_request($url, null); $res2 = json_decode($res2); //获取我们需要的各种信息 $nickname = $res2->nickname; $country = $res2->country; $province = $res2->province; $city = $res2->city; $address = $country. ' '. $province. ' '. $city; $sex = $res2->sex; //获取用户的头像 $head_imgurl = $res2->headimgurl; //我们获取小头像地址 $samll_head_imgurl = substr($head_imgurl, 0, -1)."132"; $sql = "INSERT INTO `userinfo2` (id, openid, nickname, headurl, address, sex) VALUES(NULL, '{$formUsername}', '{$nickname}', '{$samll_head_imgurl}', '{$address}', '{$sex}')"; mysql_query($sql); echo '保存ok'.$i.'<br/>'; }
只要把这段代码保存到一个php文件里面,然后,在浏览器打开程序就会把您微信公众号里面的用户信息保存到数据库表userinfo2里面。
注意:如果您使用上面的代码请把相应的内容换上您自己的,例如,数据库的名称、数据库密码等信息。
next_openid:
上面只是把从零到最多一万条用户信息查询出来并保存到数据库表里,但是,一个公众号往往是数量巨大的,当一个公众号粉丝超过一万个的话,就需要使用参数next_openid了。
假设您的公众号里面有三万粉丝,当取完一万个后,如何知道已经取完了一万个了?这个是在获取用户列表后返回的json里面,有一个元素"next_openid":"NEXT_OPENID"。
如果前一万条还没有取完的话NEXT_OPENID值为空,如果取完了的话,这个NEXT_OPENID值表示的是下一个openid,所以,我们就可以通过这个返回的结果来判断是不是已经取完了前一万个用户,如果取完了则直接取下一万个用户,以此类推,使用do...while() 结构是比较合适的。
这里只提供思路,具体的实际项目中请自己编写代码,只要我们把这最基本的学会使用了,再怎么复杂也是在这些基础上开发出来的。
扩展阅读
腾讯官方给我们提供了一个微信公众号粉丝超过10000的例子,可能参考一下。
当公众号关注者数量超过10000时,可通过填写next_openid的值,从而多次拉取列表的方式来满足需求。
具体而言,就是在调用接口时,将上一次调用得到的返回中的next_openid值,作为下一次调用中的next_openid值。
示例如下:
公众账号A拥有23000个关注的人,想通过拉取关注接口获取所有关注的人,那么分别请求url如下:
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN
返回结果:
{ "total":23000, "count":10000, "data":{" openid":[ "OPENID1", "OPENID2", ..., "OPENID10000" ] }, "next_openid":"OPENID10000" }
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID1
返回结果:
{ "total":23000, "count":10000, "data":{ "openid":[ "OPENID10001", "OPENID10002", ..., "OPENID20000" ] }, "next_openid":"OPENID20000" }
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID2
返回结果(关注者列表已返回完时,返回next_openid为空):
{
"total":23000,
"count":3000,
"data":{"
"openid":[
"OPENID20001",
"OPENID20002",
...,
"OPENID23000"
]
},
"next_openid":"OPENID23000"
}
本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:595397166@qq.com
上一篇:新增临时素材