V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
0o0O0o0O0o
V2EX  ›  OpenAI

减少 ChatGPT 官方网页需要频繁刷新的简单办法

  0o0O0o0O0o · 2023-03-24 16:23:20 +08:00 · 20302 次点击
这是一个创建于 370 天前的主题,其中的信息可能已经有所发展或是发生改变。

多开一个标签页,访问一个需要过验证但又不会有交互请求的链接,例如:

https://chat.openai.com/404

装个自动刷新的插件,我用的是 GitHub 随便找的:

https://github.com/Claxtastic/just-refresh ( jquery.min.js 已经和官网的对比过是一致的)

我设置的间隔是 3 秒,对我来说很管用,希望能帮到你们。

原理很简单,用别的更优雅的方式自然也可以实现。

第 1 条附言  ·  2023-03-24 18:42:57 +08:00

油猴版本,不想装油猴就直接在对话页面的 DevTools - Console 里执行。
优雅一点,不需要多开个标签页了。
应该没人太在意 DevTools - Network 里有很多 404 请求吧?

// ==UserScript==
// @name         ChatGPT heartbeat
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       https://v2ex.com/t/926890
// @match        https://chat.openai.com/*
// @icon         https://chat.openai.com/favicon.ico
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    setInterval(function(){
        fetch('https://chat.openai.com/404');
    }, 3000);
})();
第 2 条附言  ·  2023-03-24 19:31:22 +08:00

上面这个油猴脚本仅仅 fetch 404 似乎没有自动刷新那么有效,我实测还是要刷新了,干脆用 iframe 了,写法可能不好,欢迎指点:

// ==UserScript==
// @name         ChatGPT heartbeat
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       https://v2ex.com/t/926890
// @match        https://chat.openai.com/*
// @icon         https://chat.openai.com/favicon.ico
// @grant        none
// ==/UserScript==

(function () {
  var iframe = document.createElement("iframe");
  iframe.id = "heartbeat";
  iframe.style = "display:none";
  iframe.name = "heartbeat";
  iframe.src = "https://chat.openai.com/404/";
  var fn = function () {
    setTimeout(function(){
        iframe.src = "https://chat.openai.com/404/" + Math.random();
    }, 3000);
  };
  if (iframe.attachEvent) {
    iframe.attachEvent("onload", fn);
  } else {
    iframe.onload = fn;
  }
  document.body.insertBefore(iframe, document.body.firstChild);
})();

第 3 条附言  ·  2023-03-24 20:52:05 +08:00

//
//
//
//

上面的油猴脚本占用太高了,风扇呼呼的。
实测 robots.txt 也有效(fetch 可能失效大概是 Cloudflare 对 Headers 的检测?)。
下面是 ChatGPT heartbeat 再也不改版,未来如果 robots.txt 无效了可以自己修改链接为 404,如果觉得每5秒请求一次太频繁了可以自己调大时间间隔。

// ==UserScript==
// @name         ChatGPT heartbeat
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       https://v2ex.com/t/926890
// @match        https://chat.openai.com/chat/*
// @icon         https://chat.openai.com/favicon.ico
// @grant        none
// ==/UserScript==

(function () {
  var iframe = document.createElement("iframe");
  iframe.id = "heartbeat";
  iframe.style = "display:none";
  iframe.name = "heartbeat";
  iframe.src = "https://chat.openai.com/robots.txt";
  var fn = function () {
    setTimeout(function(){
        document.getElementById('heartbeat').contentWindow.location.reload(true);
    }, 5000);
  };
  if (iframe.attachEvent) {
    iframe.attachEvent("onload", fn);
  } else {
    iframe.onload = fn;
  }
  document.body.insertBefore(iframe, document.body.firstChild);
})();

第 4 条附言  ·  2023-03-25 16:40:22 +08:00

绝对不会再改版

// ==UserScript==
// @name         ChatGPT heartbeat
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  try to take over the world!
// @author       https://v2ex.com/t/926890
// @match        https://chat.openai.com/chat*
// @icon         https://chat.openai.com/favicon.ico
// @grant        none
// ==/UserScript==

