全球主机交流论坛

标题: 【开源】在 CF Workers 搭建自己的 t.cn 短网址入口 [打印本页]

作者: Mr.    时间: 2020-4-19 18:01
标题: 【开源】在 CF Workers 搭建自己的 t.cn 短网址入口
本帖最后由 Mr. 于 2020-4-19 18:39 编辑

@ljm4216 大佬的帖子 https://www.gebi.eu.org/thread-676833-1-1.html 得到启发,
才知道原来 t.cn 的接口这么简单,于是撸了个基于 Cloudflare Workers 的在线版页面。

演示地址:https://tcn.sino.workers.dev/

食用方法:创建个 workers 把以下代码粘贴进去就可以了,快把今天撸的免费域名用起来吧!

  1. addEventListener('fetch', (event) => {
  2.   return event.respondWith(handleRequest(event.request));
  3. })

  4. const handleRequest = async (request) => {
  5.   const render = (body) => {
  6.     return new Response(`
  7.       <!doctype html>
  8.       <html>
  9.       <head>
  10.         <meta charset="utf-8" />
  11.         <meta name="viewport" content="width=device-width,initial-scale=1" />
  12.         <title>T.CN 短网址</title>
  13.       </head>
  14.       <body>${body}</body>
  15.       </html>`.trim(), {
  16.       status: 200,
  17.       headers: {
  18.         'Content-Type': 'text/html; charset=utf-8'
  19.       }
  20.     });
  21.   }
  22.   request = new URL(request.url);
  23.   if (request.pathname !== '/') return new Response(null, { status: 404 });
  24.   if (request.searchParams.has('url')) {
  25.     const url = request.searchParams.get('url');
  26.     const response = await fetch(`http://service.weibo.com/share/share.php?url=${encodeURIComponent(url)}&title=1`);
  27.     const html = await response.text();
  28.     const short = html.match(/http:\/\/t.cn\/\w+/i);
  29.     const refer = html.match(/\$refer\s+: "(.+?)"/i);
  30.     if (short && refer) {
  31.       return render(`
  32.         缩短结果:<a href="${short[0]}">${short[0]}</a><br />
  33.         原始网址:<a href="${refer[1]}">${refer[1]}</a><br />
  34.         <a href="/">返回</a>
  35.       `);
  36.     }
  37.     return render(`请求失败`);
  38.   }
  39.   return render(`
  40.     <form method="GET">
  41.     <input name="url" placeholder="URL" />
  42.     <button type="submit">压缩</button>
  43.     </form>
  44.   `);
  45. }
复制代码

作者: future    时间: 2020-4-19 18:02
支持大佬!
作者: robot    时间: 2020-4-19 18:04
好东东。紫薯补丁
作者: Reves    时间: 2020-4-19 18:04
感谢分享,一会儿试试
作者: 嗷嗷    时间: 2020-4-19 18:05
牛批牛批
作者: tssz    时间: 2020-4-19 18:07
收藏
作者: shenke    时间: 2020-4-19 18:12
提示: 作者被禁止或删除 内容自动屏蔽
作者: Mr.    时间: 2020-4-19 18:12
shenke 发表于 2020-4-19 18:12
https://blog.csdn.net/sculpta/article/details/104142531

你怕是理解错了
作者: qytang    时间: 2020-4-19 18:20
本帖最后由 qytang 于 2020-4-19 18:22 编辑

牛逼!不管是啥,到大佬们手里都能玩出花来
作者: 李逍遥    时间: 2020-4-19 18:24
提示: 作者被禁止或删除 内容自动屏蔽
作者: Aczz    时间: 2020-4-19 18:24
谢谢分享
作者: Mr.    时间: 2020-4-19 18:35
qytang 发表于 2020-4-19 18:20
牛逼!不管是啥,到大佬们手里都能玩出花来

不是啥新花样,就为了自用方便点
作者: Lemon0    时间: 2020-4-19 18:37
哇 NBNB Mark
作者: Emporer    时间: 2020-4-19 18:46
缩短的链接有问题,无法访问 ---前面多了 t.cn
作者: Mr.    时间: 2020-4-19 18:47
Emporer 发表于 2020-4-19 18:46
缩短的链接有问题,无法访问

原链接是什么样的
作者: Mr.    时间: 2020-4-19 18:50
Emporer 发表于 2020-4-19 18:46
缩短的链接有问题,无法访问 ---前面多了 t.cn

