【来我的楼踩踩|开奖贴】公平给掘金活动抽奖的小代码

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

WangScaler: 一个用心创作的作者。

声明:才疏学浅,如有错误,恳请指正。

活动来我的楼踩踩开奖了,开奖地址。我们中了摩天大楼奖,
为了活动公平抽奖,特发此贴,如果你认为抽奖过程存在不公平行为,请评论此文,提出公平方案。

分析

我们想获取盖楼用户的数据,就要从掘金的接口获取,首先我们找到了这个接口
https://api.juejin.cn/interact_api/v1/comment/list?aid=2608&uuid=6950557314831795745
我们发现需要传递的参数如下

1
2
3
4
5
6
7
8
json复制代码{
"item_id": "7017671938038333471",
"item_type": 4,
"cursor": "0",
"limit": 20,
"sort": 0,
"client_type": 2608
}

通过分析发现cursor就是页数,而limit就是当前页查询的条数,经过测试limit最大支持的条数是50。通过响应的数据

image.png
可以看到共有274条,也就是我们得多次请求才能获取全部的数据。通过has_more可以判断是否获取完全部的数据。

获取全部数据

通过上述分析代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java复制代码String url = "https://api.juejin.cn/interact_api/v1/comment/list?aid=2608&uuid=6950557314831795745";
HashMap<String, Object> map = new HashMap<String, Object>(6);
map.put("item_id", "7017671938038333471");
map.put("item_type", 4);
map.put("cursor", "0");
map.put("limit", 50);
map.put("sort", 0);
map.put("client_type", 2608);
Boolean condition = Boolean.TRUE;
do {
System.out.println("当前cursor:" + map.get("cursor"));
ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
if (responseEntity.getStatusCode().value() == 200) {
LuckDto data = JSONObject.parseObject(responseEntity.getBody(), LuckDto.class);
condition = data.getHas_more();
map.put("cursor", data.getCursor());
List<JSONObject> ReplyList = data.getData();
for (int i = 0; i < ReplyList.size(); i++) {
if (ReplyList.get(i).get("is_author").equals(Boolean.FALSE)) {
JSONObject userInfo = (JSONObject) ReplyList.get(i).get("user_info");
redisTemplate.boundSetOps("luckdraw").add(userInfo.getString("user_id"));
}
}

}
} while (condition);

因为redis的set集合的成员是唯一的,所以可以排除同一个用户的多条评论。通过打印System.out.println("当前cursor:" + map.get("cursor"));可以判断请求的次数,和每次请求的参数,是否符合我们的预期要求。

用户数据

image.png
最后redis获取到的用户数据共262条。我们将这些用户id参与抽奖。

抽奖

采取的现成的在线抽奖软件,这个抽奖地址,大家常用,能保证抽奖结果的可靠性。

image.png
原有抽奖人数262,抽奖三次,最后剩余抽奖人数262-3=259。

获取中奖人的昵称

1
2
3
java复制代码if (userInfo.getString("user_id").equals("4441682709316647") || userInfo.getString("user_id").equals("2277843826120318") || userInfo.getString("user_id").equals("3403743732709197")) {
System.out.println(userInfo.getString("user_name"));
}

image.png

image.png

image.png

image.png

最后

恭喜上述三位好友。

因本周三晚上需要提交问卷,此文公布至周三中午十二点之前,没有疑问就是上述三位好友分别获得官方的徽章。如有疑问,可重新抽奖。

来都来了,点个赞再走呗!

关注WangScaler,祝你升职、加薪、不提桶!

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%