【ChatGPT with Date】使用 ChatGPT 时显示消息时间的插件

文章目录

    • 1. 介绍
    • 2. 使用方法
      • 2.1 安装 Tampermonkey
      • 2.2 安装脚本
      • 2.3 使用
    • 3. 配置
      • 3.1 时间格式
      • 3.2 时间位置
    • 4. 反馈
    • 5. 未来计划
    • 6. 开源协议
    • 7. 供给开发者自定义修改脚本的文档
      • 7.1 项目组织架构
      • 7.2 定义新的 Component
        • (1) 定义一个新的 Component 类
        • (2) 注册该 Component
      • 7.3 一些建议
        • (1) 注入外部 JavaScript 库
    • X. Changelog


1. 介绍

有时我们希望看到 ChatGPT 的消息时间,但 ChatGPT 并没有显示消息时间的功能。
本项目通过 Tampermonkey 开发,可以在 Chrome 和 Firefox 等支持 Tampermonkey 插件的浏览器上使用,实现显示 ChatGPT每一条消息时间的功能。

该插件不但可以获取以往的消息时间,还可以实时获取新消息的时间。

在交互时添加时间标签

提供多种配置选项,例如时间显示格式、时间显示位置等。

配置面板示意图

除此之外,时间样式高度自定义,你可以输入以下 html
代码来实现上图的效果。具体的时间格式化规则请参考 3.1 时间格式

<span style="border-radius: 8px; color: #E0E0E0; font-size: 0.9em; overflow: hidden; display: inline-block;"><spanstyle="background: #333; padding: 2px 4px 2px 10px; display: inline-block;">{yyyy}-{MM}-{dd}</span><spanstyle="background: #606060; padding: 2px 10px 2px 4px; display: inline-block;">{HH}:{mm}:{ss}</span></span>

2. 使用方法

2.1 安装 Tampermonkey

可查看 Tampermonkey 首页 查看详细的使用方法。

2.2 安装脚本

访问链接: Greasy Fork - ChatGPT with Date,点击 安装此脚本 安装脚本。

2.3 使用

首次使用请允许跨源资源共享(CORS)请求,本项目将请求 Vue.js 和 NaiveUI 的资源,以便生成配置面板。

打开 ChatGPT 页面,即可看到消息时间。你可以在此处打开配置面板。

配置面板打开引导

3. 配置

3.1 时间格式

默认支持的时间格式有(文章平台不同可能无法正常显示):

模板样例
<span>{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}</span>2000-12-31 00:00:00
<span>{MM}/{dd}/{yyyy} {HH}:{mm}:{ss}</span>12/31/2000 00:00:00
<span>{MM}-{dd} {HH}:{mm}:{ss}</span>12-31 00:00:00
<span>{MM}-{dd} {HH}:{mm}</span>12-31 00:00
<span>{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}.{ms}</span>2000-12-31 00:00:00.000
<span style="background: #2B2B2B;border-radius: 8px;padding: 1px 10px;color: #717171;">{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}</span>2000-12-31 00:00:00
<span style="border-radius: 8px; color: #E0E0E0; font-size: 0.9em; overflow: hidden; display: inline-block;"><span style="background: #333; padding: 2px 4px 2px 10px; display: inline-block;">{yyyy}-{MM}-{dd}</span><span style="background: #606060; padding: 2px 10px 2px 4px; display: inline-block;">{HH}:{mm}:{ss}</span></span>2000-12-1300:00:00

支持的时间元素有:

  • {yyyy}: 年份
  • {MM}: 月份
  • {dd}: 日期
  • {HH}: 小时
  • {mm}: 分钟
  • {ss}: 秒
  • {ms}: 毫秒

你完全可以自定义时间格式,只需要输入你想要的 html 代码即可,脚本将替换上面的模板时间元素为当前时间的相应数据。
在介绍中已经给出了一个示例:

<span style="border-radius: 8px; color: #E0E0E0; font-size: 0.9em; overflow: hidden; display: inline-block;"><spanstyle="background: #333; padding: 2px 4px 2px 10px; display: inline-block;">{yyyy}-{MM}-{dd}</span><spanstyle="background: #606060; padding: 2px 10px 2px 4px; display: inline-block;">{HH}:{mm}:{ss}</span></span>