用什么网址去缩短的
作者: Emporer    时间: 2020-4-19 18:51
Mr. 发表于 2020-4-19 18:47
原链接是什么样的

www.baidu.com
作者: Mr.    时间: 2020-4-19 18:53
Emporer 发表于 2020-4-19 18:51
www.baidu.com

加上 http:// 或 https://,
新浪允许这样的网址我就懒得做校验了,反正不消耗自己的数据库,正常用也不会去压这样的网址
作者: b66667777    时间: 2020-4-19 18:56
路过帮顶
作者: hihelllo    时间: 2020-4-19 18:58
url.cn 杂生成?
作者: Mr.    时间: 2020-4-19 18:59
hihelllo 发表于 2020-4-19 18:58
url.cn 杂生成?

不知道啊… 以前要用也都是网上找,后来发现几个网站都挂了,今天看到大佬那个帖子才搞了这个
作者: bl5c    时间: 2020-4-19 19:01

还需要解压缩功能
作者: Mr.    时间: 2020-4-19 19:02
bl5c 发表于 2020-4-19 19:01
还需要解压缩功能


好 我研究一下 应该不难
作者: cxuqry    时间: 2020-4-19 19:02
这个好,等下就去试试
作者: suaxi    时间: 2020-4-19 19:07
蛇蛇楼主
作者: Mr.    时间: 2020-4-19 19:09
suaxi 发表于 2020-4-19 19:07
蛇蛇楼主

she?she哪里???
作者: suaxi    时间: 2020-4-19 19:12
Mr. 发表于 2020-4-19 19:09
she?she哪里???

我原本是把这个帖子的链接转成了短链,编辑了两遍回复都没发成功
作者: hihelllo    时间: 2020-4-19 19:20
Mr. 发表于 2020-4-19 18:59
不知道啊… 以前要用也都是网上找,后来发现几个网站都挂了,今天看到大佬那个帖子才搞了这个 ...

刚才找了一圈都是第三方的
作者: ncnc    时间: 2020-4-19 19:21
Cloudflare Workers

怎么使用呢
作者: test100    时间: 2020-4-19 19:21
不懂,先马克搞到免费的再说
作者: Mr.    时间: 2020-4-19 19:28
ncnc 发表于 2020-4-19 19:21
Cloudflare Workers

怎么使用呢

登录 cf,右边有个 workers
作者: 空灵心梦    时间: 2020-4-19 19:34
本帖最后由 空灵心梦 于 2020-4-19 19:40 编辑

大佬牛逼,但是为啥我的短网址直接404了...

又试了一下转换这个帖子的地址是没问题的,但是转我自己的站就404,难道是因为没有北岸的原因吗

不对,只是因为转出来默认是http协议的,我开了强制https 很好用感谢楼主
作者: usbport    时间: 2020-4-19 19:37
mark一下 之后肯定能用到的
作者: Zeros    时间: 2020-4-19 19:39
nbnb,不愧是大佬
作者: 1号城管    时间: 2020-4-19 19:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 空灵心梦    时间: 2020-4-19 19:42
本帖最后由 空灵心梦 于 2020-4-19 19:43 编辑
1号城管 发表于 2020-4-19 19:40
我就想知道如果被MJJ恶意刷CF Workers请求的话会不会损失一套海景房,


workers配额用完应该只是暂停服务,之前有大佬在workers上放了个影视站,到了晚上的时候经常上不去,估计是配额用完自动暂停了

去查了下,的确只是暂停服务
Worker requests that exceed the daily limit of 100,000 requests per day or 1,000 requests per minute will return errors.

作者: 风为裳    时间: 2020-4-19 19:42
感谢楼主分享,标记一下,以后慢慢弄
作者: Mr.    时间: 2020-4-19 19:44
1号城管 发表于 2020-4-19 19:40
我就想知道如果被MJJ恶意刷CF Workers请求的话会不会损失一套海景房,

没绑卡,用的免费套餐,请求数用完了就暂停
作者: 1号城管    时间: 2020-4-19 19:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: M78探索者    时间: 2020-4-19 19:48
mark一下,cloudflare卡的上不去啊
作者: Mr.    时间: 2020-4-19 20:20
空灵心梦 发表于 2020-4-19 19:34
大佬牛逼,但是为啥我的短网址直接404了...

