紫曦博客

Onedrive+OneManager+Heroku+CFWorkers,羊毛衫新织法

2020-10-24 748

onedrive这个神器又能满血复活了?

网站下载链接直接是xxx.com/abc.jpg,没有302跳到微软xxx.sharepoint.com,也没有反代xxx.sharepoint.com那样后面一长串。
准备工作:
1, Onedrive,或Sharepoint
这个大家有的,各种A1,E3,E5,世纪。(Sharepoint默认25T)
2, OneManager,Github地址:https://github.com/qkqpttgf/OneManager-php
基于各种无服务器的平台,比如Heroku、腾讯SCF、阿里FC、华为FG、百度CFC,配置都保存在其环境变量中,当然也可以装在VPS与空间里,不过为了一致,程序不固定储存onedrive的目录结构,缓存最多1小时
3, Heroku,最好需要注册2个帐号,注册与登录时需要魔法,平时操作时不需要
OneManager配置是保存在环境变量中的,所以不需要一直监控保活,Heroku免费套餐每月550小时,550小时/30天=18.33小时,每天只要访问时间段空出来24-18=6小时没有人访问,这一个月其实就足够使用了,但有些人的网站可能访问人比较多所以还没到月底就用光了。
当然,heroku也可绑卡达到1000小时,同时还能自定义域名。但,SSL却比较麻烦。
4, CF workers,免费的就好
部署程序、安装程序、绑定网盘:
1, 将OneManager一键部署到Heroku,直接→点击这里←即可一键部署
2, 访问给定的herokuapp域名,正式安装好程序
3, 安装好后登录,在设置中绑定Onedrive或Sharepoint
绑定教程可以参考一下这个文章→点我查看
4, 在设置中做些设定
5, 换一个Heroku帐号再安装一次(时长够用就无所谓)
重点:
在CF Workers中填入以下代码
//2020.10.24更新 //之前的代码有一点bug,目前已经替换成最新的代码,有兴趣可以看看github里的更新说明 //https://github.com/qkqpttgf/OneManager-php/blob/master/CFWorkers.js // odd, 单日 const SingleDay = 'https://aaa1.herokuapp.com' // even, 双日 const DoubleDay = 'https://bbb2.herokuapp.com' //const SingleDay = 'https://153xxxxx0.cn-hongkong.fc.aliyuncs.com/2016-08-15/proxy/onedrive/xxx/' //const DoubleDay = 'https://153xxxxx0.cn-hongkong.fc.aliyuncs.com/2016-08-15/proxy/onedrive/xxx/' // CF proxy all, 一切给CF代理,true/false const CFproxy = true // Used in cloudflare workers, odd or even days point to 2 heroku account. // 由于heroku不绑卡不能自定义域名,就算绑卡后https也不方便 // 另外免费套餐每月550小时,有些人不够用 // 于是在CF Workers使用此代码,分单双日拉取不同heroku帐号下的相同网页 // 只改上面,下面不用动 addEventListener('fetch', event => { let url=new URL(event.request.url); if (url.protocol == 'http:') { url.protocol = 'https:' event.respondWith( Response.redirect(url.href) ) } else { let response = null; let nd = new Date(); if (nd.getDate()%2) { host = SingleDay } else { host = DoubleDay } if (host.substr(0, 7)!='http://'&&host.substr(0, 8)!='https://') host = 'http://' + host; response = fetchAndApply(host, event.request); event.respondWith( response ); } }) async function fetchAndApply(host, request) { let f_url = new URL(request.url); let a_url = new URL(host); let replace_path = a_url.pathname; if (replace_path.substr(replace_path.length-1)!='/') replace_path += '/'; let replaced_path = '/'; let query = f_url.search; let path = f_url.pathname; if (host.substr(host.length-1)=='/') path = path.substr(1); f_url.href = host + path + query; let response = null; if (!CFproxy) { response = await fetch(f_url, request); } else { let method = request.method; let body = request.body; let request_headers = request.headers; let new_request_headers = new Headers(request_headers); new_request_headers.set('Host', f_url.host); new_request_headers.set('Referer', request.url); response = await fetch(f_url.href, { method: method, body: body, headers: new_request_headers }); } let out_headers = new Headers(response.headers); if (out_headers.get('Content-Disposition')=='attachment') out_headers.delete('Content-Disposition'); let out_body = null; let contentType = out_headers.get('Content-Type'); if (contentType.includes("application/text")) { out_body = await response.text(); while (out_body.includes(replace_path)) out_body = out_body.replace(replace_path, replaced_path); } else if (contentType.includes("text/html")) { out_body = await response.text(); while (replace_path!='/'&&out_body.includes(replace_path)) out_body = out_body.replace(replace_path, replaced_path); } else { out_body = await response.body; } let out_response = new Response(out_body, { status: response.status, headers: out_headers }) return out_response; }
单双日分别填入不同的heroku帐号下的网站(当然2个网站要设置得一模一样),这样每个heroku帐号每个月都只访问15或16天,就算24小时有人访问也才360或384小时。
最后,给workers加上自定义域名的路由!
从头到尾都可以是Free的,不看网站页面,光从下载过程来看,可以完全假装CF套在了大盘鸡上,谁也看不出我没服务器。

3