热爱互联网

利用新浪微博短网址实现加密访问功能

已经好多年没打开过这个blog了,幸好域名续费了很久。。。
周末闲得无聊,又刚好有一台空闲的vps,就顺便写了个网页,这几年不是流行https嘛,然后又去狗爹上花了30刀买了ssl证书…

使用场景

微博和Twitter都有140字数的限制,如果分享一个长网址,很容易就超出限制,发布出去。短网址服务可以把一个长网址变成短网址,方便在社交网络上传播。当然有些网赚项目也是通过短网址来推广的。

实现方式大概有两种:

一种是存数据库中,取自增ID,进行10 -> 62进制转换,结果为短网址,访问时再从数据库取得真实地址。
另一种是网上流传较广的,取HASH值的前N位,碰撞,不重复就为短网址。

我们注意到,其实不管上面哪种方式都需要本地建数据库存储,如果量大的话或者被恶意攻击的话,存储和性能等方面都存在很大问题。那么能不能使用大公司已有的基础设施来定做我们自己的短网址呢?

 
我的需求是:用户访问短网址,需要输入访问密码才能够跳到真实链接。

因为新浪短网址并没有提供加密访问功能,但是可以利用新浪的第三方开放平台api来实现自己的新浪短网址。

老板催着我干活了, 贴下API文档

网址缩短

GET /short_url/shorten?url=urlencode(要缩短的网址)&pwd=访问密码

Response
{
    "err_code": 0,
    "err_msg": "OK",
    "short_url": "http://t.cn/Rp7YRQG"
}

网址还原

GET /short_url/expand?url=urlencode(要还原的网址)&pwd=访问密码

Response
{
    "err_code": 0,
    "err_msg": "OK",
    "long_url": "https://www.baidu.com"
}

加密链接的生成

处理网址缩短请求时,首先检测pwd是否为空,如果pwd为空,long_url即为原始链接,
如果pwd不为空,那么需要将原始链接按如下步骤处理,然后将得到的long_url交于新浪API处理:

long_url: https://weibo.ws/short_url/check_pwd?url=base64UrlEncode(ciphertext)

ciphertext = AES(jsonbody)
jsonbody = {"long_url": "https://www.baidu.com", "pwd": "访问密码"}

加密链接的访问

GET /short_url/check_pwd?url=xxx

用户访问 http://t.cn/Rp7YRQG 时,跳转到 /short_url/check_pwd?url=xxx,用户在页面输入密码后,
POST请求 /short_url/check_pwd?url=xxx&pwd=访问密码 。
服务器在收到请求后,先解码xxx获取里面的'pwd'字段,若pwd一致后,则返回原始的long_url
Response
{
    "err_code": 0,
    "err_msg": "OK",
    "long_url": "https://www.baidu.com"
}

整个实现原理全部讲完了,最后贴一下项目地址 新浪短网址,欢迎根据上面的API文档使用。

PS:为什么不用网上第三方的,因为第三方的短网址会偷偷进行流量劫持,就是半夜偷偷把你的短链接跳到其他的广告页面,所以最靠谱的还是是用新浪提供的服务。

测试一下
加密访问测试(123456)

Post a Comment

Your email is kept private. Required fields are marked *