kuizuo / chaoxing-sign

超星学习通网页版在线签到,采用 nuxt 全栈框架实现协议复现。支持所有签到类型以及自动签到。
https://cx.kuizuo.cn
MIT License
171 stars 17 forks source link

浏览器监听失败 #5

Closed SummonHIM closed 1 year ago

SummonHIM commented 1 year ago

node:18-alpine使用的是linux-musl-openssl-3.0.x 缺少了报错,添加了又好了

还有Docker中AUTH_ORIGIN似乎没生效。登录仍然会跳转回localhost

kuizuo commented 1 year ago

nuxt-auth 不仅要设置 AUTH_ORIGIN 还需要设置 NEXTAUTH_URL,否则在登录跳转的时候不会跳转的预期地址(当时没设置 NEXTAUTH_URL 坑了我好几天)

kuizuo commented 1 year ago

prisma client 会根据不同平台,由于 docker 镜像通常会缺失一些文件,因此需要在 binaryTargets 中添加目标服务器来进行构建。

我这里只测试了 macos 14 和 centos 7系统,其他系统则根据对应的报错提示添加便可。

SummonHIM commented 1 year ago

nuxt-auth 不仅要设置 AUTH_ORIGIN 还需要设置 NEXTAUTH_URL,否则在登录跳转的时候不会跳转的预期地址(当时没设置 NEXTAUTH_URL 坑了我好几天)

设置了NEXTAUTH_URL后,监听模式无法启动 环境是docker+nginx

运行日志和浏览器控制台也完全没有输出反馈,只有一个与超星头像的Mixed Content警告

kuizuo commented 1 year ago

至于说监听功能,有些不稳定,几小时会存在断连的情况(我这里使用的是 easemob-websdk即某星官方的库)

SummonHIM commented 1 year ago

至于说监听功能,有些不稳定,几小时会存在断连的情况(我这里使用的是 easemob-websdk即某星官方的库)

不是断链,是点监听按钮没反应

kuizuo commented 1 year ago

控制台有无输出类似字样?

image

SummonHIM commented 1 year ago
❯ docker logs chaoxing-sign-server-1
Listening on http://[::]:8050
[nuxt] [request error] [unhandled] [500] Cannot read properties of null (reading 'uid')
  at ./.output/server/chunks/accounts.get.mjs:55:21
  at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
[nuxt] [request error] [unhandled] [500] Cannot read properties of null (reading 'uid')
  at ./.output/server/chunks/accounts.get.mjs:55:21
  at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client
  at new NodeError (node:internal/errors:405:5)
  at ServerResponse.setHeader (node:_http_outgoing:648:11)
  at setResponseHeaders (./.output/server/chunks/nitro/node-server.mjs:1871:20)
  at ./.output/server/chunks/handlers/renderer.mjs:74:7
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
17:45:39:846 IM SDK [debug]:  init Msync by connection
17:45:39:862 IM SDK [debug]:  open
17:45:40:267 IM SDK [info]:  httpType: https
17:45:40:972 IM SDK [debug]:  websockt onOpen
17:45:41:95 IM SDK [debug]:  dispatch event: onConnected
17:45:45:161 IM SDK [debug]:  websocket onClose
17:45:45:161 IM SDK [debug]:  dispatch event: onDisconnected
[nuxt] [request error] [unhandled] [500] Cannot read properties of null (reading 'uid')
  at ./.output/server/chunks/accounts.get.mjs:55:21
  at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
[nuxt] [request error] [unhandled] [500] Cannot read properties of null (reading 'uid')
  at ./.output/server/chunks/accounts.get.mjs:55:21
  at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client
  at new NodeError (node:internal/errors:405:5)
  at ServerResponse.setHeader (node:_http_outgoing:648:11)
  at setResponseHeaders (./.output/server/chunks/nitro/node-server.mjs:1871:20)
  at ./.output/server/chunks/handlers/renderer.mjs:74:7
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
Listening on http://[::]:8050
17:49:18:418 IM SDK [debug]:  init Msync by connection
17:49:18:424 IM SDK [debug]:  open
17:49:18:702 IM SDK [info]:  httpType: https
17:49:19:157 IM SDK [debug]:  websockt onOpen
17:49:19:250 IM SDK [debug]:  dispatch event: onConnected
17:49:27:127 IM SDK [debug]:  websocket onClose
17:49:27:128 IM SDK [debug]:  dispatch event: onDisconnected

