1、防骚扰黑名单
1.1 协议说明
拦截等级定义
⼀般 :核⼼投诉库;拦截比例8%左右
敏感: 核⼼投诉库;有效投诉库 ;拦截比例13%左右
⾼危: 核⼼投诉库;有效投诉库;⾏为预警库 ;拦截比例15%左右
核⼼投诉库情况:包括高投诉群体和当天极度敏感人群(当天退订短信人群);
有效投诉库情况:最近⼀年有投诉的集合;
⾏为预警库情况:通过上⾏、⾼频查询和设备等⽅式判定的有投诉倾向的集合
1.2 请求参数
请求参数 Body 以 application/x-www-form-urlencoded 方式提交
1.3 响应内容
字段名 | 类型 | 说明 |
---|
resultCode | String | 状态码,000000-成功 其他-失败,详见附录状态码 |
resultMsg | String | 状态码说明 |
requestId | String | 请求 id |
chargeCounts | Integer | 计费条数 |
resultObj | array | 返回结果 |
mobile | String | 手机号码 |
forbid | String | 是否拦截,0: 非风险号码,不拦截,1: 风险号码,拦截,2:行为预警号码,拦截 |
msg | String | 中文描述: 非风险号码 风险号码需拦截 行为预警号码需拦截。 等级为高危才返回行为预警,行为预警定义:通过上⾏、⾼频查询和设备等⽅式判定的有投诉倾向的集合 |
luckyLevel | String | 吉祥号等级(见 1.6) |
1.4 请求示例
{
"resultMsg": "成功",
"resultCode": "000000",
"chargeCounts": 2,
"requestId": "1181696648126271488",
"resultObj": [
{
"mobile": "13911112222",
"forbid": 1,
"msg": "风险号码需拦截",
"luckyLevel": "1"
},
{
"mobile": "13911113333",
"forbid": 0,
"msg": "非风险号码",
"luckyLevel": "1"
}
]
}
1.5 失败返回实体
{
"resultMsg": "拦截等级不存在",
"resultCode": "400102",
"chargeCounts": 0
}
1.6 吉祥号等级
吉祥号等级 | 规则 | 描述 |
---|
-1 | 非手机号 | \ |
1 | 六位连续相同数字,或四位相同数字+四位相同数字,或连续的 8 位顺增数字 | 建议拦截 |
2 | 五位连续相同数字或连续的 7 位顺增数字 | 建议拦截 |
3-1 | 四位连续相同数字,最后一位为 6/7/8/9,或连续的 6 位顺增数字,或两两相同的数字连续出现四次 | 建议拦截 |
3-2 | 四位连续相同数字 | 建议拦截 |
4-1 | 三位连续相同数字,最后一位为 6/7/8/9,或连续的 5 位顺增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
4-2 | 三位连续相同数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
5-1 | 两两相同的数字连续出现三次,或末尾四个为连续的 4 位递增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
5-2 | 连续的 4 位顺增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
6 | 两两相同的数字连续出现两次,或者连续的 3 位递增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
0 | 不符合上述任何一种情况的号码,普通号码 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
2、防骚扰黑名单(MD5 版)
2.1 协议说明
2.2 请求参数
请求参数 Body 以 application/x-www-form-urlencoded 方式提交
2.3 响应内容
字段名 | 类型 | 说明 |
---|
resultCode | String | 状态码,000000-成功 其他-失败,详见附录状态码 |
resultMsg | String | 状态码说明 |
requestId | String | 请求 id |
chargeCounts | Integer | 计费条数 |
resultObj | array | 返回结果 |
mobile | String | MD5 手机号码 |
forbid | String | 是否拦截,0: 非风险号码,不拦截,1: 风险号码,拦截,2:行为预警号码,拦截,3:库无 |
msg | String | 中文描述: 非风险号码 风险号码需拦截 行为预警号码需拦截 库无 等级为高危才返回行为预警,行为预警定义:通过上⾏、⾼频查询和设备等⽅式判定的有投诉倾向的集合 |
luckyLevel | String | 吉祥号等级(见 2.6) |
2.4 请求示例
{
"resultMsg": "成功",
"resultCode": "000000",
"chargeCounts": 2,
"requestId": "1075739120843624448",
"resultObj": [
{
"mobile": "92c13b699442dc45a155a7567aa73efa",
"forbid": 1,
"msg": "风险号码需拦截",
"luckyLevel": "1"
},
{
"mobile": "92c137bb672d6e96571d28d052f20d68",
"forbid": 0,
"msg": "非风险号码",
"luckyLevel": "1"
},
{
"mobile": "92c13b699442dc45a155a7567aa73ef1",
"forbid": 3,
"msg": "库无",
"luckyLevel": "-1"
}
]
}
2.5 失败返回实体
{
"resultMsg": "拦截等级不存在",
"resultCode": "400102",
"chargeCounts": 0
}
2.6 吉祥号等级
吉祥号等级 | 规则 | 描述 |
---|
-1 | 非手机号 | \ |
1 | 六位连续相同数字,或四位相同数字+四位相同数字,或连续的 8 位顺增数字 | 建议拦截 |
2 | 五位连续相同数字或连续的 7 位顺增数字 | 建议拦截 |
3-1 | 四位连续相同数字,最后一位为 6/7/8/9,或连续的 6 位顺增数字,或两两相同的数字连续出现四次 | 建议拦截 |
3-2 | 四位连续相同数字 | 建议拦截 |
4-1 | 三位连续相同数字,最后一位为 6/7/8/9,或连续的 5 位顺增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
4-2 | 三位连续相同数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
5-1 | 两两相同的数字连续出现三次,或末尾四个为连续的 4 位递增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
5-2 | 连续的 4 位顺增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
6 | 两两相同的数字连续出现两次,或者连续的 3 位递增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
0 | 不符合上述任何一种情况的号码,普通号码 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
2.7 测试工具
使用说明
1.请确认确激活防骚扰黑名,并且有响应余额。
2.在IP白名单中,绑定本机,所在的公网IP(绑定后5分钟生效)。
3.appid和appkey在接口详情处获取。
4.输入的文件格式为csv或者txt格式,每行一个号码(仅需包含号码)。
5.单次检测的号码数量请控制在50万内。
6.每测试1次"测试连接”将后可能会消耗-次查询。
7.每次独立的检测,对应的文件名不要与历史检测的文件名重合。
操作步骤
1.输入appid和appkey,点击测试连接,待提示连接成功方可下一步。
2.输入待检测文件的地址,点击预览,待提示成功后方可下一步。
3.选择forbidLevel等级(根据内容的易投诉情况选择合适的等级)。
4.点击执行,并观察进度条(执行期间请勿关闭该窗口)。
5.若执行中断,重新打开软件,重复1到4步,将继续中断前的检测。
示例
3、防骚扰黑名单(vos)
3.1 协议说明
⼀般 :核⼼投诉库;拦截比例8%左右
敏感: 核⼼投诉库;有效投诉库 ;拦截比例13%左右
⾼危: 核⼼投诉库;有效投诉库;⾏为预警库 ;拦截比例15%左右
核⼼投诉库情况:包括高投诉群体和当天极度敏感人群(当天高频语音呼叫人群)
有效投诉库情况:最近⼀年有投诉的集合;
⾏为预警库情况:通过上⾏、⾼频查询和设备等⽅式判定的有投诉倾向的集合
3.2 请求参数
参数名 | 数据类型 | 说明 |
---|
appId | Integer | 呼叫唯一标识 |
caller | String | 通话主叫号码 |
callee | String | 通话被叫号码(查询黑名单的号码) |
version | Integer | 黑名单拦截等级(1:一般2:敏感3:高危),默认:1 |
extraData | String | 拓展字段,json格式的字符串,包含:appId、appKey。appId、appKey请在https://www.chuanglan.com/登录后获取 |
在vos中配置的示例
SERVER_EXTERNAL_BLACK_LIST_EXTRA_DATA={\"appId\":\"******\",\"appKey\":\"******\"}
SERVER_EXTERNAL_BLACK_LIST_HTTP= https://wsapi.253.com/customized/vosReq
SERVER_EXTERNAL_BLACK_LIST_HTTP_TIMEOUT=5000
SERVER_EXTERNAL_BLACK_LIST_VERSION = 2
3.3 响应内容
响应body数据为JSON格式。
字段名 | 类型 | 说明 |
---|
callId | Integer | 呼叫唯一标识 |
forbid | Integer | 不设置:允许通话继续 设置:禁止通话继续, 可任意填写数值 |
3.4 请求示例
{
"callId": 123456,
"caller": "139xxxxxxxx",
"callee": "139xxxxxxxx",
"version": 3,
"extraData": "{\"appId\":\"XXXXXXXX\",\"appKey\": \"XXXXXXXX\"}"
}
3.5 响应示例
设置:禁止通话继续
{
"callId": 123456,
"forbid": 1
}
不设置:允许通话继续
{
"callId": 123456
}
4、防骚扰黑名单(AES)
4.1 协议说明
4.2 请求参数
参数名 | 数据类型 | 说明 |
---|
appId | String | appId |
appKey | String | appKey |
forbidLevel | Integer | 拦截等级(1:一般 2:敏感 3:高危) |
mobiles | String | 1. 非AES加密类型,明文手机号,多个手机号以英文半角逗号分隔,最多支持500个号码 2. AES加密类型,需对手机号进行AES(mobiles, aesSecretKey)加密 |
encryptType | String | 加密类型, 1:AES256,0:明文手机号;默认0 |
timestamp | String | 时间戳 |
nonce | String | 随机字符串 |
sign | String | 签名,sha256(appId + appKey + aesSecretKey+ forbidLevel+ timestamp) |
4.3 响应内容
响应body数据为JSON格式。
字段名 | 类型 | 说明 |
---|
resultCode | String | 状态码,000000-成功 其他-失败,详见附录状态码 |
resultMsg | String | 状态码说明 |
requestId | String | 请求id |
chargeCounts | Integer | 计费条数 |
resultObj | array | 返回结果:1. 非AES加密类型,此字段返回查询结果数组;2. AES加密类型,此字段不返回; |
mobile | String | 手机号码 |
forbid | Integer | 是否拦截,是否拦截,0: 非风险号码,不拦截,1: 风险号码,拦截,2:行为预警号码,拦截,3:库无 |
msg | String | 中文描述:非风险号码 风险号码需拦截 行为预警号码需拦截 库无等级为高危才返回行为预警,行为预警定义:通过上⾏、⾼频查询和设备等⽅式判定的有投诉倾向的集合 |
luckyLevel | String | 吉祥号等级(见2.6) |
resultAES | String | 返回结果:1. 非AES加密类型,此字段不返回;2. AES加密类型,此字段返回对resultObj进行AES加密后的结果; |
4.4 响应示例(明文)
{
"resultMsg": "成功",
"resultCode": "000000",
"chargeCounts": 2,
"requestId": "1189520112465743872",
"resultObj": [
{
"mobile": "15966784104",
"forbid": 0,
"msg": "非风险号码",
"luckyLevel": "6"
},
{
"mobile": "13000001111",
"forbid": 1,
"msg": "风险号码需拦截",
"luckyLevel": "1"
}
]
}
4.4 响应示例(AES)
{
"resultMsg": "成功",
"resultCode": "000000",
"chargeCounts": 3,
"requestId": "1189519542740848640",
"resultAES": "DFLQz-_xGoSEYJyairkew13WsGoAukndoI0ygiPyzXIIehi-UjUYgMEVp5i_Owf0xGlCfnH1qA8Rsevc9WkYOPsOGDQpOihAv4R9l_41RPpIAKBfgPKcqL9x_wvHvSjCA9-CQGSlTlYLZ1yUtt67M58rw1roA9PLt3VBGpRH1qBJUmwL0tAI_h6bmL364_yxews_X6lhgHIIKXwW548042wPfXVaOhBNd5m59rRjU8K0ig65OizSAqz60rPO5wyx5QYB6wi7aKuZXsPzZpLRw8b0ejn52wkFBBVRh5GBIJMKxzq6LprIHiyB3uxw1neSTcd3SbvZ5k-P18R4dQ_okw=="
}
4.5 吉祥号等级
吉祥号等级 | 规则 | 描述 |
---|
-1 | 非手机号 | \ |
1 | 六位连续相同数字,或四位相同数字+四位相同数字,或连续的 8 位顺增数字 | 建议拦截 |
2 | 五位连续相同数字或连续的 7 位顺增数字 | 建议拦截 |
3-1 | 四位连续相同数字,最后一位为 6/7/8/9,或连续的 6 位顺增数字,或两两相同的数字连续出现四次 | 建议拦截 |
3-2 | 四位连续相同数字 | 建议拦截 |
4-1 | 三位连续相同数字,最后一位为 6/7/8/9,或连续的 5 位顺增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
4-2 | 三位连续相同数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
5-1 | 两两相同的数字连续出现三次,或末尾四个为连续的 4 位递增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
5-2 | 连续的 4 位顺增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
6 | 两两相同的数字连续出现两次,或者连续的 3 位递增数字 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
0 | 不符合上述任何一种情况的号码,普通号码 | 根据客户需求酌情选择是否拦截:比如高危情况建议所有吉祥号都拦截 |
4.6 加密代码参考(JAVA)
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class EncryptionUtils {
private static final String ENCRYPTION_ALGORITHM = "AES";
private static final String SECRET_KEY_ALGORITHM = "AES";
private static final String HASH_ALGORITHM = "SHA-256";
public static String encrypt(String data, String key) throws Exception {
SecretKeySpec secretKeySpec = generateSecretKeySpec(key);
Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
return Base64.getUrlEncoder().encodeToString(encryptedBytes);
}
public static String decrypt(String data, String key) throws Exception {
SecretKeySpec secretKeySpec = generateSecretKeySpec(key);
Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
byte[] decodedBytes = Base64.getUrlDecoder().decode(data);
byte[] decryptedBytes = cipher.doFinal(decodedBytes);
return new String(decryptedBytes, StandardCharsets.UTF_8);
}
private static SecretKeySpec generateSecretKeySpec(String key) throws Exception {
MessageDigest sha = MessageDigest.getInstance(HASH_ALGORITHM);
byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
byte[] hashedBytes = sha.digest(keyBytes);
byte[] truncatedBytes = new byte[16];
System.arraycopy(hashedBytes, 0, truncatedBytes, 0, truncatedBytes.length);
return new SecretKeySpec(truncatedBytes, SECRET_KEY_ALGORITHM);
}
/**
* Sha256哈希加密
**/
public static String sha256(String source) {
String encodeStr = "";
try {
//生成sign
encodeStr = DigestUtils.sha256Hex(source);
} catch (Exception e) {
log.error("SHA256加密失败,source:{}", source, e);
}
return encodeStr;
}
public static void main(String[] args) {
//appId/appKey/AES秘钥,用户控制台获取
String appId = "11111";
String appKey = "22222";
String aesSecretKey = "e70b825512444addb3ebc39d8dacad0f";
String forbidLevel = "1";
String mobiles = "13911112222,13911113333"; //明文手机号
String nonce = "899cb86333be4549be00986b4e602410";
String timestamp = String.valueOf(System.currentTimeMillis());
try {
//http请求参数
Map<String, String> param = new HashMap<>();
param.put("appId", appId); //万数appId
param.put("appKey", appKey);//万数appKey
param.put("forbidLevel", "1");//拦截等级(1:一般 2:敏感 3:高危)
param.put("encryptType", "1");//加密类型, 1:AES256,0:明文手机号;默认0
param.put("nonce", nonce);//随机字符串
param.put("timestamp", timestamp);//时间戳
String encryptMobiles = EncryptionUtils.encrypt(mobiles, aesSecretKey);
param.put("mobiles", encryptMobiles);//encryptType为AES加密类型时,需要对mobiles字段进行AES加密后传入
String sign = sha256(appId + appKey + aesSecretKey + forbidLevel + timestamp);
param.put("sign", sign);//获取签名,sha256(appId + appKey + aesSecretKey + forbidLevel + timestamp)
log.info("timestamp:{},encryptMobiles:{},sign:{}", timestamp, encryptMobiles, sign);
//发送http请求
//........
// 结果响应,resultAES为AES加密的返回的数据,需要解密
String resultAES = "DFLQz-_xGoSEYJyairkew13WsGoAukndoI0ygiPyzXIIehi-UjUYgMEVp5i_Owf0xGlCfnH1qA8Rsevc9WkYOPsOGDQpOihAv4R9l_41RPpIAKBfgPKcqL9x_wvHvSjCA9-CQGSlTlYLZ1yUtt67M58rw1roA9PLt3VBGpRH1qBJUmwL0tAI_h6bmL364_yxews_X6lhgHIIKXwW548042wPfXVaOhBNd5m59rRjU8K0ig65OizSAqz60rPO5wyx5QYB6wi7aKuZXsPzZpLRw8b0ejn52wkFBBVRh5GBIJMKxzq6LprIHiyB3uxw1neSTcd3SbvZ5k-P18R4dQ_okw==";
String decryptedData = EncryptionUtils.decrypt(resultAES, aesSecretKey);
log.info("解密后的数据:{} ", decryptedData);
//解密后的数据: [{"forbid":0,"mobile":"13911112222","msg":"非风险号码"},{"forbid":0,"mobile":"13911113333","msg":"非风险号码"}]
} catch (Exception e) {
e.printStackTrace();
}
}
}
附录
code 码 | 描述 |
---|
000000 | 成功 |
400102 | 参数错误、参数不能为空、拦截等级不存在、号码数量不符合要求 |
403000 | 用户校验失败、请求非法,appId 不能为空、请求非法,appKey 不能为空、请求非法,appId 格式不正确、请求非法,appKey 格式不正确、请求非法,appId 不存在 |
500005 | 余额不足、账户余额异常 |
500100 | 系统错误 |
500008 | 请求速率超限 |
- - | |
没有更多了