// ==UserScript== // @name Github项目批量删除 // @namespace https://github.com/mengyou658/github-repositories-manage // @version 1.1.7 // @description Github项目批量删除,fork的项目太多了,注意:需要先申请操作token,申请地址https://github.com/settings/tokens,请至少选择Delete Repos,如果频繁出现删除失败,请重新生成token(github有限制) // @author yunchaoq/mengyou658 // @license GPL License // @match *://github.com/* // @require https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js // @require https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/layer.min.js // @resource layerCss https://cdn.bootcdn.net/ajax/libs/layer/3.1.1/theme/default/layer.min.css // @grant GM_addStyle // @grant GM_setClipboard // @grant GM_getResourceText // @downloadURL https://update.greasyfork.icu/scripts/412188/Github%E9%A1%B9%E7%9B%AE%E6%89%B9%E9%87%8F%E5%88%A0%E9%99%A4.user.js // @updateURL https://update.greasyfork.icu/scripts/412188/Github%E9%A1%B9%E7%9B%AE%E6%89%B9%E9%87%8F%E5%88%A0%E9%99%A4.meta.js // ==/UserScript== (function () { 'use strict'; GM_addStyle(GM_getResourceText('layerCss')) // GM_addStyle(GM_getResourceText('layuiCss')) var location = window.location.href; var pathname = window.location.pathname; var userName = pathname.replace("/", ""); var checkList = []; var tmpCode = localStorage.getItem("gitto"); var detailPageBodyTmp = $('ul[class*="UnderlineNav-body"]'); var detailPageFlag = detailPageBodyTmp.length && detailPageBodyTmp.find('span[data-content="Settings"]').length; let homePageFlag = location.indexOf("tab=repositories") > -1; if (homePageFlag || detailPageFlag) { init(); } function init() { if (homePageFlag) { homePageInit(); } if (detailPageFlag) { detailPageInit(); } tipsShow(); $('#user-repositories-code').on('click', function () { tipsShow(); openMsg(); }); if (!tmpCode) { openMsg(); } } function openMsg() { layer.prompt({ title: '输入申请的token,并点击确认,点击这里是申请,请至少选择Delete Repos,注意如果频繁出现删除失败,请重新生成token', formType: 1 }, function (token, index) { if (token) { tmpCode = token; localStorage.setItem('gitto', tmpCode); layer.closeAll(); } }); } function tipsShow() { layer.tips('提示:先输入token,点击这里是申请,请至少选择Delete Repos,注意如果频繁出现删除失败,请重新生成token', '#user-repositories-code', { tips: [1,'#2ea44f'] //还可配置颜色 ,tipsMore:true ,time: 0, }); } function homePageInit() { $(".UnderlineNav-body:first").append('输入token'); $("#user-repositories-list li").each((id, it) => { $(it).append(''); }); $("#user-repositories-list li").on('click', function () { let find = $(this).find('.user-repositories-list-checkbox'); var href = $(this).find('.wb-break-all').find('a').attr('href'); if (href.indexOf(pathname) > -1) { // var repoName = href.replace(pathname + "/", ""); let index = checkList.indexOf(href); if (index > -1) { find.prop('checked', false); checkList.splice(index, 1); } else { find.prop('checked', true); checkList.push(href); } if (!$('#user-repositories-delete').length && checkList.length) { if (homePageFlag) { $(".UnderlineNav-body:first").append('批量删除'); $("#user-repositories-delete").on('click', function () { if (!tmpCode) { openMsg(); return; } var resList = {}; var count = 0; var promiseList = []; checkList.forEach((it) => { var tmpPromise = new Promise((resolve, reject) => { var url = 'https://api.github.com/repos' + it $.ajax({ url: url, method: 'DELETE', "headers": { "Accept": "application/vnd.github.v3+json", "Authorization": "token " + tmpCode }, success: function (data, textStatus, jqXHR) { resList[it] = true; count++; resolve(count); }, error: function (XMLHttpRequest, textStatus, errorThrown) { resList[it] = false; count++; resolve(count); } }) }); promiseList.push(tmpPromise); }) Promise.all(promiseList).then((count) => { var resTxt = ""; for (var i in resList) { if (resList[i] == true) { resTxt += " 删除【" + i + "】成功
"; } } for (var ii in resList) { if (resList[ii] == false) { resTxt += " 删除【" + ii + "】失败
"; } } checkList = []; layer.msg('删除结果:
' + resTxt, function () { window.location.reload(); }); }); }); } } else { if (!checkList.length) { $("#user-repositories-delete").remove(); } } } }); } function detailPageInit() { detailPageBodyTmp.find('li:last').append('输入token'); if (!tmpCode) { openMsg(); } detailPageBodyTmp.find('li:last').append('快速删除当前仓库'); $("#user-repositories-delete").on('click', function () { if (!tmpCode) { openMsg(); return; } var resList = {}; var count = 0; var promiseList = []; var it = $('a[data-pjax="#js-repo-pjax-container"]').attr('href') var tmpPromise = new Promise((resolve, reject) => { var url = 'https://api.github.com/repos' + it $.ajax({ url: url, method: 'DELETE', "headers": { "Accept": "application/vnd.github.v3+json", "Authorization": "token " + tmpCode }, success: function (data, textStatus, jqXHR) { resList[it] = true; count++; resolve(count); }, error: function (XMLHttpRequest, textStatus, errorThrown) { resList[it] = false; count++; resolve(count); } }) }); promiseList.push(tmpPromise); Promise.all(promiseList).then((count) => { var resTxt = ""; for (var i in resList) { if (resList[i] == true) { resTxt += " 删除【" + i + "】成功
"; } } for (var ii in resList) { if (resList[ii] == false) { resTxt += " 删除【" + ii + "】失败
"; } } layer.msg('

注意如果频繁出现删除失败,请重新生成token

删除结果:
' + resTxt, function () { window.location.reload(); }); }); }); } })();