You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

269 lines
7.7 KiB
JavaScript

const {Plugin, PluginSettingTab, Setting } = require("obsidian");
let server = 'fastgit'
let proMap = {
fastgit:{
down:"https://download.fastgit.org/"
,raw:"https://raw.fastgit.org/"
,home:"https://hub.fastgit.org/"
}
,mtr:{
down:"https://download.fastgit.org/"
,raw:"https://raw-gh.gcdn.mirr.one/"
,home:"https://api.mtr.pub/"
}
,ghproxy:{
down:"https://mirror.ghproxy.com/https://github.com/"
,raw:"https://mirror.ghproxy.com/https://github.com/"
,home:"https://mirror.ghproxy.com/https://github.com/"
}
,gitclone:{
down:"https://download.fastgit.org/"
,raw:"https://raw.fastgit.org/"
,home:"https://gitclone.com/github.com/"
}
,mirr:{
down:"https://gh.gcdn.mirr.one/"
,raw:"https://raw-gh.gcdn.mirr.one/"
,home:"https://gh.gcdn.mirr.one/"
}
}
let include = [
{
match: (url) => url.indexOf("/releases/download/") >= 0
, to: (url) => url.replace("https://github.com/", proMap[server].down)
}
, {
match: (url) => url.startsWith("https://raw.githubusercontent.com/") >= 0
, to: (url) => url.replace("https://raw.githubusercontent.com/", proMap[server].raw)
}
, {
match: (url) => url.startsWith("https://github.com/") >= 0
, to: (url) => url.replace("https://github.com/", proMap[server].home)
}
]
// 匹配URL
function matchUrl(e) {
console.log("开始访问:" + JSON.stringify(e))
for (var key in include) {
let item = include[key]
console.log(key)
console.log(item)
if (e && e.url && item.match(e.url)) {
e.url = item.to(e.url)
console.log("要访问的地址:" + e.url)
if (!e.headers) {
e.headers = {}
}
e.headers["content-type"] = "application/x-www-form-urlencoded";
e.headers["Access-Control-Allow-Origin"] = "*"
return true;
}
}
return false;
}
// 代理访问
function proxy(e) {
return new Promise((function (t, n) {
e.success = t;
e.error = function (e, t) {
return n(t)
}
debugger
if (app.isMobile) {
forMobile(e);
return;
}
forPC(e)
}))
}
/**
*
* https://github.com/denolehov/obsidian-git/issues/57
* https://capacitorjs.com/blog/bypassing-cors-with-the-http-plugin
* https://github.com/capacitor-community/http
*
* @param {*} e
*/
async function forMobile(e) {
try {
const http = require('@capacitor-community/http')
const options = {url: e.url};
new window.Notice("发送请求:" + e.url, 10000)
new window.Notice(JSON.stringify(http.get) + "123", 10000)
// http.get(options);
const resp = await http.get(options).then((resp) => {
new window.Notice("请求成功:", 10000)
new window.Notice("请求成功:" + resp.status, 10000)
e.success(resp.data)
}).catch((error) => {
new window.Notice("出错了:" + JSON.stringify(error), 10000)
})
new window.Notice("请求成功12", 10000)
e.success(resp.data)
} catch (e) {
e.error(e)
new window.Notice("加载@capacitor-community/http出错", 10000)
}
}
function forPC(e) {
try {
const https = require('https')
https.get(e.url, function (res) {
new window.Notice("https.get成功", 10000)
res.setEncoding('utf8');
let rawData = '';
res.on('data', (chunk) => {
rawData += chunk;
});
res.on('end', () => {
try {
new window.Notice("https.get处理数据成功", 10000)
e.success(rawData)
} catch (e) {
new window.Notice("https.get处理数据失败", 10000)
e.error(e)
}
});
}).on('error', function (e) {
new window.Notice("https.get失败", 10000)
e.error(e)
})
} catch (e) {
new window.Notice("导入http出错", 10000)
new window.Notice(JSON.parse(e), 10000)
}
}
function apProxy() {
var ap;
this.regedit = function() {
ap = window.ajaxPromise;
window.ajaxPromise = function (e) {
if (!matchUrl(e)) {
return ap(e);
}
new window.Notice("正在通过 ProxyGithub 来代理访问社区插件!")
return proxy(e)
}
}
this.unRegedit = function() {
window.ajaxPromise = ap;
}
}
//window.Capacitor.registerPlugin("App").request
function apCapacitor() {
var ap;
this.regedit = function() {
ap = window.Capacitor.registerPlugin("App").request;
console.log(ap)
window.Capacitor.registerPlugin("App").request = function (e){
matchUrl(e);
new window.Notice("正在通过 ProxyGithub 来代理访问社区插件!")
ap(e);
// if (matchUrl(e)) {
// return ap(e);
// }
}
console.log("apc注册成功")
}
this.unRegedit = function() {
window.window.Capacitor.registerPlugin("App").request = ap;
}
}
function apElectron() {
var ap;
this.regedit = function() {
ap = window.require("electron").ipcRenderer.send;
debugger
console.log(ap)
window.require("electron").ipcRenderer.send = function (a,b,e,...rest){
debugger
matchUrl(e);
new window.Notice("正在通过 ProxyGithub 来代理访问社区插件!")
ap(a,b,e, ...rest);
// if (matchUrl(e)) {
// return ap(e);
// }
}
console.log("apc注册成功")
}
this.unRegedit = function() {
window.require("electron").ipcRenderer.send = ap;
}
}
class ProxyGithubSettingTab extends PluginSettingTab {
constructor(app, plugin) {
console.log("加载了tab~~~~~~~~~~~~~~~~~~~~~~")
super(app, plugin)
this.plugin = plugin
}
async display() {
this.containerEl.empty()
new Setting(this.containerEl)
.setName('代理服务器')
.setDesc(`通过选择不同的服务器来切换代理,可以解决某些情况下,某个服务器无法访问的情况。当前代理服务器:${this.plugin.settings.server}`)
// .setValue(this.plugin.settings.server) // <-- Add me!
.addDropdown(dropDown => {
dropDown.addOption('mirr', '请选择');
dropDown.addOption('fastgit', 'fastgit');
dropDown.addOption('mtr', 'mtr');
dropDown.addOption('ghproxy', 'ghproxy');
dropDown.addOption('gitclone', 'gitclone');
dropDown.addOption('mirr', 'mirr');
dropDown.onChange(async (value) => {
this.plugin.settings.server=value
// this.plugin.settings.server = value;
await this.plugin.saveSettings();
});
});
}
}
let app = new apProxy();
let apc = new apCapacitor();
let ape = new apElectron();
module.exports = class ProxyGithub extends Plugin {
onload() {
new window.Notice("添加 ProxyGithub 代理访问社区插件!");
this.addSettingTab(new ProxyGithubSettingTab(this.app, this));
ape.regedit();
apc.regedit();
app.regedit();
this.settings = {server:'mirr'}
}
async loadSettings() {
this.settings = Object.assign({}, {server:'mirr'}, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
server = this.settings.server;
debugger
}
onunload() {
ape.unRegedit()
apc.unRegedit()
app.unRegedit()
}
}