title: antibot-server接入说明
date:2016-05-05
tags:
1、对于已使用ng-common-0.4.31 RPC的接入方
1.1、新增配置项
1.1.1、在define.conf中
# RPC本地调试时的antibot_server地址-开发时用到
antibot_server.test=http://100.84.51.184:9027
#调用antibot_server的caller&key,无需配置,配置好rpc.caller和rpc.key即可
1.1.2、在application.conf中
antibot_server.test.host=${antibot_server.test}
1.2、引入jar包
引入antibot-server-api-xxx.jar,其中xxx是版本号。
antibot-server-api-xxx.jar当前还没有上传到nexus库,如需最新版本,请找我要。
1.3、示例:业务方页面接入ua.js
在页面最底部(body结束之前),加入如下代码片段:
<body>
<!--页面主体及业务js-->
<script>
var UA_Opt={Flag:16676992};//ua.js的配置
function (doc, tagName, tagId, src) {
a = doc.createElement(tagName);
m = doc.getElementsByTagName(tagName)[0];
a.async = 1;
a.id = tagId;
a.src = src;
m.parentNode.insertBefore(a, m);
}(document, 'script', 'uajs', "/ua.js?siteId=<你的siteId>");
</script>
</body>
在发起业务请求时,获取ua密文;在complete时,切换token。例如:
$.ajax({
type: "POST",
url: that.user.upCoinsUrl,
data: {
uid: uid,
shareId: shareId,
coins: coinsBuilt,
ua:UA_Opt.getUA() //字段名通常是ua,与第4步中从Reqeust.current()中获取的参数名保持一致即可
},
complete:function(){
UA_Opt.reload(true); //异步地切换token
}
dataType: "json",
timeout: 30000
//其他属性...
});
1.4、示例:业务方服务器调用评估风险接口
/**
* 测试antibot_server提供的接口
*/
public static void antibotEstimate(){
Request req = Request.current();
String uaCipher = req.param.get("ua");
if(StringUtils.isEmpty(uaCipher)){
// ua密文不存在,高风险,请处理
ResponseHelper.sendError(...);
}
RuleApiService ruleServ = RPC.look(RuleApiService.class);
RuleEstimateRequest req = new RuleEstimateRequest();
req.setUaCipher(uaCipher);
req.setRules(buildRules("dafde23ccde0a"));
try{
RuleEstimateResponse resp = ruleServ.estimate(req,"?siteId=<你的siteId>");
int riskLevel = resp.getRiskLevel();
if(riskLevel>=4){
//高风险
}
}catch(ApiException e){
//处理业务参数错误,业务码说明请参见接口描述文档
int errCode = e.getErrorCode();
if(errCode==RuleStatusCode.DECODE_FAILURE.getCode()){
//解码失败,可视为高风险
}else{
//多半是请求参数有问题,请调整
}
}catch(RpcException e){
//处理rpc调用出错(如调用超时)
}
}
/** 构造规则
* @param submitBtnId 提交按钮的id
* @return List<Rule>
*/
private static List<Rule> buildRules(String submitBtnId){
return Arrays.asList(new Rule[]{
new Rule(COND.TOKEN),//页面token合法
new Rule(COND.BROWSER_PLATFORM),//浏览器平台APP特征合法
new Rule(COND.TAP_TARGET,OP.EQ, submitBtnId),//提交按钮的点击事件
new Rule(COND.FOCUS,OP.EXIST),//存在焦点事件
new Rule(COND.BLUR,OP.EXIST),//存在失焦事件
new Rule(COND.TAP_INTERVAL,OP.GE,"15"),//按下抬起间隔>=15ms
new Rule(COND.LOCATION,OP.MATCH,"http://wanke.9game.cn/xxx/comment"),//发出请求的页面的地址格式满足正则表达式
new Rule(COND.PAGE_STAY,OP.GE,"2000")//页面停留时间最少2000ms
});
}
1.5、业务方后台请求ua.js及token
当部署结构满足下图时,只需上述四步即可完成接入:
但,当运维不支持将antibot_server直接对外提供/ua.js和/utk时,只能通过业务方web后台(即图中wk_web)向antibot_server转调这两个接口,并将结果返回给浏览器。这种情况下,业务方web后台需要再写两个方法,用于响应浏览器的/ua.js和/utk请求,代码如下:
public class UajsController extends Controller {
private static UajsApiService uajsServ = RPC.look(UajsApiService.class);
/**
* 响应ua.js
*
* @param siteId
* 业务方站点id
* @param siteId
* void
*/
@UnneedAccountSdkHandle
@NoUcidPretreat
@DisableBeforeCache
public static void serveUajs(String siteId) {
Map<String,Object> resp = uajsServ.getUajs(buildSearchStr(siteId));
String jsContent = (String)resp.get("content");
throw new RenderJS(jsContent);
}
static class RenderJS extends Result {
String text;
public RenderJS(CharSequence text) {
this.text = text.toString();
}
public void apply(Request request, Response response) {
try {
jws.Logger.debug("[UajsController RenderJS] apply...");
setContentTypeIfNotSet(response, "application/javascript; charset=utf-8");
response.out.write(text.getBytes("utf-8"));
jws.Logger.debug("[UajsController RenderJS] apply finished.");
} catch (Exception e) {
throw new UnexpectedException(e);
}
}
}
/**
* 响应页面token请求
*
* @param siteId
* 业务方站点id 生成动态token
*/
@UnneedAccountSdkHandle
@NoUcidPretreat
@DisableBeforeCache
public static void serveToken(String siteId) {
throw new RenderText(uajsServ.getToken(buildSearchStr(siteId)));
}
private static String buildSearchStr(String siteId){
if(StringUtils.isNotBlank(siteId)){
return String.format("?siteId=%s", siteId);
}else{
return "";
}
}
}
同时,需要再业务方web后台的routes中,新增如下配置:
GET /ua.js UajsController.serveUajs
GET /utk UajsController.serveToken