// ==UserScript==
// @name 中文PT站官邀查询器
// @namespace https://greasyfork.org
// @version 0.1
// @description 中国私人追踪器官方招募路线
// @author ChatGPT, cO_ob
// @match https://tieba.baidu.com/*pt*
// @grant none
// @license MIT
// ==/UserScript==
(function() {
'use strict';
window.addEventListener('load', function() {
const routeInfo = {
'AgsvPT': {
'XingTan': [90, '', '', 2408],
'Vicomo': [0, 'Power User', '', 2404]
},
'Audiences': {
'GGPT': [0, '', '', 2311],
'Hares': [0, '', '', 2408],
'HDPT': [0, '', '', 2407],
'HTPT': [0, '', '', 2311],
'PANDA': [0, '', '', 2401],
'TTG': [0, 'Extreme User', '做种时间 2000天', 2406],
'U2': [540, 'Veteran User', '发布5个相关种子', 2405]
},
'BTSCHOOL': {
'ECUSTPT': [0, 'Power User', '发布数 1', 2404],
'Hares': [0, 'Crazy User', '', 2403],
'HDPT': [0, 'Elite User', '', 2402],
'PigGo': [0, 'Crazy User', '', 2408],
'ZmPT': [0, 'Elite User', '做种体积 1T', 2310]
},
'DIC': {
'GPW': [0, 'Power User', '发布数 5', 2407],
'PuTao': [180, 'Elite', '注册时间 1年 或 Torrent Master', 2402],
'Vicomo': [0, 'Power User', '', 2401],
'ZmPT': [0, 'Power User', '', 2309]
},
'GPW': {
'AgsvPT': [0, 'Power User', '', 2404],
'M-Team': [60, 'Elite', '', 2401],
'PuTao': [180, 'Elite', '注册时间 1年 或 Torrent Master', 2402],
'U2': [84, 'Power User', '已审核ACG发布数 5', 2404],
'Vicomo': [0, 'Power User', '', 2401],
'ZmPT': [180, 'Elite', '', 2309]
},
'HDDolby': {
'HDCity': [0, 'Elite User', '', 2406],
'Hares': [0, 'Power User', '', 2408],
'HUDBT': [0, 'Power User', '', 2406],
'ptsbao': [0, 'Power User', '', 2407],
'RedLeaves': [90, 'Power User', '', 2407]
},
'HHCLUB': {
'ECUSTPT': [0, 'Power User', '', 2408],
'HDPT': [0, 'Power User', '', 2406],
'PigGo': [0, 'Crazy User', '', 2405]
},
'HD4FANS': {
'PTerClub': [180, 'Crazy User', '', 2407],
'TorrentCCF': [90, 'Power User', '', 2403],
'Vicomo': [0, 'Power User', '', 2401]
},
'HDArea': {
'Hares': [0, 'Crazy User', '', 2402]
},
'HDAtmos': {
'ECUSTPT': [0, 'Power User', '发布数 1', 2404]
},
'HDFans': {
'ECUSTPT': [0, 'Power User', '发布数 1', 2405],
'HDKylin': [0, '', '', 2408],
'HUDBT': [0, 'Power User', '学习类发布数 5 或上传量 50GB', 2407],
'HDPT': [0, 'Elite User', '', 2408],
'Hares': [0, 'Crazy User', '', 2408],
'RedLeaves': [180, 'Veteran User', '做种体积 2T', 2406],
'ZmPT': [0, 'Elite User', '做种体积 1T', 2309]
},
'HDHome': {
'HDVideo': [0, 'Elite User', '', 2403],
'HDKylin': [0, 'Power User', '', 2407],
'Hares': [0, 'Crazy User', '', 2402],
'RedLeaves': [0, 'Elite User', '做种体积 5TB', 2405],
'U2': [210, 'Veteran User', 'ACG发布数 5', 2407]
},
'HDSky': {
'DaJiao': [0, 'Elite User', '', 2407],
'GPW': [0, 'Elite User', '发布数 1', 2401],
'PT@KEEPFRDS': [0, 'Insane User', '做种时间 2000天', 2407],
'HTPT': [0, 'Power User', '', 2408],
'RedLeaves': [90, 'Veteran User', '或 官种 5T', 2405]
},
'M-Team': {
'HDKylin': [0, '', '', 2408],
'HDPT': [0, 'Elite User', '', 2408],
'FSM': [0, '', '', 2408],
'GPW': [84, 'Crazy User', '发布数 1 上传量 500GB', 2405],
'DiscFan': [200, 'Elite User', '', 2408],
'Hares': [0, 'Elite User', '', 2406],
'ilolicon': [0, 'Crazy User', '', 2408],
'DaJiao': [0, 'Elite User', '', 2405],
'DragonHD': [0, '', '上传量 2TB 分享率 1', 2406],
'RedLeaves': [90, 'Veteran User', '官种做种体积 2TB', 2407]
},
'OpenCD': {
'PTerClub': [180, 'Crazy User', '', 2401],
'SSD': [360, 'Veteran User', '已审核ACG发布数 5', 2402],
'BYRBT': [0, '', '上传量 200G', 2407]
},
'OurBits': {
'RedLeaves': [90, 'Power User', '', 2404],
'SSD': [360, 'Veteran User', '发布数 10 注册时间 12月 做种时间 50000天', 2404],
'MonikaDesign': [56, 'Elite User', '', 2406],
'DiscFan': [56, 'Elite User', '', 2408]
},
'PT@KEEPFRDS': {
'FSM': [0, 'Power User', '', 2312],
'HDPOST': [0, 'Elite User', '', 2407],
'PTerClub': [180, 'Crazy User', '', 2407],
'TorrentCCF': [30, 'Crazy User', '', 2404]
},
'PTerClub': {
'TorrentCCF': [180, 'Crazy User', '发布数 1', 2407],
'PuTao': [180, 'Insane User', '', 2405],
'M-Team': [0, 'Crazy User', '发布数 10 或 Insane User', 2408],
'HITPT': [0, 'Power User', '', 2408],
'XingTan': [0, 'Power User', '', 2406],
'FSM': [0, '', '', 2408],
'PT@KEEPFRDS': [0, 'Insane User', 'FRDS资源做种体积 1TB', 2408],
'DaJiao': [0, 'Elite User', '', 2408],
'Hares': [0, 'Power User', '', 2406],
'OpenCD': [280, 'Veteran User', '已审核音乐发布数 10', 2407],
'GPW': [0, 'Crazy User', '影视或音乐发布数 1', 2402],
'HDFans': [0, 'Power User', '', 2405],
'HDPT': [0, 'Power User', '', 2406],
'HDVideo': [0, 'Elite User', '', 2403],
'kamePT': [0, 'Elite User', '', 2406],
'MonikaDesign': [56, 'Power User', '', 2405],
'OKPT': [30, 'Power User', '', 2406],
'U2': [112, 'Crazy User', 'ACG发布数 5', 2404],
'TLFBits': [90, 'Crazy User', 'TLF资源 1TB', 2407],
'SSD': [300, '', '1.下载量1024GB;2.分享率 3.55;3.做种积分 1500000;4.已审核存活发布数 30', 2407],
'PigGo': [0, 'Crazy User', '', 2408],
'PANDA': [0, 'Power User', '', 2405],
'HUDBT': [0, 'Power User', '', 2401]
},
'RedLeaves': {
'OKPT': [0, '', '', 2311],
'ECUSTPT': [0, 'Power User', '发布数 1', 2402],
'AgsvPT': [0, 'Elite User', '已审核发布数 10', 2402],
'XingTan': [0, '', '', 2404],
'BTSCHOOL': [0, '', '', 2403],
'qingwa': [0, 'Power User', '', 2403],
'HDKylin': [0, 'Power User', '', 2407],
'HDFans': [0, 'Power User', '', 2404],
'Vicomo': [0, 'Power User', '', 2311],
'Ubits': [0, 'Power User', '', 2311],
'GGPT': [0, '', '', 2403],
'kamePT': [0, 'Crazy User', '上传量 5GB', 2404]
},
'SSD': {
'PuTao': [210, 'Elite', '1.发布数 20 或 保种积分 800000 或 下载量 2TB 上传量 10TB', 2405],
'PTerClub': [180, 'Elite', '保种上传 20GB/月 或 100GB 或 发布数 3', 2407],
'HDVideo': [0, 'Elite', '', 2407],
'U2': [175, 'Elite', '1.做种积分 400000;2.发布1相关种子或保种上传 500GB', 2406],
'PigGo': [180, '', '', 2407],
'FSM': [0, '', '', 2408],
'TorrentCCF': [30, '', '发布数 1', 2407],
'TTG': [0, 'Master', '做种时间 2000天', 2311],
'OpenCD': [180, 'God', '保种上传 1024GB', 2406],
'OurBits': [0, 'Master', '发布数 10;保种上传 300GB', 2403]
},
'TLFBits': {
'Hares': [0, 'Power User', '', 2402],
'Soulvoice': [0, 'Crazy User', '', 2407],
'PTerClub': [180, 'Crazy User', '', 2407]
},
'TorrentCCF': {
'BYRBT': [0, '', '上传量 500GB', 2402],
'RedLeaves': [180, 'Veteran User', '', 2407],
'PTerClub': [0, 'Veteran User', '发布数 5', 2407],
'HITPT': [0, 'Power User', '', 2406]
},
'tjupt': {
'TLFBits': [0, '', '', 2408],
'PuTao': [180, 'Power User', '1.发布数 10 HnR 90或 2.Crazy User 且 做种 5000天 HnR 95', 2402],
'PTerClub': [90, 'Crazy User', '', 2401],
'RedLeaves': [180, 'Veteran User', '', 2406],
'HDCity': [0, 'Elite User', '', 2406],
'HDFans': [0, 'Power User', 'HnR 100', 2312],
'XingTan': [90, 'Power User', '', 2408],
'GPW': [0, 'Crazy User', '', 2404],
'MonikaDesign': [0, '', '', 2309]
},
'TTG': {
'Audiences': [0, 'PetaByte', '1.(Audiences官种发布数 10 且 Audiences做种数100 且 Audiences做种体积 1TB) 或 (Audiences做种数100 且 Audiences做种体积 2TB)', 2408],
'TLFBits': [0, 'TeraByte', '', 2407],
'SSD': [0, 'BrontoByte', '发布数 5 做种时间 40000天', 2404]
},
'U2': {
'HDCity': [0, '', '上传量 500GB 或 (上传量300GB 且 下载量100GB)', 2406],
'kamePT': [0, 'Elite User', '', 2408],
'OpenCD': [180, 'Ultimate User', '', 2407],
'SSD': [0, 'Insane User', '做种体积×做种天数 1000000', 2407],
'XingTan': [0, 'Power User', '', 2407],
'PTerClub': [180, 'Insane User', '', 2402],
'GPW': [0, 'Crazy User', '发布数 1', 2404],
'MonikaDesign': [28, 'Power User', '', 2406],
'PigGo': [0, 'Insane User', '', 2407]
},
'Ubits': {
'Vicomo': [0, 'Power User', '', 2311],
'RedLeaves': [90, 'Veteran User', '做种体积 5T', 2405],
'qingwa': [0, 'Power User', '', 2403],
'HDKylin': [0, '', '', 2408],
'DaJiao': [0, 'Power User', '', 2311],
'PigGo': [0, 'Crazy User', '', 2408]
},
'ZHUQUE': {
'Hares': [0, '结丹', '', 2309],
'qingwa': [0, '元婴', '', 2406],
'FSM': [0, '', '', 2401],
'RedLeaves': [180, '合体', '', 2405],
'ECUSTPT': [0, '结丹', '发布数 1', 2404],
'ZmPT': ['', '原石 300000', 2309]
},
};
const unlockInviteClass = {
'AgsvPT': '',
'Audiences': 'Elite User',
'BTSCHOOL': '',
'DIC': 'Power User',
'GPW': 'Power User',
'HDDolby': 'Elite User',
'HHCLUB': '',
'HD4FANS': '',
'HDArea': '',
'HDAtmos': '',
'HDFans': '',
'HDHome': 'Crazy User',
'HDSky': 'Elite User',
'M-Team': 'Elite User',
'OpenCD': 'Elite User',
'OurBits': 'Elite User',
'PT@KEEPFRDS': 'Elite User',
'PTerClub': 'Power User',
'RedLeaves': '',
'SSD': 'Elite',
'TLFBits': '',
'TorrentCCF': 'Elite User',
'tjupt': '',
'TTG': 'TeraByte',
'U2': '',
'Ubits': '',
'ZHUQUE': ''
}
const classInfo = {
'AgsvPT': {
'Power User': [28, '50GB', 1.05, '做种积分 40000'],
'Elite User': [56, '120GB', 1.55, '做种积分 80000'],
'Crazy User': [84, '300GB', 2.05, '做种积分 150000'],
'Insane User': [140, '500GB', 2.55, '做种积分 400000'],
'Veteran User': [196, '750GB', 4.05, '做种积分 800000'],
'Extreme User': [280, '1TB', 5.05, '做种积分 1400000'],
'Ultimate User': [364, '1.5TB', 6.05, '做种积分 2200000'],
'Nexus Master': [490, '3TB', 7.05, '做种积分 3200000']
},
'Audiences': {
'Power User': [35, '120GB', 2.0, '做种积分 100000'],
'Elite User': [105, '240GB', 2.5, '做种积分 200000'],
'Crazy User': [168, '400GB', 3.0, '做种积分 400000'],
'Insane User': [280, '600GB', 3.5, '做种积分 640000'],
'Veteran User': [420, '1TB', 4.0, '做种积分 880000'],
'Extreme User': [560, '2TB', 4.5, '做种积分 1200000'],
'Ultimate User': [700, '4TB', 5.0, '做种积分 1500000'],
'Nexus Master': [784, '8TB', 6.0, '做种积分 1800000']
},
'BTSCHOOL': {
'Power User': [28, '50GB', 2.0, '做种积分 40000'],
'Elite User': [56, '100GB', 2.5, '做种积分 80000'],
'Crazy User': [105, '300GB', 3.0, '做种积分 150000'],
'Insane User': [175, '500GB', 3.5, '做种积分 250000'],
'Veteran User': [280, '1TB', 4.0, '做种积分 400000'],
'Extreme User': [420, '2TB', 4.5, '做种积分 600000'],
'Ultimate User': [560, '5TB', 5.0, '做种积分 800000'],
'Nexus Master': [700, '10TB', 5.5, '做种积分 1000000']
},
'DIC': {
'Member': [7, '10GB', 0.7, '注册时间 1周'],
'Power User': [14, '25GB', 1.05, '注册时间 2周, 发布数 5'],
'Elite': [28, '75GB', 1.05, '注册时间 4周, 发布数 50'],
'Torrent Master': [56, '200GB', 1.05, '注册时间 8周, 发布数 150'],
'Power Torrent Master': [56, '375GB', 1.05, '注册时间 8周, 独特分组发布数 300'],
'Elite Torrent Master': [84, '600GB', 1.05, '注册时间 12周, FLAC/WAV完美发布数 500'],
'Elite Torrent Master Plus': [84, '600GB', 1.05, '注册时间 12周, FLAC完美发布数 500'],
'Guru': [112, '1.2TB', 1.05, '注册时间 16周, FLAC完美发布数 1000']
},
'GPW': {
'Member': [7, '80GB', 0.8, '注册时间 1周'],
'Power User': [14, '200GB', 1.2, '注册时间 2周, 发布数 1'],
'Elite': [28, '500GB', 1.2, '注册时间 4周, 发布数 25'],
'Torrent Master': [56, '1TB', 1.2, '注册时间 8周, 发布数 100'],
'Power Torrent Master': [84, '2TB', 1.2, '注册时间 12周, 发布数 250'],
'Elite Torrent Master': [112, '5TB', 1.2, '注册时间 16周, 发布数 500'],
'Guru': [140, '10TB', 1.2, '注册时间 20周, 发布数 1000']
},
'HHCLUB': {
'Power User': [28, '50GB', 1.05, '做种积分 80000'],
'Elite User': [56, '120GB', 1.55, '做种积分 150000'],
'Crazy User': [105, '300GB', 2.05, '做种积分 300000'],
'Insane User': [175, '500GB', 2.55, '做种积分 500000'],
'Veteran User': [280, '750GB', 3.05, '做种积分 900000'],
'Extreme User': [420, '1TB', 3.55, '做种积分 1100000'],
'Ultimate User': [560, '1.5TB', 4.05, '做种积分 1300000'],
'Nexus Master': [700, '3TB', 4.55, '做种积分 1500000']
},
'HD4FANS': {
'Power User': [28, '50GB', 1.05, '做种积分 40000'],
'Elite User': [56, '120GB', 1.55, '做种积分 80000'],
'Crazy User': [105, '300GB', 2.05, '做种积分 150000'],
'Insane User': [175, '500GB', 2.55, '做种积分 250000'],
'Veteran User': [280, '750GB', 3.05, '做种积分 400000'],
'Extreme User': [420, '1TB', 3.55, '做种积分 600000'],
'Ultimate User': [560, '1.5TB', 4.05, '做种积分 800000'],
'Nexus Master': [700, '3TB', 4.55, '做种积分 1000000']
},
'HDArea': {
'Power User': [28, '50GB', 1.05, ''],
'Elite User': [56, '120GB', 3.0, ''],
'Crazy User': [70, '300GB', 3.5, ''],
'Insane User': [84, '750GB', 4.0, ''],
'Veteran User': [140, '1TB', 4.5, ''],
'Extreme User': [175, '2TB', 5.0, ''],
'Ultimate User': [210, '5TB', 5.5, ''],
'Nexus Master': [280, '10TB', 6.0, '']
},
'HDAtmos': {
'Power User': [28, '50GB', 1.05, ''],
'Elite User': [56, '120GB', 1.55, ''],
'Crazy User': [105, '300GB', 2.05, ''],
'Insane User': [175, '500GB', 2.55, ''],
'Veteran User': [280, '750GB', 3.05, ''],
'Extreme User': [420, '1TB', 3.55, ''],
'Ultimate User': [560, '1.5TB', 4.05, ''],
'Nexus Master': [700, '3TB', 4.55, '']
},
'HDDolby': {
'Power User': [14, '120GB', 2.0, '做种积分 60000'],
'Elite User': [28, '256GB', 2.5, '做种积分 120000'],
'Crazy User': [56, '512GB', 3.0, '做种积分 240000'],
'Insane User': [84, '768GB', 3.5, '做种积分 360000'],
'Veteran User': [140, '1TB', 4.0, '做种积分 600000'],
'Extreme User': [196, '2TB', 4.5, '做种积分 720000'],
'Ultimate User': [280, '4TB', 5.0, '做种积分 1200000'],
'Nexus Master': [392, '8TB', 5.5, '做种积分 1680000']
},
'HDFans': {
'Power User': [28, '50GB', 1.0, '做种积分 50000'],
'Elite User': [56, '120GB', 1.5, '做种积分 100000'],
'Crazy User': [105, '256GB', 2.0, '做种积分 250000'],
'Insane User': [210, '512GB', 2.5, '做种积分 400000'],
'Veteran User': [280, '1TB', 3.0, '做种积分 600000'],
'Extreme User': [350, '2TB', 3.5, '做种积分 800000'],
'Ultimate User': [420, '4TB', 4.0, '做种积分 1000000'],
'Nexus Master': [700, '10TB', 5.0, '做种积分 1688888']
},
'HDHome': {
'Power User': [35, '256GB', 2.0, '做种积分 40000'],
'Elite User': [56, '386GB', 2.5, '做种积分 100000'],
'Crazy User': [84, '512GB', 3.0, '做种积分 180000'],
'Insane User': [112, '768GB', 3.5, '做种积分 280000'],
'Veteran User': [140, '1TB', 4.0, '做种积分 400000'],
'Extreme User': [168, '2TB', 4.5, '做种积分 540000'],
'Ultimate User': [210, '8TB', 5.0, '做种积分 700000'],
'Nexus Master': [252, '10TB', 10.0, '做种积分 1000000']
},
'HDSky': {
'Power User': [35, '200GB', 2.0, ''],
'Elite User': [70, '500GB', 2.5, ''],
'Crazy User': [105, '1TB', 3.0, ''],
'Insane User': [140, '2TB', 3.5, ''],
'Veteran User': [175, '4TB', 4.0, ''],
'Extreme User': [210, '6TB', 4.5, ''],
'Ultimate User': [315, '8TB', 5.0, ''],
'Nexus Master': [455, '10TB', 5.5, '']
},
'M-Team': {
'Power User': [28, '200GB', 2.0, ''],
'Elite User': [56, '400GB', 3.0, ''],
'Crazy User': [84, '500GB', 4.0, ''],
'Insane User': [112, '800GB', 5.0, ''],
'Veteran User': [140, '1000GB', 6.0, ''],
'Extreme User': [168, '2000GB', 7.0, ''],
'Ultimate User': [196, '2500GB', 8.0, ''],
'Nexus Master': [224, '3000GB', 9.0, '']
},
'OpenCD': {
'Power User': [28, '20GB', 1.5, ''],
'Elite User': [56, '60GB', 2.0, ''],
'Crazy User': [105, '200GB', 2.5, ''],
'Insane User': [140, '400GB', 3.0, ''],
'Veteran User': [175, '600GB', 3.5, ''],
'Extreme User': [175, '1TB', 4.0, ''],
'Ultimate User': [210, '2TB', 4.5, ''],
'Nexus Master': [210, '3TB', 5.0, '']
},
'OurBits': {
'Power User': [35, '100GB', 2.0, ''],
'Elite User': [70, '350GB', 2.5, ''],
'Crazy User': [105, '500GB', 3.0, ''],
'Insane User': [140, '1TB', 3.5, ''],
'Veteran User': [175, '2TB', 4.0, ''],
'Extreme User': [210, '4TB', 4.5, ''],
'Ultimate User': [280, '6TB', 5.0, ''],
'Nexus Master': [364, '8TB', 5.5, '']
},
'PT@KEEPFRDS': {
'Power User': [35, '50GB', 1.0, '积分 3200'],
'Elite User': [70, '150GB', 1.5, '积分 19200'],
'Crazy User': [105, '300GB', 2.0, '积分 76800'],
'Insane User': [210, '500GB', 2.5, '积分 256000'],
'Veteran User': [420, '1TB', 3.5, '积分 640000'],
'Extreme User': [630, '2TB', 4.0, '积分 1280000'],
'Ultimate User': [840, '3TB', 4.5, '积分 1920000'],
'Nexus Master': [1050, '4TB', 5.0, '积分 2560000']
},
'PTerClub': {
'Power User': [35, '50GB', 1.05, '做种积分 10000'],
'Elite User': [70, '120GB', 1.55, '做种积分 30000'],
'Crazy User': [168, '300GB', 2.05, '做种积分 80000'],
'Insane User': [224, '500GB', 2.55, '做种积分 150000'],
'Veteran User': [280, '750GB', 3.05, '做种积分 300000 或 做种积分 900000 发布数 10'],
'Extreme User': [336, '1TB', 3.55, '做种积分 600000 或 做种积分 1800000 发布数 10'],
'Ultimate User': [392, '1.5TB', 4.05, '做种积分 1200000 或 做种积分 3600000 发布数 10'],
'Nexus Master': [784, '3TB', 4.55, '做种积分 2400000 或 做种积分 9600000 发布数 10']
},
'RedLeaves': {
'Power User': [28, '100GB', 1.05, '做种积分 60000'],
'Elite User': [56, '200GB', 1.55, '做种积分 120000'],
'Crazy User': [105, '400GB', 2.05, '做种积分 200000'],
'Insane User': [175, '800GB', 2.55, '做种积分 400000'],
'Veteran User': [280, '1600GB', 3.05, '做种积分 600000'],
'Extreme User': [420, '2400GB', 3.55, '做种积分 800000'],
'Ultimate User': [560, '3200GB', 4.05, '做种积分 1000000'],
'Nexus Master': [700, '4000GB', 4.55, '做种积分 2000000']
},
'SSD': {
'Elite': [105, '500GB', 1.2, '做种积分 100000 或 做种积分 150000'],
'Master': [210, '1TB', 1.2, '做种积分 500000 或 做种积分 1000000'],
'God': [420, '3TB', 2.0, '做种积分 1200000 或 做种积分 2400000']
},
'TLFBits': {
'Power User': [28, '50GB', 1.5, '注册时间 4周'],
'Elite User': [56, '120GB', 2.55, '注册时间 8周'],
'Crazy User': [105, '300GB', 3.05, '注册时间 15周'],
'Insane User': [175, '500GB', 4.55, '注册时间 25周'],
'Veteran User': [280, '750GB', 5.05, '注册时间 40周'],
'Extreme User': [315, '1TB', 6.55, '注册时间 45周'],
'Ultimate User': [350, '1.5TB', 7.05, '注册时间 50周'],
'Nexus Master': [385, '3TB', 8.55, '注册时间 55周']
},
'TorrentCCF': {
'Power User': [14, '64GB', 1.05, '注册时间 2周'],
'Elite User': [42, '128GB', 1.55, '注册时间 6周'],
'Crazy User': [98, '258GB', 2.05, '注册时间 14周'],
'Insane User': [182, '512GB', 2.55, '注册时间 26周'],
'Veteran User': [266, '1TB', 3.05, '注册时间 38周'],
'Extreme User': [378, '2TB', 3.55, '注册时间 54周'],
'Ultimate User': [490, '4TB', 4.05, '注册时间 70周'],
'Nexus Master': [616, '8TB', 4.55, '注册时间 88周']
},
'tjupt': {
'Power User': [28, '50GB', 1.0, '积分消耗 10000'],
'Elite User': [56, '200GB', 1.0, '积分消耗 30000'],
'Crazy User': [112, '800GB', 1.0, '积分消耗 80000'],
'Insane User': [168, '2000GB', 1.0, '积分消耗 150000'],
'Veteran User': [336, '5000GB', 1.0, '积分消耗 300000'],
'Extreme User': [504, '10000GB', 1.0, '积分消耗 400000'],
'Ultimate User': [700, '20000GB', 1.0, '积分消耗 600000'],
'Nexus Master': [924, '50000GB', 1.0, '积分消耗 1000000']
},
'TTG': {
'KiloByte': [35, '60GB', 1.1, '注册时间 5周'],
'MegaByte': [56, '150GB', 2.0, '注册时间 8周'],
'GigaByte': [56, '250GB', 2.0, '注册时间 8周'],
'TeraByte': [56, '500GB', 2.5, '注册时间 8周'],
'PetaByte': [112, '750GB', 2.5, '注册时间 16周'],
'ExaByte': [168, '1TB', 3.0, '注册时间 24周'],
'ZettaByte': [168, '1.5TB', 3.5, '注册时间 24周'],
'YottaByte': [168, '2.5TB', 4.0, '注册时间 24周'],
'BrontoByte': [224, '3.5TB', 5.0, '注册时间 32周'],
'NonaByte': [336, '5TB', 6.0, '注册时间 48周'],
'DoggaByte': [336, '10TB', 6.0, '注册时间 48周']
},
'U2': {
'Power User': [28, '50GB', 1.05, '注册时间 4周'],
'Elite User': [56, '120GB', 1.55, '注册时间 8周'],
'Crazy User': [105, '300GB', 2.05, '注册时间 15周'],
'Insane User': [175, '500GB', 2.55, '注册时间 25周'],
'Veteran User': [280, '750GB', 3.05, '注册时间 40周'],
'Extreme User': [420, '1TB', 3.55, '注册时间 60周'],
'Ultimate User': [560, '1.5TB', 4.05, '注册时间 80周'],
'Nexus Master': [700, '3TB', 4.55, '注册时间 100周']
},
'Ubits': {
'Power User': [35, '200GB', 2.0, '做种积分 80000'],
'Elite User': [70, '500GB', 3.0, '做种积分 150000'],
'Crazy User': [105, '800GB', 4.0, '做种积分 300000'],
'Insane User': [140, '1TB', 5.0, '做种积分 650000'],
'Veteran User': [175, '1.5TB', 6.0, '做种积分 1000000'],
'Extreme User': [210, '2TB', 7.0, '做种积分 2000000'],
'Ultimate User': [280, '3TB', 8.0, '做种积分 3000000'],
'Nexus Master': [420, '4TB', 10.0, '做种积分 5000000']
},
'ZHUQUE': {
'结丹': [35, '10GiB', 2.0, ''],
'元婴': [70, '25GiB', 2.0, ''],
'出窍': [105, '50GiB', 2.0, ''],
'炼虚': [140, '100GiB', 2.0, ''],
'合体': [175, '200GiB', 4.0, ''],
'大乘': [210, '300GiB', 6.0, ''],
'真仙': [245, '400GiB', 8.0, '']
},
};
const nicknameList = {
'AgsvPT': '末日',
'Audiences': '人人',
'BTSCHOOL': '学校',
'BYRBT': '北邮',
'DaJiao': '打胶',
'DIC': '海豚',
'DiscFan': '碟粉',
'DragonHD': '龙',
'ECUSTPT': '花梨',
'FSM': '拉面',
'GGPT': 'GGPT',
'GPW': '海豹',
'Hares': '白兔',
'HD4FANS': '兽',
'HDArea': '好大',
'HDAtmos': '阿童木',
'HDCity': '城市',
'HDDolby': '杜比',
'HDFans': '红豆',
'HDHome': '家园',
'HDKylin': '麒麟',
'HDPOST': '普斯特',
'HDPT': '明教',
'HDSky': '天空',
'HdVideo': 'HdVideo',
'HHCLUB': '聪明',
'HITPT': '百川',
'HTPT': '海棠',
'HUDBT': '蝴蝶',
'ilolicon': 'ilolicon',
'kamePT': 'kamePT',
'M-Team': '馒头',
'MonikaDesign': '莫妮卡',
'OurBits': '我堡',
'OKPT': 'OKPT',
'OpenCD': '皇后',
'PANDA': '熊猫',
'PigGo': '猪',
'PT@KEEPFRDS': '月',
'PTerClub': '猫',
'ptsbao': '烧包',
'PuTao': '葡萄',
'qingwa': '青蛙',
'RedLeaves': '红叶',
'Soulvoice': '聆音',
'SSD': '草莓',
'tjupt': '北洋',
'TLFBits': '吐鲁番',
'TorrentCCF': '吹风',
'TTG': '听歌',
'U2': '花园',
'Ubits': '你堡',
'Vicomo': '象',
'XingTan': '杏坛',
'ZHUQUE': '朱雀',
'ZmPT': '织梦'
}
var style = document.createElement('style');
style.textContent = `
#tb_header_search_form {
align-items: center;
flex-wrap: nowrap;
overflow: hidden;
white-space: nowrap;
}
.search_btn_wrap {
margin-right: 5px;
}
.search_btn {
display: inline-block;
vertical-align: middle;
text-decoration: none;
}
.official_invite {
background-color: #fff;
color: #38f !important;
padding: 5px 10px;
text-align: center;
white-space: nowrap;
}
#routeCalcForm {
--light: hsl(0, 0%, 100%);
--background: linear-gradient(to right bottom, hsl(236, 50%, 50%), hsl(195, 50%, 50%));
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 700px;
height: 400px;
background: var(--background);
border-radius: 12px;
padding: 20px;
user-select: none;
z-index: 9999;
}
#routeCalcForm label {
display: block;
margin-bottom: 5px;
}
#routeCalcForm select {
background: transparent;
color: var(--light);
}
#routeCalcForm button {
margin-bottom: 10px;
padding: 16px 20px;
color: var(--light);
background: transparent;
font-size: 16px;
font-family: inherit;
letter-spacing: 2px;
transition: .2s;
cursor: pointer;
}
#routeCalcForm #result {
margin-top: 10px;
}
#routeContainer {
display: flex;
margin-top: 30px;
align-items: center;
justify-content: space-between;
padding: 10px;
position: relative;
}
#routeTitle {
color: var(--light);
background: transparent;
font-size: 18px;
text-align: center;
}
#routeCalcForm #leftButton {
position: absolute;
top: 40px;
left: 100px;
width: 180px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
#routeCalcForm #rightButton {
position: absolute;
top: 40px;
right: 100px;
width: 180px;
display: flex;
flex-direction: column;
justify-content: space-between;
}
#routeCalcForm #rightButton #target,
#routeCalcForm #leftButton #source {
margin-top: -90px;
padding: 80px 30px 30px 30px;
color: var(--light);
background: transparent;
font-size: 16px;
font-weight: bold;
font-family: inherit;
letter-spacing: 2px;
transition: .2s;
cursor: pointer;
z-index: 6000;
}
#routeCalcForm #leftButton button,
#routeCalcForm #rightButton button{
margin-top: 10px;
border: none;
padding: 16px 25px;
color: var(--light);
background: transparent;
font-size: 32px;
font-family: inherit;
letter-spacing: 2px;
transition: .2s;
cursor: pointer;
}
#routeCalcForm #bottomButtons {
position: absolute;
bottom: 20px;
right: 20px;
}
#routeCalcForm #bottomButtons button {
margin: 0;
padding: 16px 25px;
border: 1px solid hsla(0, 0%, 100%, .6);
border-radius: 1600px;
color: var(--light);
background: transparent;
font-size: 16px;
font-family: inherit;
letter-spacing: 2px;
transition: .2s;
cursor: pointer;
right: 20px;
}
#prevroute, #nextroute {
display: none;
position: absolute;
bottom: 0;
padding: 8px 16px;
color: var(--light);
background: transparent;
font-size: 48px;
font-family: inherit;
letter-spacing: 1px;
cursor: pointer;
}
#prevroute {
left: 0;
}
#nextroute {
right: 0;
}
#routeText {
padding: 10px;
margin-top: 10px;
color: var(--light);
font-size: 13px;
max-height: 200px;
overflow: auto;
line-height: 1.6;
}
#routeText::-webkit-scrollbar {
width: 0;
height: 0;
}
#routeText::-webkit-scrollbar-track {
background: transparent;
}
#routeText::-webkit-scrollbar-thumb {
background: transparent;
}
.separator {
height: 1px;
background-color: hsla(0, 0%, 100%, .4);
margin: 10px 0;
}
#gridContainer {
display: none;
position: absolute;
width: 700px;
top: 120px;
left: 60px;
background: #f9f9f9;
padding: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
border-radius: 8px;
z-index: 10000;
}
#gridContainer div {
padding: 8px;
background: #fff;
text-align: center;
cursor: pointer;
}
`;
document.head.appendChild(style);
var form = document.querySelector('#tb_header_search_form');
if (!form) return;
var enterBaBtn = form.querySelector('.search_btn_enter_ba');
var searchPostBtn = form.querySelector('.j_search_post');
if (!enterBaBtn || !searchPostBtn) return;
var newButton = document.createElement('span');
newButton.className = 'search_btn_wrap';
newButton.innerHTML = '<a rel="noopener" class="search_btn official_invite" href="#" onclick="return false;" onmousedown="this.className+=\' search_btn_down\'" onmouseout="this.className=this.className.replace(\' search_btn_down\',\'\')">车票查询</a>';
enterBaBtn.parentNode.insertAdjacentElement('afterend', newButton);
const inviteForm = document.createElement('form');
inviteForm.id = 'routeCalcForm';
inviteForm.style.display = 'none';
inviteForm.innerHTML = `
<div id="leftButton">
<button type="button" id="sourcenick">始发站</button>
<button type="button" id="source">From</button>
</div>
<div id="rightButton">
<button type="button" id="targetnick">终点站</button>
<button type="button" id="target">To</button>
</div>
<div id="routeContainer">
<div id="routeTitle"></div>
<div id="prevroute">‹‹</div>
<div id="nextroute">››</div>
</div>
<div id="routeText"></div>
<div id="gridContainer"></div>
<div id="bottomButtons">
<button type="button" id="exit">佛系观影</button>
</div>
`;
let allRoutes = [];
let currentRouteIndex = 0;
document.body.appendChild(inviteForm);
document.querySelector('.official_invite').addEventListener('click', () => {
inviteForm.style.display = inviteForm.style.display === 'none' ? 'block' : 'none';
});
waitForElement('a.search_btn.j_search_post', (button) => {
button.remove();
});
document.getElementById('exit').addEventListener('click', function() {
document.getElementById('routeCalcForm').style.display = 'none';
});
document.getElementById('source').addEventListener('click', function() {
const gridContainer = document.getElementById('gridContainer');
if (gridContainer.style.display === 'none' || gridContainer.style.display === '') {
populateGrid('source');
gridContainer.style.display = 'block';
} else {
gridContainer.style.display = 'none';
}
});
document.getElementById('target').addEventListener('click', function() {
const gridContainer = document.getElementById('gridContainer');
if (gridContainer.style.display === 'none' || gridContainer.style.display === '') {
populateGrid('target');
gridContainer.style.display = 'block';
} else {
gridContainer.style.display = 'none';
}
});
document.getElementById('prevroute').addEventListener('click', function() {
showRoute(-1);
});
document.getElementById('nextroute').addEventListener('click', function() {
showRoute(1);
});
function populateGrid(buttonId) {
const gridContainer = document.getElementById('gridContainer');
gridContainer.innerHTML = '';
const uniqueKeys = Array.from(new Set(
Object.keys(routeInfo)
.flatMap(startKey => [startKey, ...Object.keys(routeInfo[startKey])])
))
.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));
if (buttonId === 'source') {
uniqueKeys.unshift('From');
} else if (buttonId === 'target') {
uniqueKeys.unshift('To');
}
const container = document.createElement('div');
container.style.display = 'grid';
container.style.gridTemplateColumns = 'repeat(auto-fit, minmax(100px, auto))';
container.style.gap = '0px';
uniqueKeys.forEach(key => {
const item = document.createElement('div');
item.textContent = key;
item.style.padding = '8px';
item.style.background = '#fff';
item.style.textAlign = 'center';
item.style.cursor = 'pointer';
item.style.whiteSpace = 'nowrap';
item.style.minWidth = 'max-content';
item.addEventListener('click', () => {
if (buttonId === 'source') {
if (key === 'From') {
setTextContent('source', 'From');
setTextContent('sourcenick', '始发站');
} else {
setTextContent('source', key);
setTextContent('sourcenick', nicknameList[key] || key);
}
} else if (buttonId === 'target') {
if (key === 'To') {
setTextContent('target', 'To');
setTextContent('targetnick', '终点站');
} else {
setTextContent('target', key);
setTextContent('targetnick', nicknameList[key] || key);
}
}
gridContainer.style.display = 'none';
calculateRoute();
});
container.appendChild(item);
});
gridContainer.appendChild(container);
}
function calculateRoute() {
const routeContainer = document.getElementById('routeContainer');
const resultTitle = document.getElementById('routeTitle');
const resultDescription = document.getElementById('routeText');
const prevRouteButton = document.getElementById('prevroute');
const nextRouteButton = document.getElementById('nextroute');
resultTitle.innerText = '';
resultDescription.innerHTML = '';
prevRouteButton.style.display = 'none';
nextRouteButton.style.display = 'none';
const start = document.getElementById('source').textContent.trim();
const end = document.getElementById('target').textContent.trim();
if (start === end) {
resultTitle.innerText = '同站';
resultDescription.innerText = '';
routeContainer.style.display = 'block';
return;
}
if (start === 'From') {
if (end === 'To') {
resultTitle.innerText = '至少选一个';
resultDescription.innerText = '';
routeContainer.style.display = 'block';
return;
}
allRoutes = Object.keys(routeInfo)
.filter(node => routeInfo[node] && routeInfo[node][end])
.map(node => [node, end]);
} else if (end === 'To') {
if (!routeInfo[start]) {
resultTitle.innerText = '没有';
resultDescription.innerText = '';
routeContainer.style.display = 'block';
return;
}
allRoutes = Object.keys(routeInfo[start])
.map(node => [start, node])
.filter(([from, to]) => routeInfo[from] && routeInfo[from][to])
.map(([from, to]) => [from, to]);
} else {
if (!routeInfo[start]) {
resultTitle.innerText = '没有';
resultDescription.innerText = '';
routeContainer.style.display = 'block';
return;
}
allRoutes = findAllRoutes(start, end);
}
if (allRoutes.length === 0) {
resultTitle.innerText = '到不了';
resultDescription.innerText = '';
routeContainer.style.display = 'block';
return;
}
allRoutes = allRoutes.sort((a, b) => {
const timeA = a.reduce((sum, node, index) => {
if (index < a.length - 1 && routeInfo[node] && routeInfo[node][a[index + 1]]) {
return sum + getMaxDays(node, a[index + 1]);
}
return sum;
}, 0);
const timeB = b.reduce((sum, node, index) => {
if (index < b.length - 1 && routeInfo[node] && routeInfo[node][b[index + 1]]) {
return sum + getMaxDays(node, b[index + 1]);
}
return sum;
}, 0);
return timeA - timeB;
});
currentRouteIndex = 0;
showRoute(0);
}
function showRoute(direction) {
if (allRoutes.length === 0) return;
currentRouteIndex = (currentRouteIndex + direction + allRoutes.length) % allRoutes.length;
const route = allRoutes[currentRouteIndex];
const routeContainer = document.getElementById('routeContainer');
const resultTitle = document.getElementById('routeTitle');
const resultDescription = document.getElementById('routeText');
const prevRouteButton = document.getElementById('prevroute');
const nextRouteButton = document.getElementById('nextroute');
resultTitle.innerText = `换乘 ${route.length - 2} 次\n耗时 ${route.reduce((sum, node, index) => {
if (index < route.length - 1 && routeInfo[node] && routeInfo[node][route[index + 1]]) {
return sum + getMaxDays(node, route[index + 1]);
}
return sum;
}, 0)} 天`;
const details = route.map((node, index) => {
console.log("Processing node:", node);
if (index < route.length - 1 && routeInfo[node] && routeInfo[node][route[index + 1]]) {
const nextNode = route[index + 1];
const maxDays = getMaxDays(node, nextNode);
const [time, userclass, requirement, lastActivity] = routeInfo[node][nextNode];
const formattedDate = formatDate(lastActivity);
const fromUserClassIndex = Object.keys(classInfo[node]).indexOf(userclass);
const unlockUserClassIndex = Object.keys(classInfo[node]).indexOf(unlockInviteClass[node]);
const higherUserClass = (unlockUserClassIndex !== -1)
? (fromUserClassIndex > unlockUserClassIndex ? userclass : unlockInviteClass[node])
: userclass;
const upgradeReq = classInfo[node][higherUserClass] || [0, 0, 0, '无'];
const upgradeReqText = `${upgradeReq[0]}天,下载量${upgradeReq[1]},分享率${upgradeReq[2]},${upgradeReq[3]}`;
let baseText = `<div class="separator"></div>${node} -> ${nextNode} 时间:${maxDays}天 ${userclass ? `申请等级:${userclass} ` : ''}${unlockInviteClass[node] ? `解锁等级:${unlockInviteClass[node]} ` : ''}最近活动:${formattedDate}`;
if (userclass || unlockInviteClass[node]) {
baseText += `<br>升级要求:${upgradeReqText}`;
}
if (requirement) {
baseText += `<br>额外要求:${requirement}`;
}
return baseText;
}
return '';
});
resultDescription.innerHTML = details.join('');
prevRouteButton.style.display = currentRouteIndex === 0 ? 'none' : 'inline';
nextRouteButton.style.display = currentRouteIndex === allRoutes.length - 1 ? 'none' : 'inline';
routeContainer.style.display = 'block';
}
function getMaxDays(start, end) {
const days1 = routeInfo[start][end][0];
const userclassRequirement = routeInfo[start][end][1];
const days2 = (userclassRequirement === '') ? 0 : classInfo[start][userclassRequirement][0];
let days3 = 0;
const unlockUserClass = unlockInviteClass[start];
if (unlockUserClass) {
days3 = classInfo[start][unlockUserClass][0];
}
return Math.max(days1, days2, days3);
}
function findAllRoutes(start, end) {
const result = [];
const stack = [[start, [start]]];
const visited = new Set();
while (stack.length) {
const [node, route] = stack.pop();
if (node === end) {
result.push(route);
continue;
}
visited.add(node);
for (const [next, _] of Object.entries(routeInfo[node] || {})) {
if (!route.includes(next) && !visited.has(next)) {
stack.push([next, [...route, next]]);
}
}
}
return result;
}
function formatDate(dateString) {
const year = Math.floor(dateString / 100);
const month = dateString % 100;
return `20${year}年${month.toString().padStart(2, '0')}月`;
}
function waitForElement(selector, callback) {
const interval = setInterval(() => {
const element = document.querySelector(selector);
if (element) {
clearInterval(interval);
callback(element);
}
}, 100);
}
function setTextContent(id, text) {
document.getElementById(id).textContent = text;
}
});
})();