# tiny_url **Repository Path**: ponponon/tiny_url ## Basic Information - **Project Name**: tiny_url - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2022-03-16 - **Last Updated**: 2022-05-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 项目描述 闲来无事,写了一个短链接的小项目。 因为平时刷抖音比较多,然后抖音又有视频分享功能,利用到了短链接。所以就用和这个为例子来做吧! ![抖音界面截图](./static/img/3361649600688_.pic.jpg) 比如这是我点了抖音中分享按钮后的链接样式: `https://v.douyin.com/NWJ91NJ/`,然后我在浏览器中打开,就被重定向到了 `https://www.iesdouyin.com/share/video/7084933822722182430/` 打开浏览器的开发者模式就能观察到下面的样子: ![Firefox F12的截图](./static/img/3351649600579_.pic_hd.jpg) 其中 shorturl 就是 `https://v.douyin.com/NWJ91NJ/` 而 long_url 就是 `https://www.iesdouyin.com/share/video/7084933822722182430/` --- 我想实现的功能: - 生成的分享连接要尽量的简短,称之为 tinyurl(或者 shorturl) - 一个视频,每个分享者的分享连接都不一样,这意味着: - tinyUrl 是不可以重复的 - videoUrl 和 tinyUrl 是一对多关系 - 不能从 tinyurl 倒推出分享者是谁,这是为了用户隐私 # QA ## Question: 该项目有鉴权功能吗? Answer: 没有鉴权。现代开发流行微服务,我做的这个就是一个微服务。首先,我这个服务不直接对外,而是给内部服务使用的,不用担心安全、权限等等问题,鉴权由其他服务去做(负责把 cookie、token 等等转成 user_id),然后直接通过 user_id 来区分是谁调用的 Tinyurl 这个服务。 ## Question: 为什么不用 base62,而是使用随机生成 shorturl 呢? Answer: 一个 long_url 只对应一个 shorturl 的方案,可以使用 base62,但是我们要做的是视频连接分享的 tniyurl,每个人的分享链接都是不一样的(为了分析用户行为),所以 base62 不行! ## Question: 为什么不用 video_id + user_id 来做 base62 ? Answer: 因为这样会导致生成的链接长度翻倍,就不 tiny 了! ## Question: 为什么不用 video_id + user_id 来做 base62 ? Answer: 因为这样会导致生成的链接长度翻倍,就不 tiny 了! ## Question: 为什么选用 Python 语言? Answer: 因为我是 Python developer ## Question: 为什么选用 fastapi 框架? Answer: 优雅!pydantic 集成、swagger 集成,非常的好用 ## Question: base62 和 随机数方案怎么权衡? ### 先来说说 Base62 编码方案 优点: - 可逆 - 不会有重复的问题 缺点: - 没有办法做到每个人一个专属连接,只能一对一,不能一对多 ### 再来看看随机生成方案 优点: - 灵活万能 缺点: - 需要使用数据库记录 - 每次生成 tinyUrl 都需要判断一下是否重复了 我们的选择 ## Question: 能从这个项目中学到什么? Answer: - Python 技巧:typing、多线程等等 - 微服务开发:Docker 容器使用,k8s 的使用 - 各种数据库:redis、mysql、hbase、tidb 等等 - 数据分析 - 各种现代化的东西 # 项目进度 2022-04-10 更新:尚在开发中,可以催更 # 制作流程 - 为长链接生成短链接 - 查询短链接对应的长链接 还希望什么?更加通用一些,不仅仅用于 video 分享的场景,还可以用在 user 分享 ## 抖音生成短链接的流程 > 下面的内容基于网页版的抖音分享,地址:https://www.douyin.com/ 先提前按下 F12 ,然后跟着我操作吧! 网页版本点击右下角的按钮就会生成对应的短链接 ![点击右下角的按钮就会生成对应的短链接](./static/img/D6A90F3A-2F17-43B0-8B34-793C030E28B6.png) 短链接的内容:`5.66 mQX:/ “你我素未谋面,心动是我送你的第一份礼物” https://v.douyin.com/N7NS9Lo/ 复制此链接,打开Dou音搜索,直接观看视频!`,其中包含了短链接 `https://v.douyin.com/N7NS9Lo/` 让我们看看开发者模式中有什么吧,通过搜索关键字 `N7NS9Lo` 可以看到一个 GET 请求:`https://www.douyin.com/aweme/v1/web/shorten/?targets=https://www.iesdouyin.com/share/video/7084610343909084427/` (去掉了没有用的东西) ![Firefox F12的截图——生成短链接](./static/img/Xnip2022-04-11_22-12-23.png) 看看这个请求的 response body 是什么吧 ![短链接生成请求的 response body](./static/img/Xnip2022-04-11_22-41-44.png) 格式化一下就是下面的样子: ```json { "short_url_list": [ { "short_url": "https://v.douyin.com/N7NS9Lo/", "status": 0, "target": "https://www.iesdouyin.com/share/video/7084610343909084427/?region=CN\u0026mid=6750804773122869250\u0026u_code=jf5bjlga\u0026did=MS4wLjABAAAAYi4GOOQB03ChUmgGJL65zP6El4vn9_dhAHwlG0HdLHcv6WGoW8QdmIPaN0Uc3MUQ\u0026iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ\u0026with_sec_did=1\u0026titleType=title\u0026from=web_code_link" } ] } ``` ## 访问短链接的流程 把短链接 `https://v.douyin.com/N7NS9Lo/` 复制到浏览器地址栏中, ![访问短链接后的结果-200](./static/img/A5311362-CA49-4CE6-BDC4-4F4CC0D48EBA.png) ![访问短链接后的结果-302](./static/img/A5311362-CA49-4CE6-BDC4-4F4CC0D48EBA.png)