douyin_web.js 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046
  1. const channels_path = "hiker://files/rules/js/TyrantGenesis_抖音关注.js"
  2. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  3. const baseParse = _ => {
  4. let d = [], category, html
  5. let home_cookie = request(douyin_cookie)
  6. const empty = "hiker://empty"
  7. html = fetch("https://www.douyin.com", {headers:{"User-Agent": PC_UA, "cookie": home_cookie}, withHeaders: true})
  8. html = JSON.parse(html)
  9. // 首页cookie
  10. if (! home_cookie || ! home_cookie.match(/__ac_nonce/) || html.body.match(/<body><\/body>/)) {
  11. let cookie = html.headers["set-cookie"].join(';')
  12. writeFile(douyin_cookie, cookie.match(/__ac_nonce=(.*?);/)[0])
  13. }
  14. // 滑块验证
  15. if (html.body.match(/验证码/)) {
  16. d.push({
  17. title: '本地cookie失效, 请点击获取(需要过验证,15秒左右)',
  18. url: $(empty).lazyRule(_ => {
  19. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  20. let current_cookie = request(douyin_cookie).match(/__ac_nonce=(.*?);/)[0]
  21. showLoading('自动验证中')
  22. let slide_cookie = fetch("http://student.tyrantg.com:8199/slide.php", {timeout: 30000})
  23. if(slide_cookie) writeFile(douyin_cookie, current_cookie+slide_cookie)
  24. hideLoading()
  25. refreshPage(true)
  26. return 'toast://验证成功'
  27. }),
  28. col_type: 'text_1'
  29. })
  30. } else {
  31. let current_page = MY_URL.split('##')[1].toString()
  32. let channels
  33. if (fetch(channels_path)) {
  34. let local_channels = fetch(channels_path)
  35. channels = JSON.parse(local_channels)
  36. } else {
  37. let defaultChannels = [
  38. {title: '橄榄(联盟记者)', sec_uid: 'MS4wLjABAAAAx9uv2rkiSVYxg3-4kygWEpsR0XWPnajnaKsuq3XGxMc', avatar_url: 'https://p11.douyinpic.com/img/tos-cn-i-0813/ce41336f7815445db7345c78b4f0da1e~c5_100x100.jpeg?from=2956013662'},
  39. {title: '法老_Pharaoh', sec_uid: 'MS4wLjABAAAAENcAhhKYCY80DmEdGk9gH2jlG42xW_5kRh33ynV8Ii4', avatar_url: 'https://p3.douyinpic.com/img/tos-cn-i-0813/833a09e8f9b14bcf87ee5a9c5435b825~c5_1080x1080.jpeg?from=116350172'},
  40. {title: '马思唯马思唯', sec_uid: 'MS4wLjABAAAA508qPG3qA_ogo6wjQ9QTIEW_n_NBemKv8ujnHDxt-4OjNI0vC_rqs8x7I0EOoywP', avatar_url: 'https://p3.douyinpic.com/img/tos-cn-avt-0015/cd07db037361174d855251b2854d8b49~c5_1080x1080.jpeg?from=116350172'},
  41. {title: '乃万NINEONE', sec_uid: 'MS4wLjABAAAAPqhPtBXeQ1E3eow8onFHRaZsfKXZnb9gLii-8QvhiJ4', avatar_url: 'https://p9.douyinpic.com/aweme/1080x1080/31afc0003a07472f77daf.jpeg?from=116350172'},
  42. ]
  43. writeFile(channels_path, JSON.stringify(defaultChannels))
  44. channels = defaultChannels
  45. }
  46. let cate_select = getVar("tyrantgenesis.douyin_web.cate_select", "void")
  47. let channel_select = getVar("tyrantgenesis.douyin_web.channel_select", "0")
  48. let button_show = getVar("tyrantgenesis.douyin_web.button_show", "1") // 1:热门,2:直播,3:关注,4:收起,5:取消,6:置顶
  49. let max_cursor = getVar("tyrantgenesis.douyin_web.max_cursor", "")
  50. let live_1st_cate = getVar("tyrantgenesis.douyin_web.live_1st_cate", "")
  51. let live_2nd_cate = getVar("tyrantgenesis.douyin_web.live_2nd_cate", "")
  52. putVar("tyrantgenesis.douyin_web.video_other_button", "0")
  53. let level_1_button_1_title = '',
  54. level_1_button_2_title = '',
  55. level_1_button_3_title = '',
  56. level_1_button_4_title = '',
  57. level_1_button_3_show = '',
  58. level_1_button_4_show = '',
  59. channel_prefix = ''
  60. switch (button_show) {
  61. case "1": {
  62. level_1_button_1_title = '‘‘’’<strong><font color="red">热门视频</font></strong>'
  63. level_1_button_2_title = '热门直播'
  64. level_1_button_3_title = '我的关注'
  65. level_1_button_4_title = '取消关注'
  66. level_1_button_3_show = '3'
  67. level_1_button_4_show = '5'
  68. channel_prefix = ''
  69. break
  70. }
  71. case "2": {
  72. level_1_button_1_title = '热门视频'
  73. level_1_button_2_title = '‘‘’’<strong><font color="red">热门直播</font></strong>'
  74. level_1_button_3_title = '我的关注'
  75. level_1_button_4_title = '取消关注'
  76. level_1_button_3_show = '3'
  77. level_1_button_4_show = '5'
  78. channel_prefix = ''
  79. break
  80. }
  81. case "3": {
  82. level_1_button_1_title = '热门视频'
  83. level_1_button_2_title = '热门直播'
  84. level_1_button_3_title = '‘‘’’<strong><font color="red">我的关注</font></strong>'
  85. level_1_button_4_title = '取消关注'
  86. level_1_button_3_show = '4'
  87. level_1_button_4_show = '5'
  88. channel_prefix = '✓'
  89. break
  90. }
  91. case "4": {
  92. level_1_button_1_title = '热门视频'
  93. level_1_button_2_title = '热门直播'
  94. level_1_button_3_title = '‘‘’’<strong><font color="red">我的关注</font></strong>'
  95. level_1_button_4_title = '取消关注'
  96. level_1_button_3_show = '3'
  97. level_1_button_4_show = '5'
  98. channel_prefix = ''
  99. break
  100. }
  101. case "5": {
  102. level_1_button_1_title = '热门视频'
  103. level_1_button_2_title = '热门直播'
  104. level_1_button_3_title = '我的关注'
  105. level_1_button_4_title = '‘‘’’<strong><font color="red">取消关注</font></strong>'
  106. level_1_button_3_show = '3'
  107. level_1_button_4_show = '6'
  108. channel_prefix = '❌'
  109. break
  110. }
  111. case "6": {
  112. level_1_button_1_title = '热门视频'
  113. level_1_button_2_title = '热门直播'
  114. level_1_button_3_title = '我的关注'
  115. level_1_button_4_title = '‘‘’’<strong><font color="red">置顶关注</font></strong>'
  116. level_1_button_3_show = '3'
  117. level_1_button_4_show = '5'
  118. channel_prefix = '🔝'
  119. break
  120. }
  121. }
  122. if (current_page === '1') {
  123. d.push({
  124. title: level_1_button_1_title,
  125. url: $("hiker://empty").lazyRule(_ => {
  126. putVar("tyrantgenesis.douyin_web.button_show", "1")
  127. putVar("tyrantgenesis.douyin_web.cate_select", "")
  128. putVar("tyrantgenesis.douyin_web.max_cursor", "")
  129. refreshPage(true)
  130. return "hiker://empty"
  131. }),
  132. col_type: 'scroll_button',
  133. })
  134. d.push({
  135. title: level_1_button_2_title,
  136. url: $("hiker://empty").lazyRule(_ => {
  137. putVar("tyrantgenesis.douyin_web.button_show", "2")
  138. refreshPage(true)
  139. return "hiker://empty"
  140. }),
  141. col_type: 'scroll_button',
  142. })
  143. d.push({
  144. title: level_1_button_3_title,
  145. url: $("hiker://empty").lazyRule(params => {
  146. putVar("tyrantgenesis.douyin_web.button_show", params.level_1_button_3_show)
  147. putVar("tyrantgenesis.douyin_web.max_cursor", "")
  148. refreshPage(true)
  149. return "hiker://empty"
  150. }, {
  151. level_1_button_3_show: level_1_button_3_show
  152. }),
  153. col_type: 'scroll_button',
  154. })
  155. d.push({
  156. title: level_1_button_4_title,
  157. url: $("hiker://empty").lazyRule(params => {
  158. putVar("tyrantgenesis.douyin_web.button_show", params.level_1_button_4_show)
  159. putVar("tyrantgenesis.douyin_web.max_cursor", "")
  160. refreshPage(false)
  161. return "hiker://empty"
  162. }, {
  163. level_1_button_4_show: level_1_button_4_show
  164. }),
  165. col_type: 'scroll_button',
  166. })
  167. d.push({
  168. title: "设置",
  169. url: $("hiker://empty").rule(_ => {
  170. let d = []
  171. d.push({
  172. title: '根据抖音接口限制,登陆后才能享受更多搜索(即搜索的翻页)<br />需要解锁这个功能<del>点下方登录扫码登录</del>到网页版登陆后查找cookie - sessionid并将值填入下方输入框',
  173. col_type: 'rich_text',
  174. })
  175. d.push({
  176. title: "登录(已废弃)",
  177. url: $("hiker://empty").rule(_ => {
  178. let d = []
  179. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  180. const base64_title = "data:image/jpeg;base64,"
  181. const login_url = "https://sso.douyin.com/get_qrcode/?service=https%3A%2F%2Fwww.douyin.com&need_logo=false&aid=6383"
  182. let data_json = fetch(login_url, {headers:{"User-Agent": PC_UA}, withHeaders: true})
  183. let data = JSON.parse(data_json)
  184. let info = JSON.parse(data.body)
  185. // let first_cookie = home_cookie.split(';').shift()
  186. // putVar("tyrantgenesis.douyin_web.home_cookie", first_cookie+';'+data.headers["set-cookie"].join(';'))
  187. if (info.data) {
  188. d.push({
  189. title: "1. 图片为base64格式不能直接保存\r\n2. 抖音限制不能通过扫相册的二维码登录,请使用app直接扫码",
  190. col_type: 'long_text',
  191. })
  192. d.push({
  193. pic_url: base64_title+info.data.qrcode,
  194. url: "hiker://empty",
  195. col_type: 'pic_1_full',
  196. })
  197. } else {
  198. d.push({
  199. title: '获取二维码失败,请下拉刷新',
  200. col_type: 'long_text',
  201. })
  202. }
  203. setResult(d);
  204. }),
  205. col_type: "text_1",
  206. })
  207. d.push({
  208. title: "确认",
  209. desc: "填写 sessionid",
  210. url: "input.trim() ? $('hiker://empty').lazyRule(params => {eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'));return saveCookie(params.input)}, {input: input.trim()}) : 'toast://请填写sessionid'",
  211. col_type: "input"
  212. })
  213. setResult(d);
  214. }),
  215. col_type: 'scroll_button',
  216. })
  217. }
  218. switch (button_show) {
  219. case "1": {
  220. if (current_page === '1') {
  221. category = [
  222. {title: '全部', id: 'void'},
  223. {title: '娱乐', id: '300201'},
  224. {title: '知识', id: '300203'},
  225. {title: '二次元', id: '300206'},
  226. {title: '游戏', id: '300205'},
  227. {title: '游戏', id: '300205'},
  228. {title: '美食', id: '300204'},
  229. {title: '体育', id: '300207'},
  230. {title: '时尚', id: '300208'},
  231. {title: '音乐', id: '300209'},
  232. ]
  233. d.push({
  234. col_type:"blank_block"
  235. })
  236. category.forEach(cate => {
  237. d.push({
  238. title: cate_select === cate.id ? '‘‘’’<strong><font color="red">'+cate.title+'</font></strong>' : cate.title,
  239. url: $("hiker://empty").lazyRule(params => {
  240. putVar("tyrantgenesis.douyin_web.cate_select", params.id)
  241. refreshPage(false)
  242. return "hiker://empty"
  243. }, {
  244. id: cate.id
  245. }),
  246. col_type: 'scroll_button',
  247. })
  248. })
  249. }
  250. // let not_sign_url = "https://www.douyin.com/aweme/v1/web/channel/feed/?device_platform=webapp&aid=6383&channel=channel_pc_web&tag_id="+cate_select+"&count=20&version_code=160100&version_name=16.1.0"
  251. let sign_url = fetch("http://douyin_signature.dev.tyrantg.com?type=feed&params="+cate_select)
  252. // let true_url = not_sign_url + "&_signature="+sign
  253. let data_json = fetch(sign_url, {
  254. headers: {
  255. "referer" : "https://www.douyin.com/",
  256. "cookie": home_cookie,
  257. "Accept": 'application/json, text/plain, */*',
  258. "User-Agent": PC_UA,
  259. "Accept-Language": 'zh-CN,zh;q=0.9',
  260. }
  261. })
  262. if (! data_json || data_json === 'Need Verifying') {
  263. d.push({
  264. title: 'signature 获取失败,待修复',
  265. col_type: "long_text",
  266. })
  267. } else {
  268. let list = JSON.parse(data_json).aweme_list
  269. if (list && list.length > 0) {
  270. list.forEach(item => {
  271. if (item.video && item.author) {
  272. d.push({
  273. title: item.desc,
  274. pic_url: item.video.cover.url_list[0],
  275. desc: item.author.nickname,
  276. url: $("https://www.douyin.com/video/"+item.aweme_id+"##fypage").rule(item => {
  277. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  278. videoParse(item)
  279. }, item),
  280. col_type: 'movie_2',
  281. })
  282. } else {
  283. //item.cell_room.rawdata.replace(/:([1-9]\d*),/g, ':"$1",')
  284. }
  285. })
  286. }
  287. }
  288. break
  289. }
  290. case "2": {
  291. if (current_page === '1') {
  292. d.push({
  293. col_type:"blank_block"
  294. })
  295. html = fetch("https://www.douyin.com/live", {headers:{"User-Agent": PC_UA}})
  296. let cate_1st_list = parseDomForArray(html, '._1ccdf9ef5e1baec8470ed46e874b49fd-scss&&.ece80b1afae1c9f97b41337a7ccdfaa3-scss')
  297. d.push({
  298. title: live_1st_cate === '' ? '‘‘’’<strong><font color="red">热门直播</font></strong>' : '热门直播',
  299. url: $("hiker://empty").lazyRule(_ => {
  300. putVar("tyrantgenesis.douyin_web.live_1st_cate", "")
  301. putVar("tyrantgenesis.douyin_web.live_2nd_cate", "")
  302. refreshPage(true)
  303. return "hiker://empty"
  304. }),
  305. col_type: 'scroll_button',
  306. })
  307. cate_1st_list.forEach(cate => {
  308. let cate_id = parseDomForHtml(cate, '.a18585314085fd46d4da4b236d3d2903-scss&&href').split('/').pop()
  309. let title = parseDomForHtml(cate, 'h2&&Text')
  310. if (title !== '热门直播') {
  311. d.push({
  312. title: live_1st_cate === cate_id.toString() ? '‘‘’’<strong><font color="red">'+title+'</font></strong>' : title,
  313. url: $("hiker://empty").lazyRule(params => {
  314. putVar("tyrantgenesis.douyin_web.live_1st_cate", params.cate_id.toString())
  315. putVar("tyrantgenesis.douyin_web.live_2nd_cate", "")
  316. refreshPage(true)
  317. return "hiker://empty"
  318. }, {
  319. cate_id: cate_id
  320. }),
  321. col_type: 'scroll_button',
  322. })
  323. }
  324. })
  325. d.push({
  326. col_type:"blank_block"
  327. })
  328. if (live_1st_cate !== '') {
  329. html = fetch("https://live.douyin.com/category/"+live_1st_cate, {headers:{"User-Agent": PC_UA}})
  330. let cate_2nd_list = parseDomForArray(html, '._51b435273dea21a09f82e973bb87baf1-scss&&a')
  331. d.push({
  332. title: live_2nd_cate === '' ? '‘‘’’<strong><font color="red">全部</font></strong>' : '全部',
  333. url: $("hiker://empty").lazyRule(_ => {
  334. putVar("tyrantgenesis.douyin_web.live_2nd_cate", "")
  335. refreshPage(false)
  336. return "hiker://empty"
  337. }),
  338. col_type: 'scroll_button',
  339. })
  340. cate_2nd_list.forEach(cate => {
  341. let cate_group = parseDomForHtml(cate, 'a&&href').split('/').pop().split('_')
  342. let title = parseDomForHtml(cate, 'a&&title')
  343. if (cate_group.length > 1) {
  344. let cate_id = cate_group[1]
  345. d.push({
  346. title: live_2nd_cate === cate_id.toString() ? '‘‘’’<strong><font color="red">'+title+'</font></strong>' : title,
  347. url: $("hiker://empty").lazyRule(params => {
  348. putVar("tyrantgenesis.douyin_web.live_2nd_cate", params.cate_id.toString())
  349. refreshPage(false)
  350. return "hiker://empty"
  351. }, {
  352. cate_id: cate_id
  353. }),
  354. col_type: 'scroll_button',
  355. })
  356. }
  357. })
  358. }
  359. }
  360. let count = 20
  361. let offset = (parseInt(current_page) - 1) * count
  362. let partition = 720
  363. if (live_2nd_cate !== '') {
  364. partition = live_2nd_cate
  365. } else if (live_1st_cate !== '') {
  366. partition = live_1st_cate
  367. }
  368. let not_sign_url = "https://live.douyin.com/webcast/web/partition/detail/room/?aid=6383&live_id=1&device_platform=web&language=zh-CN&count="+count+"&offset="+offset+"&partition="+partition+"&partition_type=1"
  369. let sign = fetch("http://douyin_signature.dev.tyrantg.com/old_index.php?url="+encodeURIComponent(not_sign_url))
  370. let true_url = not_sign_url + "&_signature="+sign
  371. let data_json = fetch(true_url, {
  372. headers: {
  373. "referer" : "https://live.douyin.com",
  374. "cookie": home_cookie,
  375. "Accept": 'application/json, text/plain, */*',
  376. "User-Agent": PC_UA,
  377. "Accept-Language": 'zh-CN,zh;q=0.9',
  378. }
  379. })
  380. if (data_json === '') {
  381. d.push({
  382. title: 'signature 获取失败,待修复',
  383. col_type: "long_text",
  384. })
  385. } else {
  386. let list = JSON.parse(data_json).data.data
  387. if (list && list.length > 0) {
  388. list.forEach(item => {
  389. let room = item.room
  390. let m3u8 = room.stream_url.hls_pull_url_map || room.stream_url.flv_pull_url
  391. d.push({
  392. title: room.title,
  393. pic_url: room.cover.url_list[0],
  394. desc: room.owner.nickname,
  395. url: m3u8[Object.keys(m3u8)[0]],
  396. col_type: 'movie_2',
  397. })
  398. })
  399. }
  400. }
  401. break
  402. }
  403. case "3":
  404. case "4": {
  405. let sec_uid = channels[channel_select].sec_uid
  406. if (current_page === '1' && button_show === '3') {
  407. channels.forEach((channel, index) => {
  408. d.push({
  409. title: parseInt(channel_select) === index ? channel_prefix + channel.title : channel.title,
  410. pic_url: channel.avatar_url,
  411. url: $("hiker://empty").lazyRule(params => {
  412. putVar("tyrantgenesis.douyin_web.channel_select", params.index.toString())
  413. putVar("tyrantgenesis.douyin_web.max_cursor", "")
  414. refreshPage(true)
  415. return "hiker://empty"
  416. }, {
  417. index: index
  418. }),
  419. col_type: 'icon_round_4'
  420. })
  421. })
  422. d.push({
  423. col_type:"blank_block"
  424. })
  425. /*let web_url = "https://www.douyin.com/user/"+sec_uid
  426. let html = fetch(web_url, {headers:{"User-Agent": PC_UA}})
  427. max_cursor = html.match(/%22maxCursor%22%3A(.*?)%2C%22/)[1]*/
  428. max_cursor = ''
  429. }
  430. let not_sign_url = "https://www.douyin.com/aweme/v1/web/aweme/post/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id="+sec_uid+"&max_cursor="+max_cursor+"&count=10&publish_video_strategy_type=2&version_code=160100&version_name=16.1.0"
  431. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  432. let true_url = not_sign_url + "&_signature="+sign
  433. let data_json = fetch(true_url, {
  434. headers: {
  435. "referer" : "https://www.douyin.com/",
  436. "cookie": home_cookie,
  437. "Accept": 'application/json, text/plain, */*',
  438. "User-Agent": PC_UA,
  439. "Accept-Language": 'zh-CN,zh;q=0.9',
  440. }
  441. })
  442. if (data_json === 'Need Verifying') {
  443. d.push({
  444. title: 'signature 获取失败,待修复',
  445. col_type: "long_text",
  446. })
  447. } else {
  448. let data = JSON.parse(data_json)
  449. let list = data.aweme_list
  450. if (list && list.length > 0) {
  451. putVar("tyrantgenesis.douyin_web.max_cursor", data.max_cursor.toString())
  452. list.forEach(item => {
  453. d.push({
  454. title: item.desc,
  455. pic_url: item.video.cover.url_list[0],
  456. desc: item.author.nickname,
  457. url: item.video.play_addr.url_list[0] + "#isVideo=true#",
  458. col_type: 'movie_2',
  459. })
  460. })
  461. }
  462. }
  463. break
  464. }
  465. case "5":
  466. case "6": {
  467. let sec_uid = channels[channel_select].sec_uid
  468. if (current_page === '1') {
  469. channels.forEach((channel, index) => {
  470. d.push({
  471. title: channel_prefix + channel.title,
  472. pic_url: channel.avatar_url,
  473. url: $("hiker://empty").lazyRule(params => {
  474. const channels_path = "hiker://files/rules/js/TyrantGenesis_抖音关注.js"
  475. if (params.button_show === '5') {
  476. params.channels.splice(params.index, 1)
  477. writeFile(channels_path, JSON.stringify(params.channels))
  478. } else {
  479. let current = params.channels[params.index]
  480. params.channels.splice(params.index, 1)
  481. params.channels.unshift(current)
  482. writeFile(channels_path, JSON.stringify(params.channels))
  483. }
  484. putVar("tyrantgenesis.douyin_web.channel_select", "0")
  485. putVar("tyrantgenesis.douyin_web.max_cursor", "")
  486. refreshPage(true)
  487. return "hiker://empty"
  488. }, {
  489. channels: channels,
  490. index: index,
  491. button_show: button_show
  492. }),
  493. col_type: 'icon_round_4'
  494. })
  495. })
  496. d.push({
  497. col_type:"blank_block"
  498. })
  499. /*let web_url = "https://www.douyin.com/user/"+sec_uid
  500. let html = fetch(web_url, {headers:{"User-Agent": PC_UA}})
  501. max_cursor = html.match(/%22maxCursor%22%3A(.*?)%2C%22/)[1]*/
  502. max_cursor = ''
  503. }
  504. let not_sign_url = "https://www.douyin.com/aweme/v1/web/aweme/post/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id="+sec_uid+"&max_cursor="+max_cursor+"&count=10&publish_video_strategy_type=2&version_code=160100&version_name=16.1.0"
  505. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  506. let true_url = not_sign_url + "&_signature="+sign
  507. let data_json = fetch(true_url, {
  508. headers: {
  509. "referer" : "https://www.douyin.com/",
  510. "cookie": home_cookie,
  511. "Accept": 'application/json, text/plain, */*',
  512. "User-Agent": PC_UA,
  513. "Accept-Language": 'zh-CN,zh;q=0.9',
  514. }
  515. })
  516. if (data_json === 'Need Verifying') {
  517. d.push({
  518. title: 'signature 获取失败,待修复',
  519. col_type: "long_text",
  520. })
  521. } else {
  522. let data = JSON.parse(data_json)
  523. let list = JSON.parse(data_json).aweme_list
  524. if (list && list.length > 0) {
  525. putVar("tyrantgenesis.douyin_web.max_cursor", data.max_cursor.toString())
  526. list.forEach(item => {
  527. d.push({
  528. title: item.desc,
  529. pic_url: item.video.cover.url_list[0],
  530. desc: item.author.nickname,
  531. url: item.video.play_addr.url_list[0] + "#isVideo=true#",
  532. col_type: 'movie_2',
  533. })
  534. })
  535. }
  536. }
  537. break
  538. }
  539. }
  540. }
  541. setResult(d);
  542. }
  543. const searchParse = _ => {
  544. let d = [];
  545. let input = MY_URL.split('##')[1].toString()
  546. d.push({
  547. title: "搜索视频-关键词:"+input,
  548. url: $("hiker://empty##fypage").rule(params => {
  549. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  550. let home_cookie = request(douyin_cookie)
  551. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  552. let d = [];
  553. let current_page = parseInt(MY_URL.split('##')[1])
  554. let page = 20
  555. let offset = (current_page - 1) * page
  556. // let not_sign_url = "https://www.douyin.com/aweme/v1/web/search/item/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_video_web&sort_type=0&publish_time=0&keyword="+encodeURIComponent(params.input)+"&search_source=normal_search&query_correct_type=1&is_filter_search=0&offset="+offset+"&count="+page+"&version_code=160100&version_name=16.1.0"
  557. let not_sign_url = "https://www.douyin.com/aweme/v1/web/search/item/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_video_web&sort_type=0&publish_time=0&keyword="+encodeURIComponent(params.input)+"&search_source=normal_search&query_correct_type=1&is_filter_search=0&offset="+offset+"&count="+page+"&version_code=160100&version_name=16.1.0&cookie_enabled=true&screen_width=1920&screen_height=1080&browser_language=zh-CN&browser_platform=Win32&browser_name=Mozilla&browser_version=5.0+(Windows+NT+10.0%3B+Win64%3B+x64)+AppleWebKit%2F537.36+(KHTML,+like+Gecko)+Chrome%2F91.0.4472.114+Safari%2F537.36&browser_online=true"
  558. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  559. let true_url = not_sign_url + "&_signature="+sign
  560. let data_json = fetch(true_url, {
  561. headers: {
  562. "referer" : "https://www.douyin.com/search/"+encodeURIComponent(params.input)+"?source=normal_search&aid=3e8899ee-879c-4f85-b666-1009462412c4&enter_from=main_page",
  563. "cookie": home_cookie,
  564. }
  565. })
  566. if (data_json === 'Need Verifying') {
  567. d.push({
  568. title: 'signature 获取失败,待修复',
  569. col_type: "long_text",
  570. })
  571. } else {
  572. let list = JSON.parse(data_json).data
  573. if (list && list.length > 0) {
  574. list.forEach(item => {
  575. let aweme = item.aweme_info
  576. d.push({
  577. title: aweme.desc,
  578. pic_url: aweme.video.cover.url_list[0],
  579. desc: aweme.author.nickname,
  580. url: $("https://www.douyin.com/video/"+item.aweme_id+"##fypage").rule(aweme => {
  581. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  582. videoParse(aweme)
  583. }, aweme),
  584. col_type: 'movie_2',
  585. })
  586. })
  587. }
  588. if (list && list.length === 0 && current_page === 2) {
  589. d.push({
  590. title: "抖音接口限制,在设置里填写token模拟后可搜索更多",
  591. col_type: "long_text",
  592. })
  593. }
  594. }
  595. setResult(d);
  596. }, {
  597. input: input
  598. }),
  599. })
  600. d.push({
  601. title: "搜索用户-关键词:"+input,
  602. url: $("hiker://empty##fypage").rule(params => {
  603. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  604. let home_cookie = request(douyin_cookie)
  605. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  606. let d = [];
  607. let current_page = parseInt(MY_URL.split('##')[1])
  608. let page = 30
  609. let offset = (current_page - 1) * page
  610. let not_sign_url = "https://www.douyin.com/aweme/v1/web/discover/search/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_user_web&keyword="+encodeURIComponent(params.input)+"&search_source=normal_search&query_correct_type=1&is_filter_search=0&offset="+offset+"&count="+page+"&version_code=160100&version_name=16.1.0"
  611. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  612. let true_url = not_sign_url + "&_signature="+sign
  613. let data_json = fetch(true_url, {
  614. headers: {
  615. "referer" : "https://www.douyin.com/",
  616. "cookie": home_cookie,
  617. }
  618. })
  619. if (data_json === 'Need Verifying') {
  620. d.push({
  621. title: 'signature 获取失败,待修复',
  622. col_type: "long_text",
  623. })
  624. } else {
  625. let list = JSON.parse(data_json).user_list
  626. if (list && list.length > 0) {
  627. list.forEach(item => {
  628. let userinfo = item.user_info
  629. d.push({
  630. title: userinfo.nickname,
  631. pic_url: userinfo.avatar_thumb.url_list[0],
  632. desc: userinfo.signature,
  633. url: $("https://www.douyin.com/user/"+userinfo.sec_uid+'##fypage').rule(userinfo => {
  634. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  635. userParse(userinfo)
  636. }, userinfo),
  637. col_type: 'icon_2_round',
  638. })
  639. })
  640. }
  641. if (list && list.length === 0 && current_page === 2) {
  642. d.push({
  643. title: "抖音接口限制,在设置里填写token模拟后可搜索更多",
  644. col_type: "long_text",
  645. })
  646. }
  647. }
  648. setResult(d);
  649. }, {
  650. input: input
  651. }),
  652. })
  653. setResult(d);
  654. }
  655. /*const searchParse = _ => {
  656. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  657. let home_cookie = request(douyin_cookie)
  658. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  659. let d = [];
  660. let input = MY_URL.split('##')[1].toString()
  661. let current_page = parseInt(MY_URL.split('##')[2])
  662. let page = 30
  663. let offset = (current_page - 1) * page
  664. let not_sign_url = "https://www.douyin.com/aweme/v1/web/discover/search/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_user_web&keyword="+encodeURIComponent(input)+"&search_source=normal_search&query_correct_type=1&is_filter_search=0&offset="+offset+"&count="+page+"&version_code=160100&version_name=16.1.0"
  665. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  666. let true_url = not_sign_url + "&_signature="+sign
  667. let data_json = fetch(true_url, {
  668. headers: {
  669. "referer" : "https://www.douyin.com/",
  670. "cookie": home_cookie,
  671. }
  672. })
  673. if (data_json === 'Need Verifying') {
  674. d.push({
  675. title: 'signature 获取失败,待修复',
  676. col_type: "long_text",
  677. })
  678. } else {
  679. let list = JSON.parse(data_json).user_list
  680. if (list && list.length > 0) {
  681. list.forEach(item => {
  682. let userinfo = item.user_info
  683. d.push({
  684. title: userinfo.nickname,
  685. pic_url: userinfo.avatar_thumb.url_list[0],
  686. desc: userinfo.signature,
  687. url: $("https://www.douyin.com/user/"+userinfo.sec_uid+'##fypage').rule(userinfo => {
  688. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  689. userParse(userinfo)
  690. }, userinfo),
  691. col_type: 'icon_2_round',
  692. })
  693. })
  694. }
  695. if (list && list.length === 0 && current_page === 2) {
  696. d.push({
  697. title: "抖音接口限制,在设置里填写token模拟后可搜索更多",
  698. col_type: "long_text",
  699. })
  700. }
  701. }
  702. setResult(d);
  703. }*/
  704. const userParse = userinfo => {
  705. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  706. let home_cookie = request(douyin_cookie)
  707. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  708. let uid = userinfo.sec_uid
  709. let channels_json = request(channels_path)
  710. let channels = JSON.parse(channels_json)
  711. let d = [];
  712. let user_url = MY_URL.split('##')[0]
  713. let page = MY_URL.split('##')[1]
  714. let max_cursor = getVar("tyrantgenesis.douyin_web.search_max_cursor", "")
  715. if (parseInt(page) === 1) {
  716. /*let html = fetch(user_url, {headers:{"User-Agent": PC_UA}})
  717. max_cursor = html.match(/%22maxCursor%22%3A(.*?)%2C%22/)
  718. setError(html)
  719. return false*/
  720. max_cursor = ''
  721. d.push({
  722. title: userinfo.nickname,
  723. pic_url: userinfo.avatar_thumb.url_list[0],
  724. url: MY_URL,
  725. col_type: 'icon_2_round'
  726. })
  727. let has_collect = false
  728. channels.forEach(item => {
  729. if (item.sec_uid === userinfo.sec_uid) has_collect = true
  730. })
  731. d.push({
  732. title: has_collect ? "已关注" : "关注用户",
  733. url: $("").lazyRule(params => {
  734. const channels_path = "hiker://files/rules/js/TyrantGenesis_抖音关注.js"
  735. if (params.has_collect) {
  736. refreshPage(false)
  737. return 'toast://已关注'
  738. } else {
  739. params.channels.push({
  740. title: params.author.nickname,
  741. sec_uid: params.author.sec_uid,
  742. avatar_url: params.author.avatar_thumb.url_list[0],
  743. })
  744. writeFile(channels_path, JSON.stringify(params.channels))
  745. refreshPage(false)
  746. return 'toast://关注成功'
  747. }
  748. }, {
  749. has_collect: has_collect,
  750. author: userinfo,
  751. channels: channels,
  752. }),
  753. col_type: 'text_2'
  754. })
  755. }
  756. let not_sign_url = "https://www.douyin.com/aweme/v1/web/aweme/post/?device_platform=webapp&aid=6383&channel=channel_pc_web&sec_user_id="+uid+"&max_cursor="+max_cursor+"&count=10&publish_video_strategy_type=2&version_code=160100&version_name=16.1.0"
  757. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  758. let true_url = not_sign_url + "&_signature="+sign
  759. data_json = fetch(true_url, {
  760. headers: {
  761. "referer" : "https://www.douyin.com/",
  762. "cookie": home_cookie,
  763. }
  764. })
  765. if (data_json === 'Need Verifying') {
  766. d.push({
  767. title: 'signature 获取失败,待修复',
  768. col_type: "long_text",
  769. })
  770. } else {
  771. let data = JSON.parse(data_json)
  772. let list = data.aweme_list
  773. if (list && list.length > 0) {
  774. putVar("tyrantgenesis.douyin_web.search_max_cursor", data.max_cursor.toString())
  775. list.forEach(item => {
  776. d.push({
  777. title: item.desc,
  778. pic_url: item.video.cover.url_list[0],
  779. // desc: '',
  780. url: $("https://www.douyin.com/video/"+item.aweme_id+"##fypage").rule(aweme => {
  781. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  782. videoParse(aweme)
  783. }, item),
  784. col_type: 'movie_2',
  785. })
  786. })
  787. }
  788. }
  789. setResult(d);
  790. }
  791. const videoParse = aweme => {
  792. let d = [];
  793. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  794. let home_cookie = request(douyin_cookie)
  795. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  796. let channels_json = request(channels_path)
  797. let channels = JSON.parse(channels_json)
  798. let current_page = parseInt(MY_URL.split('##')[1])
  799. let video_other_button = getVar("tyrantgenesis.douyin_web.video_other_button") // 1:推荐视频,2:评论
  800. if (current_page === 1) {
  801. d.push({
  802. title: aweme.author.nickname,
  803. pic_url: aweme.author.avatar_thumb.url_list[0],
  804. desc: aweme.author.signature,
  805. url: $("https://www.douyin.com/user/"+aweme.author.sec_uid+'##fypage').rule(userinfo => {
  806. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  807. userParse(userinfo)
  808. }, aweme.author),
  809. col_type: 'icon_2_round',
  810. })
  811. let has_collect = false
  812. channels.forEach(item => {
  813. if (item.sec_uid === aweme.author.sec_uid) has_collect = true
  814. })
  815. d.push({
  816. title: has_collect ? "已关注" : "关注用户",
  817. url: $("").lazyRule(params => {
  818. const channels_path = "hiker://files/rules/js/TyrantGenesis_抖音关注.js"
  819. if (params.has_collect) {
  820. refreshPage(false)
  821. return 'toast://已关注'
  822. } else {
  823. params.channels.push({
  824. title: params.author.nickname,
  825. sec_uid: params.author.sec_uid,
  826. avatar_url: params.author.avatar_thumb.url_list[0],
  827. })
  828. writeFile(channels_path, JSON.stringify(params.channels))
  829. refreshPage(false)
  830. return 'toast://关注成功'
  831. }
  832. }, {
  833. has_collect: has_collect,
  834. author: aweme.author,
  835. channels: channels,
  836. }),
  837. col_type: 'text_2'
  838. })
  839. d.push({
  840. title: aweme.desc,
  841. pic_url: aweme.video.origin_cover.url_list[0],
  842. desc: aweme.author.nickname,
  843. url: MY_URL,
  844. col_type: 'pic_1',
  845. })
  846. d.push({
  847. title: '选择线路:',
  848. col_type: 'text_1'
  849. })
  850. if (aweme.video.play_addr) {
  851. aweme.video.play_addr.url_list.forEach((url, index) => {
  852. d.push({
  853. title: "线路"+(parseInt(index)+1).toString(),
  854. url: url+"#isVideo=true#",
  855. col_type: "text_4"
  856. })
  857. })
  858. } else if (aweme.video.play_addr_lowbr) {
  859. aweme.video.play_addr_lowbr.url_list.forEach((url, index) => {
  860. d.push({
  861. title: "线路"+(index+1),
  862. url: url+"#isVideo=true#",
  863. col_type: "text_4"
  864. })
  865. })
  866. }
  867. d.push({
  868. col_type: 'line_blank'
  869. })
  870. d.push({
  871. title: video_other_button === '1' ? '‘‘’’<strong><font color="red">推荐视频</font></strong>' : '推荐视频',
  872. url: $('hiker://empty').lazyRule(params => {
  873. putVar("tyrantgenesis.douyin_web.video_other_button", params.video_other_button === "1" ? "0" : "1")
  874. refreshPage(true)
  875. return "hiker://empty"
  876. }, {
  877. video_other_button: video_other_button
  878. }),
  879. col_type: 'text_2'
  880. })
  881. d.push({
  882. title: video_other_button === '2' ? '‘‘’’<strong><font color="red">评论</font></strong>' : '评论',
  883. url: $('hiker://empty').lazyRule(params => {
  884. putVar("tyrantgenesis.douyin_web.video_other_button", params.video_other_button === "2" ? "0" : "2")
  885. refreshPage(true)
  886. return "hiker://empty"
  887. }, {
  888. video_other_button: video_other_button
  889. }),
  890. col_type: 'text_2'
  891. })
  892. }
  893. let count = 20
  894. let cursor = (current_page - 1) * count
  895. if (video_other_button === '1') {
  896. let not_sign_url = "https://www.douyin.com/aweme/v1/web/aweme/related/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id="+aweme.aweme_id+"&count="+count+"&version_code=160100&version_name=16.1.0"
  897. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  898. let true_url = not_sign_url + "&_signature="+sign
  899. let data_json = fetch(true_url, {
  900. headers: {
  901. "referer" : "https://www.douyin.com/video/"+aweme.aweme_id+"?previous_page=main_page",
  902. "cookie": home_cookie,
  903. }
  904. })
  905. if (data_json === 'Need Verifying') {
  906. d.push({
  907. title: 'signature 获取失败,待修复',
  908. col_type: "long_text",
  909. })
  910. } else {
  911. let data = JSON.parse(data_json)
  912. let list = data.aweme_list
  913. if (list && list.length > 0) {
  914. list.forEach(item => {
  915. d.push({
  916. title: item.desc,
  917. pic_url: item.video.cover.url_list[0],
  918. // desc: '',
  919. url: $("https://www.douyin.com/video/"+item.aweme_id+"##fypage").rule(aweme => {
  920. eval(fetch('hiker://files/TyrantG/VIDEO/douyin_web.js'))
  921. videoParse(aweme)
  922. }, item),
  923. col_type: 'movie_2',
  924. })
  925. })
  926. }
  927. }
  928. } else if (video_other_button === '2') {
  929. let not_sign_url = "https://www.douyin.com/aweme/v1/web/comment/list/?device_platform=webapp&aid=6383&channel=channel_pc_web&aweme_id="+aweme.aweme_id+"&cursor="+cursor+"&count="+count+"&version_code=160100&version_name=16.1.0"
  930. let sign = fetch("http://douyin_signature.dev.tyrantg.com?url="+encodeURIComponent(not_sign_url))
  931. let true_url = not_sign_url + "&_signature="+sign
  932. let data_json = fetch(true_url, {
  933. headers: {
  934. "referer" : "https://www.douyin.com/video/"+aweme.aweme_id+"?previous_page=main_page",
  935. "cookie": home_cookie,
  936. }
  937. })
  938. if (data_json === 'Need Verifying') {
  939. d.push({
  940. title: 'signature 获取失败,待修复',
  941. col_type: "long_text",
  942. })
  943. } else {
  944. let data = JSON.parse(data_json)
  945. let list = data.comments
  946. if (list && list.length > 0) {
  947. list.forEach(item => {
  948. d.push({
  949. title: item.user.nickname + ':' + item.text,
  950. col_type: 'text_1',
  951. })
  952. })
  953. }
  954. }
  955. }
  956. setResult(d);
  957. }
  958. const saveCookie = sessionid => {
  959. const douyin_cookie = "hiker://files/TyrantG/cookie/douyin.txt"
  960. let home_cookie = request(douyin_cookie)
  961. // let home_cookie = getVar("tyrantgenesis.douyin_web.home_cookie")
  962. let first_cookie = home_cookie.split(';')[0]
  963. let new_cookie = 'sessionid='+sessionid
  964. writeFile(douyin_cookie, first_cookie+';'+new_cookie)
  965. // putVar("tyrantgenesis.douyin_web.home_cookie", first_cookie+';'+new_cookie)
  966. refreshPage(true)
  967. return "toast://设置成功"
  968. }