Greasy Fork

来自缓存

Greasy Fork is available in English.

Rlog按time重排

Rlog 展示的顺序不对,用上传的time 重排,要求上传的内容是JSON, 并且有 time 字段,time 可以被 new Date(time) 处理,就会重新覆盖默认的时间

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Rlog按time重排
// @namespace    aizigao
// @version      1.6
// @description  Rlog 展示的顺序不对,用上传的time 重排,要求上传的内容是JSON, 并且有 time 字段,time 可以被 new Date(time) 处理,就会重新覆盖默认的时间
// @author       aizigao
// @match        https://log-search-docker.zuoyebang.cc/explore*
// @grant        none
// @license MIT
// ==/UserScript==

;(function () {
  'use strict'

  const originalFetch = window.fetch
  const log = (...args) => console.log('😜', ...args)
  function get(obj, path, defaultValue = undefined) {
    const keys = Array.isArray(path) ? path : path.split('.')
    let result = obj
    for (const key of keys) {
      result = result ? result[key] : undefined
      if (result === undefined) {
        return defaultValue
      }
    }
    return result
  }
  function set(obj, path, value) {
    const keys = Array.isArray(path) ? path : path.split('.')
    let current = obj
    keys.forEach((key, index) => {
      if (index === keys.length - 1) {
        current[key] = value
      } else {
        current[key] = current[key] || {}
        current = current[key]
      }
    })
    return obj
  }

  const TARGET_APP_AUTH = ['zphybrid-log-debug', 'zphybrid-log']
  const authKey = (() => {
    // const search = window.location.search;
    const deCodeQuery = decodeURIComponent(window.location.search)
    const m = deCodeQuery.match(/app=\\"(.*?)\\"/)
    return m ? m[1] : ''
  })()

  log('authKey', authKey)

  const SafeJsonParse = (str) => {
    try {
      return JSON.parse(str)
    } catch (e) {
      return str
    }
  }

  const transformTime = (list) => {
    log('transformTime', list)
    return list.map((i) => {
      const { values, ...others } = i
      const newValues = values
        .map(([_oldTs, objStr]) => {
          const obj = SafeJsonParse(objStr)
          const time = new Date(obj.time).getTime()
          if (typeof obj === 'string') {
            log('错误:数据不是JSON')
          }
          if (!time || Number.isNaN(time)) {
            log('没有time 字段')
          }
          if (!time || Number.isNaN(time) || typeof obj === 'string') {
            return [_oldTs, objStr]
          }
          if (TARGET_APP_AUTH.includes(authKey)) {
            const content = JSON.parse(obj.content)
            delete obj.content
            const {p: pageKey, q: pageSearchPartical,atcxt,att, ...others} = content
            return [
              String(time * 1e6),
              JSON.stringify({
                att,
                atcxt,
                ...others,
                ...obj,
                AT_RLOG_RE_TIMING___: 'Rlog time 重置OK',
                pageKey: '/static/pad-InkLearn/' + pageKey + '.html',
                pageSearchPartical,
                z_RLOG_RE_TIMING___old_time: new Date(_oldTs / 1e6),
              }),
            ]
          }
          return [
            String(time * 1e6),
            JSON.stringify({
             
              ...obj,
               AT_RLOG_RE_TIMING___: 'Rlog time 重置OK',
              z_RLOG_RE_TIMING___old_time: new Date(_oldTs / 1e6),
            }),
          ]
        })
        .sort((a, b) => Number(a[0]) > Number(b[0]))
      return {
        values: newValues,
        ...others,
      }
    })
  }

  window.fetch = async function (resource, init) {
    // Check if the request URL matches the target API endpoint
    if (
      typeof resource === 'string' &&
      resource.includes('/loki/api/v1/query_range')
    ) {
      log('Intercepted fetch request:', resource)

      // Call the original fetch
      const response = await originalFetch(resource, init)

      if(response.status>300){
        return response
      }
      // Clone the response so we can modify it
      const clonedResponse = response.clone()

      const data = await clonedResponse.json()

      if(typeof data === 'string'){
        return response
      }


      // Modify the response data
      log('Original response data:', data)

      const originList = get(data, ['data', 'result'], [])
      // Example modification: add a custom field to the response

      data.customField = 'Modified content'
      if (originList.length) {
        try {
          const rstList = transformTime(originList)
          log('rstList', rstList)
          set(data, ['data', 'result'], rstList)
        } catch (e) {
          log('修改失败', e)
          window.alert('RLog 修改失败')
        }
      }
      // Create a new response with the modified data
      const modifiedResponse = new Response(JSON.stringify(data), {
        status: response.status,
        statusText: response.statusText,
        headers: response.headers,
      })

      log('Modified response data:', data)

      return modifiedResponse
    }

    // If not our target URL, just proceed with the normal fetch
    return originalFetch(resource, init)
  }
})()