伪程序员的福音,对公众号官方接口一知半解,加上对后台处理文档也写不好,百度又搜不到能用的资源,就独辟蹊径曲线救国,用纯asp写了下面的代码。
我们公众号网站平台是asp+access写的,先简单介绍下结构,数据库存放会员的表名叫member,关键字段有wx_openid[存放openid],wx_gzh_off[存放是否关注状态],本次新增了一个字段tongbu,这个用法下面有解释。
第一步,获取粉丝列表
我的办法比较简单粗暴,直接访问接口并通过asp语音获取到源代码,官方接口为:【https://api.weixin.qq.com/cgi-bin/user/get?access_token=“&weixin_Access_token&”&next_openid=】,只需要access_token这个值,怎么获取我就不介绍了,官方和百度都有教程,提醒一下这个access_token有效期是7200秒(两小时),所以我这里是调用了数据库(我这个平台设置为需要时就请求一次并存放在数据库)。next_openid如果你的粉丝低于1万就不用填,高于一万就填上后再执行一次。
访问接口后,获取到的网页源码是这样的:
{“total”:5693,“count”:5693,“data”:{“openid”:[“oVfr41baSm9YtXKQwGyxUtovH6Bs”,“oVfr41c5ciKQ-5rhIgYd347jdhfo”,“中间的省略”,“oVfr41UTDuPi_BedF2ZATg9n3LPA”]},“next_openid”:“oVfr41UTDuPi_BedF2ZATg9n3LPA”}
total的值是粉丝总数,count是本次拉取数量,openid就是我们需要的粉丝数据了,我首先把它保存为txt文件【我知道用js读取后处理更方便,无奈水平有限,所以曲线救国】。
第二步,读取txt文件,并提取出需要的粉丝总数和openid数组,下面代码中我都做了注释,实现方法参考注释就行。
第三步,循环数组,并分别查询数据库对比已有会员的openid,如果已经存在的,就修改一次关注状态为1,并在上面提到的tongbu字段里写入一段字码,用于标注本次已经处理过这个会员,如果数据库不存在这个openid,就新建一条,并写入openid、关注状态和标识码。到此,就等于获取到官方的粉丝数据都已经入库并做了标识,那么在字段tongbu里面没有写入标识码的,就都是没有关注或者取关的会员了,我们只需要执行一次标识码不符的会员全部把关注状态设为0。
以上是逻辑,下面贴出代码,供跟我差不多水平的参考使用,如果您水平比较高,希望不要耻笑并给予更好的解决代码,不胜感激!
<%
url="https://api.weixin.qq.com/cgi-bin/user/get?access_token="&weixin_Access_token&"&next_openid="
suijima = Clng(DateDiff("s","1970-1-1 00:00:00",Now))
Function getHtml(url) '以HTML格式备份粉丝列表
Set xh = CreateObject("Microsoft.XMLHTTP")
xh.Open "GET",url,0
xh.Send()
Set MyStream=CreateObject("Adodb.Stream")
MyStream.Type = 2
MyStream.Open
MyStream.WriteText xh.responseText
MyStream.Position = 0
getHtml=MyStream.ReadText
MyStream.Close
End Function
Function tongbu(openid) '执行同步数据库
set rs=server.CreateObject("adodb.recordset")
sql="SELECT * FROM member where wx_openid='"&openid&"'"
rs.open sql,conn,1,3
if not rs.eof then
rs("wx_gzh_off") = 1
rs("home_tj") = suijima
else
rs.addnew
rs("wx_openid") = MyArray(I)
rs("wx_name") = "同步粉丝"
rs("wx_gzh_off") = 1
rs("home_tj") = suijima
end if
rs.update
rs.close
set rs=nothing
End Function
%>
<%
if request("action")="" then
%>
<form id="form1" name="form1" method="post" action="?action=save">
当前粉丝:<%=Conn.Execute("select count(id) from member where wx_gzh_off=1")(0) %> 人
<input type="button" name="submit" onClick="window.open('<%=url%>')" value="查看">
<input type="submit" name="Submit" value="同步" onClick="return confirm('同步前务必 1、先备份数据库;2、查看接受是否正确反馈;3、同步时间较长,完成前不要关闭浏览器')"/>
</form>
<%
elseif request("action")="save" then
'=============第一步 先讲公众平台官网获取到的粉丝列表写到txt文==================
Set Fso = Server.CreateObject("Scripting.FileSystemObject")
Set Fout = Fso.CreateTextFile(Server.Mappath("fensi.txt")) '保存的TXT文件名
Fout.Write getHtml(url) '写入获取到的指定url网页的源文件
Fout.Close
Set Fout = Nothing
Set Fso = Nothing
'=============写txt文件结束=================================================
'=============读txt文件开始=================================================
set fs=server.createobject("scripting.filesystemobject")
filetxt=server.mappath("fensi.txt")
set txt=fs.opentextfile(filetxt,1,true)
if not txt.atendofstream then
line=txt.ReadAll
if Instr(line, "err")>0 then
response.write"<SCRIPT language=JavaScript>alert('获取列表出错!');" '如果密码验证成功,跳转
response.write"javascript:history.go(-1)</SCRIPT>"
response.end
else
openid = Replace(line,chr(34),"")'将双引号去除,方面后面处理
openid=split(openid,"{openid:[")(1)'截取openid部分
openid=split(openid,"]},next_openid")(0)'截取openid部分,就得到了openid列表
line=split(line,":")(1)'截取第一个冒号后面的代码,这是为了获取粉丝数量
line=split(line,",")(0)'粉丝数量
'response.write "共计:"&line & " 名粉丝<br>"
MyArray = Split(openid,",")'分割粉丝列表数组
For I = Lbound(MyArray) to Ubound(MyArray)'开始逐个执行
tongbu(MyArray(I))'执行类,把每一个获取到的openid都分别拿到数据库对比一下,同步数据库粉丝
Next
Conn.ExeCute("update [member] set wx_gzh_off=0 where home_tj is null or home_tj<>"&suijima)'将同步后官方没有的openid全部设为未关注
end if
end if
response.write"<SCRIPT language=JavaScript>alert('同步成功"&line&"名粉丝!');" '如果密码验证成功,跳转
response.write"javascript:history.go(-1)</SCRIPT>"
end if
%>