曲径辟幽,asp公众号平台系统获取粉丝列表并入库,对比数据库会员更新会员是否已关注或取关公众号

伪程序员的福音,对公众号官方接口一知半解,加上对后台处理文档也写不好,百度又搜不到能用的资源,就独辟蹊径曲线救国,用纯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
%>

你可能感兴趣的:(数据库,asp,微信公众平台)