Greasy Fork is available in English.

Script Finder GreasyFork Script Lookup

Script Finder Keresse meg az adott webhelyre vonatkozó bármely webhelyet GreasyFork Script。

Szkript telepítése?
A szerző által javasolt szkript

Ez is érdekelhet: Greasyfork Ragasztó iparos

Szkript telepítése
  1. // ==UserScript==
  2. // @name Script Finder+
  3. // @name:zh-CN Script Finder 油猴脚本查找
  4. // @description:zh-CN Script Finder 在任何网站上找到适用于该网站的 油猴脚本。
  5. // @name:ar Script Finder البحث عن نص قرد الشحوم
  6. // @description:ar Script Finder ابحث في أي موقع ويب ينطبق على هذا الموقع سيناريو القرد الشحوم。
  7. // @name:bg Script Finder Търсене на скрипт на GreasyFork
  8. // @description:bg Script Finder Намерете във всеки уебсайт, който се отнася за този уебсайт GreasyFork Script。
  9. // @name:cs Script Finder Vyhledávání skriptů GreasyFork
  10. // @description:cs Script Finder Vyhledejte na libovolném webu, který se tohoto webu týká GreasyFork Script。
  11. // @name:da Script Finder GreasyFork Script-opslag
  12. // @description:da Script Finder Find på ethvert websted, der gælder for det pågældende websted GreasyFork Script。
  13. // @name:de Script Finder Nachschlagen von GreasyFork-Skripten
  14. // @description:de Script Finder Finden Sie auf jeder Website, die für diese Website gilt GreasyFork-Skript。
  15. // @name:el Script Finder Αναζήτηση σεναρίου GreasyFork
  16. // @description:el Script Finder Βρείτε σε οποιονδήποτε ιστότοπο που ισχύει για αυτόν τον ιστότοπο Σενάριο GreasyFork。
  17. // @name:en Script Finder GreasyFork Script Lookup
  18. // @description:en Script Finder Find on any website that applies to that website GreasyFork Script。
  19. // @name:eo Script Finder GreasyFork Skripto Serĉo
  20. // @description:eo Script Finder Trovu en iu ajn retejo kiu validas por tiu retejo GreasyFork Skripto。
  21. // @name:es Script Finder Búsqueda de guiones de GreasyFork
  22. // @description:es Script Finder Busque en cualquier sitio web que se aplique a ese sitio web. Guión del mono de grasa。
  23. // @name:fi Script Finder GreasyFork Script Lookup
  24. // @description:fi Script Finder Etsi miltä tahansa verkkosivustoa, joka koskee kyseistä verkkosivustoa GreasyFork Script。
  25. // @name:fr Script Finder Recherche de script GreasyFork
  26. // @description:fr Script Finder Rechercher sur n’importe quel site Web qui s’applique à ce site Web Script de GreasyFork。
  27. // @name:he Script Finder בדיקת סקריפט של גריז קוף
  28. // @description:he Script Finder מצא בכל אתר הרלוונטי לאותו אתר סקריפט גריז קוף。
  29. // @name:hr Script Finder Traženje skripte GreasyFork
  30. // @description:hr Script Finder Pronađite na bilo kojoj web stranici koja se odnosi na tu web stranicu GreasyFork Script。
  31. // @name:hu Script Finder GreasyFork Script Lookup
  32. // @description:hu Script Finder Keresse meg az adott webhelyre vonatkozó bármely webhelyet GreasyFork Script。
  33. // @name:id Script Finder Pencarian Skrip GreasyFork
  34. // @description:id Script Finder Temukan di situs web mana pun yang berlaku untuk situs web tersebut Naskah Monyet Gemuk。
  35. // @name:it Script Finder Ricerca script GreasyFork
  36. // @description:it Script Finder Trova su qualsiasi sito Web che si applica a quel sito Web Sceneggiatura della scimmia grassa。
  37. // @name:ja Script Finder GreasyFork スクリプトの検索
  38. // @description:ja Script Finder その Web サイトに該当する Web サイトを検索する グリース モンキー スクリプト。
  39. // @name:ka Script Finder GreasyFork სკრიპტის ძიება
  40. // @description:ka Script Finder იპოვეთ ნებისმიერ ვებსაიტზე, რომელიც ეხება ამ ვებსაიტს GreasyFork Script。
  41. // @name:ko Script Finder 그리스 원숭이 스크립트 조회
  42. // @description:ko Script Finder 해당 웹사이트에 적용되는 웹사이트를 찾으세요. 그리스 원숭이 스크립트。
  43. // @name:nl Script Finder GreasyFork-script opzoeken
  44. // @description:nl Script Finder Zoek op elke website wat op die website van toepassing is GreasyFork-script。
  45. // @name:nb Script Finder GreasyFork Script Lookup
  46. // @description:nb Script Finder Finn på et hvilket som helst nettsted som gjelder for det nettstedet GreasyFork Script。
  47. // @name:pl Script Finder Wyszukiwanie skryptu GreasyFork
  48. // @description:pl Script Finder Znajdź na dowolnej stronie internetowej, która dotyczy tej witryny Smaruj skrypt małpy。
  49. // @name:pt-BR Script Finder Pesquisa de script do GreasyFork
  50. // @description:pt-BR Script Finder Encontre em qualquer site que se aplique a esse site Script do Macaco Graxa。
  51. // @name:ro Script Finder Căutare Script GreasyFork
  52. // @description:ro Script Finder Găsiți pe orice site care se aplică acelui site GreasyFork Script。
  53. // @name:ru Script Finder Поиск сценария GreasyFork
  54. // @description:ru Script Finder Найти на любом веб-сайте, который относится к этому веб-сайту Сценарий GreasyFork。
  55. // @name:sk Script Finder Vyhľadávanie skriptov GreasyFork
  56. // @description:sk Script Finder Nájdite na ľubovoľnej webovej lokalite, ktorá sa týka danej webovej lokality GreasyFork Script。
  57. // @name:sr Script Finder Греасе Монкеи Сцрипт Лоокуп
  58. // @description:sr Script Finder Пронађите на било којој веб локацији која се односи на ту веб локацију Греасе Монкеи Сцрипт。
  59. // @name:sv Script Finder GreasyFork Script Lookup
  60. // @description:sv Script Finder Hitta på vilken webbplats som helst som gäller den webbplatsen GreasyFork Script。
  61. // @name:th Script Finder ค้นหาสคริปต์ GreasyFork
  62. // @description:th Script Finder ค้นหาบนเว็บไซต์ใด ๆ ที่ใช้กับเว็บไซต์นั้น สคริปต์ลิงจาระบี。
  63. // @name:tr Script Finder GreasyFork Komut Dosyası Arama
  64. // @description:tr Script Finder Söz konusu web sitesi için geçerli olan herhangi bir web sitesinde bulun GreasyFork Komut Dosyası。
  65. // @name:ug Script Finder مايمۇن قوليازمىسىنى ئىزدەش
  66. // @description:ug Script Finder شۇ تور بېكەتكە ماس كېلىدىغان ھەرقانداق تور بەتنى ئىزدەڭ مايمۇن قوليازمىسى。
  67. // @name:uk Script Finder Пошук сценарію GreasyFork
  68. // @description:uk Script Finder Знайдіть на будь-якому веб-сайті, який стосується цього веб-сайту Сценарій GreasyFork。
  69. // @name:vi Script Finder Tra cứu tập lệnh GreasyFork
  70. // @description:vi Script Finder Tìm trên bất kỳ trang web nào áp dụng cho trang web đó Kịch bản khỉ mỡ。
  71. // @name:zh-TW Script Finder 油猴腳本查找
  72. // @description:zh-TW Script Finder 在任何網站上找到適用於該網站的 油猴腳本。
  73. // @name:zh-HK Script Finder 油猴腳本查找
  74. // @description:zh-HK Script Finder 在任何網站上找到適用於該網站的 油猴腳本。
  75. // @name:fr-CA Script Finder Recherche de script GreasyFork
  76. // @description:fr-CA Script Finder Rechercher sur n’importe quel site Web qui s’applique à ce site Web Script de GreasyFork。
  77. // @description Script Finder allows you to find userscripts from greasyfork on any website.
  78. // @namespace https://github.com/ChinaGodMan/UserScripts
  79. // @version 2025.04.28.1400
  80. // @author shiquda & 人民的勤务员 <china.qinwuyuan@gmail.com>
  81. // @supportURL https://github.com/ChinaGodMan/UserScripts/issues
  82. // @homepageURL https://github.com/ChinaGodMan/UserScripts
  83. // @match *://*/*
  84. // @connect greatest.deepsurf.us
  85. // @icon data:image/png;base64,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
  86. // @grant GM_xmlhttpRequest
  87. // @grant GM_addStyle
  88. // @license MIT
  89. // ==/UserScript==
  90. /**
  91. * File: script-finder-plus.user.js
  92. * Project: UserScripts
  93. * File Created: 2024/11/24,Sunday 12:39:02
  94. * Author: shiquda <https://github.com/shiquda> 人民的勤务员@ChinaGodMan (china.qinwuyuan@gmail.com)
  95. * -----
  96. * Last Modified: 2025/04/28,Monday 14:01:01
  97. * Modified By: 人民的勤务员@ChinaGodMan (china.qinwuyuan@gmail.com)
  98. * -----
  99. * License: MIT License
  100. * Copyright © 2024 - 2025 ChinaGodMan,Inc
  101. */
  102.  
  103. (function () {
  104. const userLang = (navigator.languages && navigator.languages[0]) || navigator.language || 'en'
  105. const translations = {
  106. 'en,en-GB': {
  107. Author: 'Author',
  108. Installs: 'Installs',
  109. DailyInstalls: 'Daily Installs',
  110. Created: 'Created',
  111. Updated: 'Updated',
  112. Rating: 'Rating',
  113. LoadingScripts: 'Loading scripts...',
  114. LoadMore: 'Load more',
  115. AllScriptsLoaded: 'All scripts loaded',
  116. SearchPlaceholder: 'Search scripts...',
  117. ViewOnGreasyfork: 'View on Greasyfork',
  118. errorMessage: 'Failed to retrieve script information or there are no available scripts for this domain.',
  119. Loading: 'Loading...',
  120. Scripts: 'Scripts'
  121. },
  122. 'zh-CN,zh,zh-SG': {
  123. Author: '作者',
  124. Installs: '安装数量',
  125. DailyInstalls: '每日安装',
  126. Created: '创建日期',
  127. Updated: '更新时间',
  128. Rating: '评分',
  129. LoadingScripts: '正在加载脚本...',
  130. LoadMore: '加载更多',
  131. AllScriptsLoaded: '所有脚本已加载',
  132. SearchPlaceholder: '搜索脚本...',
  133. ViewOnGreasyfork: '在Greasyfork查看',
  134. errorMessage: '无法检索脚本信息或该域没有可用的脚本。',
  135. Loading: '载入中...',
  136. Scripts: '脚本'
  137.  
  138. },
  139. 'zh-TW,zh-HK,zh-MO': {
  140. Author: '作者',
  141. Installs: '安裝數量',
  142. DailyInstalls: '每日安裝',
  143. Created: '創建日期',
  144. Updated: '更新日期',
  145. Rating: '評分',
  146. LoadingScripts: '正在載入腳本...',
  147. LoadMore: '載入更多',
  148. AllScriptsLoaded: '所有腳本已載入',
  149. SearchPlaceholder: '搜尋腳本...',
  150. ViewOnGreasyfork: '在Greasyfork查看',
  151. errorMessage: '無法檢索腳本信息或該域沒有可用的腳本。',
  152. Loading: '載入中...',
  153. Scripts: '腳本'
  154. },
  155. 'ja': {
  156. Author: '著者',
  157. Installs: 'インストール数',
  158. DailyInstalls: '日次インストール数',
  159. Created: '作成日',
  160. Updated: '更新日',
  161. Rating: '評価',
  162. LoadingScripts: 'スクリプトを読み込んでいます...',
  163. LoadMore: 'もっと読む',
  164. AllScriptsLoaded: 'すべてのスクリプトが読み込まれました',
  165. SearchPlaceholder: 'スクリプトを検索...',
  166. ViewOnGreasyfork: 'Greasyforkで見る',
  167. errorMessage: 'スクリプト情報の取得に失敗するか、またはこのドメインには利用可能なスクリプトがありません。',
  168. Loading: '読み込み中...',
  169. Scripts: 'スクリプト'
  170. },
  171. 'vi': {
  172. Author: 'Tác giả',
  173. Installs: 'Số lượt cài đặt',
  174. DailyInstalls: 'Cài đặt hàng ngày',
  175. Created: 'Ngày tạo',
  176. Updated: 'Ngày cập nhật',
  177. Rating: 'Đánh giá',
  178. LoadingScripts: 'Đang tải các tập lệnh...',
  179. LoadMore: 'Tải thêm',
  180. AllScriptsLoaded: 'Đã tải tất cả các tập lệnh',
  181. SearchPlaceholder: 'Tìm kiếm tập lệnh...',
  182. ViewOnGreasyfork: 'Xem trên Greasyfork',
  183. errorMessage: 'Không thể truy xuất thông tin tập lệnh hoặc không có tập lệnh nào có sẵn cho miền này.',
  184. Loading: 'Đang tải...',
  185. Scripts: 'Tập lệnh'
  186. }
  187. }
  188. const getTranslations = (lang) => {
  189. for (const key in translations) {
  190. if (key === lang || key.split(',').includes(lang)) {
  191. return translations[key]
  192. }
  193. }
  194. return translations['en']
  195. }
  196. const translate = new Proxy(
  197. function (key) {
  198. const lang = userLang
  199. const strings = getTranslations(lang)
  200. return strings[key] || translations['en'][key]
  201. },
  202. {
  203. get(target, prop) {
  204. const lang = userLang
  205. const strings = getTranslations(lang)
  206. return strings[prop] || translations['en'][prop]
  207. }
  208. }
  209. )
  210. const domainParts = window.location.hostname.split('.').slice(-2)
  211. const domain = domainParts.join('.')
  212. const errorMessage = translate('errorMessage')
  213. let neverLoadedScripts = true
  214. let collapsed = true
  215. let loadedPages = 0
  216.  
  217. function getScriptsInfo(domain, page = 1) {
  218. var url = `https://greatest.deepsurf.us/scripts/by-site/${domain}?filter_locale=0&sort=updated&page=${page}`
  219.  
  220. GM_xmlhttpRequest({
  221. method: 'GET',
  222. url: url,
  223. onload: (response) => {
  224. // 解析结果
  225. const parser = new DOMParser()
  226. const doc = parser.parseFromString(response.responseText, 'text/html')
  227. const scripts = doc.querySelector('#browse-script-list')?.querySelectorAll('[data-script-id]')
  228. let scriptsInfo = []
  229.  
  230. if (!scripts) {
  231. scriptsInfo = errorMessage
  232. } else {
  233. for (var i = 0; i < scripts.length; i++) {
  234. scriptsInfo.push(parseScriptInfo(scripts[i]))
  235. }
  236. }
  237.  
  238. // 处理对象
  239. const loadMoreButton = document.querySelector('.load-more')
  240. console.log(doc.querySelector('.next_page'))
  241. if (doc.querySelector('.next_page') == null || doc.querySelector('.next_page')?.getAttribute('aria-disabled') === 'true') {
  242. loadedPages = 'max'
  243. loadMoreButton.disabled = true
  244. loadMoreButton.textContent = translate('AllScriptsLoaded')
  245. } else {
  246. loadMoreButton.disabled = false
  247. loadMoreButton.textContent = translate('LoadMore')
  248. }
  249. // console.log(scriptsInfo);
  250. document.querySelector('.wait-loading').style.display = 'none'
  251. loadMoreButton.style.display = 'block'
  252. appendScriptsInfo(scriptsInfo)
  253. updateMatches()
  254.  
  255. loadedPages = typeof loadedPages === 'number' ? loadedPages + 1 : 0
  256. // console.log(loadedPages)
  257. },
  258. onerror: () => {
  259. console.log('Some error occurred!')
  260. if (loadedPages === 0) {
  261. appendScriptsInfo(scriptsInfo)
  262. }
  263. const scriptsInfo = errorMessage
  264. document.querySelector('.wait-loading').style.display = 'none'
  265. }
  266. })
  267. }
  268.  
  269. // 解析脚本信息
  270. function parseScriptInfo(script) {
  271. return {
  272. id: script.getAttribute('data-script-id'),
  273. name: script.getAttribute('data-script-name'),
  274. author: script.querySelector('dd.script-list-author').textContent,
  275. description: script.querySelector('.script-description').textContent,
  276. version: script.getAttribute('data-script-version'),
  277. url: 'https://greatest.deepsurf.us/scripts/' + script.getAttribute('data-script-id'),
  278. createDate: script.getAttribute('data-script-created-date'),
  279. updateDate: script.getAttribute('data-script-updated-date'),
  280. installs: script.getAttribute('data-script-total-installs'),
  281. dailyInstalls: script.getAttribute('data-script-daily-installs'),
  282. ratingScore: script.getAttribute('data-script-rating-score')
  283. }
  284. }
  285.  
  286. // 插入脚本
  287. function appendScriptsInfo(scriptsInfo) {
  288. const infoList = document.querySelector('.info-list')
  289. if (scriptsInfo === errorMessage) {
  290. // infoList.innerHTML = errorMessage;
  291. const loadMoreButton = document.querySelector('.load-more')
  292. loadMoreButton.disabled = true
  293. loadMoreButton.textContent = translate('AllScriptsLoaded')
  294. loadMoreButton.innerHTML = errorMessage
  295. } else {
  296. for (var i = 0; i < scriptsInfo.length; i++) {
  297. var script = scriptsInfo[i]
  298. var listItem = document.createElement('li')
  299. listItem.className = 'info-item'
  300.  
  301. var scriptContainer = document.createElement('div')
  302. scriptContainer.className = 'script-container'
  303.  
  304. var nameElement = document.createElement('a')
  305. nameElement.className = 'mscript-link'
  306. nameElement.innerText = script.name
  307. nameElement.href = script.url
  308. nameElement.target = '_blank'
  309.  
  310. var descriptionElement = document.createElement('p')
  311. descriptionElement.className = 'script-description-finder'
  312. descriptionElement.innerHTML = script.description
  313.  
  314. var detailsContainer = document.createElement('div')
  315. detailsContainer.className = 'details-container'
  316.  
  317. // 创建一键安装按钮
  318. var installButton = document.createElement('a')
  319. installButton.className = 'install-button'
  320. installButton.innerText = `Install ${script.version}`
  321. installButton.href = `https://greatest.deepsurf.us/scripts/${script.id}/code/script.user.js`
  322.  
  323. const details = [
  324. { key: translate('Author'), value: script.author },
  325. { key: translate('Installs'), value: script.installs },
  326. { key: translate('DailyInstalls'), value: script.dailyInstalls },
  327. { key: translate('Created'), value: script.createDate },
  328. { key: translate('Updated'), value: script.updateDate },
  329. { key: translate('Rating'), value: script.ratingScore }
  330. ]
  331.  
  332. for (let i = 0; i < details.length; i++) {
  333. const spanElement = document.createElement('span')
  334. spanElement.className = 'script-details'
  335. spanElement.innerText = `${details[i].key}:\n${details[i].value}`
  336. detailsContainer.appendChild(spanElement)
  337. }
  338.  
  339. scriptContainer.appendChild(nameElement)
  340. scriptContainer.appendChild(descriptionElement)
  341. scriptContainer.appendChild(detailsContainer)
  342. scriptContainer.appendChild(installButton)
  343.  
  344. listItem.appendChild(scriptContainer)
  345. listItem.scriptId = script.id
  346. infoList.appendChild(listItem)
  347. }
  348. }
  349. }
  350.  
  351. function setupUI() {
  352. GM_addStyle(`
  353. scrbutton.script-button {
  354. position: fixed;
  355. bottom: 20%;
  356. right: -50px;
  357. transform: translateY(50%);
  358. padding: 20px;
  359. font-size: 16px;
  360. border: none;
  361. border-radius: 4px;
  362. background-color: #1e90ff;
  363. color: #ffffff;
  364. cursor: pointer;
  365. transition: right 0.3s;
  366. z-index: 9999999999999999;
  367. }
  368. div.info-container {
  369. display: none;
  370. position: fixed;
  371. top: 50%;
  372. left: 50%;
  373. transform: translate(-50%, -50%);
  374. width: 650px;
  375. padding: 12px;
  376. background-color: #ffffff;
  377. box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3);
  378. border-radius: 4px;
  379. opacity: 0;
  380. transition: opacity 0.3s;
  381. z-index: 9999;
  382. max-height: 80vh;
  383. overflow-y: auto;
  384. }
  385. ul.info-list {
  386. list-style: none;
  387. margin: 0;
  388. padding: 0;
  389. }
  390. li.info-item {
  391. margin-bottom: 15px;
  392. padding: 12px;
  393. padding-bottom: 22px;
  394. display: flex;
  395. flex-direction: column;
  396. border: 1px solid #1e90ff;
  397. border-radius: 5px;
  398. }
  399. .div.script-container {
  400. display: flex;
  401. flex-direction: column;
  402. }
  403. a.mscript-link {
  404. font-size: 18px !important;
  405. font-weight: bold !important;
  406. margin-bottom: 5px !important;
  407. color: #1e90ff !important;
  408. }
  409. p.script-description-finder {
  410. color: black !important;
  411. margin-top: 2px;
  412. margin-bottom: 5px;
  413. font-size: 16px;
  414. }
  415. div.details-container {
  416. font-size: 15px;
  417. font-weight: bold;
  418. display: flex;
  419. justify-content: space-between;
  420. margin-bottom: 15px;
  421. }
  422. span.script-details {
  423. font: !important;
  424. color: black !important;
  425. flex-grow: 1 !important;
  426. text-align: center !important;
  427. border: 1px solid #1e90ff !important;
  428. border-radius: 5px !important;
  429. margin: 4px !important;
  430. }
  431. div.table-header {
  432. color: #1e90ff !important;
  433. font-size: 25px;
  434. font-weight: bold;
  435. }
  436. input.script-search-input {
  437. width: 96% !important;
  438. padding: 10px !important;
  439. font-size: 18px !important;
  440. border: 1px solid #1e90ff !important;
  441. border-radius: 4px !important;
  442. box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3) !important;
  443. margin-bottom: 15px !important;
  444. margin-top: 20px !important;
  445. }
  446. a.install-button {
  447. font-size: 20px;
  448. background-color: green;
  449. color: white;
  450. padding: 12px;
  451. }
  452. button.to-greasyfork {
  453. position: absolute;
  454. top: 12px;
  455. right: 12px;
  456. border-radius: 4px;
  457. padding: 8px;
  458. font-size: 16px;
  459. border: none;
  460. background-color: #1e90ff;
  461. color: #ffffff;
  462. cursor: pointer;
  463. }
  464. span.match-count {
  465. background-color: #1e90ff;
  466. font-size: 25px;
  467. font-weight: bold;
  468. color: white;
  469. padding: 6px;
  470. position: absolute;
  471. right: 50%;
  472. border-radius: 12px;
  473. top: 10px;
  474. }
  475. div.wait-loading {
  476. font-size: 20px;
  477. font-weight: bold;
  478. color: #1e90ff;
  479. animation: blink 1s infinite;
  480. }
  481. @keyframes fadeInOut {
  482. 0% {
  483. opacity: 0;
  484. }
  485. 50% {
  486. opacity: 1;
  487. }
  488. 100% {
  489. opacity: 0;
  490. }
  491. }
  492. @keyframes blink {
  493. 0%, 100% {
  494. opacity: 0;
  495. }
  496. 50% {
  497. opacity: 1;
  498. }
  499. }
  500. button.load-more {
  501. border-radius: 4px;
  502. padding: 8px;
  503. font-size: 16px;
  504. border: none;
  505. background-color: #1e90ff;
  506. color: #ffffff;
  507. cursor: pointer;
  508. position: relative;
  509. bottom: 5px;
  510. left: 50%;
  511. transform: translateX(-50%);
  512. }
  513. button.load-more:disabled {
  514. background-color: #cccccc;
  515. cursor: not-allowed;
  516. }
  517. /* Dark styles */
  518. @media (prefers-color-scheme: dark) {
  519. scrbutton.script-button {
  520. background-color: #1e3a8a;
  521. color: #ffffff;
  522. }
  523. div.info-container {
  524. background-color: #1e1e1e;
  525. color: #ffffff;
  526. box-shadow: 0 2px 5px rgba(255, 255, 255, 0.3);
  527. }
  528. li.info-item {
  529. background-color: #2d2d2d;
  530. border: 1px solid #2563eb;
  531. }
  532. a.mscript-link {
  533. color: #3b82f6 !important;
  534. }
  535. p.script-description-finder {
  536. color: #e5e7eb !important;
  537. }
  538. div.details-container {
  539. color: #ffffff;
  540. }
  541. span.script-details {
  542. background-color: #374151 !important;
  543. color: #d1d5db !important;
  544. border: 1px solid #2563eb !important;
  545. }
  546. div.table-header {
  547. color: #3b82f6 !important;
  548. }
  549. input.script-search-input {
  550. background-color: #1e1e1e !important;
  551. color: #ffffff !important;
  552. border: 1px solid #2563eb !important;
  553. }
  554. a.install-button {
  555. background-color: #16a34a;
  556. color: #ffffff;
  557. }
  558. button.to-greasyfork {
  559. background-color: #2563eb;
  560. color: #ffffff;
  561. }
  562. span.match-count {
  563. background-color: #2563eb;
  564. color: #ffffff;
  565. }
  566. div.wait-loading {
  567. color: #3b82f6;
  568. }
  569. button.load-more {
  570. background-color: #2563eb;
  571. color: #ffffff;
  572. }
  573. button.load-more:disabled {
  574. background-color: #4b5563;
  575. color: #9ca3af;
  576. }
  577. }
  578.  
  579. /* Mobile styles */
  580. @media (max-width: 600px) {
  581. scrbutton.script-button {
  582. right: -30px;
  583. padding: 8px;
  584. font-size: 14px;
  585. }
  586. span.script-details {
  587. font-size: 10px !important;
  588. margin: 2px !important;
  589. padding: 2px !important;
  590. }
  591. span.match-count {
  592. font-size: 20px;
  593. padding: 4px;
  594. }
  595.  
  596. button.to-greasyfork {
  597. padding: 6px;
  598. font-size: 14px;
  599. }
  600.  
  601. a.install-button {
  602. font-size: 12px;
  603. padding: 8px;
  604. }
  605. div.table-header {
  606. font-size: 20px;
  607. }
  608. div.script-container {
  609. padding: 10px;
  610. }
  611. div.info-container {
  612. top: 10%;
  613. left: 5%;
  614. right: 5%;
  615. transform: none;
  616. width: calc(90% - 10px); /* 自适应宽度,保持左右边距 */
  617. max-width: 100%; /* 确保不超出屏幕宽度 */
  618. }
  619. a.mscript-link {
  620. font-size: 16px !important;
  621. }
  622. p.script-description-finder {
  623. font-size: 14px;
  624. }
  625.  
  626. input.script-search-input {
  627. width: 92% !important;
  628. padding: 8px !important;
  629. font-size: 16px !important;
  630. }
  631. span.match-count {
  632. font-size: 20px;
  633. padding: 4px;
  634. }
  635. button.load-more {
  636. font-size: 14px;
  637. padding: 6px;
  638. }
  639. }
  640. `)
  641.  
  642. // 创建打开列表按钮
  643. var button = document.createElement('scrbutton')
  644. button.className = 'script-button'
  645. button.innerText = translate('Scripts')
  646. document.addEventListener('fullscreenchange', function () {
  647. if (document.fullscreenElement) {
  648. button.style.display = 'none'
  649. } else {
  650. button.style.display = 'block'
  651. }
  652. })
  653. // 创建脚本容器
  654. var infoContainer = document.createElement('div')
  655. infoContainer.className = 'info-container'
  656.  
  657. // 创建搜索框
  658. var searchInput = document.createElement('input')
  659. searchInput.type = 'text'
  660. searchInput.placeholder = translate('SearchPlaceholder')
  661. searchInput.className = 'script-search-input'
  662.  
  663. // 创建指向greasyfork的链接
  664. var toGreasyfork = document.createElement('button')
  665. toGreasyfork.className = 'to-greasyfork'
  666. toGreasyfork.innerText = translate('ViewOnGreasyfork')
  667.  
  668. // 创建计数器
  669. var matchCount = document.createElement('span')
  670. matchCount.className = 'match-count'
  671.  
  672. // 创建表头
  673. var tableHeader = document.createElement('div')
  674. tableHeader.className = 'table-header'
  675. tableHeader.appendChild(document.createTextNode('Script Finder'))
  676. tableHeader.appendChild(matchCount)
  677. tableHeader.appendChild(searchInput)
  678. tableHeader.appendChild(toGreasyfork)
  679.  
  680. // 创建脚本列表
  681. var infoList = document.createElement('ul')
  682. infoList.className = 'info-list'
  683.  
  684. // 创建等待加载
  685. var waitLoading = document.createElement('div')
  686. waitLoading.className = 'wait-loading'
  687. waitLoading.innerText = translate('LoadingScripts')
  688.  
  689. // 创建加载更多
  690. var loadMore = document.createElement('button')
  691. loadMore.className = 'load-more'
  692. loadMore.innerText = 'Load more'
  693. loadMore.style.display = 'none'
  694.  
  695. infoList.appendChild(waitLoading)
  696. infoList.appendChild(loadMore)
  697.  
  698. infoContainer.appendChild(tableHeader)
  699. infoContainer.appendChild(infoList)
  700.  
  701. var timeout
  702. button.addEventListener('mouseenter', function () {
  703. clearTimeout(timeout)
  704. button.style.right = '10px'
  705. })
  706.  
  707. button.addEventListener('mouseleave', function () {
  708. timeout = setTimeout(function () {
  709. button.style.right = '-50px'
  710. }, 500)
  711. })
  712.  
  713. button.addEventListener('click', function (event) {
  714. event.stopPropagation()
  715. if (collapsed) {
  716. infoContainer.style.display = 'block'
  717. infoContainer.style.opacity = 1
  718. collapsed = false
  719. }
  720. else {
  721. infoContainer.style.display = 'none'
  722. infoContainer.style.opacity = 0
  723. collapsed = true
  724. }
  725.  
  726. if (neverLoadedScripts) {
  727. getScriptsInfo(domain, 1)
  728. neverLoadedScripts = false
  729. }
  730.  
  731. })
  732.  
  733. infoContainer.addEventListener('click', function (event) {
  734. event.stopPropagation()
  735. })
  736.  
  737. searchInput.addEventListener('input', () => {
  738. searchScript()
  739. updateMatches()
  740. })
  741.  
  742. toGreasyfork.addEventListener('click', function () {
  743. window.open(`https://greatest.deepsurf.us/scripts/by-site/${domain}?q=${searchInput.value}&filter_locale=0&sort=updated`)
  744. })
  745.  
  746. loadMore.addEventListener('click', () => {
  747. if (loadedPages === 'max') {
  748. return
  749. }
  750. const loadMoreButton = document.querySelector('.load-more')
  751. loadMoreButton.disabled = true
  752. loadMoreButton.textContent = translate('Loading')
  753. document.querySelector('.wait-loading').style.display = 'block'
  754. getScriptsInfo(domain, loadedPages + 1)
  755. })
  756.  
  757. document.body.addEventListener('click', function () {
  758. clearTimeout(timeout)
  759. collapsed = true
  760. button.style.right = '-50px'
  761. infoContainer.style.opacity = 0
  762. infoContainer.style.display = 'none'
  763. })
  764.  
  765. document.body.appendChild(button)
  766.  
  767. document.body.appendChild(infoContainer)
  768.  
  769. infoContainer.addEventListener('change', () => {
  770. updateMatches()
  771. })
  772. updateMatches()
  773. }
  774.  
  775. function searchScript() {
  776. const searchWord = document.querySelector('.script-search-input').value.toLowerCase() // 将要匹配的文本转换为小写
  777. const scriptList = document.querySelectorAll('.info-item')
  778. for (let i = 0; i < scriptList.length; i++) {
  779. const scriptText = scriptList[i].innerText.toLowerCase() // 将检索的文本转换为小写
  780. if (scriptText.includes(searchWord)) {
  781. scriptList[i].style.display = 'block'
  782. } else {
  783. scriptList[i].style.display = 'none'
  784. }
  785. }
  786. }
  787.  
  788. function updateMatches() {
  789. const matchCount = document.querySelectorAll('.info-item:not([style*="display: none"])').length
  790. const allCount = document.querySelectorAll('.info-item').length
  791. document.querySelector('.match-count').innerText = matchCount === allCount ? matchCount : `${matchCount}/${allCount}`
  792. }
  793.  
  794. function main() {
  795. if (window.self !== window.top) {
  796. // 在iframe中执行时,直接退出
  797. return
  798. }
  799. setupUI()
  800. }
  801. main()
  802. setTimeout(() => {
  803. const scripButton = document.querySelector('.script-button')
  804. if (!scripButton) {
  805. console.log('🔍 ~ <function> ~ script-finder-plus/script-finder-plus.user.js:730 ~ scripButton:找不到按钮,重新加载。。.')
  806. main()
  807. }
  808. }, 2000)
  809. })()