在未修改NEXTAUTH_URL下,监听启动一次后就无法再次启动了 修改了NEXTAUTH_URL就直接点不了了

kuizuo commented 1 year ago

我这边本地测试监听是没问题的,稍等一下,我测试一下 docker 环境下

SummonHIM commented 1 year ago

我这边本地测试监听是没问题的,稍等一下,我测试一下 docker 环境下

说错了 都是启动一次后就无法再次启动了

还有NUXT_SECRET是?我赋了个随机uuid上去

kuizuo commented 1 year ago

image

我这边测试是没有问题的

kuizuo commented 1 year ago

我这边本地测试监听是没问题的,稍等一下,我测试一下 docker 环境下

说错了 都是启动一次后就无法再次启动了

还有NUXT_SECRET是?我赋了个随机uuid上去

ENV NODE_ENV=production ENV PORT=8050 ENV NUXT_SECRET="chaoxing-sign" ENV AUTH_ORIGIN="http://localhost:8050" ENV NEXTAUTH_URL="http://localhost:8050"

ENV DATABASE_URL="xxx"

你确保 Dockerfile 内容是否正确

SummonHIM commented 1 year ago

我这边本地测试监听是没问题的,稍等一下,我测试一下 docker 环境下

说错了 都是启动一次后就无法再次启动了 还有NUXT_SECRET是?我赋了个随机uuid上去

ENV NODE_ENV=production ENV PORT=8050 ENV NUXT_SECRET="chaoxing-sign" ENV AUTH_ORIGIN="http://localhost:8050" ENV NEXTAUTH_URL="http://localhost:8050"

ENV DATABASE_URL="xxx"

你确保 Dockerfile 内容是否正确

Dockerfile的内容我没有修改过的

剩下就是schema加了那个target然后npx prisma generate了下

我感觉应该是nginx反代的锅了

kuizuo commented 1 year ago

不,这个自动监听跟反向代理没有关系

SummonHIM commented 1 year ago

不,这个自动监听跟反向代理没有关系

大概点不了的时候浏览器就报告这个错误

Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received
kuizuo commented 1 year ago

你可以尝试重新构建一下镜像,

不,这个自动监听跟反向代理没有关系

大概点不了的时候浏览器就报告这个错误

Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received

浏览器是?版本?

因为在 createIMConnection 中需要修改 global 对象,或者说叫补环境。而这可能会导致浏览器一些对象(window,document) 被修改,我之前在测试这一步的时候就一直在反复测试

SummonHIM commented 1 year ago

你可以尝试重新构建一下镜像,

不,这个自动监听跟反向代理没有关系

大概点不了的时候浏览器就报告这个错误

Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received

浏览器是?版本?

因为在 createIMConnection 中需要修改 global 对象,或者说叫补环境。而这可能会导致浏览器一些对象(window,document) 被修改,我之前在测试这一步的时候就一直在反复测试

Chrome/116.0.0.0

kuizuo commented 1 year ago

还有更详细的报错信息截图不?

我这里可以肯定的是 监听 和反向代理与环境配置没有直接关系

SummonHIM commented 1 year ago

还有更详细的报错信息截图不?

我这里可以肯定的是 监听 和反向代理与环境配置没有直接关系

这也是重新构建镜像后的日志 截图: image 点击了监听没有反应,只是一个摆设开关

Docker日志

Listening on http://[::]:8050
18:33:58:160 IM SDK [debug]:  init Msync by connection
18:33:58:167 IM SDK [debug]:  open
18:33:58:463 IM SDK [info]:  httpType: https
18:33:58:944 IM SDK [debug]:  websockt onOpen
18:33:59:64 IM SDK [debug]:  dispatch event: onConnected
18:34:10:152 IM SDK [debug]:  websocket onClose
18:34:10:153 IM SDK [debug]:  dispatch event: onDisconnected

浏览器 image

kuizuo commented 1 year ago

稍等 我这边关闭一下我的 ssl测试一下,你部署在服务器上可能会是 ssl 证书的因素。

我排查了一下 也不是这个问题,很奇怪

SummonHIM commented 1 year ago