/*
  需要保持非常久的,可以额外尝试在 chrome://discards 里禁用 `Auto Discardable`,
  或者用 https://github.com/WorldLanguages/DoNotDiscard
  否则就算保持了 Cookies 有效,Chrome 也有可能自动休眠标签页。
*/
(function () {
  var count = 0;
  var iframe = document.createElement("iframe");
  iframe.id = "heartbeat";
  iframe.style = "display:none";
  iframe.name = "heartbeat";
  iframe.src = "https://chat.openai.com/robots.txt";
  var fn = function () {
    setTimeout(function () {
      if (count++ % 60 === 59) {
        iframe.src = "https://chat.openai.com/404";
      } else if (iframe.src === "https://chat.openai.com/robots.txt") {
        iframe.contentWindow.location.reload(true);
      } else {
        iframe.src = "https://chat.openai.com/robots.txt";
      }
    }, Math.floor(Math.random() * 5) * 1000 + 5000);
  };
  if (iframe.attachEvent) {
    iframe.attachEvent("onload", fn);
  } else {
    iframe.onload = fn;
  }
  document.head.insertBefore(iframe, document.head.firstChild);
})();

第 5 条附言  ·  2023-03-28 16:11:51 +08:00

绝对绝对不会再改版

// ==UserScript==
// @name         ChatGPT heartbeat
// @namespace    http://tampermonkey.net/
// @version      0.2.1
// @description  try to take over the world!
// @author       https://v2ex.com/t/926890
// @match        https://chat.openai.com/chat*
// @icon         https://chat.openai.com/favicon.ico
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// ==/UserScript==

/*
  需要保持非常久的,可以额外尝试在 chrome://discards 里禁用 `Auto Discardable`,
  或者用 https://github.com/WorldLanguages/DoNotDiscard
  否则就算保持了 Cookies 有效,Chrome 也有可能自动休眠标签页。
*/
(function () {
    var refreshURL = 'https://chat.openai.com/_next/static/k9OKjvwgjWES7JT3k-6g9/_ssgManifest.js';
    var refreshInterval = 30 * 1000;

    var iframe = document.createElement('iframe');
    iframe.id = 'heartbeat';
    iframe.style = 'display:none';
    iframe.name = 'heartbeat';
    iframe.src = refreshURL;
    document.head.insertBefore(iframe, document.head.firstChild);
    setInterval(function () {
        if (iframe.contentWindow.location.href === refreshURL) {
            iframe.contentWindow.location.reload(true);
        }
    }, refreshInterval)
})();

第 6 条附言  ·  363 天前
86 条回复    2023-11-15 16:57:16 +08:00
yiios
    1
yiios  
   2023-03-24 16:56:20 +08:00
好思路
0x535
    2
0x535  
   2023-03-24 17:12:55 +08:00
问了 ChatGPT ,它说不想装插件,用油猴脚本也可以。试了一下,确实可以,目前情绪稳定😄 不知道后面会不会出问题

```js
(function() {
'use strict';
setInterval(function(){
location.reload();
}, 3000);
})();
```
bigtear
    3
bigtear  
   2023-03-24 17:18:11 +08:00
尝试一下
arzyu
    4
arzyu  
   2023-03-24 17:26:15 +08:00
这个方法不错!
autoxbc
    5
autoxbc  
   2023-03-24 17:53:34 +08:00
@0x535 #2 这个 ChatGPT 代码能力不行,reload() 执行后上下文都会销毁,回调不会执行第二次,此处用 setInterval 是思路不清
X-Force
    6
X-Force  
   2023-03-24 17:55:01 +08:00
我让 ChatGPT 帮忙写了一个油猴脚本,每隔 2 分钟发送一句“ping”,Ai 会回答 pong 。然后,就没有然后了,就这样。
X-Force
    7
X-Force  
   2023-03-24 17:56:44 +08:00
不必多开,不必刷新。只是有污染聊天记录,虽然没有根治验证的问题,但基本上算是解决烦人的问题
0o0O0o0O0o
    8
0o0O0o0O0o  
OP
   2023-03-24 17:57:57 +08:00 via iPhone
@autoxbc #5 他说的是油猴,所以还是可以的吧
0x535
    9
