Google 高级搜索助手

在谷歌搜索页面顶部添加一个高级搜索表单

当前为 2023-08-30 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name Advanced Search Assistant for Google
  3. // @name:zh-CN Google 高级搜索助手
  4. // @namespace http://tampermonkey.net/
  5. // @version 0.1.2
  6. // @description Add an advanced search form to the top of the page
  7. // @description:zh-CN 在谷歌搜索页面顶部添加一个高级搜索表单
  8. // @author shiquda
  9. // @namespace https://github.com/shiquda/shiquda_UserScript
  10. // @supportURL https://github.com/shiquda/shiquda_UserScript/issues
  11. // @match *://www.google.com/search*
  12. // @grant GM_addStyle
  13. // @grant GM_setValue
  14. // @grant GM_getValue
  15. // @license MIT
  16. // ==/UserScript==
  17.  
  18. (function () {
  19. 'use strict';
  20. const userLanguage = '' // You can set your language config here manually. 'zh-CN' & 'en' are supported now.
  21.  
  22.  
  23. const translation = {
  24. 'as_q': {
  25. 'zh-CN': '搜索字词:',
  26. 'en': 'Search word:'
  27. },
  28. 'as_epq': {
  29. 'zh-CN': '与以下字词完全匹配:',
  30. 'en': 'Match the following words exactly:'
  31. },
  32. 'as_oq': {
  33. 'zh-CN': '包含以下任意字词:',
  34. 'en': 'Contains any of the following words:'
  35. },
  36. 'as_eq': {
  37. 'zh-CN': '排除以下字词:',
  38. 'en': 'Exclude the following words:'
  39. },
  40. 'as_nlo': {
  41. 'zh-CN': '包含的数字范围:从',
  42. 'en': 'Number range: from'
  43. },
  44. 'as_nhi': {
  45. 'zh-CN': '到:',
  46. 'en': 'to:'
  47. },
  48. 'lr': {
  49. 'zh-CN': '语言:',
  50. 'en': 'Language:'
  51. },
  52. 'cr': {
  53. 'zh-CN': '地区:',
  54. 'en': 'Region:'
  55. },
  56. 'as_qdr': {
  57. 'zh-CN': '最后更新时间:',
  58. 'en': 'Last update time:'
  59. },
  60. 'as_sitesearch': {
  61. 'zh-CN': '网站或域名:',
  62. 'en': 'Website or domain:'
  63. },
  64. 'as_occt': {
  65. 'zh-CN': '字词出现位置:',
  66. 'en': 'Word position:'
  67. },
  68. 'as_filetype': {
  69. 'zh-CN': '文件类型:',
  70. 'en': 'File type:'
  71. },
  72. 'tbs': {
  73. 'zh-CN': '使用权限:',
  74. 'en': 'Usage rights:'
  75. },
  76. 'advancedSearch': {
  77. 'zh-CN': '高级搜索',
  78. 'en': 'Advanced Search'
  79. },
  80. 'search': {
  81. 'zh-CN': '搜索',
  82. 'en': 'Search'
  83. },
  84. 'clear': {
  85. 'zh-CN': '清空',
  86. 'en': 'Clear'
  87. },
  88. 'as_qdr_select': {
  89. 'zh-CN': {
  90. '': '请选择',
  91. 'd': '一天内',
  92. 'w': '一周内',
  93. 'm': '一月内',
  94. 'y': '一年内',
  95. },
  96. 'en': {
  97. '': 'Please select',
  98. 'd': 'Past 24 hours',
  99. 'w': 'Past week',
  100. 'm': 'Past month',
  101. 'y': 'Past year',
  102. }
  103. }
  104. }
  105. const style = `
  106. #advancedSearchToggleButton {
  107. margin-right: 10px;
  108. border: none;
  109. border-radius: 5px;
  110. background-color: #007bff;
  111. color: #fff;
  112. font-size: 14px;
  113. font-weight: bold;
  114. }
  115.  
  116.  
  117. #advancedSearchFormContainer {
  118. position: fixed;
  119. top: 130px;
  120. left: 40px;
  121. display: none;
  122. background: #fff;
  123. padding: 10px;
  124. border: 1px solid #ccc;
  125. border-radius: 5px;
  126. font-size: 14px;
  127. font-weight: bold;
  128. }
  129.  
  130.  
  131. #advancedSearchFormContainer label {
  132. display: block;
  133. margin-top: 5px;
  134. }
  135.  
  136.  
  137. #advancedSearchFormContainer input[type="text"] {
  138. margin-top: 5px;
  139. padding: 5px;
  140. border: 1px solid #ccc;
  141. border-radius: 5px;
  142. }
  143.  
  144. #advancedSearchFormContainer select {
  145. margin-top: 5px;
  146. padding: 5px;
  147. border: 1px solid #ccc;
  148. border-radius: 5px;
  149. }
  150.  
  151. #advancedSearchFormContainer button {
  152. border: none;
  153. border-radius: 5px;
  154. background-color: #007bff;
  155. color: #fff;
  156. font-size: 14px;
  157. font-weight: bold;
  158. margin: 20px;
  159. }
  160. `
  161. GM_addStyle(style)
  162.  
  163. const language = userLanguage ? userLanguage : navigator.language ? navigator.language : 'en'
  164. // 创建按钮和表单元素
  165. const toggleButton = document.createElement('button');
  166. toggleButton.className = 'nfSF8e';
  167. toggleButton.textContent = translation['advancedSearch'][language];
  168. toggleButton.id = 'advancedSearchToggleButton'
  169. document.querySelector('.logo').appendChild(toggleButton);
  170.  
  171. const formContainer = document.createElement('div');
  172. formContainer.id = 'advancedSearchFormContainer'
  173. document.body.appendChild(formContainer);
  174.  
  175. // 创建表单元素
  176. const form = document.createElement('form');
  177. formContainer.appendChild(form);
  178.  
  179. const params = {
  180. 'as_q': translation['as_q'][language],
  181. 'as_epq': translation['as_epq'][language],
  182. 'as_oq': translation['as_oq'][language],
  183. 'as_eq': translation['as_eq'][language],
  184. 'as_nlo': translation['as_nlo'][language],
  185. 'as_nhi': translation['as_nhi'][language],
  186. // 'lr': translation['lr'][language],
  187. // 'cr': translation['cr'][language],
  188. 'as_qdr': {
  189. 'name': translation['as_qdr'][language],
  190. 'options':
  191. {
  192. '': translation['as_qdr_select'][language][''],
  193. 'd': translation['as_qdr_select'][language]['d'],
  194. 'w': translation['as_qdr_select'][language]['w'],
  195. 'm': translation['as_qdr_select'][language]['m'],
  196. 'y': translation['as_qdr_select'][language]['y'],
  197. }
  198. },
  199. 'as_sitesearch': translation['as_sitesearch'][language],
  200. // 'as_occt': translation['as_occt'][language],
  201. 'as_filetype': translation['as_filetype'][language],
  202. // 'tbs': translation['tbs'][language],
  203. };
  204.  
  205. for (const param in params) {
  206. if (typeof params[param] === 'object') {
  207. const label = document.createElement('label');
  208. label.textContent = params[param].name;
  209. const select = document.createElement('select');
  210. select.name = param;
  211.  
  212. Object.keys(params[param]['options']).forEach(option => {
  213. const optionElement = document.createElement('option');
  214. optionElement.value = option;
  215. optionElement.textContent = params[param]['options'][option];
  216. select.appendChild(optionElement);
  217. });
  218.  
  219. form.appendChild(label);
  220. form.appendChild(select);
  221. form.appendChild(document.createElement('br'));
  222. continue;
  223. }
  224. const label = document.createElement('label');
  225. label.textContent = params[param];
  226. const input = document.createElement('input');
  227. input.name = param;
  228. input.type = 'text';
  229. form.appendChild(label);
  230. form.appendChild(input);
  231. form.appendChild(document.createElement('br'));
  232. }
  233.  
  234. const searchButton = document.createElement('button');
  235. searchButton.textContent = translation['search'][language];
  236. form.appendChild(searchButton);
  237.  
  238. // Add a clear button to reset the form
  239. const clearButton = document.createElement('button');
  240. clearButton.textContent = translation['clear'][language];
  241. clearButton.addEventListener('click', function (event) {
  242. event.preventDefault();
  243. form.reset();
  244. });
  245. form.appendChild(clearButton);
  246.  
  247. // Load saved data and fill the form when opening a new page
  248. window.addEventListener('load', function () {
  249. for (const param in params) {
  250. const savedValue = GM_getValue(param);
  251. if (savedValue) {
  252. form[param].value = savedValue;
  253. }
  254. }
  255. });
  256.  
  257. // Save form data to Greasemonkey storage
  258. form.addEventListener('input', function () {
  259. for (const param in params) {
  260. GM_setValue(param, form[param].value);
  261. }
  262. });
  263.  
  264. // 在按钮点击时切换表单可见性
  265. toggleButton.addEventListener('click', function (event) {
  266. event.preventDefault();
  267. let status = formContainer.style.display;
  268. status = status === 'none' || status === '' ? 'block' : 'none';
  269. formContainer.style.display = status;
  270. });
  271.  
  272. // 在表单提交时进行高级搜索
  273. form.addEventListener('submit', function (event) {
  274. event.preventDefault();
  275. const searchParams = new URLSearchParams();
  276. for (const param in params) {
  277. const value = form[param].value;
  278. if (value) {
  279. searchParams.set(param, value);
  280. }
  281. }
  282. const searchUrl = 'https://www.google.com/search?' + searchParams.toString();
  283. window.location.href = searchUrl;
  284. });
  285. })();