3.2 时间位置

时间位置有三种选择:

  • 角色之后(靠左): 时间显示在角色名字的后面,并靠左显示。
  • 角色之后(靠右): 时间显示在角色名字的后面,并靠右显示。
  • 角色之下: 时间显示在角色名字下方。

4. 反馈

如果你有任何问题或建议,欢迎在 GitHub Issues 或 脚本反馈区 中提出。

5. 未来计划

  • 国际化:脚本支持多种语言(日志、提示等)。
  • 时间格式化细粒度配置面板:优化时间格式自定义功能,而不是难以维护的 HTML字符串 表示。
  • 时间格式化元素:支持更多的时间格式化元素,例如星期、月份(英文)等。
  • 时间格式化规则:支持更多的时间格式化规则,例如 12 小时制、24 小时制等。

6. 开源协议

本项目遵循 MIT 开源协议。

CopyRight © 2024~Present Jiang Liu

7. 供给开发者自定义修改脚本的文档

7.1 项目组织架构

源代码总览

本项目采用依赖注入(DI)的方式组织各个 Component,主要包括以下几个部分:

  • UserConfig: 用户配置信息,包括时间格式、时间位置等。
  • StyleService: 样式服务,负责跟踪管理一些可变化的样式。
  • MessageService: 消息服务,负责管理和存储消息信息。
  • MonitorService: 监控服务,负责劫持 Fetch 请求和实时监听页面新消息的添加。
  • TimeRendererService: 时间渲染服务,负责渲染时间。
  • ConfigPanelService: 配置面板服务,负责生成基于 Vue+NaiveUI 的配置面板。

上述服务之间的依赖关系如下:

UserConfig
StyleService
MessageService
MonitorService
TimeRendererService
ConfigPanelService

本项目采用的依赖注入方式限制了循环依赖的发生,依赖注入的设计架构允许组件保持独立于其依赖项的具体实现。这种技术可以使代码更容易理解、维护和测试。
之所以要避免循环依赖,因为循环依赖违反了单一职责原则、依赖倒置原则。

7.2 定义新的 Component

如果你想自定义一个新的 Component,你需要:

(1) 定义一个新的 Component 类
  • 继承:该类必须继承自 Component
  • 构造函数:在构造函数中定义 dependencies 属性,该属性是一个数组,数组中的每个元素是一个对象,对象包含两个属性:field
    clazz,分别表示依赖的字段名和依赖的类。
  • 依赖注入:不应该在构造函数中进行除了定义依赖关系之外的其他操作,因为依赖关系的注入是在 Component::initDependencies
    方法中进行的。在该方法执行之前,依赖关系是无法使用的。
  • 初始化函数:在 init 方法中进行正式的初始化操作,在该方法中可以使用依赖注入的属性。
  • 依赖关系:应当避免循环依赖,否则会导致初始化失败。