又试了一下转换这个帖子的地址是没问题的,但是转我自己的站就 ...

你是说 http 开头的 t.cn 的压缩结果,无法跳转到强制 https 的目标网站?
作者: 空灵心梦    时间: 2020-4-19 20:45
Mr. 发表于 2020-4-19 20:20
你是说 http 开头的 t.cn 的压缩结果,无法跳转到强制 https 的目标网站?

我又看了下,发现原因是没加http://,我就说我设置了重定向的
作者: 空灵心梦    时间: 2020-4-19 20:46
Mr. 发表于 2020-4-19 20:20
你是说 http 开头的 t.cn 的压缩结果,无法跳转到强制 https 的目标网站?

  1. const url = "http://"+request.searchParams.get('url');
复制代码

第26行这里自动加上“http://”用起来方便一些
作者: 铅笔    时间: 2020-4-19 21:03
技术贴绑定 大佬牛逼
作者: Mr.    时间: 2020-4-19 21:05
空灵心梦 发表于 2020-4-19 20:46
第26行这里自动加上“http://”用起来方便一些

那会导致有 http 或 https 的网站出错的
作者: 空灵心梦    时间: 2020-4-19 21:08
Mr. 发表于 2020-4-19 21:05
那会导致有 http 或 https 的网站出错的

也是,只考虑到了手动输入方便了一些
作者: Tong    时间: 2020-4-19 21:21
大佬牛逼,mark
作者: 额头有王的喵    时间: 2020-4-19 21:41
loc需常来,mjj花样多
作者: Mr.    时间: 2020-4-19 22:42
空灵心梦 发表于 2020-4-19 21:08
也是,只考虑到了手动输入方便了一些

本来想加个判断,无前缀的自动加前缀。
但突然发现,不能单纯判断有无 http 开头,因为还可能存在 ftp:// 等其它协议,有点复杂,还是算了,怪不得渣浪的接口也不判断,来者不拒。
作者: 32MB.CN    时间: 2020-4-19 23:12
大佬666
作者: Function    时间: 2020-4-19 23:45
优秀,哈哈,终于有自己的啦
作者: ljm4216    时间: 2020-4-20 02:27
提示: 作者被禁止或删除 内容自动屏蔽
作者: xJogger    时间: 2020-4-20 09:11
本帖最后由 xJogger 于 2020-4-20 09:23 编辑

加了一点样式,看起来更舒服了。

预览:




代码:

  1.      addEventListener('fetch', (event) => {
  2.       return event.respondWith(handleRequest(event.request));
  3.     })

  4.     const handleRequest = async (request) => {
  5.       const render = (body) => {
  6.         return new Response(`
  7. <!DOCTYPE html>
  8. <html>
  9.   <head>
  10.     <meta charset="utf-8">
  11.     <meta name="viewport" content="width=device-width, initial-scale=1">
  12.     <title>T.CN 短网址</title>

  13.     <style media="screen">
  14.       body { background: #ECEFF1; color: rgba(0,0,0,0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; }
  15.       #message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px; border-radius: 3px; }
  16.       #message h2 {  color: rgba(0,0,0,0.6); font-weight: bold; font-size: 14px; margin: 0 0 8px; }
  17.       #message h1 { color: #ffa100;  font-size: 30px; font-weight: 300;  margin: 0 0 16px;}
  18.       #message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; }
  19.       #message a { display: block; text-align: center; background: #039be5; text-decoration: none; color: white; padding: 16px; border-radius: 4px; }
  20.       #message, #message a { box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); }
  21.       #load { color: rgba(0,0,0,0.4); text-align: center; font-size: 13px; }
  22.       @media (max-width: 600px) {
  23.         body, #message { margin-top: 0; background: white; box-shadow: none; }
  24.         body { border-top: 16px solid #ffa100; }
  25.       }
  26.     </style>
  27.   </head>
  28.   <body>
  29. ${body}

  30. </body>
  31. </html>`.trim(), {
  32.           status: 200,
  33.           headers: {
  34.             'Content-Type': 'text/html; charset=utf-8'
  35.           }
  36.         });
  37.       }
  38.       request = new URL(request.url);
  39.       if (request.pathname !== '/') return new Response(null, { status: 404 });
  40.       if (request.searchParams.has('url')) {
  41.         const url = request.searchParams.get('url');
  42.         const response = await fetch(`http://service.weibo.com/share/share.php?url=${encodeURIComponent(url)}&title=1`);
  43.         const html = await response.text();
  44.         const short = html.match(/http:\/\/t.cn\/\w+/i);
  45.         const refer = html.match(/\$refer\s+: "(.+?)"/i);
  46.         if (short && refer) {
  47.           return render(`
  48.           <div id="message" align="center">
  49.          
  50.             <center><h1>缩短结果:</h1><a href="${short[0]}">${short[0]}</a></center>
  51.             <p></p>
  52.             <center><h1>原始网址:</h1><a href="${refer[1]}">${refer[1]}</a></center>
  53.             <p></p>
  54.             <a href="/">返回</a>
  55.             </div>
  56.           `);
  57.         }
  58.         return render(`
  59.         <div id="message" align="center">
  60.         <center><h1>请求失败</h1></center>
  61.         </div>
  62.         `);
  63.       }
  64.       return render(`
  65.       <div id="message" align="center">
  66.       <center><h1>T.CN 短网址</h1></center>
  67.    <p></p>
  68.         <form method="GET">
  69.         <input name="url" placeholder="URL" />
  70.         <button type="submit">压缩</button>
  71.         </form>
  72.         </div>
  73.       `);
  74.     }
