NGA PLUS

NGA网页版增强插件

  1. // ==UserScript==
  2. // @name NGA PLUS
  3. // @version 2.0
  4.  
  5. // @grant GM.getValue
  6. // @grant GM.setValue
  7. // @grant GM.listValues
  8. // @grant GM.setClipboard
  9. // @grant GM.deleteValue
  10. // @include http://nga.178.com/*
  11. // @include https://nga.178.com/*
  12. // @include https://bbs.nga.cn/*
  13. // @include http://bbs.nga.cn/*
  14. // @include https://*.ngabbs.com/*
  15. // @include http://*.ngabbs.com/*
  16. // @namespace https://gf.qytechs.cn/users/284856
  17. // @description NGA网页版增强插件
  18. // ==/UserScript==
  19. var ARRAY_COLOR_LIST=new Array("red","yellow","green","aqua","blue","purple","white","black") //设置循环颜色
  20. var NGA_PLUS_VERSION = 2.0
  21.  
  22. //渲染页面
  23. //针对帖子列表页面
  24.  
  25. str_url = window.location.href
  26.  
  27. async function NGA_PLUS(){
  28. // 加入脚本设置功能
  29. DISPLAY_TIME = await GM.getValue("脚本设置_显示时间",false)
  30. DISPLAY_MOBILE = await GM.getValue("脚本设置_显示机型",true)
  31. //DISPLAY_VOID = await GM.getValue("脚本设置_无备注显示空",false) 不开放该功能,若开放,则无法在贴内进行备注
  32.  
  33. obj_cpinfo = document.getElementsByClassName("cpinfo")[0]
  34.  
  35. obj_newinfo = document.createElement("input")
  36. obj_newinfo.type = "checkbox"
  37. obj_newinfo.id = "settings_display_time"
  38. obj_newinfo.checked = DISPLAY_TIME
  39. obj_cpinfo.appendChild(obj_newinfo)
  40. obj_newinfo = document.createElement("span")
  41. obj_newinfo.innerText = "功能:显示用户注册(不可用)/最后登录(不可用)时间"
  42. obj_cpinfo.appendChild(obj_newinfo)
  43. obj_cpinfo.appendChild(document.createElement("br"))
  44.  
  45.  
  46. obj_newinfo = document.createElement("input")
  47. obj_newinfo.type = "checkbox"
  48. obj_newinfo.id = "settings_display_mobile"
  49. obj_newinfo.checked = DISPLAY_MOBILE
  50. obj_cpinfo.appendChild(obj_newinfo)
  51. obj_newinfo = document.createElement("span")
  52. obj_newinfo.innerText = "功能:显示用户手机型号(如可能)"
  53. obj_cpinfo.appendChild(obj_newinfo)
  54. obj_cpinfo.appendChild(document.createElement("br"))
  55.  
  56. //obj_newinfo = document.createElement("input")
  57. //obj_newinfo.type = "checkbox"
  58. //obj_newinfo.id = "settings_display_void"
  59. //obj_newinfo.checked = DISPLAY_VOID
  60. //obj_cpinfo.appendChild(obj_newinfo)
  61. //obj_newinfo = document.createElement("span")
  62. //obj_newinfo.innerText = "功能:当无备注时隐藏备注"
  63. //obj_cpinfo.appendChild(obj_newinfo)
  64. //obj_cpinfo.appendChild(document.createElement("br"))
  65.  
  66. obj_newinfo = document.createElement('span')
  67. obj_newinfo.style.color = "blue"
  68. obj_newinfo.style.fontSize = "12px"
  69. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  70. obj_newinfo.innerText = "导出设置"
  71. obj_newinfo.id = "Export_NGA_PLUS"
  72. obj_cpinfo.appendChild(obj_newinfo)
  73. obj_cpinfo.appendChild(document.createElement("br"))
  74.  
  75. obj_newinfo = document.createElement('span')
  76. obj_newinfo.style.color = "blue"
  77. obj_newinfo.style.fontSize = "12px"
  78. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  79. obj_newinfo.innerText = "导入设置并合并"
  80. obj_newinfo.id = "Import_NGA_PLUS"
  81. obj_cpinfo.appendChild(obj_newinfo)
  82. obj_cpinfo.appendChild(document.createElement("br"))
  83.  
  84. obj_newinfo = document.createElement('span')
  85. obj_newinfo.style.color = "blue"
  86. obj_newinfo.style.fontSize = "12px"
  87. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  88. obj_newinfo.innerText = "清空设置"
  89. obj_newinfo.id = "Zero_NGA_PLUS"
  90. obj_cpinfo.appendChild(obj_newinfo)
  91. obj_cpinfo.appendChild(document.createElement("br"))
  92.  
  93. obj_newinfo = document.createElement('span')
  94. obj_newinfo.style.color = "red"
  95. obj_newinfo.style.fontSize = "12px"
  96. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  97. obj_newinfo.innerText = `NGA_PLUS 版本 ${NGA_PLUS_VERSION} 作者 春风扫残雪`
  98. obj_newinfo.id = "NGA_PLUS"
  99. obj_cpinfo.appendChild(obj_newinfo)
  100.  
  101.  
  102.  
  103.  
  104.  
  105. if (str_url.indexOf("read.php?")>=0){
  106. if (str_url.indexOf("thread.php")<0){
  107. //渲染读取页面
  108. //首先渲染客户端来源
  109.  
  110. if (await GM.getValue("脚本设置_显示机型",true)){
  111. list_source = document.getElementsByClassName(" client_icon")
  112. for (i = 0;i<list_source.length;i++){
  113. str_source = list_source[i].title.replace("发送自 ","").replace(" 上的 NGA官方客户端","").replace("NGA官方客户端","开源版客户端(Android)")
  114. obj_newinfo = document.createElement('span')
  115. obj_newinfo.style.color = "#555"
  116. obj_newinfo.style.fontSize = "12px"
  117. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  118. obj_newinfo.innerText = str_source
  119. obj_poster = list_source[i].parentNode
  120. obj_poster.insertBefore(obj_newinfo,obj_poster.lastChild)
  121. console.log("done")
  122. }
  123. }
  124.  
  125. //其次渲染注册(不可用)/登录(不可用)时间等信息
  126. list_poster = document.getElementsByClassName("posterinfo")
  127. for (i = 0;i<list_poster.length;i++){
  128. if (list_poster[i].id.indexOf('commentposter')>=0){
  129. //热点回复
  130. }
  131. else {
  132. obj_author = list_poster[i].firstChild
  133. //console.log(list_poster[i])
  134. obj_stat = list_poster[i].getElementsByClassName("stat")[0]
  135. //console.log(obj_author.lastChild.innerText) // str_user_id
  136. str_user_id = "用户ID " + obj_author.lastChild.innerText
  137. str_user_note = await GM.getValue(str_user_id + "_备注","")
  138. int_user_color = await GM.getValue(str_user_id,0)
  139. //console.log(str_user_id +" "+str_user_note)
  140. if (str_user_note){
  141. obj_newinfo = document.createElement('span')
  142. obj_newinfo.className = "UserDefinedNote"
  143. obj_newinfo.style.color = ARRAY_COLOR_LIST[int_user_color % ARRAY_COLOR_LIST.length]
  144. obj_newinfo.style.fontSize = "12px"
  145. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  146. obj_newinfo.id = str_user_id
  147. obj_newinfo.innerText = "备注: " + str_user_note
  148. }
  149. else {
  150. obj_newinfo = document.createElement('span')
  151. obj_newinfo.className = "UserDefinedNoteNull"
  152. obj_newinfo.style.color = "#555"
  153. obj_newinfo.style.fontSize = "12px"
  154. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  155. obj_newinfo.id = str_user_id
  156. //if (await GM.getValue("脚本设置_无备注显示空",true) == false){
  157. // obj_newinfo.innerText = "无备注"
  158. //} else {
  159. // obj_newinfo.innerText = ""
  160. //}
  161. obj_newinfo.innerText = "无备注"
  162. }
  163. list_poster[i].appendChild(obj_newinfo)
  164. list_info = obj_stat.getElementsByTagName("span")
  165. str_logininfo = list_info[3].title // MAGIC
  166. //console.log(await GM.getValue("脚本设置_显示时间"))
  167. if (await GM.getValue("脚本设置_显示时间") == true){
  168.  
  169. obj_newinfo = document.createElement('span')
  170. obj_newinfo.style.color = "#555"
  171. obj_newinfo.style.fontSize = "12px"
  172. obj_newinfo.style.fontFamily = 'Verdana, Tahoma, Arial, "Microsoft YaHei", "Hiragino Sans GB", "WenQuanYi Micro Hei", sans-serif;'
  173. obj_newinfo.innerText = str_logininfo
  174. //console.log(list_info)
  175. list_poster[i].appendChild(document.createElement("br"))
  176. list_poster[i].appendChild(obj_newinfo)
  177. }
  178. }}
  179. return
  180.  
  181.  
  182.  
  183. }
  184. }
  185. //渲染其他页面,如搜索、帖子列表等
  186. list_time = document.getElementsByClassName("silver postdate")
  187. for (i = 0;i<list_time.length;i++){
  188. str_user_id = list_time[i].parentNode.getElementsByClassName("author")[0].title
  189.  
  190. int_user_color = await GM.getValue(str_user_id) //读取之前设置的颜色index
  191. if (int_user_color) {
  192. obj_c3 = list_time[i].parentNode
  193. obj_c3.parentNode.getElementsByClassName("c2")[0].getElementsByClassName("topic")[0].style.color = ARRAY_COLOR_LIST[int_user_color % ARRAY_COLOR_LIST.length]
  194. console.log(`color done`)
  195. }
  196. str_user_note = await GM.getValue(str_user_id + "_备注","") // 读取之前设置的备注
  197. if (str_user_note != ""){
  198. list_time[i].innerText += " 备注:" + str_user_note
  199. list_time[i].style.color = "red"
  200. console.log(str_user_id + " " + str_user_note)
  201. }
  202. }
  203. }
  204.  
  205. window.onload = NGA_PLUS()
  206.  
  207.  
  208. //点击事件
  209. document.addEventListener('click',async function(event){
  210. //console.log(event.target.className+" "+event.target.id)
  211. if (event.target.className == "c3"){
  212. str_user_id = event.target.getElementsByClassName("author")[0].title //读取选中的用户ID
  213. str_user_value = await GM.getValue(str_user_id,-1) //读取之前设置的颜色
  214. str_user_value += 1
  215. await GM.setValue(str_user_id,str_user_value)
  216. event.target.parentNode.getElementsByClassName("c2")[0].getElementsByClassName("topic")[0].style.color = ARRAY_COLOR_LIST[str_user_value % ARRAY_COLOR_LIST.length]
  217. }
  218. if (event.target.className == "silver postdate"){
  219. var newstr = prompt("请输入对该用户的备注","")
  220. event.target.innerText += " 备注:" + newstr
  221.  
  222. str_user_id = event.target.parentNode.getElementsByClassName("author")[0].title
  223. event.target.style.color = "red"
  224. GM.setValue(str_user_id+"_备注", newstr)
  225. }
  226. if (event.target.className == " uitxt1"){
  227. //ajax 加载待解决
  228. }
  229. if (event.target.className == "UserDefinedNoteNull") {
  230. // 添加新备注
  231. var newstr = prompt("请输入对该用户的备注","")
  232. event.target.innerText = "备注: " + newstr
  233. event.target.style.color = "red"
  234. str_user_id = event.target.id
  235. await GM.setValue(str_user_id+"_备注",newstr)
  236. event.target.className = "UserDefinedNote"
  237. return
  238. }
  239. if (event.target.className == "UserDefinedNote") {
  240. var newstr = prompt("请修改对该用户的备注","")
  241. int_user_color = await GM.getValue(str_user_id,0)
  242. event.target.innerText = "备注: " + newstr
  243. str_user_id = event.target.id
  244. await GM.setValue(str_user_id+"_备注",newstr)
  245. }
  246. if (event.target.id == "Export_NGA_PLUS"){
  247. Export_NGAPLUS()
  248. }
  249. if (event.target.id == "Zero_NGA_PLUS"){
  250. Zero_NGAPLUS()
  251. }
  252. if (event.target.id == "Import_NGA_PLUS"){
  253. Import_NGAPLUS()
  254. }
  255. if (event.target.id == "settings_display_time"){
  256. tmp_display = await GM.getValue("脚本设置_显示时间",false)
  257. tmp_display = !tmp_display
  258. GM.setValue("脚本设置_显示时间",tmp_display)
  259. }
  260. if (event.target.id == "settings_display_mobile"){
  261. tmp_mobile = await GM.getValue("脚本设置_显示机型",true)
  262. tmp_mobile = !tmp_mobile
  263. GM.setValue("脚本设置_显示机型",tmp_mobile)
  264. }
  265. if (event.target.id == "settings_display_void"){
  266. tmp_void = await GM.getValue("脚本设置_无备注显示空",false)
  267. tmp_void = !tmp_void
  268. GM.setValue("脚本设置_无备注显示空",tmp_void)
  269. }
  270. },true);
  271.  
  272. async function Export_NGAPLUS(){
  273. str_result = "#NGASTART#"
  274. OBJ_STATE_SAVE = {};
  275. list_GM = await GM.listValues()
  276. console.log(list_GM)
  277. for (i=0;i<list_GM.length;i++){
  278. OBJ_STATE_SAVE[list_GM[i]] = await GM.getValue(list_GM[i])
  279. }
  280. str_obj_json = JSON.stringify(OBJ_STATE_SAVE)
  281. str_result += str_obj_json + "#NGAEND#"
  282. GM.setClipboard(str_result)
  283. alert("设置已导出到剪贴板中!")
  284. }
  285.  
  286. async function Zero_NGAPLUS(){
  287. if (confirm("确认要清空插件的所有备注和颜色提示吗?")){
  288. list_GM = await GM.listValues()
  289. console.log(list_GM)
  290. for (i=0;i<list_GM.length;i++){
  291. GM.deleteValue(list_GM[i])
  292. }
  293. console.log(await GM.listValues())
  294. alert("设置已清空!")
  295. }
  296. }
  297.  
  298. async function Import_NGAPLUS(){
  299. str_import = prompt("请输入需要合并的设置","")
  300. if ((str_import.indexOf("#NGASTART#")>=0)&&(str_import.indexOf("#NGAEND#")>=0)){
  301. str_json = str_import.replace("#NGASTART#","").replace("#NGAEND#","")
  302. console.log(str_json)
  303. obj_json = JSON.parse(str_json)
  304. for (key in obj_json){
  305. GM.setValue(key,obj_json[key])
  306. }
  307. alert("设置合并完成!")
  308. } else {
  309. alert("设置不完整,请重新检查!")
  310. }
  311. }

QingJ © 2025

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