送书第一期 《用户画像:平台构建与业务实践》
送书活动之抽奖工具的打造 《获取博客评论用户抽取幸运中奖者》
前几天做了一期送书活动,随着时间流逝,也即将迎来赠书活动抽奖环节,为了活动的公正公开以及可见性,特此开发了一款Web抽奖工具,结合Springboot后台获取博客评论用户接口,打造了一款公开透明的抽奖工具,大家都可以来玩一玩。
工具地址: http://139.159.230.49/draw.html
获取博客评论用户接口(url后的参数可替换为想要的博客地址): http://139.159.230.49/csdn/draw/url?url=https://blog.csdn.net/weixin_39709134/article/details/133195146
页面是单文件引入vue,所有的CSS、JS文件都是放在CDN上,此源代码直接复制即可用
博客赠书抽奖页面,由4部分组成
填写需要抽奖的CSDN博客地址
如(用户画像:平台构建与业务实践):https://blog.csdn.net/s445320/article/details/133265834
在赠书时,我们可过滤掉作者自身账号,或者其他账号。
如不能满足需求,可以自行改造过滤逻辑。
点击此按钮,根据1.3、1.4 所填写的内容,去获取抽奖账号名单(可见第2部分 springboot抽奖账号名单接口)
展示抽奖池用户名单。
在展示抽奖池用户名单后,即可点击抽奖按钮;
已抽奖次数会累加。
展示中奖者的名单,使用逗号(,)隔开
获取博客评论用户接口(url后的参数可替换为想要的博客地址): http://139.159.230.49/csdn/draw/url?url=https://blog.csdn.net/weixin_39709134/article/details/133195146
通过Chrome的【开发者工具】,在【网络】区域找到评论信息;
1、切换到【预览】,通过响应数据,确认是我们要找的接口
2、切换到【标头】,拿到请求地址,并测试get、post请求类型
1、从URL里提取出博客唯一ID;
2、通过CSDN评论信息接口,获取评论数据信息;
3、格式化数据,返回用户名、用户ID集合信息;
public List<DrawUser> getDrawUserList(String blogUrl) {
int page = 1;
int pageSize = 100;
RestTemplate restTemplate = new RestTemplate();
List<DrawUser> drawUserList = new ArrayList<>();
String blogId = "";
//处理特殊字符?
if( blogUrl.indexOf("?") != -1 ) {
blogUrl = blogUrl.substring(0 , blogUrl.indexOf("?"));
}
//处理特殊字符#
if( blogUrl.indexOf("#") != -1 ) {
blogUrl = blogUrl.substring(0 , blogUrl.indexOf("#"));
}
int start = blogUrl.indexOf("details");
if( start == -1 ) {
log.info("格式错误");
return null;
} else {
blogId = blogUrl.substring(start+8 , blogUrl.length());
}
//循环加载多页数据,每页100条
while( true ){
//页码每次+1
String url = "https://blog.csdn.net/phoenix/web/v1/comment/list/"+ blogId +"?page="+ page++ +"&size="+ pageSize +"&fold=unfold";
HashMap jsonObject = restTemplate.getForObject(url, HashMap.class);
if( !jsonObject.get("code").equals(200) ) {
return drawUserList;
}
if( jsonObject.get("code").equals(200) ) {
LinkedHashMap blogInfoMap = (LinkedHashMap) jsonObject.get("data");
//获取单次请求的评论信息集合
List<HashMap> userInfoList = (List<HashMap>) blogInfoMap.get("list");
for (int i = 0; i < userInfoList.size(); i++) {
HashMap userInfo = userInfoList.get(i);
//提取出userName、nickName
HashMap info = (HashMap) userInfo.get("info");
//把用户信息添加到集合里
drawUserList.add(new DrawUser(info.get("userName")+"" , info.get("nickName")+""));
}
if( userInfoList.size() < pageSize ) {
log.info("数据加载完毕");
return drawUserList;
}
}
}
log.info("评论人数:" + drawUserList.size());
//返回用户信息集合
return drawUserList;
}
后续还有很多赠书活动,特此开发了一个Web版本抽奖工具,基本上通用(覆盖了一些场景,还谈不上完美),可以解决CSDN博客几百评论用户信息获取问题。