稍等 我这边关闭一下我的 ssl测试一下,你部署在服务器上可能会是 ssl 证书的因素。

证书我用的是LetsEncrypt ZeroSSL的。acme生成的

kuizuo commented 1 year ago

你尝试一下换个浏览器,重新构建一个应用,重启服务看看 我这边环境是 chrome 112 与 Microsoft Edge 版本 114.0 本地 node 20 服务端 v16.15.0. (建议 18)

实际上是 node 这边在与某星(easemob-websdk)做 websocket 链接,因此很大概率会是 node 环境导致的。

从这个来看

Uncaught (in promise) Error: A listener indicated an asynchronous response by returning true, but the message channel closed before a response was received

应该触发了WebSocket链接,但是立马断开了,导致消息没有送出去即未双向连接。

SummonHIM commented 1 year ago

稍等 我这边关闭一下我的 ssl测试一下,你部署在服务器上可能会是 ssl 证书的因素。

我排查了一下 也不是这个问题,很奇怪

我下了个火狐 火狐就有报错 image

kuizuo commented 1 year ago

稍等 我这边关闭一下我的 ssl测试一下,你部署在服务器上可能会是 ssl 证书的因素。 我排查了一下 也不是这个问题,很奇怪

我下了个火狐 火狐就有报错 image

点击展开,根据堆栈跳转到指定位置看看

kuizuo commented 1 year ago

不过题外话,我觉得现在针对自动监听就不是那么需求了,原因就是因为 手势、签到码、二维码这三个签到类型都需要相应提交信息(手势轨迹,签到码,二维码)。此时自动监听的意义就不是那么大了。且当前情况下自动监听不是那么稳定,存在断连,我从内心上来说都有点像移除该功能了。

而初衷则是委托一个小伙伴,而不用将自己的手机(客户端)交给他,随手打开一个网页,点击后稍等片刻,即可完成签到的任务。

SummonHIM commented 1 year ago

稍等 我这边关闭一下我的 ssl测试一下,你部署在服务器上可能会是 ssl 证书的因素。 我排查了一下 也不是这个问题,很奇怪

我下了个火狐 火狐就有报错 image

点击展开,根据堆栈跳转到指定位置看看

刷新了之后又没有报这些错误了

随后服务端报这个

[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client
  at new NodeError (node:internal/errors:405:5)  
  at ServerResponse.setHeader (node:_http_outgoing:648:11)  
  at setResponseHeaders (./.output/server/chunks/nitro/node-server.mjs:1871:20)  
  at ./.output/server/chunks/handlers/renderer.mjs:74:7  
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)  
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client
  at new NodeError (node:internal/errors:405:5)  
  at ServerResponse.setHeader (node:_http_outgoing:648:11)  
  at setResponseHeaders (./.output/server/chunks/nitro/node-server.mjs:1871:20)  
  at ./.output/server/chunks/handlers/renderer.mjs:74:7  
  at runNextTicks (node:internal/process/task_queues:60:5)  
  at process.processTimers (node:internal/timers:509:9)  
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)  
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client
  at new NodeError (node:internal/errors:405:5)  
  at ServerResponse.setHeader (node:_http_outgoing:648:11)  
  at setResponseHeaders (./.output/server/chunks/nitro/node-server.mjs:1871:20)  
  at ./.output/server/chunks/handlers/renderer.mjs:74:7  
  at async Object.handler (./.output/server/chunks/nitro/node-server.mjs:2375:19)  
  at async Server.toNodeHandle (./.output/server/chunks/nitro/node-server.mjs:2564:7)
SummonHIM commented 1 year ago

不过题外话,我觉得现在针对自动监听就不是那么需求了,原因就是因为 手势、签到码、二维码这三个签到类型都需要相应提交信息(手势轨迹,签到码,二维码)。此时自动监听的意义就不是那么大了。且当前情况下自动监听不是那么稳定,存在断连,我从内心上来说都有点像移除该功能了。

而初衷则是委托一个小伙伴,而不用将自己的手机(客户端)交给他,随手打开一个网页,点击后稍等片刻,即可完成签到的任务。

确实 但是这个东西 我不确定是不是监听和那个手势签到码一起出bug了 除了二维码我没有出现过输入手势和签到码的窗口

SummonHIM commented 1 year ago

