Go短链接服务分析
概览
应用场景
- 微信文章分享,访问1次后失效
- 文章分享,需要密码访问
- 以二维码访问分享链接
- 访问城市,设备统计
- 分享后能保留#后长尾路由
功能列表
- 允许给短网址加密码,分享更私密
- 短网址只想被人访问1次?2次?若干次?都可以,只要你指定就行
- 接入到你的应用系统中?开放API
- 二维码展示
- 访客统计的来自哪个城市?用什么上网?操作系统是什么?IP是什么?用的什么浏览器等等。
对象列表
gox_url_item
名称 | 描述 |
---|---|
ID | guid |
TYPE | 301跳转,302跳转,302直达,js跳转,meta跳转 |
SHORT_CODE | 编号 |
URL_LONG | 长网址 |
URL_CALLBACK | 回调地址 |
COUNT_ALLOW | 允许次数 |
COUNT_VISiT | 访问次数 |
API列表
短网址生成
Get url
http://dev.xxx.com/create?applicationId=123?url_long=[长网址]&url_callback=[http://dev.xxx.com/owx/{shortCode}]&time=1&expires=1141889120&password=000000
- applicationId参数为应用id,可为空
- times参数是可分享次数
- auth=1 参数为启用密码访问
- applicationId 为应用id可为空
- url_callback 为跳转回调地址,需要在回调地址中通过api 获取回调具体地址
- url_long 访问地址
- expires这个参数的值是一个UNIX时间(自UTC时间1970年1月1号开始的秒数,详见wiki),用于标识该URL的超时时间。如果OSS接收到这个URL请求的时候晚于签名中包含的Expires参数时,则返回请求超时的错误码。例如:当前时间是1141889060,开发者希望创建一个60秒后自动失效的URL,则可以设置Expires时间为1141889120。
- restype 返回类型 json 返回对象,qrcode 返回直接返回二维码
- logo qrocde中间的logo nbeport 返回电子口岸 logo , nbciq 返回宁波国检logo
示例1 生成短链接
http://localhost/go/create?applicationId=123&url_long=http://www.baidu.com&url_callback=http://www.baidu.com/{shortCode}&time=1&expires=1141889120&password=000000
返回结果
{"ShortCode":"7J7fIn","ShortUrl":"http://dev.www.com/go/7J7fIn"}
短网址获取信息
请求参数
get url:http://dev.xxx.com/go/get/{shortCode}
返回结果
{"ShortCode":"7J7fIn","CallBackUrl":"http://dev.xxx.com/owx/{0}","LongUrl":"http://dev.xxx.com/nqp/#/tab/send","Expires":1234312111,"Times":-1,"Password":"","VistCount":0}
短网址直接访问
浏览器中直接访问 http://dev.xxx.com/go/{shortCode}
短网址二维码显示
http://dev.xxx.com/go/{shortCode}/qrcode/{pix}
应用示例
301跳转
- 使用 短网址生成 生成短网址
- 分享短网址
- 短网址将重定向到目标网址
callback调用
- 使用 短网址生成 生成短网址
- 分享短网址
- 短网址将重定向到回调地址
- 回调地址通过[短网址获取信息]接口获取配置信息
- 业务逻辑后续处理
Key生成算法
- 将长网址md5生成32位签名串,分为4段, 每段8个字节;
- 对这四段循环处理, 取8个字节, 将他看成16进制串与0x3fffffff(30位1)与操作, 即超过30位的忽略处理;
- 这30位分成6段, 每5位的数字作为字母表的索引取得特定字符, 依次进行获得6位字符串;
- 总的md5串可以获得4个6位串; 取里面的任意一个就可作为这个长url的短url地址;
`public class UrlHelper {
public static string[] Create(string url)
{
//可以自定义生成MD5加密字符传前的混合KEY
string key = "mykey1";
//要使用生成URL的字符
string[] chars = new string[]{
"a" , "b" , "c" , "d" , "e" , "f" , "g" , "h" ,
"i" , "j" , "k" , "l" , "m" , "n" , "o" , "p" ,
"q" , "r" , "s" , "t" , "u" , "v" , "w" , "x" ,
"y" , "z" , "0" , "1" , "2" , "3" , "4" , "5" ,
"6" , "7" , "8" , "9" , "A" , "B" , "C" , "D" ,
"E" , "F" , "G" , "H" , "I" , "J" , "K" , "L" ,
"M" , "N" , "O" , "P" , "Q" , "R" , "S" , "T" ,
"U" , "V" , "W" , "X" , "Y" , "Z"};
//对传入网址进行MD5加密
string hex = Md5Hash(key + url);
string[] resUrl = new string[4];
for (int i = 0; i < 4; i++)
{
//把加密字符按照8位一组16进制与0x3FFFFFFF进行位与运算
int hexint = 0x3FFFFFFF & Convert.ToInt32("0x" + hex.Substring(i * 8, 8), 16);
string outChars = string.Empty;
for (int j = 0; j < 6; j++)
{
//把得到的值与0x0000003D进行位与运算,取得字符数组chars索引
int index = 0x0000003D & hexint;
//把取得的字符相加
outChars += chars[index];
//每次循环按位右移5位
hexint = hexint >> 5;
}
//把字符串存入对应索引的输出数组
resUrl[i] = outChars;
}
return resUrl;
}
/// <summary>
/// 32位MD5加密
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
private static string Md5Hash(string input)
{
MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}
}`