package edu.fudan.weixin.utils;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.util.JSON;
import edu.fudan.eservice.common.utils.CommonUtil;
import edu.fudan.eservice.common.utils.MongoUtil;
import edu.fudan.eservice.common.utils.ThreadPoolHelper;
public class WeixinFollowerHelper {
private static Log log=LogFactory.getLog(WeixinFollowerHelper.class);
private static WeixinFollowerHelper instance = null;
private WeixinFollowerHelper(){
refetch();
ThreadPoolHelper.getInstance().getSchPool().scheduleAtFixedRate(new AutoFetchWeixinFollower(), 1800, 1800, TimeUnit.SECONDS);
}
//手动刷新
public void refetch(){
new AutoFetchWeixinFollower().run();
}
public static synchronized WeixinFollowerHelper getInstance(){
if (instance == null)
return new WeixinFollowerHelper();
return instance;
}
//获取用户资料(UnionID机制)
public static void FetchWeixinUserInfo(String openid) {
if (!CommonUtil.isEmpty(openid)){
try {
String urlstr="https://api.weixin.qq.com/cgi-bin/user/info?access_token="+AccessTokenHelper.getInstance().getToken(AccessTokenHelper.WEIXIN)
+"&openid="+openid+"&lang=zh_CN";
Object obj = JSON.parse(CommonUtil.getWebContent(urlstr).toString());
if(obj instanceof DBObject)
{
DBObject dbo = (DBObject)obj;
MongoUtil.getInstance().getDB().getCollection("weixinuser").
update(new BasicDBObject("openid",openid), dbo, true, false);
log.info("save user:" + obj.toString());
}
else{
log.error(" Fetch " + openid + "'s info Failed:"+obj.toString());
}
}
catch (Exception e){
log.error(e.toString());
}
}
else{
log.error("openid is empty!");
}
}
//将所有用户置为未关注状态*/
public static void SetAllFollowersUnSubscribed() {
BasicDBObject dbo = new BasicDBObject().append("$set",new BasicDBObject().append("subscribe", 0));
MongoUtil.getInstance().getDB().getCollection("weixinuser").update(new BasicDBObject(),dbo,false,true);
}
public static void FetchAllWeixinFollowers(String next_openid) {
String urlstr="https://api.weixin.qq.com/cgi-bin/user/get?access_token="+AccessTokenHelper.getInstance().getToken(AccessTokenHelper.WEIXIN);
do {
if (!CommonUtil.isEmpty(next_openid)) {
urlstr+="&next_openid="+next_openid;
}
try {
Object obj = JSON.parse(CommonUtil.getWebContent(urlstr).toString());
if(obj instanceof DBObject){
DBObject dbo= (DBObject)obj;
if (dbo.containsField("errcode")){
log.error("server returns error! "+dbo.toString());
return;
}
//更新拉取到的信息
if (dbo.containsField("data")) {
Object datadbo = JSON.parse(dbo.get("data").toString());
if (datadbo instanceof DBObject){
@SuppressWarnings("unchecked")
List<String> openids = (List<String>)((DBObject)datadbo).get("openid");
for(String openid : openids){
FetchWeixinUserInfo(openid);
}
}
}
next_openid = dbo.get("next_openid").toString();
}
//当next_openid非空时继续拉取
}
catch (Exception e){
log.error(e.toString());
}
} while (!CommonUtil.isEmpty(next_openid));
}
public class AutoFetchWeixinFollower implements Runnable {
public void run() {
SetAllFollowersUnSubscribed();
FetchAllWeixinFollowers("");
}
}
}