0x535  
   2023-03-24 17:58:44 +08:00
@autoxbc 它说了,用油猴脚本。它给的回答里有油猴脚本的配置信息。
0o0O0o0O0o
    10
0o0O0o0O0o  
OP
   2023-03-24 17:59:28 +08:00 via iPhone
@X-Force 那我建议你用油猴请求不存在的页面,而不是对话,毕竟 openai 资源紧张,被找理由 ban 了就不好了。其实就是带上 cookie 让 cloudflare 知道你请求了就行。
Lentin
    11
Lentin  
   2023-03-24 18:02:28 +08:00
@autoxbc #5 猴脚本跟上下文没有关系,每次刷新页面都会注入
Vitta
    12
Vitta  
   2023-03-24 18:02:45 +08:00
你把 userAgent 改成 safari 的 试试。我改了之后不管他好久还能继续用
autoxbc
    13
autoxbc  
   2023-03-24 18:12:30 +08:00   ❤️ 1
@0o0O0o0O0o #8
@0x535 #9
@Lentin #11
看来我没说清楚,我知道这是油猴,知道这不是控制台的注入。我的意思是,这里只用 setTimeout 就足够了,页面重载会重新注入这段代码,不需要 setInterval 来维持调度。反过来说,他试图用 setInterval 来维持调度说明对浏览器,对油猴理解不够
0o0O0o0O0o
    14
0o0O0o0O0o  
OP
   2023-03-24 18:18:13 +08:00 via iPhone
@autoxbc #13 哈哈,要是对它的期望是“能跑就行”那倒不错
falcon05
    15
falcon05  
   2023-03-24 18:28:04 +08:00
简单粗暴,但真的有用,帮上大忙了!
zacharyjia
    16
zacharyjia  
   2023-03-24 18:33:18 +08:00
简单粗暴但有效,就喜欢这种方法
yinyu
    17
yinyu  
   2023-03-24 18:53:21 +08:00
我想说,每三秒自动刷新,是不是每三秒他需要回你一次,爽了自己苦了别人啊
(啥脚本啊,我马上去下载,我有油猴。狗头.ipg )
0o0O0o0O0o
    18
0o0O0o0O0o  
OP
   2023-03-24 18:58:07 +08:00 via iPhone
@yinyu #17 不需要的,考虑到这一点了,所以请求的是不存在的页面,对 OpenAI 服务器造成的负担会很小
zacharyjia
    19
zacharyjia  
   2023-03-24 19:01:49 +08:00
@yinyu
@0o0O0o0O0o
3 秒有点太频繁了,实测刷新间隔 30 秒,坚持 30 分钟不断没问题,(可能更长,但是还没用到那么长时间 2333 )
yinyu
    20
yinyu  
   2023-03-24 19:02:55 +08:00
原来是请求一个不会交互的页面,妙啊,但是感觉官网有时候也抽风,可能是我机场的问题,有时候也是吐字很慢。不如白嫖的 API
nijux
    21
nijux  
   2023-03-24 19:32:58 +08:00
可以让 ChatGPT 改成随机 3~15 秒访问一次
0o0O0o0O0o
    22
0o0O0o0O0o  
OP
   2023-03-24 19:38:52 +08:00
@nijux #21 嗯,要是访问 404 页面没有效果我应该就会加上随机了,仅仅访问 404 页面感觉不太容易被风控关照到
hanqian
    23
hanqian  
   2023-03-24 21:04:51 +08:00