复制代码

作者: aliyunyun    时间: 2020-4-20 14:58

作者: Lemon0    时间: 2020-4-20 15:03
Mark先
作者: Clost    时间: 2020-4-20 17:48
可以自定义网址的notion.clost.net
作者: 臭小子    时间: 2020-4-20 19:13
牛批牛批
作者: odd    时间: 2020-4-20 20:08
优秀学习了!
作者: lenchanlhz    时间: 2020-4-21 13:29
t.cn 短网址api接口怎么制作?
作者: 她掏出我想掏的    时间: 2020-4-21 13:35
哈  都是鬼才   
作者: Mr.    时间: 2020-4-21 13:48
lenchanlhz 发表于 2020-4-21 13:29
t.cn 短网址api接口怎么制作?

制作什么?
作者: vdna    时间: 2020-4-24 22:24
顶!!!!
作者: 移不动    时间: 2020-4-24 23:17
cloudflare 官网都卡成翔
作者: MoeWang    时间: 2020-4-25 09:06
这个操作很骚,奇怪的workers使用方法增加了
作者: 52Fancy    时间: 2020-4-25 14:14
本帖最后由 52Fancy 于 2020-4-25 14:20 编辑
  1. <?php

  2.         $url = urlencode($_GET['url']);
  3.        
  4.         $ch = curl_init();                                                                //初始化curl
  5.         curl_setopt($ch, CURLOPT_URL, "https://service.weibo.com/share/share.php?url=$url&title=$url");                        //设置抓取的url       
  6.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); // 检查服务器证书
  7.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 检查证书中是否设置域名
  8.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);        //要求结果为字符串且输出到屏幕上
  9.         curl_setopt($ch, CURLOPT_TIMEOUT, 30);                        //设置cURL允许执行的最长秒数
  10.        
  11.         $result = curl_exec($ch);
  12.         curl_close($ch);
  13.                
  14.         if (preg_match("/http:\/\/t.cn\/\w+/i", $result, $matches)){
  15.                 echo str_replace("http","https",$matches[0]);
  16.         }
复制代码

我来一个简易PHP版本的接口
保存为dwz.php  
请求 dwz.php?url=https://baidu.com
作者: Mr.    时间: 2020-4-25 14:50
52Fancy 发表于 2020-4-25 14:14
我来一个简易PHP版本的接口
保存为dwz.php  
请求 dwz.php?url=https://baidu.com ...

就一 get 请求用 file_get_contents 就够了,还省得设置 SSL 相关参数
作者: 师太    时间: 2020-5-4 10:06
Mr. 发表于 2020-4-25 14:50
就一 get 请求用 file_get_contents 就够了,还省得设置 SSL 相关参数

php  file_get受网络影响很容易报错导致源码直接暴露哈哈哈
作者: Mr.    时间: 2020-5-10 16:52
Eicky 发表于 2020-5-10 15:06
不行了,请求失败

这个接口改了,要登录WB才能用




欢迎光临 全球主机交流论坛 (https://gebi.eu.org/) Powered by Discuz! X3.4