稍等 我这边关闭一下我的 ssl测试一下,你部署在服务器上可能会是 ssl 证书的因素。 我排查了一下 也不是这个问题,很奇怪

我下了个火狐 火狐就有报错 image

点击展开,根据堆栈跳转到指定位置看看

image

image

是否是因为直接调用了学习通的头像,导致混合内容。浏览器检测到不安全断开了ws

kuizuo commented 1 year ago

是否是因为直接调用了学习通的头像,导致混合内容。浏览器检测到不安全断开了ws

这也不太可能,因为ws 是在 node里跑的,如果是浏览器连某星的 websocket 服务的话,浏览器关了还怎么监听

SummonHIM commented 1 year ago

是否是因为直接调用了学习通的头像,导致混合内容。浏览器检测到不安全断开了ws

这也不太可能,因为ws 是在 node里跑的,如果是浏览器连某星的 websocket 服务的话,浏览器关了还怎么监听

我用pnpm run dev运行也是这样子 也没有用反代

也是报[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client

SummonHIM commented 1 year ago

手势和签到码的弹窗功能现在是有的吗?

kuizuo commented 1 year ago

也是报[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令

kuizuo commented 1 year ago

手势和签到码的弹窗功能现在是有的吗?

有的,不过需要通过一键签到来触发,后续可能会针对这两个签到类型增加一个按钮,来针对指定课程签到(因为不同于二维码签到能获取到活动 id) 在帮助说明有说到 image

SummonHIM commented 1 year ago

手势和签到码的弹窗功能现在是有的吗?

有的,不过需要通过一键签到来触发,后续可能会针对这两个签到类型增加一个按钮,来针对指定课程签到(因为不同于二维码签到能获取到活动 id) 在帮助说明有说到 image

我们有个老师签到完不结束活动的 现在一键签到老是弹那些旧二维码签到

不知道是不是这个把签到码覆盖掉了

kuizuo commented 1 year ago

我们有个老师签到完不结束活动的 现在一键签到老是弹那些旧二维码签到

不知道是不是这个把签到码覆盖掉了

woc,这个细节我没注意到,确实是这样的,当时写的比较匆忙,就只寻找第一个签到任务是签到码/手势的,就会导致该 bug。

按理来说后续我应该在批量操作框中 添加一个选择课程的按钮 然后只获取这个课程下的签到任务进行完成

一键签到的本质就是不进行判断,能签到的情况下就执行签到,所以没有考虑是否已签到过滤

SummonHIM commented 1 year ago

也是报[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令

Screenshot_2023-09-01-03-49-41-272_com termux 命令都是照着readme装的

kuizuo commented 1 year ago

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令 命令都是照着readme装的

你这环境有点抽象。。。

遇到 [nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client 这种情况,是连页面都无法进入是吧。

SummonHIM commented 1 year ago

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令 命令都是照着readme装的

你这环境有点抽象。。。

node和pnpm需要哪个版本

电脑刚关 是手机ssh到服务器的

SummonHIM commented 1 year ago

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令 命令都是照着readme装的

你这环境有点抽象。。。

遇到 [nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client 这种情况,是连页面都无法进入是吧。

没 只有监听不了的问题

kuizuo commented 1 year ago

[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令 命令都是照着readme装的

你这环境有点抽象。。。

node和pnpm需要哪个版本

电脑刚关 是手机ssh到服务器的

这两个问题不大。

有时候 nuxt 会抽风,你最好把 node_modules,.nuxt 文件夹,都删除,然后重新安装

SummonHIM commented 1 year ago

[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令 命令都是照着readme装的

你这环境有点抽象。。。

node和pnpm需要哪个版本 电脑刚关 是手机ssh到服务器的

这两个问题不大。

有时候 nuxt 会抽风,你最好把 node_modules,.nuxt 文件夹,都删除,然后重新安装

我明天试一下吧

多谢大佬帮忙 搞到这么晚

kuizuo commented 1 year ago

这两个问题不大。 有时候 nuxt 会抽风,你最好把 node_modules,.nuxt 文件夹,都删除,然后重新安装

我明天试一下吧

多谢大佬帮忙 搞到这么晚

对了,我突然想起来我当时有写测试文件 im.test.ts

你在 .env 中添加 CX_USERNAME 和 CX_PASSWORD 两个变量,然后执行 npx vitest im 可以查看效果,我这边正好完善一下测试代码

image

SummonHIM commented 1 year ago

这两个问题不大。 有时候 nuxt 会抽风,你最好把 node_modules,.nuxt 文件夹,都删除,然后重新安装

我明天试一下吧 多谢大佬帮忙 搞到这么晚

对了,我突然想起来我当时有写测试文件 im.test.ts

你在 .env 中添加 CX_USERNAME 和 CX_PASSWORD 两个变量,然后执行 npx vitest im 可以查看效果,我这边正好完善一下测试代码

image

一开始正常,到后面突然停止了 image image

SummonHIM commented 1 year ago

[nuxt] [request error] [unhandled] [500] Cannot set headers after they are sent to the client

你贴一下你的环境变量 .env 以及你的 node 环境/ pnpm 环境,还有你安装依赖到运行的所有命令 命令都是照着readme装的

你这环境有点抽象。。。

node和pnpm需要哪个版本 电脑刚关 是手机ssh到服务器的

这两个问题不大。

有时候 nuxt 会抽风,你最好把 node_modules,.nuxt 文件夹,都删除,然后重新安装

我删掉重新clone一遍,pnpm install然后又push了db,最后打包docker。还是一样不行

你的范例站点也不行 image Chrome/Firefox也试过了

kuizuo commented 1 year ago

一开始正常,到后面突然停止了 image image

这边我推送了新的代码,你重新拉去一下,出现 listen 加载中就说明正在处于监听中。

kuizuo commented 1 year ago

一开始正常,到后面突然停止了 image image

这边我推送了新的代码,你重新拉去一下,出现 listen 加载中就说明正在处于监听中。

你需要执行以下命令

npx vitest im 
kuizuo commented 1 year ago

Chrome/Firefox也试过了

这里的开始监听后,之前的任务是不会监听到的。我猜测你可能是想说为什么点击监听按钮后,而没有立马进行签到。该监听功能只有在开启后,有新的签到任务,才能够监听到并进行自动签到。

SummonHIM commented 1 year ago

Chrome/Firefox也试过了

这里的开始监听后,之前的任务是不会监听到的。我猜测你可能是想说为什么点击监听按钮后,而没有立马进行签到。该监听功能只有在开启后,有新的签到任务,才能够监听到并进行自动签到。

并不是说立马进行签到,我详细说就是,第一次点击监听时,IM是有日志输出onConnected的。我发起的普通签到监听也能监听得到。然而我取消监听后再次监听时。网页显示确实是监听成功。但是点击监听的加载过程非常快,后台也没有任何日志。刷新网页后监听的心跳图标也没有显示。我发起的普通签到也没有被读取到

SummonHIM commented 1 year ago

一开始正常,到后面突然停止了 image image

这边我推送了新的代码,你重新拉去一下,出现 listen 加载中就说明正在处于监听中。

你需要执行以下命令

npx vitest im 

image

kuizuo commented 1 year ago

忘记在取消监听逻辑中,将内容中 map 数据删除了

https://github.com/kuizuo/chaoxing-sign/blob/82dfb7fd3c73d1fa4b1df80bdd6190eba41c4b9b/server/api/cx/account/%5Buid%5D/unmonitor.post.ts#L24-L28

现已修复 https://github.com/kuizuo/chaoxing-sign/commit/e58ece3d2d34529094cfed45e7a493f21a4b7d45

https://github.com/kuizuo/chaoxing-sign/blob/e58ece3d2d34529094cfed45e7a493f21a4b7d45/server/api/cx/account/%5Buid%5D/unmonitor.post.ts#L24-L30

kuizuo commented 1 year ago

并不是说立马进行签到,我详细说就是,第一次点击监听时,IM是有日志输出onConnected的。我发起的普通签到监听也能监听得到。然而我取消监听后再次监听时。网页显示确实是监听成功。但是点击监听的加载过程非常快,后台也没有任何日志。刷新网页后监听的心跳图标也没有显示。我发起的普通签到也没有被读取到

第二次为何加载很快是由于 在 map 中有找到监听的账号数据,就认为已经监听了,则不会进行后续操作。 而在取消监听只将 client 关闭,而忘记将 map 数据删除,就导致第二次数据没有重新建立新的连接。