Giveaway Left Check

检测其乐论坛福利放送版块的赠key剩余数量

目前为 2020-07-11 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name Giveaway Left Check
  3. // @namespace Giveaway-Left-Check
  4. // @version 0.1
  5. // @description 检测其乐论坛福利放送版块的赠key剩余数量
  6. // @author HCLonely
  7. // @include *://keylol.com/*
  8. // @require https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js
  9. // @run-at document-end
  10. // @grant GM_xmlhttpRequest
  11. // @grant GM_addStyle
  12. // @connect marvelousga.com
  13. // @connect grabfreegame.com
  14. // @connect bananagiveaway.com
  15. // @connect gamehag.com
  16. // @connect prys.revadike.com
  17. // @connect takekey.ru
  18. // @connect alienwarearena.com
  19. // ==/UserScript==
  20.  
  21. (function () {
  22. 'use strict'
  23.  
  24. const leftTitle = $('.subforum_left_title_left_up a').eq(3)
  25. const leftTitleHref = leftTitle.length > 0 ? leftTitle.attr('href') : ''
  26. if ((leftTitleHref.includes('f319-1') || (leftTitleHref.includes('page=1') && leftTitleHref.includes('fid=319'))) && leftTitle.text() === '福利放送') {
  27. const marvelousgaLinks = $('a[href*="marvelousga.com"]')
  28. const grabfreegameLinks = $('a[href*="grabfreegame.com"],a[href*="bananagiveaway.com"]')
  29. const gamehagLinks = $('a[href*="gamehag.com"]')
  30. const prysLinks = $('a[href*="prys.revadike.com"]')
  31. const takekeyLinks = $('a[href*="takekey.ru"]')
  32. const alienwarearenaLinks = $('a[href*="alienwarearena.com"]')
  33.  
  34. if (marvelousgaLinks.length > 0) {
  35. for (const e of marvelousgaLinks) {
  36. const test = $(e).attr('href').match(/https?:\/\/marvelousga\.com\/giveaway\/(.+)/)
  37. const id = test ? test[1] : false
  38. if (id) checkMarvelousga(id, e)
  39. }
  40. }
  41. if (grabfreegameLinks.length > 0) {
  42. for (const e of grabfreegameLinks) {
  43. const link = $(e).attr('href')
  44. if (/https?:\/\/www\.(grabfreegame|bananagiveaway)\.com\/giveaway\/.*/.test(link)) checkGrabfreegame(link, e)
  45. }
  46. }
  47. if (gamehagLinks.length > 0) {
  48. for (const e of gamehagLinks) {
  49. const link = $(e).attr('href')
  50. if (/https?:\/\/.*?gamehag\.com\/giveaway\/[\d]+.*?/.test(link)) checkGamehag(link, e)
  51. }
  52. }
  53. if (prysLinks.length > 0) {
  54. for (const e of prysLinks) {
  55. const link = $(e).attr('href')
  56. if (/https?:\/\/prys\.revadike\.com\/giveaway\/\?id=[\d]+/.test(link)) checkPrys(link, e)
  57. }
  58. }
  59. if (takekeyLinks.length > 0) {
  60. for (const e of takekeyLinks) {
  61. const link = $(e).attr('href')
  62. if (/https?:\/\/takekey\.ru\/distribution\/[\d]+/.test(link)) checkTakekey(link, e)
  63. }
  64. }
  65. if (alienwarearenaLinks.length > 0) {
  66. for (const e of alienwarearenaLinks) {
  67. const link = $(e).attr('href')
  68. if (/https?:\/\/.*?\.alienwarearena\.com\/ucf\/show\/[\d]+.*?/.test(link)) checkAlienwarearena(link, e)
  69. }
  70. }
  71. }
  72. function checkMarvelousga (id, e) {
  73. const thisEle = $('a[href="' + $(e).attr('href') + '"]')
  74. GM_xmlhttpRequest({
  75. method: 'get',
  76. url: 'https://marvelousga.com/',
  77. timeout: 30 * 1000,
  78. ontimeout: () => {
  79. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求超时">timeout</font>')
  80. },
  81. onerror: () => {
  82. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求失败">error</font>')
  83. },
  84. onload: response => {
  85. try {
  86. const a = $(`<div>${response.responseText}</div>`).find('a[href*="' + id + '"]')
  87. if (a.length > 0) {
  88. const leftKey = a.parent().children('small').text().trim().match(/[\d]+/)[0]
  89. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`)
  90. } else {
  91. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`)
  92. }
  93. } catch (err) {
  94. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="获取数据失败">error</font>')
  95. }
  96. }
  97. })
  98. }
  99. function checkGrabfreegame (url, e) {
  100. const thisEle = $('a[href="' + $(e).attr('href') + '"]')
  101. GM_xmlhttpRequest({
  102. method: 'get',
  103. url,
  104. timeout: 30 * 1000,
  105. ontimeout: () => {
  106. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求超时">timeout</font>')
  107. },
  108. onerror: () => {
  109. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求失败">error</font>')
  110. },
  111. onload: response => {
  112. try {
  113. const counter = $(`<div>${response.responseText}</div>`).find('#giveaway .left>b')
  114. if (counter.length > 0) {
  115. const leftKey = counter.text().trim()
  116. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`)
  117. } else {
  118. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`)
  119. }
  120. } catch (err) {
  121. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="获取数据失败">error</font>')
  122. }
  123. }
  124. })
  125. }
  126. function checkGamehag (url, e) {
  127. const thisEle = $('a[href="' + $(e).attr('href') + '"]')
  128. GM_xmlhttpRequest({
  129. method: 'get',
  130. url,
  131. timeout: 30 * 1000,
  132. ontimeout: () => {
  133. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求超时">timeout</font>')
  134. },
  135. onerror: () => {
  136. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求失败">error</font>')
  137. },
  138. onload: response => {
  139. try {
  140. const counter = $(`<div>${response.responseText}</div>`).find('div.giveaway-counter').not(':contains("day")').find('.strong')
  141. if (counter.length > 0) {
  142. const leftKey = counter.text().trim()
  143. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`)
  144. } else {
  145. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`)
  146. }
  147. } catch (err) {
  148. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="获取数据失败">error</font>')
  149. }
  150. }
  151. })
  152. }
  153. function checkPrys (url, e) {
  154. const thisEle = $('a[href="' + $(e).attr('href') + '"]')
  155. GM_xmlhttpRequest({
  156. method: 'get',
  157. url,
  158. timeout: 30 * 1000,
  159. ontimeout: () => {
  160. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求超时">timeout</font>')
  161. },
  162. onerror: () => {
  163. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求失败">error</font>')
  164. },
  165. onload: response => {
  166. try {
  167. const counter = $(`<div>${response.responseText}</div>`).find('#header :contains("left")')
  168. if (counter.length > 0) {
  169. const leftKey = counter.text().trim().match(/\(([\d]+).*\)/)[1]
  170. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`)
  171. } else {
  172. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`)
  173. }
  174. } catch (err) {
  175. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="获取数据失败">error</font>')
  176. }
  177. }
  178. })
  179. }
  180. function checkTakekey (url, e) {
  181. const thisEle = $('a[href="' + $(e).attr('href') + '"]')
  182. GM_xmlhttpRequest({
  183. method: 'get',
  184. url,
  185. timeout: 30 * 1000,
  186. ontimeout: () => {
  187. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求超时">timeout</font>')
  188. },
  189. onerror: () => {
  190. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求失败">error</font>')
  191. },
  192. onload: response => {
  193. try {
  194. const counter = $(`<div>${response.responseText}</div>`).find('span.text-muted:contains("Left")')
  195. if (counter.length > 0) {
  196. const leftKey = counter.text().trim().match(/[\d]+/)[0]
  197.  
  198. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(leftKey)}" title="剩余key数量">${leftKey}</font>`)
  199. } else {
  200. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(0)}" title="剩余key数量">0</font>`)
  201. }
  202. } catch (err) {
  203. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="获取数据失败">error</font>')
  204. }
  205. }
  206. })
  207. }
  208. function checkAlienwarearena (url, e) {
  209. const thisEle = $('a[href="' + $(e).attr('href') + '"]')
  210. GM_xmlhttpRequest({
  211. method: 'get',
  212. url,
  213. timeout: 30 * 1000,
  214. ontimeout: () => {
  215. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求超时">timeout</font>')
  216. },
  217. onerror: () => {
  218. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="请求失败">error</font>')
  219. },
  220. onload: response => {
  221. try {
  222. let userCountry = response.responseText.match(/user_country.*?=.*?"([\w]+)"/)
  223. userCountry = userCountry ? userCountry[1] : ''
  224. let prestigeLevel = response.responseText.match(/prestige_level.*?=.*?([\d]+)/)
  225. prestigeLevel = prestigeLevel ? parseInt(prestigeLevel[1]) : 0
  226. let fullLevel = response.responseText.match(/full_level.*?=.*?([\d]+)/)
  227. fullLevel = fullLevel ? parseInt(fullLevel[1]) : 0
  228. let countryKeys = response.responseText.match(/countryKeys.*?=.*?(\{.+\});/)
  229. countryKeys = countryKeys ? JSON.parse(countryKeys[1]) : {}
  230.  
  231. const keyType = prestigeLevel ? 'prestige' : 'normal'
  232. let userCountryKeys = countryKeys[userCountry][keyType]
  233.  
  234. let lowestLevelWithKeys
  235. let highestKeysForUser
  236. let keysForUser = false
  237.  
  238. for (const level in userCountryKeys) {
  239. if (userCountryKeys[level] > 0) {
  240. if (!lowestLevelWithKeys) { lowestLevelWithKeys = level }
  241. if (fullLevel >= level) {
  242. if (!highestKeysForUser || userCountryKeys[level] > highestKeysForUser) { highestKeysForUser = userCountryKeys[level] }
  243. }
  244. }
  245. }
  246.  
  247. if (!highestKeysForUser && keyType === 'prestige') {
  248. userCountryKeys = countryKeys[userCountry].normal
  249.  
  250. for (var level in userCountryKeys) {
  251. if (userCountryKeys[level] > 0) {
  252. if (!lowestLevelWithKeys) { lowestLevelWithKeys = level }
  253. if (fullLevel >= level) {
  254. if (!highestKeysForUser || userCountryKeys[level] > highestKeysForUser) { highestKeysForUser = userCountryKeys[level] }
  255. }
  256. }
  257. }
  258. }
  259. if (highestKeysForUser) {
  260. if (!thisEle.next().hasClass('left-keys')) thisEle.after(`<font class="left-keys ${getClass(highestKeysForUser)}" title="剩余key数量">${highestKeysForUser}</font>`)
  261. keysForUser = true
  262. }
  263.  
  264. if (!keysForUser) {
  265. if (lowestLevelWithKeys) {
  266. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="等级不足">等级不足</font>')
  267. } else {
  268. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="剩余key数量">0</font>')
  269. }
  270. }
  271. } catch (err) {
  272. if (!thisEle.next().hasClass('left-keys')) thisEle.after('<font class="left-keys lk-red" title="获取数据失败">error</font>')
  273. }
  274. }
  275. })
  276. }
  277. function getClass (left) {
  278. const leftKey = parseInt(left)
  279. if (leftKey >= 100) {
  280. return 'lk-green'
  281. } else if (leftKey > 0 && leftKey < 100) {
  282. return 'lk-yellow'
  283. } else {
  284. return 'lk-red'
  285. }
  286. }
  287. GM_addStyle(`
  288. .left-keys{
  289. color: #fff;
  290. border-radius: 10px;
  291. padding: 0 5px;
  292. margin-left: 5px;
  293. }
  294. .lk-green{
  295. background-color: #5cb85c;
  296. }
  297. .lk-yelow{
  298. background-color: #f0ad4e;
  299. }
  300. .lk-red{
  301. background-color: #d9534f;
  302. }
  303. `)
  304. })()

QingJ © 2025

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