软件需求请点击此处留言菜鸟资源为你准备 立即查看

如何利用Cloudflare Workers构建一个免费无服务器导航页

如何利用Cloudflare Workers构建一个免费无服务器导航页

Cloudflare的东西,出了名的慷慨,Workers功能在前不久提供了免费的模式 每天10W次请求数量,无限流量,真猛啊! 拿去做个小站简直不要太舒服哦 Cloudflare的东西都懂的,抗DDoS一级棒哦,就是电信联通延迟有点美丽。。...

当前版本

软件大小

软件语言

是否破解

Cloudflare的东西,出了名的慷慨,Workers功能在前不久提供了免费的模式

每天10W次请求数量,无限流量,真猛啊!

如何利用Cloudflare Workers构建一个免费无服务器导航页

拿去做个小站简直不要太舒服哦

Cloudflare的东西都懂的,抗DDoS一级棒哦,就是电信联通延迟有点美丽。。。

》》》白嫖万岁!

老规矩,先把代码丢上来,然后慢慢讲解

  1. const config = {
  2. title: "导航首页", //write your website title
  3. subtitle: "鹏龙-道记", //write your website subtitle
  4. logo_icon: "sitemap", //select your logo by semantic-ui icon (you can get more msg in:https://semantic-ui.com/elements/icon.html)
  5. hitokoto: true, //use hitokoto or not
  6. search:true, //enable search function
  7. search_engine:[ //choose search engine which you use
  8. {
  9. name:"百 度",
  10. template:"https://www.baidu.com/s?wd=$s"
  11. },
  12. {
  13. name:"谷 歌",
  14. template:"https://www.google.com/search?q=$s"
  15. },
  16. {
  17. name:"360",
  18. template:"https://www.so.com/s?q=$s"
  19. },
  20. {
  21. name:"shodan",
  22. template:"https://www.shodan.io/search?query=$s"
  23. },
  24. ],
  25. selling_ads: false, //Selling your domain or not.(turning on may be helpful for selling this domain by showing some ads.)
  26. sell_info:{
  27. domain:"example.com",
  28. price:500, //domain price
  29. mon_unit:"yen sign", //monetary unit
  30. contact:[ //how to contact you
  31. {
  32. type:"envelope", //contact type ("weixin","qq","telegram plane","envelope" or "phone")
  33. content:"info@example.com"
  34. }
  35. ]
  36. },
  37. lists: [ //Url list
  38. {
  39. name:"技术",
  40. icon:"code",
  41. list:[
  42. {
  43. url:"https://oschina.net/",
  44. name:"开源中国",
  45. desc:"程序员集散地"
  46. },
  47. {
  48. url:"https://v2ex.com",
  49. name:"V2EX",
  50. desc:"程序员集散地"
  51. },
  52. {
  53. url:"https://csdn.net/",
  54. name:"CSDN技术社区",
  55. desc:"程序员集散地"
  56. },
  57. {
  58. url:"https://github.com/",
  59. name:"Github",
  60. desc:"程序员集散地"
  61. },
  62. {
  63. url:"https://www.vulbox.com/",
  64. name:"漏洞盒子",
  65. desc:"漏洞盒子"
  66. },
  67. {
  68. url:"https://www.ichunqiu.com/",
  69. name:"I春秋",
  70. desc:"I春秋"
  71. },
  72. {
  73. url:"https://www.butian.net/",
  74. name:"补天",
  75. desc:"补天"
  76. },
  77. {
  78. url:"https://www.freebuf.com/",
  79. name:"freebuf",
  80. desc:"freebuf"
  81. },
  82. ]
  83. },
  84. {
  85. name:"学习",
  86. icon:"graduation cap",
  87. list:[
  88. {
  89. url:"https://w3school.com.cn/",
  90. name:"W3school在线教程",
  91. desc:"程序员集散地"
  92. },
  93. {
  94. url:"https://www.runoob.com/",
  95. name:"菜鸟教程",
  96. desc:"程序员集散地"
  97. },
  98. {
  99. url:"https://segmentfault.com/",
  100. name:"思否社区",
  101. desc:"程序员集散地"
  102. },
  103. {
  104. url:"https://jianshu.com/",
  105. name:"简书",
  106. desc:"程序员集散地"
  107. },
  108. ]
  109. },
  110. {
  111. name:"博客圈",
  112. icon:"code",
  113. list:[
  114. {
  115. url:"https://www.jcdpn.cn/",
  116. name:"鹏龙-道记",
  117. desc:"日常更新"
  118. },
  119. ]
  120. }
  121. ]
  122. }
  123. const el = (tag, attrs, content) => `<${tag} ${attrs.join(" ")}>${content}</${tag}>`;
  124. async function handleRequest(request) {
  125. const init = {
  126. headers: {
  127. 'content-type': 'text/html;charset=UTF-8',
  128. },
  129. }
  130. return new Response(renderHTML(renderIndex(),config.selling_ads? renderSeller() :null), init);
  131. }
  132. addEventListener('fetch', event => {
  133. return event.respondWith(handleRequest(event.request))
  134. })
  135. /*通过分析链接 实时获取favicon
  136. * @url 需要分析的Url地址
  137. */
  138. function getFavicon(url){
  139. if(url.match(/https{0,1}:///)){
  140. //return "https://ui-avatars.com/api/?bold=true&size=36&background=0D8ABC&color=fff&rounded=true&name=" + url.split('//')[1];
  141. return "https://icon.occ.hk/get.php?url=" + url;
  142. }else{
  143. //return "https://ui-avatars.com/api/?bold=true&size=36&background=0D8ABC&color=fff&rounded=true&name=" + url;
  144. return "https://icon.occ.hk/get.php?url=http://" + url;
  145. }
  146. }
  147. /** Render Functions
  148. * 渲染模块函数
  149. */
  150. function renderIndex(){
  151. const footer = el('footer',[],el('div',['class="footer"'],'Powered by' + el('a',['class="ui label"','href="https://www.jcdpn.cn/"','target="_blank"'],el('i',['class="github icon"'],"") + '龙帝') + ' &copy;'));
  152. return renderHeader() + renderMain() + footer;
  153. }
  154. function renderHeader(){
  155. const item = (template,name) => el('a',['class="item"',`data-url="${template}"`],name);
  156. var nav = el('div',['class="ui large secondary inverted menu"'],el('div',['class="item"'],el('p',['id="hitokoto"'],'条条大路通罗马')))
  157. var title = el('h1',['class="ui inverted header"'],el('i',[`class="${config.logo_icon} icon"`],"") + el('div',['class="content"'],config.title + el('div',['class="sub header"'],config.subtitle)));
  158. var menu = el('div',['id="sengine"','class="ui bottom attached tabular inverted secondary menu"'],el('div',['class="header item"'],'&nbsp;') + config.search_engine.map((link,key) =>{
  159. if(key == 0){
  160. return el('a',['class="active item"',`data-url="${link.template}"`],link.name);
  161. }else{
  162. return item(link.template,link.name);
  163. }
  164. }).join(""))
  165. var input = el('div',['class="ui left corner labeled right icon fluid large input"'],el('div',['class="ui left corner label"'],el('img',['id="search-fav"','class="left floated avatar ui image"','src="https://www.baidu.com/favicon.ico"'],"")) + el('input',['id="searchinput"','type="search"','placeholder="搜索你想要知道的……"','autocomplete="off"'],"") + el('i',['class="inverted circular search link icon"'],""));
  166. return el('header',[],el('div',['id="head"','class="ui inverted vertical masthead center aligned segment"'],(config.hitokoto ? el('div',['id="nav"','class="ui container"'],nav) : "") + el('div',['id="title"','class="ui text container"'],title + (config.search ? input + menu :"") + `${config.selling_ads ? '<div><a id="menubtn" class="red ui icon inverted button"><i class="heart icon"></i> 喜欢此域名 </a></div>' : ''}`)))
  167. }
  168. function renderMain() {
  169. var main = config.lists.map((item) => {
  170. const card = (url,name,desc)=> el('a',['class="card"',`href=${url}`,'target="_blank"'],el('div',['class="content"'],el('img',['class="left floated avatar ui image"',`src=${getFavicon(url)}`],"") + el('div',['class="header"'],name) + el('div',['class="meta"'],desc)));
  171. const divider = el('h4',['class="ui horizontal divider header"'],el('i',[`class="${item.icon} icon"`],"")+item.name);
  172. var content = el('div',['class="ui four stackable cards"'],item.list.map((link) =>{
  173. return card(link.url,link.name,link.desc);
  174. }).join(""));
  175. return el('div',['class="ui basic segment"'],divider + content);
  176. }).join("");
  177. return el('main',[],el('div',['class="ui container"'],main));
  178. }
  179. function renderSeller() {
  180. const item = (type,content) => el('div',['class="item"'],el('i',[`class="${type} icon"`],"") + el('div',['class="content"'],content));
  181. var title = el('h1',['class="ui yellow dividing header"'],el('i',['class="gem outline icon"'],"") + el('div',['class="content"'],config.sell_info.domain + ' 正在出售'));
  182. var action = el('div',['class="actions"'],el('div',['class="ui basic cancel inverted button"'],el('i',['class="reply icon"'],"") + '返回'));
  183. var contact = config.sell_info.contact.map((list) => {
  184. return item(list.type,list.content);
  185. }).join("");
  186. var column = el('div',['class="column"'],el('h3',['class="ui center aligned icon inverted header"'],el('i',['class="circular envelope open outline grey inverted icon"'],"") + '联系我') + el('div',['class="ui relaxed celled large list"'],contact));
  187. var price = el('div',['class="column"'],el('div',['class="ui large yellow statistic"'],el('div',['class="value"'],el('i',[`class="${config.sell_info.mon_unit} icon"`],"") + config.sell_info.price)));
  188. var content = el('div',['class="content"'],el('div',['class="ui basic segment"'],el('div',['class="ui two column stackable center aligned grid"'],el('div',['class="ui inverted vertical divider"'],'感兴趣?') + el('div',['class="middle aligned row"'],price + column))));
  189. return el('div',['id="seller"','class="ui basic modal"'],title + content + action);
  190. }
  191. function renderHTML(index,seller) {
  192. return `<!DOCTYPE html>
  193. <html lang="en">
  194. <head>
  195. <meta charset="UTF-8">
  196. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  197. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  198. <title>${config.title} - ${config.subtitle}</title>
  199. <link href="https://cdn.jsdelivr.net/npm/semantic-ui-css@2.4.1/semantic.min.css" rel="stylesheet">
  200. <link href="https://cdn.jsdelivr.net/gh/sleepwood/cf-worker-dir@0.1.1/style.css" rel="stylesheet">
  201. <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script>
  202. <script src="https://cdn.jsdelivr.net/npm/semantic-ui-css@2.4.1/semantic.min.js"></script>
  203. </head>
  204. <body>
  205. ${index}
  206. ${config.selling_ads ? seller : ''}
  207. <script src="https://v1.hitokoto.cn/?encode=js&select=%23hitokoto" defer></script>
  208. <script>
  209. $('#sengine a').on('click', function (e) {
  210. $('#sengine a.active').toggleClass('active');
  211. $(e.target).toggleClass('active');
  212. $('#search-fav').attr('src',$(e.target).data('url').match(`+/https{0,1}://S+//+`)[0] + '/favicon.ico') ;
  213. });
  214. $('.search').on('click', function (e) {
  215. var url = $('#sengine a.active').data('url');
  216. url = url.replace(`+/$s/+`,$('#searchinput').val());
  217. window.open(url);
  218. });
  219. /* 鼠标聚焦时,回车事件 */
  220. $("#searchinput").bind("keypress", function(){
  221. if (event.keyCode == 13){
  222. // 触发需要调用的方法
  223. $(".search").click();
  224. }
  225. });
  226. $('#menubtn').on('click', function (e) {
  227. $('#seller').modal('show');
  228. });
  229. </script>
  230. </body>
  231. </html>`
  232. }

此源码来自于Github上的一位大佬,在此感谢一下。

进入Cloudflare Workers控制台,有一个创建Worker的按钮。

如何利用Cloudflare Workers构建一个免费无服务器导航页 还看?直接点进去啊,慌什么。。。

如何利用Cloudflare Workers构建一个免费无服务器导航页

系统默认生成会自带一端Hello Word,我们将刚刚的代码替换进去

如何利用Cloudflare Workers构建一个免费无服务器导航页

直接保存部署,当然,你也可以调整一下,在旁边的浏览里面查看页面效果

如何利用Cloudflare Workers构建一个免费无服务器导航页

如何利用Cloudflare Workers构建一个免费无服务器导航页

不出意料,非常无脑,直接就搞定了,自动生成的域名非常难受,你可以选择重命名来调整主机名….

如何利用Cloudflare Workers构建一个免费无服务器导航页 …….

边缘脚本部署是不是很简单,还堪称0成本

什么是无服务器?

通常而言,构建和维护易于扩展的应用程序可支持需求高峰或全球用户群,但这需要大量前期工程和持续运营支持。 开发人员不得不花费大量时间编写支持代码,而非构建应用程序本身。 而借助 Cloudflare Workers,开发人员能够构建无服务器的可扩展应用程序,无需在基础设施或操作上花费时间和精力。

借助 Cloudflare Workers,开发人员能够在 Cloudflare 的全球云网络上部署无服务器的 JavaScript 应用程序,应用程序能够在这个网络中无缝扩展,更加接近最终用户。 Workers 基于 Service Workers API 构建,可为向应用程序发出的每次 HTTP(S) 请求接收事件。 然后,Workers 运行应用程序逻辑,并可向 Cloudflare Cache、Cloudflare Workers KV 或应用程序原始服务器发出后续请求,以将数据返回给用户。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

常见问题

  • 如何安装和激活?

    每款软件会附带有安装教程,您打开安装包一目了然

  • 程序是否已损坏?文件损坏?还是其他错误?

    有错误问题,请您参考:https://www.xxx.com/error

  • 如何更新?正式激活后会发生什么情况?

    除非安装说明中另有说明,否则官方更新可能会导致无法激活。 要从本网站更新软件,您需要在此处下载此软件的新版本(如果可用),并将其安装在计算机上安装的版本之上(替换)。在这种情况下,您将保存此软件的激活和设置。

  • 如何下载?链接不起作用?

    我们使用百度网盘,132云盘和微软网盘,除了百度网盘,其他两款不限速,如果链接失效,请您联系客服处理

  • 已发布更新。我什么时候升级我的版本?

    所有软件如有更新,我们第一时间推送,视自己情况更新使用

  • 如何更改语言?

    打开“系统偏好设置”->“通用>语言和地区”->应用程序-“+”。 选择应用和语言。此方法适用于大多数应用程序。 Adobe 产品中的语言通常是在产品本身的安装阶段选择的。 游戏中的语言通常会在游戏本身的设置中发生变化。

  • 如何删除软件?

    有很多选择。最简单的方法是使用特殊的实用程序来卸载应用程序,例如App Cleaner Uninstaller 要删除 Adobe 产品,请使用 Creative Cloud Cleaner Tool

  • 需要远程帮助吗?

    网站已开通永久会员的可享受免费远程,如果非永久会员,远程安装另外收费

技术教程

浅析AnyCast网络技术

2024-4-3 23:53:16

技术教程

传输层协议

2024-4-9 22:44:07

0 条回复 A文章作者 M管理员
人的一生会遇到两个人,一个惊艳了时光,一个温柔了岁月
欢迎您,新朋友,感谢参与互动!
    暂无讨论,说说你的看法吧
后退
榜单