妙啊,有效降低 plus 套餐的吸引力(
Lentin
    24
Lentin  
   2023-03-24 21:32:03 +08:00
0o0O0o0O0o
    25
0o0O0o0O0o  
OP
   2023-03-24 21:47:31 +08:00
@Lentin #24

嗯,有两种进入对话的方式

- 访问 https://chat.openai.com/chat 或者 https://chat.openai.com/chat/ 然后跳转到 https://chat.openai.com/chat
- 访问某个确定的对话,也就是 https://chat.openai.com/chat/<uuid>

所以可能还是

// @match https://chat.openai.com/chat*

更好些?
zkncu9zjczw
    26
zkncu9zjczw  
   2023-03-25 03:51:37 +08:00
请问这是什么原理 感觉很强
autoxbc
    27
autoxbc  
   2023-03-25 04:20:30 +08:00   ❤️ 1
iframe 的思路很好,我个人的技巧是把 iframe 插入 head ,这样不需要指定 style 就会自动隐藏
0o0O0o0O0o
    28
0o0O0o0O0o  
OP
   2023-03-25 10:13:42 +08:00
@zkncu9zjczw #26 Cloudflare 的策略问题吧,大概是保持交互 Cloudflare 就认为你活跃?没具体分析过,大概原理没错。
ysq
    29
ysq  
   2023-03-25 11:45:36 +08:00
s 升了 plus 就不用每次刷新了
X-Force
    30
X-Force  
   2023-03-25 19:04:48 +08:00
if (count++ % 60 === 59) { iframe.src = "https://chat.openai.com/404"; ....

这句的目的是什么?只访问 robot.txt 不行?一定还要偶尔访问下 404 页面吗?
0o0O0o0O0o
    31
0o0O0o0O0o  
OP
   2023-03-25 19:12:42 +08:00
@X-Force #30 我没去求证,凭感觉写的,因为如果要验证效果有点耗时间。。。robots.txt 仅仅是带着 Cookie 请求一下,但在需要刷新甚至需要重新验证时它是不跳转的,404 在需要刷新的时候则会跳转
0o0O0o0O0o
    32
0o0O0o0O0o  
OP
   2023-03-25 19:13:37 +08:00
@X-Force #30 所以干脆隔一段时间就加载一下 404
arzyu
    33
arzyu  
   2023-03-25 20:23:31 +08:00
我设置 2 分钟一刷完全没问题。
cs3230524
    34
cs3230524  
   2023-03-26 12:13:43 +08:00
付费吧,就稳定了。
cs3230524
    35
cs3230524  
   2023-03-26 12:14:50 +08:00
大伙都是程序员行业了,这 100 多的投资很值啊。把精力放在搞钱上吧。。。
yinyu
    36
yinyu  
   2023-03-27 10:31:45 +08:00
为啥我运行了最后一版的油猴,长期不刷新还是会报错。是因为我梯子太辣鸡了吗?
Lentin
    37
Lentin  
   2023-03-27 11:41:09 +08:00   ❤️ 1
这个请求可以触发 CF 的验证而且占用资源很少

https://chat.openai.com/_next/static/k9OKjvwgjWES7JT3k-6g9/_ssgManifest.js
0o0O0o0O0o
    38
0o0O0o0O0o  
OP
   2023-03-27 11:58:56 +08:00 via iPhone
@yinyu #36 你试试用 #37 的替换 404
brainor
    39
brainor  
   2023-03-27 15:38:34 +08:00
greasy fork 里看到一个[这个]( https://greasyfork.org/en/scripts/462422-chatgpt-auto-refresh )
作者貌似还弄了好几个[script]( https://github.com/adamlui/userscripts/tree/master/chatgpt ) ~
0o0O0o0O0o
    40
0o0O0o0O0o  
OP
   2023-03-27 15:45:08 +08:00
@brainor 这个牛,油猴原来还可以有菜单的
brainor
    41
brainor  
   2023-03-27 16:57:18 +08:00
@0o0O0o0O0o 但是我发现这个脚本貌似没有用 hh
qiaofanxing
    42
qiaofanxing  
   2023-03-28 14:11:01 +08:00
有一个小问题,就是每一次发起请求,油猴的图标右下角,显示当前启用脚本数量的那个红色数字就加一,静置一会那个数字都跑到好几百了,不知道这个在哪里设置
hun2008hun
    43
hun2008hun  
   2023-03-28 14:52:15 +08:00
@qiaofanxing 我也发现了,不知道怎么搞
0o0O0o0O0o
    44
0o0O0o0O0o  
OP
   2023-03-28 16:12:33 +08:00
@qiaofanxing
@hun2008hun

你们试试最新附言的版本呢? 0.2.1
160
    45
160  
   2023-03-28 18:03:24 +08:00
@qiaofanxing 打开 Tampermonkey 的设置,配置模式设置为“高级”,然后找到“操作菜单”,找到“标记点信息”,选择”已禁用“或者”运行的脚本数量“,最后保存就不会一直增加了。
Losir
    46
Losir  
   364 天前
用了 0.2.1 版,被 ban 了一小时,发消息都是回复“Too many requests in 1 hour. Try again later.”,是不是这个方法不行了?
0o0O0o0O0o
    47
0o0O0o0O0o  
OP
   364 天前
@autoxbc

这个页面监听了事件,有事件就会在本地检测 session 是否超时( 348e4 ),就会强制刷新。对于这种情况一般怎么用油猴修改呢?

hook addEventListener 效果很差,js 文件也不好拦截修改
0o0O0o0O0o
    48
0o0O0o0O0o  
OP
   364 天前
@Losir #46 我倒是没遇到过这个报错,搜了下也不算 ban ,就是一小时内对话太多?这个脚本是避免增加和 OpenAI 的交互的,所以大概不是它引起的
autoxbc
    49
autoxbc  
   364 天前   ❤️ 1
@0o0O0o0O0o #47 这个应该是官方的自动刷新机制,我觉得应该够用,然后就把油猴实现停掉了

如果对官方这个效果不满意想自己实现,可以拦截 addEventListener ,当 type 参数为 focus 和 focusin 时,把监听请求丢弃掉

有一点要注意,拦截 addEventListener 不应该这样写
globalThis.addEventListener = function(){}

因为油猴的沙盒机制要求对顶级对象的写操作要显式使用 unsafeWindow ;同时也不能这样写
unsafeWindow.addEventListener = function(){}

因为 addEventListener 有多个入口,比如 document.addEventListener ;正确的做法是
EventTarget.prototype.addEventListener = function(){}

EventTarget 是可监听对象的统一抽象原型
0o0O0o0O0o
    50
0o0O0o0O0o  
OP
   363 天前
@autoxbc #49 谢谢,很有帮助!发布到 greasyfork 了,https://greasyfork.org/scripts/462967
vxzhong
    51
vxzhong  
   363 天前
有用,感谢。
Lentin
    52
Lentin  
   360 天前   ❤️ 1
我也搞了一版,自动寻找页面上的 js 链接,顺便让 gpt 优化了下代码
(function() {
const manifestScript = document.querySelector('script[src*="_ssgManifest.js"]');
if (!manifestScript) return;

const heartbeat = Object.assign(document.createElement('iframe'), { style: 'display:none' });
document.head.prepend(heartbeat);

setInterval(() => heartbeat.src = `${manifestScript.src}?${Date.now()}`, 30000);
})();
tlerbao
    53
tlerbao  
   352 天前
@0o0O0o0O0o 我这边点安装脚本后 一闪什么也没有,脚本主页安装按钮变成了重新安装,但是油猴按钮显示没有在运行的脚本是怎么回事?
0o0O0o0O0o
    54
0o0O0o0O0o  
OP
   352 天前
@tlerbao #53

1. 重启浏览器
2. 确认油猴是 Enabled 状态
3. 进油猴的 Dashboard 看看是不是正常安装了
4. 匹配的 URL 是 `https://chat.openai.com/chat*`

要是还不行我也不了解了
tlerbao
    55
tlerbao  
   352 天前
@0o0O0o0O0o 我群友说他亲测,买了一台国外服务器,然后直接远程到服务器上面开浏览器用,不用刷新。。。。他说是独占 IP 的就不会频繁刷新
0o0O0o0O0o
    56
0o0O0o0O0o  
OP
   352 天前 via iPhone
@tlerbao #55 我是用的便宜 VPS+ warp ,成本比较低
haibbo
    57
haibbo  
   352 天前
0o0O0o0O0o
    58
0o0O0o0O0o  
OP
   352 天前
@haibbo #57 试试最新版 0.2.4
tlerbao
    59
tlerbao  
   352 天前
@0o0O0o0O0o 刚测了一下,没有用,还是需要刷新
Biluesgakki
    60
Biluesgakki  
   351 天前
和我想到一块了哈哈 刚写了个脚本 60 秒刷新以下页面
yazoox
    61
yazoox  
   350 天前
@0o0O0o0O0o OP 你这个脚本到底 是 30 秒还是 2 分钟刷新一下?
0o0O0o0O0o
    62
0o0O0o0O0o  
OP
   350 天前
@yazoox #61 30 秒,代码里的 2 分钟是应对一些特殊情况,比如 iframe 中的请求触发了 cloudflare challenge ,但 2 分钟还没跳转完就让 iframe 重新加载
jiang24gdufs
    63
jiang24gdufs  
   350 天前
@0o0O0o0O0o 我是把这段 js 脚本放在控制台运行,但是现在已经不好用了, 执行两轮就报 403 了
0o0O0o0O0o
    64
0o0O0o0O0o  
OP
   350 天前   ❤️ 1
@jiang24gdufs #63

我在用 0.2.4 ,chrome://discard 禁用了 Auto Discardable ,放置一个小时之后还是能直接对话。

发布在 greasyfork 上的引入了 MonkeyConfig ,控制台直接运行是不行的
jiang24gdufs
    65
jiang24gdufs  
   350 天前
@0o0O0o0O0o 🥰用 greasyfork 体验果然好多了, 不过想问问, 配置的 url 是固定的吗, 有没有必要参考#52 做成自动获取?
0o0O0o0O0o
    66
0o0O0o0O0o  
OP
   350 天前
@jiang24gdufs #65

已经是自动获取了,也可以自定义配置 _ssgManifest js 以外的 URL 和刷新间隔
NouveauNom
    67
NouveauNom  
   350 天前
@0o0O0o0O0o 请问 edge 没有 edge://discard 是吗
NouveauNom
    68
NouveauNom  
   350 天前
@0o0O0o0O0o 找到了,是 edge://discards/
0o0O0o0O0o
    70
0o0O0o0O0o  
OP
   349 天前
@vxzhong #69 谢谢,已更新
jiang24gdufs
    71
jiang24gdufs  
   349 天前
@0o0O0o0O0o 加了油猴插件, 但是脚本不自动执行是什么原因? 我已经启用了该脚本.
0o0O0o0O0o
    72
0o0O0o0O0o  
OP
   349 天前 via iPhone   ❤️ 1
@jiang24gdufs #71 参考 #69 ,0.2.5 版本
glouhao
    73
glouhao  
   348 天前
你还是更新了,0.25 版本好用,谢谢大佬
tgz2018
    74
tgz2018  
   348 天前
太感谢您了
tgz2018
    75
tgz2018  
   348 天前
手机安装不了油猴,那怎么实现这个呢,有时候手机也用来访问下 chatgpt
randychoi
    76
randychoi  
   346 天前 via Android
@tgz2018 手机端( iOS )

Safari:Tampermonkey 或 Userscripts
Gear:(不需要其他软件)

(Android)


Firefox: Tampermonkey
xamo
    77
xamo  
   345 天前
感谢,非常有用!
zhiyu1998
    78
zhiyu1998  
   344 天前
谢谢大佬
yyzq007
    79
yyzq007  
   343 天前
有用,感谢大佬
geekyouth
    80
geekyouth  
   340 天前
我发现开了香港全局代理,也可以顺利使用 chatgpt web 页面
ffkjjj
    81
ffkjjj  
   340 天前
isbase
    82
isbase  
   340 天前
@ffkjjj #81 直接这样一条是不是就可以了

// @match https://chat.openai.com/*
ffkjjj
    83
ffkjjj  
   339 天前 via iPhone
@isbase 是的
0o0O0o0O0o
    84
0o0O0o0O0o  
OP
   339 天前
@ffkjjj
@isbase

谢谢,已更新
michael27
    85
michael27  
   339 天前
感觉更新了之后反而不好用了,更新之后几乎每次都要报错 an error occurred
goodgoodstudy
    86
goodgoodstudy  
   134 天前
在 edge 浏览器上用不了,报错 Failed to read a named property 'href' from 'Location': Blocked a frame with origin "https://chat.openai.com" from accessing a cross-origin frame.
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2417 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 36ms · UTC 16:05 · PVG 00:05 · LAX 09:05 · JFK 12:05
Developed with CodeLauncher
♥ Do have faith in what you're doing.