GreasyFork: 导航栏增强

在导航栏上添加用户列表,控制台,收藏等..

安装此脚本?
作者推荐脚本

您可能也喜欢Greasyfork 糊裱匠

安装此脚本
  1. // ==UserScript==
  2. // @name GreasyFork: User Control Panel Button
  3. // @name:zh-CN GreasyFork: 导航栏增强
  4. // @description:zh-CN 在导航栏上添加用户列表,控制台,收藏等..
  5. // @name:ar GreasyFork: تعزيز شريط التنقل
  6. // @description:ar إضافة قائمة المستخدمين على شريط التنقل,وحدة التحكم,جمع الخ..
  7. // @name:bg GreasyFork: Подобряване на лентата за навигация
  8. // @description:bg Добавяне на потребителски списък в лентата за навигация,конзола,Колекция и др...
  9. // @name:cs GreasyFork: Vylepšení navigační lišty
  10. // @description:cs Přidejte seznam uživatelů na navigační lištu,utěšit,Sbírka atd...
  11. // @name:da GreasyFork: Forbedring af navigationslinjen
  12. // @description:da Tilføj brugerliste på navigationslinjen,konsol,Indsamling mv...
  13. // @name:de GreasyFork: Verbesserung der Navigationsleiste
  14. // @description:de Benutzerliste zur Navigationsleiste hinzufügen,Konsole,Sammlung usw...
  15. // @name:el GreasyFork: Βελτίωση της γραμμής πλοήγησης
  16. // @description:el Προσθήκη λίστας χρηστών στη γραμμή πλοήγησης,κονσόλα,Συλλογή κλπ...
  17. // @name:en GreasyFork: Navigation bar enhancement
  18. // @description:en Add user list on navigation bar,console,Collection etc...
  19. // @name:eo GreasyFork: Plibonigo de navigado trinkejo
  20. // @description:eo Aldonu uzantliston sur navigadbreto,konzolo,Kolekto ktp...
  21. // @name:es GreasyFork: Mejora de la barra de navegación
  22. // @description:es Agregar lista de usuarios en la barra de navegación,consola,Colección, etc...
  23. // @name:fi GreasyFork: Navigointipalkin parannus
  24. // @description:fi Lisää käyttäjäluettelo navigointipalkkiin,konsoli,Kokoelma jne...
  25. // @name:fr GreasyFork: Amélioration de la barre de navigation
  26. // @description:fr Ajouter une liste d’utilisateurs sur la barre de navigation,console,Collecte etc..
  27. // @name:he GreasyFork: שיפור סרגל הניווט
  28. // @description:he הוסף רשימת משתמשים בסרגל הניווט,לְנַחֵם,אוסף וכו’...
  29. // @name:hr GreasyFork: Poboljšanje navigacijske trake
  30. // @description:hr Dodajte popis korisnika na navigacijsku traku,konzola,Zbirka itd...
  31. // @name:hu GreasyFork: A navigációs sáv továbbfejlesztése
  32. // @description:hu Felhasználói lista hozzáadása a navigációs sávhoz,konzol,Gyűjtemény stb...
  33. // @name:id GreasyFork: Peningkatan bilah navigasi
  34. // @description:id Tambahkan daftar pengguna di bilah navigasi,menghibur,Koleksi dll...
  35. // @name:it GreasyFork: Miglioramento della barra di navigazione
  36. // @description:it Aggiungi l’elenco degli utenti sulla barra di navigazione,consolle,Raccolta ecc...
  37. // @name:ja GreasyFork: ナビゲーションバーの強化
  38. // @description:ja ナビゲーションバーにユーザーリストを追加,コンソール,コレクションなど..
  39. // @name:ka GreasyFork: ნავიგაციის ზოლის გაუმჯობესება
  40. // @description:ka დაამატეთ მომხმარებლის სია ნავიგაციის ზოლში,კონსოლი,კოლექცია და ა.შ...
  41. // @name:ko GreasyFork: 탐색 표시줄 개선
  42. // @description:ko 탐색 표시줄에 사용자 목록 추가,콘솔,수집 등..
  43. // @name:nl GreasyFork: Verbetering van de navigatiebalk
  44. // @description:nl Voeg een gebruikerslijst toe aan de navigatiebalk,troosten,Collectie enz...
  45. // @name:nb GreasyFork: Forbedring av navigasjonslinjen
  46. // @description:nb Legg til brukerliste på navigasjonslinjen,konsoll,Samling etc...
  47. // @name:pl GreasyFork: Udoskonalenie paska nawigacji
  48. // @description:pl Dodaj listę użytkowników na pasku nawigacyjnym,konsola,Kolekcja itp...
  49. // @name:pt-BR GreasyFork: Aprimoramento da barra de navegação
  50. // @description:pt-BR Adicionar lista de usuários na barra de navegação,console,Coleção etc..
  51. // @name:ro GreasyFork: Îmbunătățirea barei de navigare
  52. // @description:ro Adăugați lista de utilizatori pe bara de navigare,consolă,Colectare etc...
  53. // @name:ru GreasyFork: Улучшение панели навигации
  54. // @description:ru Добавить список пользователей на панель навигации,консоль,Коллекция и т. д...
  55. // @name:sk GreasyFork: Vylepšenie navigačnej lišty
  56. // @description:sk Pridajte zoznam používateľov na navigačnú lištu,konzoly,Zbierka atď...
  57. // @name:sr GreasyFork: Побољшање траке за навигацију
  58. // @description:sr Додајте листу корисника на траку за навигацију,конзола,Збирка итд...
  59. // @name:sv GreasyFork: Förbättring av navigeringsfältet
  60. // @description:sv Lägg till användarlista i navigeringsfältet,trösta,Samling etc...
  61. // @name:th GreasyFork: การเพิ่มประสิทธิภาพแถบนำทาง
  62. // @description:th เพิ่มรายชื่อผู้ใช้บนแถบนำทาง,คอนโซล,คอลเลกชัน ฯลฯ..
  63. // @name:tr GreasyFork: Gezinme çubuğu geliştirmesi
  64. // @description:tr Gezinme çubuğuna kullanıcı listesi ekleyin,konsol,Koleksiyon vb...
  65. // @name:ug GreasyFork: يولباشچى بالداقنى كۈچەيتىش
  66. // @description:ug يولباشچى ستونىغا ئىشلەتكۈچى تىزىملىكىنى قوشۇڭ,console,توپلاش قاتارلىقلار...
  67. // @name:uk GreasyFork: Покращення панелі навігації
  68. // @description:uk Додати список користувачів на панель навігації,консоль,Колекція тощо..
  69. // @name:vi GreasyFork: Cải tiến thanh điều hướng
  70. // @description:vi Thêm danh sách người dùng trên thanh điều hướng,bảng điều khiển,Bộ sưu tập vv...
  71. // @name:zh-TW GreasyFork: 導覽列增強
  72. // @description:zh-TW 在導覽列上新增使用者列表,主機,收藏等..
  73. // @name:zh-HK GreasyFork: 導覽列增強
  74. // @description:zh-HK 在導覽列上新增使用者列表,主機,收藏等..
  75. // @name:fr-CA GreasyFork: Amélioration de la barre de navigation
  76. // @description:fr-CA Ajouter une liste d’utilisateurs sur la barre de navigation,console,Collecte etc..
  77. // @namespace https://github.com/ChinaGodMan/UserScripts
  78. // @match https://gf.qytechs.cn/*
  79. // @match https://sleazyfork.org/*
  80. // @grant none
  81. // @version 0.3.1.57
  82. // @license MIT
  83. // @author CY Fung & 人民的勤务员 <china.qinwuyuan@gmail.com>
  84. // @description To add User Control Panel Button into navigation bar
  85. // @icon data:image/png;base64,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
  86. // @iconbak https://gf.qytechs.cn/vite/assets/blacklogo96-CxYTSM_T.png
  87. // @supportURL https://github.com/ChinaGodMan/UserScripts/issues
  88. // @homepageURL https://github.com/ChinaGodMan/UserScripts
  89. // ==/UserScript==
  90.  
  91. (async () => {
  92. let sections = [
  93. { id: '#user-script-sets-section' },
  94. { id: '#control-panel' },
  95. // { id: '#user-library-list-section', name: '库' },
  96. //{ id: '#user-unlisted-script-list-section', name: '没上架' },
  97. // { id: '#user-discussions', name: '讨论' },
  98. { id: '#user-script-list-section' }
  99. ]
  100.  
  101. function preSetup() {
  102. let pos = document.querySelectorAll('#site-nav>nav>li.with-submenu')
  103. pos = pos.length >= 1 ? pos[pos.length - 1] : null
  104.  
  105. if (!pos) return
  106.  
  107. pos.parentNode.style.minHeight = '2.8rem'
  108.  
  109. return { pos }
  110. }
  111.  
  112. function setup(m, namespace) {
  113. const { cpmRoot } = m
  114.  
  115. let h = cpmRoot.querySelector('h3') || cpmRoot.querySelector('header')
  116. if (!h) return
  117.  
  118. let nav = document.createElement('nav')
  119.  
  120. let addedText = new Set()
  121. let lastText = null
  122.  
  123. for (const anchor of cpmRoot.querySelectorAll('li a[href]')) {
  124. let textContent = anchor.textContent.trim()
  125.  
  126. if (addedText.has(textContent)) {
  127. lastText = textContent
  128. continue
  129. }
  130.  
  131. let li = nav.appendChild(document.createElement('li'))
  132. li.appendChild(anchor)
  133.  
  134. addedText.add(textContent)
  135. }
  136.  
  137. if (lastText !== null) {
  138. nav.querySelectorAll('li').forEach(li => {
  139. if (li.querySelector('a').textContent.trim() === lastText) {
  140. li.remove()
  141. }
  142. })
  143. }
  144.  
  145. let tm = document.createElement('template')
  146. tm.innerHTML = `
  147. <li class="with-submenu" style="display: block;">
  148. <a href="#" onclick="return false">${namespace ? namespace : h.textContent}</a>
  149. <nav style="min-width: initial;">
  150. ${nav.innerHTML}
  151. </nav>
  152. </li>
  153. `.trim()
  154.  
  155. return tm.content
  156. }
  157.  
  158. function bufferToHex(buffer) {
  159. const byteArray = new Uint8Array(buffer)
  160. const len = byteArray.length
  161. const hexCodes = new Array(len * 2)
  162. const chars = '0123456789abcdef'
  163. for (let i = 0, j = 0; i < len; i++) {
  164. const byte = byteArray[i]
  165. hexCodes[j++] = chars[byte >> 4]
  166. hexCodes[j++] = chars[byte & 0x0F]
  167. }
  168. return hexCodes.join('')
  169. }
  170.  
  171. async function digestMessage(message) {
  172. const encoder = new TextEncoder('utf-8')
  173. const msgUint8 = encoder.encode(message)
  174. const hashBuffer = await crypto.subtle.digest('SHA-1', msgUint8)
  175. return bufferToHex(hashBuffer)
  176. }
  177.  
  178. async function fetchHTML(href) {
  179. let response = await fetch(href, {
  180. method: 'GET',
  181. mode: 'same-origin',
  182. cache: 'force-cache',
  183. credentials: 'same-origin',
  184. redirect: 'follow',
  185. referrerPolicy: 'no-referrer'
  186. })
  187.  
  188. return response.text()
  189. }
  190.  
  191. async function addSectionsToNav() {
  192. let presetup = preSetup()
  193. if (!presetup) return
  194. const { pos } = presetup
  195.  
  196. let plink = document.querySelector('.user-profile-link')
  197. if (!plink) return
  198. let href = plink.querySelector('a[href*="/users/"]').href
  199. if (href.includes('/users/sign')) return
  200.  
  201. let dm = await digestMessage(href)
  202. const stKey = `gf_user_page_${dm}`
  203.  
  204. for (let trialN = 8; trialN--;) {
  205. let s = sessionStorage.getItem(stKey)
  206. let d = typeof s === 'string' ? parseInt(s) : 0
  207. if (d > 9 && Date.now() - d < 8000) await new Promise(r => setTimeout(r, 320))
  208. else break
  209. }
  210.  
  211. const userPageHTML = await fetchHTML(href)
  212. if (!userPageHTML || typeof userPageHTML !== 'string') return
  213.  
  214. sessionStorage.setItem(stKey, userPageHTML)
  215.  
  216. let template = document.createElement('template')
  217. template.innerHTML = userPageHTML
  218. const content = template.content
  219.  
  220.  
  221.  
  222. sections.forEach(({ id, name }) => {
  223. let section = content.querySelector(id)
  224. if (section) {
  225. const kc = setup({ cpmRoot: section, pos }, name)
  226. if (kc) {
  227. pos.parentNode.insertBefore(kc, pos.nextSibling)
  228. }
  229. }
  230. })
  231. }
  232.  
  233. if (!document.querySelector('.sign-out-link') || document.querySelector('.sign-in-link')) return
  234.  
  235. await addSectionsToNav()
  236. })()

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址