class NewComponent extends Component {constructor() {super();this.userConfig = nullthis.timeRendererService = nullthis.messageService = nullthis.dependencies = [{field: 'userConfig', clazz: UserConfig},{field: 'timeRendererService', clazz: TimeRendererService},{field: 'messageService', clazz: MessageService},]}init() {// 正式初始化}
}
(2) 注册该 Component

将你的 Component 注册到 Main.ComponentsConfig 中,不必担心注册的顺序,因为 Main 类会自动按照依赖关系的顺序进行初始化。

class Main {static ComponentsConfig = [UserConfig, StyleService, MessageService,MonitorService, TimeRendererService, ConfigPanelService,NewComponent,]
}

于是新的依赖关系图如下所示:

UserConfig
StyleService
MessageService
MonitorService
TimeRendererService
ConfigPanelService
NewComponent

7.3 一些建议

(1) 注入外部 JavaScript 库

请使用 GM_xmlhttpRequest 来获取外部 JavaScript 库的内容,再以字符串的形式注入到页面中。
如果你直接在页面中引入外部 JavaScript 库,可能有CSP限制。
下面是在项目中注入 Vue.js 和 NaiveUI 的示例:

function loadScript() {return new Promise(resolve => {// ✅✅ 以下方法没有 CSP 限制let completeCount = 0;const addScript = (content) => {let script = document.createElement('script');script.textContent = content;document.body.appendChild(script);completeCount++;if (completeCount === 2) {resolve()}}GM_xmlhttpRequest({method: "GET", url: "https://unpkg.com/vue@3.4.26/dist/vue.global.js", onload: function (response) {addScript(response.responseText);}});GM_xmlhttpRequest({method: "GET", url: "https://unpkg.com/naive-ui@2.38.1/dist/index.js", onload: function (response) {addScript(response.responseText);}});// ❎❎ 以下方法有 CSP 限制// const naiveScript = document.createElement('script');// naiveScript.setAttribute("type", "text/javascript");// naiveScript.text = "https://unpkg.com/naive-ui@2.38.1/dist/index.js";// document.documentElement.appendChild(naiveScript);})
}

X. Changelog

- v1.1.0 - 2024-05-02 17:50:04- 添加更多时间格式的模板

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/831272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ICode国际青少年编程竞赛- Python-1级训练场-基本操作

ICode国际青少年编程竞赛- Python-1级训练场-基本操作 1、 Dev.step(3)2、 Dev.step(1)3、 Dev.step(7)4、 Dev.step(-1)5、 Dev.step(-5)6、 Dev.step(3) Dev.step(-8)7、 Dev.turnRight() Dev.step(1)8、 Dev.turnLeft() Dev.step(1)9、 Dev.step(4) Dev.tur…

自动找出字符串中有符号数字

需求 代码 class Solution:def myAtoi(self, s: str) -> int:s s.strip() # 删除首尾空格if not s: return 0 # 字符串为空则直接返回res, i, sign 0, 1, 1int_max, int_min, bndry 2 ** 31 - 1, -2 ** 31, 2 ** 31 // 10if s[0…

2024年 Java 面试八股文——SpringMVC篇

目录 1.简单介绍下你对springMVC的理解? 2.说一说SpringMVC的重要组件及其作用 3.SpringMVC的工作原理或流程 4.SpringMVC的优点 5.SpringMVC常用注解 6.SpringMVC和struts2的区别 7.怎么实现SpringMVC拦截器 8.SpringMvc的控制器是不是单例模式&#xff1f;如果是&am…

B树:原理、操作及应用

B树&#xff1a;原理、操作及应用 一、引言二、B树概述1. 定义与性质2. B树与磁盘I/O 三、B树的基本操作1. 搜索&#xff08;B-TREE-SEARCH&#xff09;2. 插入&#xff08;B-TREE-INSERT&#xff09;3. 删除&#xff08;B-TREE-DELETE&#xff09; 四、B树的C代码实现示例五、…

蓝桥杯练习系统(算法训练)ALGO-953 混合积

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 众所周知&#xff0c;人人都在学习线性代数&#xff0c;既然都学过&#xff0c;那么解决本题应该很方便。   宇宙大战中&…

如何在postman上提交文件格式的数据

如何在postman上提交文件格式的数据 今天在写一个文件上传的功能接口时&#xff0c;想用postman进行提交&#xff0c;花了些时间才找到在postman提交文件格式的数据。记录一下吧&#xff01; 1.打开postman&#xff0c;选择POST提交方式&#xff0c;然后在Params那一行的Head…

数据分析--客户价值分析RFM(K-means聚类/轮廓系数)

原数据 import os import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import metrics ### 数据抽取&#xff0c;读⼊数据 df pd.read_csv("customers1997.csv") #相对路径读取数据 print(df.info()) pr…

WPF之自定义绘图

1&#xff0c;创建自定义控件类 class CustomDrawnElement:FrameworkElement{public static readonly DependencyProperty BackgroundColorProperty;static CustomDrawnElement(){FrameworkPropertyMetadata meta new FrameworkPropertyMetadata(Colors.SkyBlue);meta.Affects…

Python-------实现人生重开模拟器

人生重开模拟器 代码展示:实现思路序言一、设置初始属性1.游戏标题2.属性初始化 二、设置角色性别三、设置角色出生点四、针对每一年的岁数&#xff0c;自动生成人生经历总结 代码展示: # 人生重开模拟器 import random import sys import timeprint(------------------------…

服务器IP选择

可以去https://ip.ping0.cc/查看IP的具体情况 1.IP位置--如果是国内用&#xff0c;国外服务器的话建议选择日本&#xff0c;香港这些比较好&#xff0c;因为它们离这里近&#xff0c;一般延时低&#xff08;在没有绕一圈的情况下&#xff09;。 不过GPT的话屏蔽了香港IP 2. 企…

GPT是什么?直观解释Transformer | 深度学习第5章 【3Blue1Brown 官方双语】

【官方双语】GPT是什么&#xff1f;直观解释Transformer | 深度学习第5章 0:00 - 预测&#xff0c;采样&#xff0c;重复&#xff1a;预训练/生成式/Transformer模型 3:03 - Transformer 的内部结构 6:36 - 本期总述 7:20 - 深度学习的大框架 12:27 - GPT的第一层&#xff1a;…

【论文浅尝】Large Language Models for Generative Information Extraction: A Survey

本文对生成式IE的LLM进行了全面的探索。使用两种分类法对现有的代表性方法进行分类: (1)众多IE子任务的分类法&#xff0c;旨在对可以使用llm单独或统一提取的不同类型的信息进行分类; (2)学习范式分类法&#xff0c;对利用llm生成IE的各种新方法进行分类。 Preliminaries o…

msmpi 高性能计算实现文件读取输入

【高性能计算】完美解决Windows下安装mpi环境并应用到VSCode中报错问题的方法_c:\program files (x86)\microsoft sdks\mpi\include/-CSDN博客 环境配置 然后跑这个代码测试即可 // 命令行参数&#xff1a; //mpiexec -n 9 "C:\Users\ASUS\Desktop\testMPI\MPIv2.exe&qu…

【氮化镓】GaN器件可靠性及市场前景概述

文章是关于氮化镓&#xff08;GaN&#xff09;场效应晶体管&#xff08;FET&#xff09;技术在空间应用中的可靠性、辐射效应和市场前景的概述。文章由Airbus Defence & Space的多位专家撰写&#xff0c;涵盖了GaN FET技术的多个关键方面&#xff0c;包括技术概述、可靠性问…

Find My无人机|苹果Find My技术与无人机结合,智能防丢,全球定位

无人机是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机&#xff0c;或者由车载计算机完全地或间歇地自主地操作。无人机按应用领域&#xff0c;可分为军用与民用。军用方面&#xff0c;无人机分为侦察机和靶机。民用方面&#xff0c;无人机行业应用&#xff0c;是无…

opencv基础篇 ——(十二)轮廓提取与绘制

opencv基础篇 ——&#xff08;十二&#xff09;轮廓提取与绘制 findContours轮廓提取 void void findContours( InputArray image, OutputArrayOfArrays contours,OutputArray hierarchy, int mode,int method, Point offset Point());功能介绍 cv::findContours 是 OpenC…

【python】商业数据聚类-回归数据分析可视化(源码+数据)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

ios CI/CD 持续集成 组件化专题四-(手动发布私有库-组件化搭建)

一 、创建私有索引库 1.1 、第一步 首先检查本地是否存在需要的私有索引库 pod repo list 例如&#xff1a;dp_base_ios_spec 在本地不存在该私有索引库 1.2 、第二步 在git下下创建一个新的库&#xff0c;这个库用来保存私有库的podspec文件&#xff0c;取名叫xxxSpec用以…

以更多架构核心专利,推进 SDS 产业创新创造

今天是第 24 个世界知识产权日&#xff0c;今年世界知识产权日活动的主题是&#xff1a;“知识产权和可持续发展目标&#xff1a;立足创新创造&#xff0c;构建共同未来。” 这也正是 XSKY 在软件定义存储领域的目标之一。以“数据常青”为使命的 XSKY&#xff0c;始终立足于软…

【MySQL | 第十篇】重新认识MySQL索引匹配过程

文章目录 10.重新认识MySQL索引匹配过程10.1匹配规则10.2举例&#xff1a;联合索引遇到范围查询&#xff08;>、<、between、like&#xff09;10.2.1例子一&#xff1a;>10.2.2例子二&#xff1a;>10.2.3例子三&#xff1a;between10.2.4例子四&#xff1a;like 10…