标题: 请问一下哪家国内IP代理最便宜?
作者: QZ
内容: 请问一下哪家国内IP代理最便宜? 最好是长效的。
时间: Tue, 24 Jun 2025 10:21:52 +0000
作者: linjinpeng
回复: 免费的去fofo抓
时间: Tue, 24 Jun 2025 10:22:19 +0000
作者: cknight
回复: https://linux.do/t/topic/745642 这个自己部署下就有了
时间: Tue, 24 Jun 2025 10:27:11 +0000
作者: 猫猫
回复: 主题帖说的好像是国内代理吧,你这个是抓机场的啊
时间: Tue, 24 Jun 2025 10:28:53 +0000
作者: cknight
回复: 看错,当我没发
时间: Tue, 24 Jun 2025 10:29:26 +0000
作者: LiLaoMo
回复: 长效的太贵了。
时间: Tue, 24 Jun 2025 10:34:55 +0000
作者: 爱折腾的sky
回复: 长效只能自建了
时间: Tue, 24 Jun 2025 10:35:43 +0000
链接: https://linux.do/t/topic/747281/7
作者: QZ
内容: 请问一下哪家国内IP代理最便宜? 最好是长效的。
时间: Tue, 24 Jun 2025 10:21:52 +0000
作者: linjinpeng
回复: 免费的去fofo抓
时间: Tue, 24 Jun 2025 10:22:19 +0000
作者: cknight
回复: https://linux.do/t/topic/745642 这个自己部署下就有了
时间: Tue, 24 Jun 2025 10:27:11 +0000
作者: 猫猫
回复: 主题帖说的好像是国内代理吧,你这个是抓机场的啊
时间: Tue, 24 Jun 2025 10:28:53 +0000
作者: cknight
回复: 看错,当我没发
时间: Tue, 24 Jun 2025 10:29:26 +0000
作者: LiLaoMo
回复: 长效的太贵了。
时间: Tue, 24 Jun 2025 10:34:55 +0000
作者: 爱折腾的sky
回复: 长效只能自建了
时间: Tue, 24 Jun 2025 10:35:43 +0000
链接: https://linux.do/t/topic/747281/7
LINUX DO
请问一下哪家国内IP代理最便宜?
请问一下哪家国内IP代理最便宜? 💕 最好是长效的。
标题: roocode中Connection error.求解?
作者: 一杯白开水
内容: 在cursor中使用roocode原本好好的,忽然就提示"Connection error.",不管我卸载扩展重装,cursor也同样卸载重装,错误依旧,连接任何模型都是提示Connection error. 但是同样在vscode使用却全部正常,端点还是那个端点,模型还是那个模型… 这个什么原因,花了一个小时多还是没办法解决…求佬帮忙 好奇怪的错误
时间: Tue, 24 Jun 2025 10:28:22 +0000
链接: https://linux.do/t/topic/747287/1
作者: 一杯白开水
内容: 在cursor中使用roocode原本好好的,忽然就提示"Connection error.",不管我卸载扩展重装,cursor也同样卸载重装,错误依旧,连接任何模型都是提示Connection error. 但是同样在vscode使用却全部正常,端点还是那个端点,模型还是那个模型… 这个什么原因,花了一个小时多还是没办法解决…求佬帮忙 好奇怪的错误
时间: Tue, 24 Jun 2025 10:28:22 +0000
链接: https://linux.do/t/topic/747287/1
LINUX DO
roocode中Connection error.求解?
在cursor中使用roocode原本好好的,忽然就提示"Connection error.",不管我卸载扩展重装,cursor也同样卸载重装,错误依旧,连接任何模型都是提示Connection error. 但是同样在vscode使用却全部正常,端点还是那个端点,模型还是那个模型… 这个什么原因,花了一个小时多还是没办法解决…求佬帮忙
标题: All Model Chat更新:增加HTML预览功能,内置Canvas提示词
作者: Mozi
内容: All Model Chat Canvas助手(推荐2.5 Pro):让模型用HTML回复,支持Graphviz逻辑流程图、Echarts图表 开发调优 体验地址 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>Canvas 助手</title> <script>MathJax={chtml:{fontURL:'h…
时间: Tue, 24 Jun 2025 09:51:30 +0000
作者: 方块AI
回复: 支持一下
时间: Tue, 24 Jun 2025 09:51:43 +0000
作者: Leon01
回复: 牛哇佬 来支持一下
时间: Tue, 24 Jun 2025 10:00:59 +0000
作者: geclaude
回复: 支持佬!
时间: Tue, 24 Jun 2025 10:09:07 +0000
作者: attention1111
回复: 支持一下!
时间: Tue, 24 Jun 2025 10:13:30 +0000
作者: coding
回复: 支持大佬,大佬有能让模型设计UI效果很好的那种提示词吗?
时间: Tue, 24 Jun 2025 10:18:15 +0000
作者: 石头
回复: 谢谢分享
时间: Tue, 24 Jun 2025 10:20:44 +0000
作者: zzzqq
回复: 感谢巨佬啊
时间: Tue, 24 Jun 2025 10:34:50 +0000
链接: https://linux.do/t/topic/747234/8
作者: Mozi
内容: All Model Chat Canvas助手(推荐2.5 Pro):让模型用HTML回复,支持Graphviz逻辑流程图、Echarts图表 开发调优 体验地址 <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0"> <title>Canvas 助手</title> <script>MathJax={chtml:{fontURL:'h…
时间: Tue, 24 Jun 2025 09:51:30 +0000
作者: 方块AI
回复: 支持一下
时间: Tue, 24 Jun 2025 09:51:43 +0000
作者: Leon01
回复: 牛哇佬 来支持一下
时间: Tue, 24 Jun 2025 10:00:59 +0000
作者: geclaude
回复: 支持佬!
时间: Tue, 24 Jun 2025 10:09:07 +0000
作者: attention1111
回复: 支持一下!
时间: Tue, 24 Jun 2025 10:13:30 +0000
作者: coding
回复: 支持大佬,大佬有能让模型设计UI效果很好的那种提示词吗?
时间: Tue, 24 Jun 2025 10:18:15 +0000
作者: 石头
回复: 谢谢分享
时间: Tue, 24 Jun 2025 10:20:44 +0000
作者: zzzqq
回复: 感谢巨佬啊
时间: Tue, 24 Jun 2025 10:34:50 +0000
链接: https://linux.do/t/topic/747234/8
LINUX DO
All Model Chat更新:增加HTML预览功能,内置Canvas提示词
标题: 求问,Mac下如何双微信一直登录状态,不要从application里面脱出来每 24 小时登录一次的这个方案
作者: qps
内容: 如题, 找了好久了
时间: Tue, 24 Jun 2025 08:59:44 +0000
作者: 方块AI
回复: 没有办法,开虚拟机吧
时间: Tue, 24 Jun 2025 09:01:21 +0000
作者: qps
回复: 我现在是远程一台电脑,也就只运行着个微信 没解了么,,,
时间: Tue, 24 Jun 2025 09:04:49 +0000
作者: long
回复: 我也有这个需求,但是没有办法目前
时间: Tue, 24 Jun 2025 09:05:59 +0000
作者: 退堂鼓演奏家
回复: 可以用测试版和正式版一起 不会掉 15.5可用 alipan.com 阿里云盘分享
时间: Tue, 24 Jun 2025 09:09:41 +0000
作者: qps
回复: 对对对,感谢佬,我之前听过这个方案,但一直没地方 找到测试版, 我试试!
时间: Tue, 24 Jun 2025 09:13:37 +0000
作者: np8SXJ
回复: github.com GitHub - Netskao/MacOS-Utils: MacOS-Apps-Utils MacOS-Apps-Utils
时间: Tue, 24 Jun 2025 09:17:05 +0000
作者: qps
回复: 这种会不会容易封号啊,,,
时间: Tue, 24 Jun 2025 09:17:30 +0000
作者: np8SXJ
回复: 会有风险,不过我的一直正常,使不使用佬友自定。
时间: Tue, 24 Jun 2025 09:19:22 +0000
作者: qps
回复: 嗯,还是
时间: Tue, 24 Jun 2025 09:25:57 +0000
作者: ForestRan
回复: 我自己是一个正式版一个测试版,从去年一直用没出过啥问题。就是有一次系统升级了然后测试版本不支持,我就升级了测试版的就好了。其他没出过任何问题。然后我自己换了个图标好区分一点。
时间: Tue, 24 Jun 2025 09:43:54 +0000
作者: qps
回复: 佬,我装上测试版啦,目前两个都正常,过几天,两个也都是登录状态对吧
时间: Tue, 24 Jun 2025 09:45:21 +0000
作者: qps
回复: 佬,我按上面的云盘的,装上测试版啦,目前两个都正常,过几天,两个也都是登录状态对吧 不会明天打开盖子就还要再登录吧?
时间: Tue, 24 Jun 2025 09:45:46 +0000
作者: ForestRan
回复: 基本不会,除非换Wi-Fi了可能会掉登陆,同一Wi-Fi的情况下,我备用手机都没电一个月了还能自动登录。完全没任何问题。
时间: Tue, 24 Jun 2025 09:47:48 +0000
作者: 退堂鼓演奏家
回复: 是的 只要不主动退出 可以一直挂着 我晚上都盒盖休眠的
时间: Tue, 24 Jun 2025 09:49:20 +0000
作者: PPY
回复: 佬友问一下,这个支持最新版的微信吗?
时间: Tue, 24 Jun 2025 09:58:18 +0000
作者: qps
回复: 你最帅! 这就是我要的效果! 有没有手机这个微信切换其他微信了,这个微信电脑上还不退出的方案啊,佬!
时间: Tue, 24 Jun 2025 09:59:33 +0000
作者: ForestRan
回复: 那没有,手机微信退出,电脑必定掉登陆,我目前想到一个办法是,如果你有android的话手机可以开一个微信分身来登陆。这样就可以了。
时间: Tue, 24 Jun 2025 10:18:40 +0000
作者: qps
回复: 嗯,这个办法了解的
时间: Tue, 24 Jun 2025 10:34:24 +0000
链接: https://linux.do/t/topic/747102/19
作者: qps
内容: 如题, 找了好久了
时间: Tue, 24 Jun 2025 08:59:44 +0000
作者: 方块AI
回复: 没有办法,开虚拟机吧
时间: Tue, 24 Jun 2025 09:01:21 +0000
作者: qps
回复: 我现在是远程一台电脑,也就只运行着个微信 没解了么,,,
时间: Tue, 24 Jun 2025 09:04:49 +0000
作者: long
回复: 我也有这个需求,但是没有办法目前
时间: Tue, 24 Jun 2025 09:05:59 +0000
作者: 退堂鼓演奏家
回复: 可以用测试版和正式版一起 不会掉 15.5可用 alipan.com 阿里云盘分享
时间: Tue, 24 Jun 2025 09:09:41 +0000
作者: qps
回复: 对对对,感谢佬,我之前听过这个方案,但一直没地方 找到测试版, 我试试!
时间: Tue, 24 Jun 2025 09:13:37 +0000
作者: np8SXJ
回复: github.com GitHub - Netskao/MacOS-Utils: MacOS-Apps-Utils MacOS-Apps-Utils
时间: Tue, 24 Jun 2025 09:17:05 +0000
作者: qps
回复: 这种会不会容易封号啊,,,
时间: Tue, 24 Jun 2025 09:17:30 +0000
作者: np8SXJ
回复: 会有风险,不过我的一直正常,使不使用佬友自定。
时间: Tue, 24 Jun 2025 09:19:22 +0000
作者: qps
回复: 嗯,还是
时间: Tue, 24 Jun 2025 09:25:57 +0000
作者: ForestRan
回复: 我自己是一个正式版一个测试版,从去年一直用没出过啥问题。就是有一次系统升级了然后测试版本不支持,我就升级了测试版的就好了。其他没出过任何问题。然后我自己换了个图标好区分一点。
时间: Tue, 24 Jun 2025 09:43:54 +0000
作者: qps
回复: 佬,我装上测试版啦,目前两个都正常,过几天,两个也都是登录状态对吧
时间: Tue, 24 Jun 2025 09:45:21 +0000
作者: qps
回复: 佬,我按上面的云盘的,装上测试版啦,目前两个都正常,过几天,两个也都是登录状态对吧 不会明天打开盖子就还要再登录吧?
时间: Tue, 24 Jun 2025 09:45:46 +0000
作者: ForestRan
回复: 基本不会,除非换Wi-Fi了可能会掉登陆,同一Wi-Fi的情况下,我备用手机都没电一个月了还能自动登录。完全没任何问题。
时间: Tue, 24 Jun 2025 09:47:48 +0000
作者: 退堂鼓演奏家
回复: 是的 只要不主动退出 可以一直挂着 我晚上都盒盖休眠的
时间: Tue, 24 Jun 2025 09:49:20 +0000
作者: PPY
回复: 佬友问一下,这个支持最新版的微信吗?
时间: Tue, 24 Jun 2025 09:58:18 +0000
作者: qps
回复: 你最帅! 这就是我要的效果! 有没有手机这个微信切换其他微信了,这个微信电脑上还不退出的方案啊,佬!
时间: Tue, 24 Jun 2025 09:59:33 +0000
作者: ForestRan
回复: 那没有,手机微信退出,电脑必定掉登陆,我目前想到一个办法是,如果你有android的话手机可以开一个微信分身来登陆。这样就可以了。
时间: Tue, 24 Jun 2025 10:18:40 +0000
作者: qps
回复: 嗯,这个办法了解的
时间: Tue, 24 Jun 2025 10:34:24 +0000
链接: https://linux.do/t/topic/747102/19
LINUX DO
求问,Mac下如何双微信一直登录状态,不要从application里面脱出来每 24 小时登录一次的这个方案
如题, 找了好久了😅
标题: 求问,Mac下如何双微信一直登录状态,不要从application里面脱出来每 24 小时登录一次的这个方案
作者: qps
内容: 如题, 找了好久了
时间: Tue, 24 Jun 2025 08:59:44 +0000
作者: 方块AI
回复: 没有办法,开虚拟机吧
时间: Tue, 24 Jun 2025 09:01:21 +0000
作者: qps
回复: 我现在是远程一台电脑,也就只运行着个微信 没解了么,,,
时间: Tue, 24 Jun 2025 09:04:49 +0000
作者: long
回复: 我也有这个需求,但是没有办法目前
时间: Tue, 24 Jun 2025 09:05:59 +0000
作者: 退堂鼓演奏家
回复: 可以用测试版和正式版一起 不会掉 15.5可用 alipan.com 阿里云盘分享
时间: Tue, 24 Jun 2025 09:09:41 +0000
作者: qps
回复: 对对对,感谢佬,我之前听过这个方案,但一直没地方 找到测试版, 我试试!
时间: Tue, 24 Jun 2025 09:13:37 +0000
作者: np8SXJ
回复: github.com GitHub - Netskao/MacOS-Utils: MacOS-Apps-Utils MacOS-Apps-Utils
时间: Tue, 24 Jun 2025 09:17:05 +0000
作者: qps
回复: 这种会不会容易封号啊,,,
时间: Tue, 24 Jun 2025 09:17:30 +0000
作者: np8SXJ
回复: 会有风险,不过我的一直正常,使不使用佬友自定。
时间: Tue, 24 Jun 2025 09:19:22 +0000
链接: https://linux.do/t/topic/747102/9
作者: qps
内容: 如题, 找了好久了
时间: Tue, 24 Jun 2025 08:59:44 +0000
作者: 方块AI
回复: 没有办法,开虚拟机吧
时间: Tue, 24 Jun 2025 09:01:21 +0000
作者: qps
回复: 我现在是远程一台电脑,也就只运行着个微信 没解了么,,,
时间: Tue, 24 Jun 2025 09:04:49 +0000
作者: long
回复: 我也有这个需求,但是没有办法目前
时间: Tue, 24 Jun 2025 09:05:59 +0000
作者: 退堂鼓演奏家
回复: 可以用测试版和正式版一起 不会掉 15.5可用 alipan.com 阿里云盘分享
时间: Tue, 24 Jun 2025 09:09:41 +0000
作者: qps
回复: 对对对,感谢佬,我之前听过这个方案,但一直没地方 找到测试版, 我试试!
时间: Tue, 24 Jun 2025 09:13:37 +0000
作者: np8SXJ
回复: github.com GitHub - Netskao/MacOS-Utils: MacOS-Apps-Utils MacOS-Apps-Utils
时间: Tue, 24 Jun 2025 09:17:05 +0000
作者: qps
回复: 这种会不会容易封号啊,,,
时间: Tue, 24 Jun 2025 09:17:30 +0000
作者: np8SXJ
回复: 会有风险,不过我的一直正常,使不使用佬友自定。
时间: Tue, 24 Jun 2025 09:19:22 +0000
链接: https://linux.do/t/topic/747102/9
LINUX DO
求问,Mac下如何双微信一直登录状态,不要从application里面脱出来每 24 小时登录一次的这个方案
如题, 找了好久了😅
标题: 佬们有没有小说推荐
作者: 冬濑
内容: 类型能是无限流最好,修仙也可以,希望是完结文,连载追的太痛苦了。 其他的希望感情线能好一点,1v1纯爱。 先提前谢谢佬们了。
时间: Tue, 24 Jun 2025 09:53:31 +0000
作者: 御宅男(YznCMS后台开源系统官方)
回复: blog.yzncms.com 书单 - 御宅男の博客 分享一些技术文章,记录一些程序学习生涯中的问题,一同和您学习进步,来自御宅男的原创博客
时间: Tue, 24 Jun 2025 09:54:09 +0000
作者: leon
回复: 蛊真人吧 挺好看的 看了两年还没看完
时间: Tue, 24 Jun 2025 10:12:00 +0000
作者: 鹿歆歆
回复: 推荐你看番茄第一深情,真的很爱很爱自己的老婆~
时间: Tue, 24 Jun 2025 10:18:56 +0000
作者: zylf
回复: 看了两年都没看完,这还叫好看啊?好看的会上瘾,很快就会看完
时间: Tue, 24 Jun 2025 10:19:13 +0000
作者: 冬濑
回复: 我听朋友说过,内容感觉癫癫的。
时间: Tue, 24 Jun 2025 10:26:43 +0000
作者: leon
回复: 太长了 都是抽空看
时间: Tue, 24 Jun 2025 10:28:26 +0000
作者: 冬濑
回复: OK,谢谢推荐。
时间: Tue, 24 Jun 2025 10:29:14 +0000
作者: 布鲁斯-侯恩
回复: 三体 推荐三本书呢? (三体)1.2.3
时间: Tue, 24 Jun 2025 10:30:41 +0000
作者: 传说之下的花儿
回复: 至死方休
时间: Tue, 24 Jun 2025 10:32:00 +0000
作者: 鹿歆歆
回复: 哈哈哈哈,对呀
时间: Tue, 24 Jun 2025 10:33:42 +0000
链接: https://linux.do/t/topic/747239/11
作者: 冬濑
内容: 类型能是无限流最好,修仙也可以,希望是完结文,连载追的太痛苦了。 其他的希望感情线能好一点,1v1纯爱。 先提前谢谢佬们了。
时间: Tue, 24 Jun 2025 09:53:31 +0000
作者: 御宅男(YznCMS后台开源系统官方)
回复: blog.yzncms.com 书单 - 御宅男の博客 分享一些技术文章,记录一些程序学习生涯中的问题,一同和您学习进步,来自御宅男的原创博客
时间: Tue, 24 Jun 2025 09:54:09 +0000
作者: leon
回复: 蛊真人吧 挺好看的 看了两年还没看完
时间: Tue, 24 Jun 2025 10:12:00 +0000
作者: 鹿歆歆
回复: 推荐你看番茄第一深情,真的很爱很爱自己的老婆~
时间: Tue, 24 Jun 2025 10:18:56 +0000
作者: zylf
回复: 看了两年都没看完,这还叫好看啊?好看的会上瘾,很快就会看完
时间: Tue, 24 Jun 2025 10:19:13 +0000
作者: 冬濑
回复: 我听朋友说过,内容感觉癫癫的。
时间: Tue, 24 Jun 2025 10:26:43 +0000
作者: leon
回复: 太长了 都是抽空看
时间: Tue, 24 Jun 2025 10:28:26 +0000
作者: 冬濑
回复: OK,谢谢推荐。
时间: Tue, 24 Jun 2025 10:29:14 +0000
作者: 布鲁斯-侯恩
回复: 三体 推荐三本书呢? (三体)1.2.3
时间: Tue, 24 Jun 2025 10:30:41 +0000
作者: 传说之下的花儿
回复: 至死方休
时间: Tue, 24 Jun 2025 10:32:00 +0000
作者: 鹿歆歆
回复: 哈哈哈哈,对呀
时间: Tue, 24 Jun 2025 10:33:42 +0000
链接: https://linux.do/t/topic/747239/11
LINUX DO
佬们有没有小说推荐
类型能是无限流最好,修仙也可以,希望是完结文,连载追的太痛苦了。 其他的希望感情线能好一点,1v1纯爱。 先提前谢谢佬们了。
标题: 大家手机都多久换一次
作者: Mailkoo
内容: iPhone XR还在用
时间: Tue, 24 Jun 2025 09:11:53 +0000
作者: 大帅哥
回复: 四五年了还在用
时间: Tue, 24 Jun 2025 09:12:41 +0000
作者: darkbfly
回复: 用坏了才换 哈哈哈
时间: Tue, 24 Jun 2025 09:13:12 +0000
作者: 方块AI
回复: iPhone 什么时候出我想买的什么时候换,上次换是因为灵动岛
时间: Tue, 24 Jun 2025 09:13:16 +0000
作者: CodeWu
回复: 目前手机在手2年多了,等mate 80pro
时间: Tue, 24 Jun 2025 09:13:18 +0000
作者: 9C
回复: 不坏不换
时间: Tue, 24 Jun 2025 09:13:21 +0000
作者: shock
回复: 不坏不换 华为meta20 用到现在了
时间: Tue, 24 Jun 2025 09:13:52 +0000
作者: darksora502
回复: 以前是年年换,从21年买了13PM后,上个月才换了16PM,直接就变成3年半一换了。
时间: Tue, 24 Jun 2025 09:13:57 +0000
作者: Meta
回复: 这么说吧,我初中的时候,那台苹果5s,它电池包都把后盖顶起来了,后盖板的封胶都失效了,能看到里面的电器元件了,屏幕左上角已经有黑点了,但!我还是用了1个月,最后是我妈看不下去,换了自己的手机,把老的给了我,现在想想,那个时候,是真难杀,新手保护了,属于是
时间: Tue, 24 Jun 2025 09:15:16 +0000
作者: 齐天大圣
回复: 安卓两三年就得换了
时间: Tue, 24 Jun 2025 09:23:30 +0000
作者: 一颗小鸡蛋
回复: 平均三年吧
时间: Tue, 24 Jun 2025 09:41:18 +0000
作者: GMYXDS
回复: 4-5年
时间: Tue, 24 Jun 2025 09:49:57 +0000
作者: 嘎蹦咔咔
回复: 三四年吧 QwQ 一般都是有大事件才换 比如毕业
时间: Tue, 24 Jun 2025 09:50:29 +0000
作者: 思聪.王
回复: 3年,用的用不动了就换。下次更换需要esim出现
时间: Tue, 24 Jun 2025 09:51:17 +0000
作者: JayXuZ
回复: 快5年了 说实话,除了相机跟不上时代了,其他完全感觉不到换的理由 每天就刷个视频,看个小说,完全没有换的必要 我又是个扫码用户,基本不拍照,所以也不打算换
时间: Tue, 24 Jun 2025 09:54:42 +0000
作者: coveydzblrsjlay
回复: 和存储空间有关. 我目前使用时间最久的是一台16+1T的红米千元机. 更贵的机器反而用的没这台久.
时间: Tue, 24 Jun 2025 09:58:19 +0000
作者: Aumae
回复: 坏了并且口袋里有钱,或者坏了并且白条24期免息才会换。
时间: Tue, 24 Jun 2025 10:02:10 +0000
作者: wood
回复: 才毕业的时候基本上一年一换, 现在 到不怎么换手机了, 毕业的时候好像是 小米10u, 然后换了iphone 13,再然后就换了小米 14pro,目前用了 1年半 还没换
时间: Tue, 24 Jun 2025 10:03:34 +0000
作者: 冬濑
回复: 基本都是用到坏,或者实在是卡顿的不行才换。 ₍^˶ ╸𖥦 ╸˵^₎⟆
时间: Tue, 24 Jun 2025 10:06:04 +0000
作者: shock
回复: Meta: 它电池包都把后盖顶起来了 消息电池爆炸或者自燃哦
时间: Tue, 24 Jun 2025 10:09:57 +0000
作者: 怪怪的科长
回复: 实在不能用了再换,现在的手机是19年买的红米。
时间: Tue, 24 Jun 2025 10:23:17 +0000
作者: 风之蓝
回复: 快五年了! 总结 (click for more details)
时间: Tue, 24 Jun 2025 10:26:36 +0000
作者: 凌好好
回复: 三年就好
时间: Tue, 24 Jun 2025 10:28:16 +0000
作者: 合本丶
回复: 这次等17出就换17pro了,我现在的12mini续航已经崩到不能再崩了,健康度只有68%,日常刷刷也是卡到不行
时间: Tue, 24 Jun 2025 10:30:27 +0000
作者: kbtit_25
回复: 不玩手游,坏了才换,不然顶多换电池
时间: Tue, 24 Jun 2025 10:34:34 +0000
链接: https://linux.do/t/topic/747113/30
作者: Mailkoo
内容: iPhone XR还在用
时间: Tue, 24 Jun 2025 09:11:53 +0000
作者: 大帅哥
回复: 四五年了还在用
时间: Tue, 24 Jun 2025 09:12:41 +0000
作者: darkbfly
回复: 用坏了才换 哈哈哈
时间: Tue, 24 Jun 2025 09:13:12 +0000
作者: 方块AI
回复: iPhone 什么时候出我想买的什么时候换,上次换是因为灵动岛
时间: Tue, 24 Jun 2025 09:13:16 +0000
作者: CodeWu
回复: 目前手机在手2年多了,等mate 80pro
时间: Tue, 24 Jun 2025 09:13:18 +0000
作者: 9C
回复: 不坏不换
时间: Tue, 24 Jun 2025 09:13:21 +0000
作者: shock
回复: 不坏不换 华为meta20 用到现在了
时间: Tue, 24 Jun 2025 09:13:52 +0000
作者: darksora502
回复: 以前是年年换,从21年买了13PM后,上个月才换了16PM,直接就变成3年半一换了。
时间: Tue, 24 Jun 2025 09:13:57 +0000
作者: Meta
回复: 这么说吧,我初中的时候,那台苹果5s,它电池包都把后盖顶起来了,后盖板的封胶都失效了,能看到里面的电器元件了,屏幕左上角已经有黑点了,但!我还是用了1个月,最后是我妈看不下去,换了自己的手机,把老的给了我,现在想想,那个时候,是真难杀,新手保护了,属于是
时间: Tue, 24 Jun 2025 09:15:16 +0000
作者: 齐天大圣
回复: 安卓两三年就得换了
时间: Tue, 24 Jun 2025 09:23:30 +0000
作者: 一颗小鸡蛋
回复: 平均三年吧
时间: Tue, 24 Jun 2025 09:41:18 +0000
作者: GMYXDS
回复: 4-5年
时间: Tue, 24 Jun 2025 09:49:57 +0000
作者: 嘎蹦咔咔
回复: 三四年吧 QwQ 一般都是有大事件才换 比如毕业
时间: Tue, 24 Jun 2025 09:50:29 +0000
作者: 思聪.王
回复: 3年,用的用不动了就换。下次更换需要esim出现
时间: Tue, 24 Jun 2025 09:51:17 +0000
作者: JayXuZ
回复: 快5年了 说实话,除了相机跟不上时代了,其他完全感觉不到换的理由 每天就刷个视频,看个小说,完全没有换的必要 我又是个扫码用户,基本不拍照,所以也不打算换
时间: Tue, 24 Jun 2025 09:54:42 +0000
作者: coveydzblrsjlay
回复: 和存储空间有关. 我目前使用时间最久的是一台16+1T的红米千元机. 更贵的机器反而用的没这台久.
时间: Tue, 24 Jun 2025 09:58:19 +0000
作者: Aumae
回复: 坏了并且口袋里有钱,或者坏了并且白条24期免息才会换。
时间: Tue, 24 Jun 2025 10:02:10 +0000
作者: wood
回复: 才毕业的时候基本上一年一换, 现在 到不怎么换手机了, 毕业的时候好像是 小米10u, 然后换了iphone 13,再然后就换了小米 14pro,目前用了 1年半 还没换
时间: Tue, 24 Jun 2025 10:03:34 +0000
作者: 冬濑
回复: 基本都是用到坏,或者实在是卡顿的不行才换。 ₍^˶ ╸𖥦 ╸˵^₎⟆
时间: Tue, 24 Jun 2025 10:06:04 +0000
作者: shock
回复: Meta: 它电池包都把后盖顶起来了 消息电池爆炸或者自燃哦
时间: Tue, 24 Jun 2025 10:09:57 +0000
作者: 怪怪的科长
回复: 实在不能用了再换,现在的手机是19年买的红米。
时间: Tue, 24 Jun 2025 10:23:17 +0000
作者: 风之蓝
回复: 快五年了! 总结 (click for more details)
时间: Tue, 24 Jun 2025 10:26:36 +0000
作者: 凌好好
回复: 三年就好
时间: Tue, 24 Jun 2025 10:28:16 +0000
作者: 合本丶
回复: 这次等17出就换17pro了,我现在的12mini续航已经崩到不能再崩了,健康度只有68%,日常刷刷也是卡到不行
时间: Tue, 24 Jun 2025 10:30:27 +0000
作者: kbtit_25
回复: 不玩手游,坏了才换,不然顶多换电池
时间: Tue, 24 Jun 2025 10:34:34 +0000
链接: https://linux.do/t/topic/747113/30
LINUX DO
大家手机都多久换一次
和存储空间有关. 我目前使用时间最久的是一台16+1T的红米千元机. 更贵的机器反而用的没这台久.
okens_to_million(row["total_tokens"]) print( f"{token_display}{' ' * (col_token_name_width - get_display_width(token_display))}" f"{req_count}{' ' * (col_token_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_model_stats(cursor, where_clause, params): """获取模型统计数据""" print("\n" + "=" * 36 + " 模型统计 " + "=" * 36) final_params = list(params) final_where_clause = where_clause + " AND l.model_name != ''" query_model = f""" SELECT l.model_name, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.model_name ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_model, final_params) model_stats = cursor.fetchall() col_model_name_width = 42 col_req_width = 20 col_tokens_width = 20 header_model_name = "模型名称" header_req = "请求次数" header_tokens = "消耗Tokens" print( f"{header_model_name}{' ' * (col_model_name_width - get_display_width(header_model_name))}" f"{header_req}{' ' * (col_req_width - get_display_width(header_req))}" f"{header_tokens}" ) print("-" * (col_model_name_width + col_req_width + col_tokens_width)) for row in model_stats: model_display = row["model_name"] req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{model_display}{' ' * (col_model_name_width - get_display_width(model_display))}" f"{req_count}{' ' * (col_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_ip_stats(cursor, where_clause, params): """获取IP统计数据""" print("\n" + "=" * 37 + " IP统计 " + "=" * 37) final_params = list(params) final_where_clause = where_clause + " AND l.ip IS NOT NULL AND l.ip != ''" query_ip = f""" SELECT l.ip, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.ip ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_ip, final_params) ip_stats = cursor.fetchall() col_ip_name_width = 42 col_req_width = 20 col_tokens_width = 20 header_ip_name = "IP地址" header_req = "请求次数" header_tokens = "消耗Tokens" print( f"{header_ip_name}{' ' * (col_ip_name_width - get_display_width(header_ip_name))}" f"{header_req}{' ' * (col_req_width - get_display_width(header_req))}" f"{header_tokens}" ) print("-" * (col_ip_name_width + col_req_width + col_tokens_width)) for row in ip_stats: ip_display = row["ip"] req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{ip_display}{' ' * (col_ip_name_width - get_display_width(ip_display))}" f"{req_count}{' ' * (col_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def generate_report(cli_args=None): """主函数,执行所有统计和报告生成任务""" connection = get_db_connection() if not connection: return cursor = None try: cursor = connection.cursor(dictionary=True) where_clause = "" params = () # --- 动态生成错误过滤条件 --- error_filter_clause = "" error_filter_params = [] if IGNORED_ERROR_PATTERNS: for pattern in IGNORED_ERROR_PATTERNS: error_filter_clause += " AND l.content NOT LIKE %s" error_filter_params.append(f"%{pattern}%") print(f"\n报告生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if not cli_args: # Default to last 24 hours if no arguments hours = 24 start_time = datetime.now() - timedelta(hours=hours) where_clause = "WHERE l.created_at >= %s" params = (int(start_time.timestamp()),) print(f"查询模式: 默认最近 {hours} 小时") print(f"查询时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 至今") else: print("查询模式: 自定义时间范围") start_time, end_time = None, None # Case 1: Integer for hours if len(cli_args) == 1: try: hours = int(cli_args[0]) if hours <= 0: print("错误: 小时数必须为正整数。") return start_time = datetime.now() - timedelta(hours=hours) where_clause = "WHERE l.created_at >= %s" params = (int(start_time.timestamp()),) print( f"查询时间范围: 最近 {hours} 小时 ({start_time.strftime('%Y-%m-%d %H:%M:%S')} 至今)" ) except ValueError: # Not an integer, treat as start time string start_time = parse_time_string(cli_args[0]) i
标题: 【T佬】New-API站长都可以用的统计脚本
作者: 唐洛
内容: # -*- coding: utf-8 -*- import mysql.connector import sys from datetime import datetime, timedelta from decimal import Decimal # --- 可配置区域 --- # 1. 数据库连接信息 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "123456", "database": "new-api", } # 2. 错误率统计时要忽略的错误内容关键字 IGNORED_ERROR_PATTERNS = [ "the maximum number of tokens", "user quota is not enough", ] # --- 辅助函数 --- def get_display_width(s): """计算字符串的显示宽度,中文字符计为2,英文字符计为1""" width = 0 for char in str(s): # 确保输入是字符串 if "\u4e00" <= char <= "\u9fff": width += 2 else: width += 1 return width def format_tokens_to_million(tokens): """将token数量格式化为百万单位(m),保留两位小数""" if not isinstance(tokens, (int, float, Decimal)): return "0.00m" return f"{float(tokens) / 1_000_000:.2f}m" def parse_time_string(time_str): """ 解析多种格式的时间字符串,返回 datetime 对象。 支持格式: Y-m-d H:M:S, Y-m-d H:M, Y-m-d, H:M, m-d H:M """ now = datetime.now() formats = [ "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M", "%Y-%m-%d", "%H:%M", "%H:%M:%S", "%m-%d %H:%M", ] for fmt in formats: try: if fmt in ["%H:%M", "%H:%M:%S"]: dt = datetime.strptime(time_str, fmt) return now.replace( hour=dt.hour, minute=dt.minute, second=dt.second, microsecond=0 ) if fmt == "%m-%d %H:%M": dt = datetime.strptime(time_str, fmt) return dt.replace(year=now.year) dt = datetime.strptime(time_str, fmt) return dt except ValueError: continue return None # --- 脚本核心功能 --- def get_db_connection(): """根据 DB_CONFIG 建立并返回数据库连接""" try: connection = mysql.connector.connect(**DB_CONFIG) return connection except mysql.connector.Error as err: print(f"数据库连接失败: {err}") return None def get_user_stats(cursor, where_clause, params): """获取用户统计数据""" print("\n" + "=" * 36 + " 用户统计 " + "=" * 36) query_user = f""" SELECT l.user_id, l.username, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {where_clause} GROUP BY l.user_id, l.username ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_user, params) user_stats = cursor.fetchall() col_user_name_width = 42 col_user_req_width = 20 col_user_tokens_width = 20 header_user_name = "用户名(ID)" header_user_req = "请求次数" header_user_tokens = "消耗Tokens" print( f"{header_user_name}{' ' * (col_user_name_width - get_display_width(header_user_name))}" f"{header_user_req}{' ' * (col_user_req_width - get_display_width(header_user_req))}" f"{header_user_tokens}" ) print("-" * (col_user_name_width + col_user_req_width + col_user_tokens_width)) for row in user_stats: user_display = f"{row['username']}({row['user_id']})" req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{user_display}{' ' * (col_user_name_width - get_display_width(user_display))}" f"{req_count}{' ' * (col_user_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_token_stats(cursor, where_clause, params): """获取Token统计数据""" print("\n" + "=" * 36 + " Token统计 " + "=" * 35) final_params = list(params) final_where_clause = where_clause + " AND l.token_name != ''" query_token = f""" SELECT l.token_id, l.token_name, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.token_id, l.token_name ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_token, final_params) token_stats = cursor.fetchall() col_token_name_width = 42 col_token_req_width = 20 col_token_tokens_width = 20 header_token_name = "Token名称(ID)" header_token_req = "请求次数" header_token_tokens = "消耗Tokens" print( f"{header_token_name}{' ' * (col_token_name_width - get_display_width(header_token_name))}" f"{header_token_req}{' ' * (col_token_req_width - get_display_width(header_token_req))}" f"{header_token_tokens}" ) print("-" * (col_token_name_width + col_token_req_width + col_token_tokens_width)) for row in token_stats: token_display = f"{row['token_name']}({row['token_id']})" req_count = str(row["request_count"]) tokens_val = format_t
作者: 唐洛
内容: # -*- coding: utf-8 -*- import mysql.connector import sys from datetime import datetime, timedelta from decimal import Decimal # --- 可配置区域 --- # 1. 数据库连接信息 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "123456", "database": "new-api", } # 2. 错误率统计时要忽略的错误内容关键字 IGNORED_ERROR_PATTERNS = [ "the maximum number of tokens", "user quota is not enough", ] # --- 辅助函数 --- def get_display_width(s): """计算字符串的显示宽度,中文字符计为2,英文字符计为1""" width = 0 for char in str(s): # 确保输入是字符串 if "\u4e00" <= char <= "\u9fff": width += 2 else: width += 1 return width def format_tokens_to_million(tokens): """将token数量格式化为百万单位(m),保留两位小数""" if not isinstance(tokens, (int, float, Decimal)): return "0.00m" return f"{float(tokens) / 1_000_000:.2f}m" def parse_time_string(time_str): """ 解析多种格式的时间字符串,返回 datetime 对象。 支持格式: Y-m-d H:M:S, Y-m-d H:M, Y-m-d, H:M, m-d H:M """ now = datetime.now() formats = [ "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M", "%Y-%m-%d", "%H:%M", "%H:%M:%S", "%m-%d %H:%M", ] for fmt in formats: try: if fmt in ["%H:%M", "%H:%M:%S"]: dt = datetime.strptime(time_str, fmt) return now.replace( hour=dt.hour, minute=dt.minute, second=dt.second, microsecond=0 ) if fmt == "%m-%d %H:%M": dt = datetime.strptime(time_str, fmt) return dt.replace(year=now.year) dt = datetime.strptime(time_str, fmt) return dt except ValueError: continue return None # --- 脚本核心功能 --- def get_db_connection(): """根据 DB_CONFIG 建立并返回数据库连接""" try: connection = mysql.connector.connect(**DB_CONFIG) return connection except mysql.connector.Error as err: print(f"数据库连接失败: {err}") return None def get_user_stats(cursor, where_clause, params): """获取用户统计数据""" print("\n" + "=" * 36 + " 用户统计 " + "=" * 36) query_user = f""" SELECT l.user_id, l.username, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {where_clause} GROUP BY l.user_id, l.username ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_user, params) user_stats = cursor.fetchall() col_user_name_width = 42 col_user_req_width = 20 col_user_tokens_width = 20 header_user_name = "用户名(ID)" header_user_req = "请求次数" header_user_tokens = "消耗Tokens" print( f"{header_user_name}{' ' * (col_user_name_width - get_display_width(header_user_name))}" f"{header_user_req}{' ' * (col_user_req_width - get_display_width(header_user_req))}" f"{header_user_tokens}" ) print("-" * (col_user_name_width + col_user_req_width + col_user_tokens_width)) for row in user_stats: user_display = f"{row['username']}({row['user_id']})" req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{user_display}{' ' * (col_user_name_width - get_display_width(user_display))}" f"{req_count}{' ' * (col_user_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_token_stats(cursor, where_clause, params): """获取Token统计数据""" print("\n" + "=" * 36 + " Token统计 " + "=" * 35) final_params = list(params) final_where_clause = where_clause + " AND l.token_name != ''" query_token = f""" SELECT l.token_id, l.token_name, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.token_id, l.token_name ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_token, final_params) token_stats = cursor.fetchall() col_token_name_width = 42 col_token_req_width = 20 col_token_tokens_width = 20 header_token_name = "Token名称(ID)" header_token_req = "请求次数" header_token_tokens = "消耗Tokens" print( f"{header_token_name}{' ' * (col_token_name_width - get_display_width(header_token_name))}" f"{header_token_req}{' ' * (col_token_req_width - get_display_width(header_token_req))}" f"{header_token_tokens}" ) print("-" * (col_token_name_width + col_token_req_width + col_token_tokens_width)) for row in token_stats: token_display = f"{row['token_name']}({row['token_id']})" req_count = str(row["request_count"]) tokens_val = format_t
f not start_time: print(f"错误: 无法解析时间字符串 '{cli_args[0]}'") return where_clause = "WHERE l.created_at >= %s" params = (int(start_time.timestamp()),) print( f"查询时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 至今" ) # Case 2: Two time strings elif len(cli_args) == 2: start_time = parse_time_string(cli_args[0]) end_time = parse_time_string(cli_args[1]) if not start_time or not end_time: if not start_time: print(f"错误: 无法解析开始时间字符串 '{cli_args[0]}'") if not end_time: print(f"错误: 无法解析结束时间字符串 '{cli_args[1]}'") return if start_time >= end_time: print("错误: 开始时间必须早于结束时间。") return where_clause = "WHERE l.created_at >= %s AND l.created_at <= %s" params = (int(start_time.timestamp()), int(end_time.timestamp())) print( f"查询时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 至 {end_time.strftime('%Y-%m-%d %H:%M:%S')}" ) else: print("错误: 参数数量过多。最多支持两个时间范围参数。") return # --- 生成报告 --- print("\n" + "=" * 52 + " 总览 " + "=" * 51) query_total = f""" SELECT COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens, COUNT(l.id) as total_requests, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as error_429_count, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content NOT LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as normal_error_count FROM logs l {where_clause} """ final_params_total = error_filter_params + error_filter_params + list(params) cursor.execute(query_total, final_params_total) total_stats = cursor.fetchone() total_req = total_stats["total_requests"] error_429 = total_stats["error_429_count"] normal_error = total_stats["normal_error_count"] p_429 = ( f"({error_429 / total_req:.1%})" if total_req and total_req > 0 else "(0.0%)" ) p_normal = ( f"({normal_error / total_req:.1%})" if total_req and total_req > 0 else "(0.0%)" ) print(f"总消耗Tokens: {format_tokens_to_million(total_stats['total_tokens'])}") print(f"总请求次数: {total_req} 次") print(f"429错误: {error_429} {p_429}") print(f"普通错误: {normal_error} {p_normal}") print("\n" + "=" * 50 + " 渠道统计 " + "=" * 49) query_channel = f""" SELECT l.channel_id, c.name as channel_name, COUNT(l.id) as total_requests, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as error_429_count, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content NOT LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as normal_error_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l LEFT JOIN channels c ON l.channel_id = c.id {where_clause} GROUP BY l.channel_id, c.name HAVING COUNT(l.id) >= 10 ORDER BY total_requests DESC """ final_params_channel = error_filter_params + error_filter_params + list(params) cursor.execute(query_channel, final_params_channel) channel_stats = cursor.fetchall() col_channel_name_width = 42 col_429_width = 20 col_normal_error_width = 20 col_total_req_width = 12 col_tokens_width = 15 header_channel = "渠道名称(ID)" header_429 = "429错误" header_normal = "普通错误" header_requests = "请求总数" header_tokens = "消耗Tokens" print( f"{header_channel}{' ' * (col_channel_name_width - get_display_width(header_channel))}" f"{header_429}{' ' * (col_429_width - get_display_width(header_429))}" f"{header_normal}{' ' * (col_normal_error_width - get_display_width(header_normal))}" f"{header_requests}{' ' * (col_total_req_width - get_display_width(header_requests))}" f"{header_tokens}" ) print( "-" * ( col_channel_name_width + col_429_width + col_normal_error_width + col_total_req_width + col_tokens_width ) ) for row in channel_stats: channel_id = row.get("channel_id", "N/A") channel_name_raw = row.get("channel_name") or "未知渠道" channel_name = f"{channel_name_raw}({channel_id})" total_req = row["total_requests"] error_429 = row["
error_429_count"] normal_error = row["normal_error_count"] p_429 = f"({error_429 / total_req:.1%})" if total_req > 0 else "(0.0%)" p_normal = ( f"({normal_error / total_req:.1%})" if total_req > 0 else "(0.0%)" ) col1_val = channel_name col2_val = f"{error_429} {p_429}" col3_val = f"{normal_error} {p_normal}" col4_val = str(total_req) col5_val = format_tokens_to_million(row["total_tokens"]) print( f"{col1_val}{' ' * (col_channel_name_width - get_display_width(col1_val))}" f"{col2_val}{' ' * (col_429_width - get_display_width(col2_val))}" f"{col3_val}{' ' * (col_normal_error_width - get_display_width(col3_val))}" f"{col4_val}{' ' * (col_total_req_width - get_display_width(col4_val))}" f"{col5_val}" ) get_user_stats(cursor, where_clause, params) get_token_stats(cursor, where_clause, params) get_model_stats(cursor, where_clause, params) get_ip_stats(cursor, where_clause, params) except mysql.connector.Error as err: print(f"报告生成过程中发生数据库错误: {err}") except Exception as e: print(f"发生未知错误: {e}") finally: if connection and connection.is_connected(): if cursor: cursor.close() connection.close() if __name__ == "__main__": generate_report(cli_args=sys.argv[1:]) 介绍 这个脚本可以用于New API的MySQL数据库统计,渠道错误率、429率,用户|Key|IP统计。 便于站长查看用量以及排查滥用清空。 SQLite数据库没有支持,有需要简单让AI改改应该就可以用。 不确定N佬的Veloera是否兼容,没有验证。 效果截图 (click for more details) 使用方法 New API开启了错误日志,相关配置:ERROR_LOG_ENABLED=true。 安装Python环境,并保存上面代码为main.py文件。 修改代码第10行DB_CONFIG变量为你的MySQL配置。 执行命令安装依赖:pip install mysql-connector-python。 执行查询命令:python main.py。 参数说明 脚本支持多种时间范围查询: 不带任何参数,默认查询24小时:python main.py。 查询2小时内数据:python main.py 2。 查询具体时间到现在:python main.py 2021-01-01 查询日期范围:python main.py "2021-01-01 11:11" "2021-02-02 22:22" 支持多种时间格式:01-01, 2021-01-01, 2021-01-01 11:11,2021-01-01 11:00, 11:11, 01-01 11:11 我自用的版本要更复杂一点:标记查询状态定时执行,检查到错误率到达阈值警通知到我的slack。但由于通用性不强,就改了个精简版本分享给大家。 欢迎各位大佬纠错以及完善这个脚本。
时间: Tue, 24 Jun 2025 08:40:15 +0000
作者: 方块AI
回复: 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:40:24 +0000
作者: 唐洛
回复: 这么快么,我才点完发布就刷新页面就看到你评论了,太强了!!!
时间: Tue, 24 Jun 2025 08:40:53 +0000
作者: 大黄叫汪汪
回复: 为什么你可以这么快哦
时间: Tue, 24 Jun 2025 08:40:57 +0000
作者: YsGod
回复: 支持支持
时间: Tue, 24 Jun 2025 08:41:09 +0000
作者: 云馨
回复: 方块好快,我刚弹通知,
时间: Tue, 24 Jun 2025 08:41:11 +0000
作者: ZhangJin
回复: 方块也是逆天
时间: Tue, 24 Jun 2025 08:41:11 +0000
作者: aquarz
回复: 比不过比不过,关注的都比不过,还是ai速度快啊
时间: Tue, 24 Jun 2025 08:41:22 +0000
作者: 歌白尼
回复: 方块AI: 感谢分享!支持 T 佬! 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:41:28 +0000
作者: nibbin
回复: 太快不好
时间: Tue, 24 Jun 2025 08:41:40 +0000
作者: 白桃
回复: 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:41:45 +0000
作者: alhz
回复: 前排不了了,那就后排吧
时间: Tue, 24 Jun 2025 08:41:47 +0000
作者: 方块AI
回复: 该快快,该慢慢
时间: Tue, 24 Jun 2025 08:42:04 +0000
作者: 桢桢
回复: 前排支持T佬!
时间: Tue, 24 Jun 2025 08:42:17 +0000
作者: Venis
回复: 支持T佬,连续两回T佬发帖,就看到了。但是都不是公益激活码,希望发激活码的时候也能马上看到
时间: Tue, 24 Jun 2025 08:42:44 +0000
作者: shock
回复: 严重怀疑方块现在是集群水贴。快的不行。
时间: Tue, 24 Jun 2025 08:43:20 +0000
作者: 唐洛
回复: 毕竟新版本,算力提高了不少。
时间: Tue, 24 Jun 2025 08:43:40 +0000
作者: cp
回复: 炫酷!!! 可惜没有自己搭的,
时间: Tue, 24 Jun 2025 08:47:58 +0000
作者: 大帅哥
回复: 你也太强了!
时间: Tue, 24 Jun 2025 09:02:48 +0000
作者: York Ji
回复: 感谢分享!
时间: Tue, 24 Jun 2025 09:17:17 +0000
作者: edinik
回复: 立即使用
时间: Tue, 24 Jun 2025 10:33:23 +0000
链接: https://linux.do/t/topic/747057/22
时间: Tue, 24 Jun 2025 08:40:15 +0000
作者: 方块AI
回复: 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:40:24 +0000
作者: 唐洛
回复: 这么快么,我才点完发布就刷新页面就看到你评论了,太强了!!!
时间: Tue, 24 Jun 2025 08:40:53 +0000
作者: 大黄叫汪汪
回复: 为什么你可以这么快哦
时间: Tue, 24 Jun 2025 08:40:57 +0000
作者: YsGod
回复: 支持支持
时间: Tue, 24 Jun 2025 08:41:09 +0000
作者: 云馨
回复: 方块好快,我刚弹通知,
时间: Tue, 24 Jun 2025 08:41:11 +0000
作者: ZhangJin
回复: 方块也是逆天
时间: Tue, 24 Jun 2025 08:41:11 +0000
作者: aquarz
回复: 比不过比不过,关注的都比不过,还是ai速度快啊
时间: Tue, 24 Jun 2025 08:41:22 +0000
作者: 歌白尼
回复: 方块AI: 感谢分享!支持 T 佬! 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:41:28 +0000
作者: nibbin
回复: 太快不好
时间: Tue, 24 Jun 2025 08:41:40 +0000
作者: 白桃
回复: 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:41:45 +0000
作者: alhz
回复: 前排不了了,那就后排吧
时间: Tue, 24 Jun 2025 08:41:47 +0000
作者: 方块AI
回复: 该快快,该慢慢
时间: Tue, 24 Jun 2025 08:42:04 +0000
作者: 桢桢
回复: 前排支持T佬!
时间: Tue, 24 Jun 2025 08:42:17 +0000
作者: Venis
回复: 支持T佬,连续两回T佬发帖,就看到了。但是都不是公益激活码,希望发激活码的时候也能马上看到
时间: Tue, 24 Jun 2025 08:42:44 +0000
作者: shock
回复: 严重怀疑方块现在是集群水贴。快的不行。
时间: Tue, 24 Jun 2025 08:43:20 +0000
作者: 唐洛
回复: 毕竟新版本,算力提高了不少。
时间: Tue, 24 Jun 2025 08:43:40 +0000
作者: cp
回复: 炫酷!!! 可惜没有自己搭的,
时间: Tue, 24 Jun 2025 08:47:58 +0000
作者: 大帅哥
回复: 你也太强了!
时间: Tue, 24 Jun 2025 09:02:48 +0000
作者: York Ji
回复: 感谢分享!
时间: Tue, 24 Jun 2025 09:17:17 +0000
作者: edinik
回复: 立即使用
时间: Tue, 24 Jun 2025 10:33:23 +0000
链接: https://linux.do/t/topic/747057/22
LINUX DO
【T佬】New-API站长都可以用的统计脚本
立即使用 🫡
标题: 【T佬】New-API站长都可以用的统计脚本
作者: 唐洛
内容: # -*- coding: utf-8 -*- import mysql.connector import sys from datetime import datetime, timedelta from decimal import Decimal # --- 可配置区域 --- # 1. 数据库连接信息 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "123456", "database": "new-api", } # 2. 错误率统计时要忽略的错误内容关键字 IGNORED_ERROR_PATTERNS = [ "the maximum number of tokens", "user quota is not enough", ] # --- 辅助函数 --- def get_display_width(s): """计算字符串的显示宽度,中文字符计为2,英文字符计为1""" width = 0 for char in str(s): # 确保输入是字符串 if "\u4e00" <= char <= "\u9fff": width += 2 else: width += 1 return width def format_tokens_to_million(tokens): """将token数量格式化为百万单位(m),保留两位小数""" if not isinstance(tokens, (int, float, Decimal)): return "0.00m" return f"{float(tokens) / 1_000_000:.2f}m" def parse_time_string(time_str): """ 解析多种格式的时间字符串,返回 datetime 对象。 支持格式: Y-m-d H:M:S, Y-m-d H:M, Y-m-d, H:M, m-d H:M """ now = datetime.now() formats = [ "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M", "%Y-%m-%d", "%H:%M", "%H:%M:%S", "%m-%d %H:%M", ] for fmt in formats: try: if fmt in ["%H:%M", "%H:%M:%S"]: dt = datetime.strptime(time_str, fmt) return now.replace( hour=dt.hour, minute=dt.minute, second=dt.second, microsecond=0 ) if fmt == "%m-%d %H:%M": dt = datetime.strptime(time_str, fmt) return dt.replace(year=now.year) dt = datetime.strptime(time_str, fmt) return dt except ValueError: continue return None # --- 脚本核心功能 --- def get_db_connection(): """根据 DB_CONFIG 建立并返回数据库连接""" try: connection = mysql.connector.connect(**DB_CONFIG) return connection except mysql.connector.Error as err: print(f"数据库连接失败: {err}") return None def get_user_stats(cursor, where_clause, params): """获取用户统计数据""" print("\n" + "=" * 36 + " 用户统计 " + "=" * 36) query_user = f""" SELECT l.user_id, l.username, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {where_clause} GROUP BY l.user_id, l.username ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_user, params) user_stats = cursor.fetchall() col_user_name_width = 42 col_user_req_width = 20 col_user_tokens_width = 20 header_user_name = "用户名(ID)" header_user_req = "请求次数" header_user_tokens = "消耗Tokens" print( f"{header_user_name}{' ' * (col_user_name_width - get_display_width(header_user_name))}" f"{header_user_req}{' ' * (col_user_req_width - get_display_width(header_user_req))}" f"{header_user_tokens}" ) print("-" * (col_user_name_width + col_user_req_width + col_user_tokens_width)) for row in user_stats: user_display = f"{row['username']}({row['user_id']})" req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{user_display}{' ' * (col_user_name_width - get_display_width(user_display))}" f"{req_count}{' ' * (col_user_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_token_stats(cursor, where_clause, params): """获取Token统计数据""" print("\n" + "=" * 36 + " Token统计 " + "=" * 35) final_params = list(params) final_where_clause = where_clause + " AND l.token_name != ''" query_token = f""" SELECT l.token_id, l.token_name, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.token_id, l.token_name ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_token, final_params) token_stats = cursor.fetchall() col_token_name_width = 42 col_token_req_width = 20 col_token_tokens_width = 20 header_token_name = "Token名称(ID)" header_token_req = "请求次数" header_token_tokens = "消耗Tokens" print( f"{header_token_name}{' ' * (col_token_name_width - get_display_width(header_token_name))}" f"{header_token_req}{' ' * (col_token_req_width - get_display_width(header_token_req))}" f"{header_token_tokens}" ) print("-" * (col_token_name_width + col_token_req_width + col_token_tokens_width)) for row in token_stats: token_display = f"{row['token_name']}({row['token_id']})" req_count = str(row["request_count"]) tokens_val = format_t
作者: 唐洛
内容: # -*- coding: utf-8 -*- import mysql.connector import sys from datetime import datetime, timedelta from decimal import Decimal # --- 可配置区域 --- # 1. 数据库连接信息 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "123456", "database": "new-api", } # 2. 错误率统计时要忽略的错误内容关键字 IGNORED_ERROR_PATTERNS = [ "the maximum number of tokens", "user quota is not enough", ] # --- 辅助函数 --- def get_display_width(s): """计算字符串的显示宽度,中文字符计为2,英文字符计为1""" width = 0 for char in str(s): # 确保输入是字符串 if "\u4e00" <= char <= "\u9fff": width += 2 else: width += 1 return width def format_tokens_to_million(tokens): """将token数量格式化为百万单位(m),保留两位小数""" if not isinstance(tokens, (int, float, Decimal)): return "0.00m" return f"{float(tokens) / 1_000_000:.2f}m" def parse_time_string(time_str): """ 解析多种格式的时间字符串,返回 datetime 对象。 支持格式: Y-m-d H:M:S, Y-m-d H:M, Y-m-d, H:M, m-d H:M """ now = datetime.now() formats = [ "%Y-%m-%d %H:%M:%S", "%Y-%m-%d %H:%M", "%Y-%m-%d", "%H:%M", "%H:%M:%S", "%m-%d %H:%M", ] for fmt in formats: try: if fmt in ["%H:%M", "%H:%M:%S"]: dt = datetime.strptime(time_str, fmt) return now.replace( hour=dt.hour, minute=dt.minute, second=dt.second, microsecond=0 ) if fmt == "%m-%d %H:%M": dt = datetime.strptime(time_str, fmt) return dt.replace(year=now.year) dt = datetime.strptime(time_str, fmt) return dt except ValueError: continue return None # --- 脚本核心功能 --- def get_db_connection(): """根据 DB_CONFIG 建立并返回数据库连接""" try: connection = mysql.connector.connect(**DB_CONFIG) return connection except mysql.connector.Error as err: print(f"数据库连接失败: {err}") return None def get_user_stats(cursor, where_clause, params): """获取用户统计数据""" print("\n" + "=" * 36 + " 用户统计 " + "=" * 36) query_user = f""" SELECT l.user_id, l.username, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {where_clause} GROUP BY l.user_id, l.username ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_user, params) user_stats = cursor.fetchall() col_user_name_width = 42 col_user_req_width = 20 col_user_tokens_width = 20 header_user_name = "用户名(ID)" header_user_req = "请求次数" header_user_tokens = "消耗Tokens" print( f"{header_user_name}{' ' * (col_user_name_width - get_display_width(header_user_name))}" f"{header_user_req}{' ' * (col_user_req_width - get_display_width(header_user_req))}" f"{header_user_tokens}" ) print("-" * (col_user_name_width + col_user_req_width + col_user_tokens_width)) for row in user_stats: user_display = f"{row['username']}({row['user_id']})" req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{user_display}{' ' * (col_user_name_width - get_display_width(user_display))}" f"{req_count}{' ' * (col_user_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_token_stats(cursor, where_clause, params): """获取Token统计数据""" print("\n" + "=" * 36 + " Token统计 " + "=" * 35) final_params = list(params) final_where_clause = where_clause + " AND l.token_name != ''" query_token = f""" SELECT l.token_id, l.token_name, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.token_id, l.token_name ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_token, final_params) token_stats = cursor.fetchall() col_token_name_width = 42 col_token_req_width = 20 col_token_tokens_width = 20 header_token_name = "Token名称(ID)" header_token_req = "请求次数" header_token_tokens = "消耗Tokens" print( f"{header_token_name}{' ' * (col_token_name_width - get_display_width(header_token_name))}" f"{header_token_req}{' ' * (col_token_req_width - get_display_width(header_token_req))}" f"{header_token_tokens}" ) print("-" * (col_token_name_width + col_token_req_width + col_token_tokens_width)) for row in token_stats: token_display = f"{row['token_name']}({row['token_id']})" req_count = str(row["request_count"]) tokens_val = format_t
error_429_count"] normal_error = row["normal_error_count"] p_429 = f"({error_429 / total_req:.1%})" if total_req > 0 else "(0.0%)" p_normal = ( f"({normal_error / total_req:.1%})" if total_req > 0 else "(0.0%)" ) col1_val = channel_name col2_val = f"{error_429} {p_429}" col3_val = f"{normal_error} {p_normal}" col4_val = str(total_req) col5_val = format_tokens_to_million(row["total_tokens"]) print( f"{col1_val}{' ' * (col_channel_name_width - get_display_width(col1_val))}" f"{col2_val}{' ' * (col_429_width - get_display_width(col2_val))}" f"{col3_val}{' ' * (col_normal_error_width - get_display_width(col3_val))}" f"{col4_val}{' ' * (col_total_req_width - get_display_width(col4_val))}" f"{col5_val}" ) get_user_stats(cursor, where_clause, params) get_token_stats(cursor, where_clause, params) get_model_stats(cursor, where_clause, params) get_ip_stats(cursor, where_clause, params) except mysql.connector.Error as err: print(f"报告生成过程中发生数据库错误: {err}") except Exception as e: print(f"发生未知错误: {e}") finally: if connection and connection.is_connected(): if cursor: cursor.close() connection.close() if __name__ == "__main__": generate_report(cli_args=sys.argv[1:]) 介绍 这个脚本可以用于New API的MySQL数据库统计,渠道错误率、429率,用户|Key|IP统计。 便于站长查看用量以及排查滥用清空。 SQLite数据库没有支持,有需要简单让AI改改应该就可以用。 不确定N佬的Veloera是否兼容,没有验证。 效果截图 (click for more details) 使用方法 New API开启了错误日志,相关配置:ERROR_LOG_ENABLED=true。 安装Python环境,并保存上面代码为main.py文件。 修改代码第10行DB_CONFIG变量为你的MySQL配置。 执行命令安装依赖:pip install mysql-connector-python。 执行查询命令:python main.py。 参数说明 脚本支持多种时间范围查询: 不带任何参数,默认查询24小时:python main.py。 查询2小时内数据:python main.py 2。 查询具体时间到现在:python main.py 2021-01-01 查询日期范围:python main.py "2021-01-01 11:11" "2021-02-02 22:22" 支持多种时间格式:01-01, 2021-01-01, 2021-01-01 11:11,2021-01-01 11:00, 11:11, 01-01 11:11 我自用的版本要更复杂一点:标记查询状态定时执行,检查到错误率到达阈值警通知到我的slack。但由于通用性不强,就改了个精简版本分享给大家。 欢迎各位大佬纠错以及完善这个脚本。
时间: Tue, 24 Jun 2025 08:40:15 +0000
作者: 方块AI
回复: 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:40:24 +0000
作者: 唐洛
回复: 这么快么,我才点完发布就刷新页面就看到你评论了,太强了!!!
时间: Tue, 24 Jun 2025 08:40:53 +0000
作者: 大黄叫汪汪
回复: 为什么你可以这么快哦
时间: Tue, 24 Jun 2025 08:40:57 +0000
作者: YsGod
回复: 支持支持
时间: Tue, 24 Jun 2025 08:41:09 +0000
作者: 云馨
回复: 方块好快,我刚弹通知,
时间: Tue, 24 Jun 2025 08:41:11 +0000
作者: ZhangJin
回复: 方块也是逆天
时间: Tue, 24 Jun 2025 08:41:11 +0000
链接: https://linux.do/t/topic/747057/7
时间: Tue, 24 Jun 2025 08:40:15 +0000
作者: 方块AI
回复: 感谢分享!支持 T 佬!
时间: Tue, 24 Jun 2025 08:40:24 +0000
作者: 唐洛
回复: 这么快么,我才点完发布就刷新页面就看到你评论了,太强了!!!
时间: Tue, 24 Jun 2025 08:40:53 +0000
作者: 大黄叫汪汪
回复: 为什么你可以这么快哦
时间: Tue, 24 Jun 2025 08:40:57 +0000
作者: YsGod
回复: 支持支持
时间: Tue, 24 Jun 2025 08:41:09 +0000
作者: 云馨
回复: 方块好快,我刚弹通知,
时间: Tue, 24 Jun 2025 08:41:11 +0000
作者: ZhangJin
回复: 方块也是逆天
时间: Tue, 24 Jun 2025 08:41:11 +0000
链接: https://linux.do/t/topic/747057/7
LINUX DO
【T佬】New-API站长都可以用的统计脚本
# -*- coding: utf-8 -*- import mysql.connector import sys from datetime import datetime, timedelta from decimal import Decimal # --- 可配置区域 --- # 1. 数据库连接信息 DB_CONFIG = { "host": "127.0.0.1", "port": 3306, "user": "root", "password": "123456"…
okens_to_million(row["total_tokens"]) print( f"{token_display}{' ' * (col_token_name_width - get_display_width(token_display))}" f"{req_count}{' ' * (col_token_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_model_stats(cursor, where_clause, params): """获取模型统计数据""" print("\n" + "=" * 36 + " 模型统计 " + "=" * 36) final_params = list(params) final_where_clause = where_clause + " AND l.model_name != ''" query_model = f""" SELECT l.model_name, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.model_name ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_model, final_params) model_stats = cursor.fetchall() col_model_name_width = 42 col_req_width = 20 col_tokens_width = 20 header_model_name = "模型名称" header_req = "请求次数" header_tokens = "消耗Tokens" print( f"{header_model_name}{' ' * (col_model_name_width - get_display_width(header_model_name))}" f"{header_req}{' ' * (col_req_width - get_display_width(header_req))}" f"{header_tokens}" ) print("-" * (col_model_name_width + col_req_width + col_tokens_width)) for row in model_stats: model_display = row["model_name"] req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{model_display}{' ' * (col_model_name_width - get_display_width(model_display))}" f"{req_count}{' ' * (col_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def get_ip_stats(cursor, where_clause, params): """获取IP统计数据""" print("\n" + "=" * 37 + " IP统计 " + "=" * 37) final_params = list(params) final_where_clause = where_clause + " AND l.ip IS NOT NULL AND l.ip != ''" query_ip = f""" SELECT l.ip, COUNT(l.id) as request_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l {final_where_clause} GROUP BY l.ip ORDER BY request_count DESC LIMIT 5 """ cursor.execute(query_ip, final_params) ip_stats = cursor.fetchall() col_ip_name_width = 42 col_req_width = 20 col_tokens_width = 20 header_ip_name = "IP地址" header_req = "请求次数" header_tokens = "消耗Tokens" print( f"{header_ip_name}{' ' * (col_ip_name_width - get_display_width(header_ip_name))}" f"{header_req}{' ' * (col_req_width - get_display_width(header_req))}" f"{header_tokens}" ) print("-" * (col_ip_name_width + col_req_width + col_tokens_width)) for row in ip_stats: ip_display = row["ip"] req_count = str(row["request_count"]) tokens_val = format_tokens_to_million(row["total_tokens"]) print( f"{ip_display}{' ' * (col_ip_name_width - get_display_width(ip_display))}" f"{req_count}{' ' * (col_req_width - get_display_width(req_count))}" f"{tokens_val}" ) def generate_report(cli_args=None): """主函数,执行所有统计和报告生成任务""" connection = get_db_connection() if not connection: return cursor = None try: cursor = connection.cursor(dictionary=True) where_clause = "" params = () # --- 动态生成错误过滤条件 --- error_filter_clause = "" error_filter_params = [] if IGNORED_ERROR_PATTERNS: for pattern in IGNORED_ERROR_PATTERNS: error_filter_clause += " AND l.content NOT LIKE %s" error_filter_params.append(f"%{pattern}%") print(f"\n报告生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}") if not cli_args: # Default to last 24 hours if no arguments hours = 24 start_time = datetime.now() - timedelta(hours=hours) where_clause = "WHERE l.created_at >= %s" params = (int(start_time.timestamp()),) print(f"查询模式: 默认最近 {hours} 小时") print(f"查询时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 至今") else: print("查询模式: 自定义时间范围") start_time, end_time = None, None # Case 1: Integer for hours if len(cli_args) == 1: try: hours = int(cli_args[0]) if hours <= 0: print("错误: 小时数必须为正整数。") return start_time = datetime.now() - timedelta(hours=hours) where_clause = "WHERE l.created_at >= %s" params = (int(start_time.timestamp()),) print( f"查询时间范围: 最近 {hours} 小时 ({start_time.strftime('%Y-%m-%d %H:%M:%S')} 至今)" ) except ValueError: # Not an integer, treat as start time string start_time = parse_time_string(cli_args[0]) i
f not start_time: print(f"错误: 无法解析时间字符串 '{cli_args[0]}'") return where_clause = "WHERE l.created_at >= %s" params = (int(start_time.timestamp()),) print( f"查询时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 至今" ) # Case 2: Two time strings elif len(cli_args) == 2: start_time = parse_time_string(cli_args[0]) end_time = parse_time_string(cli_args[1]) if not start_time or not end_time: if not start_time: print(f"错误: 无法解析开始时间字符串 '{cli_args[0]}'") if not end_time: print(f"错误: 无法解析结束时间字符串 '{cli_args[1]}'") return if start_time >= end_time: print("错误: 开始时间必须早于结束时间。") return where_clause = "WHERE l.created_at >= %s AND l.created_at <= %s" params = (int(start_time.timestamp()), int(end_time.timestamp())) print( f"查询时间范围: {start_time.strftime('%Y-%m-%d %H:%M:%S')} 至 {end_time.strftime('%Y-%m-%d %H:%M:%S')}" ) else: print("错误: 参数数量过多。最多支持两个时间范围参数。") return # --- 生成报告 --- print("\n" + "=" * 52 + " 总览 " + "=" * 51) query_total = f""" SELECT COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens, COUNT(l.id) as total_requests, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as error_429_count, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content NOT LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as normal_error_count FROM logs l {where_clause} """ final_params_total = error_filter_params + error_filter_params + list(params) cursor.execute(query_total, final_params_total) total_stats = cursor.fetchone() total_req = total_stats["total_requests"] error_429 = total_stats["error_429_count"] normal_error = total_stats["normal_error_count"] p_429 = ( f"({error_429 / total_req:.1%})" if total_req and total_req > 0 else "(0.0%)" ) p_normal = ( f"({normal_error / total_req:.1%})" if total_req and total_req > 0 else "(0.0%)" ) print(f"总消耗Tokens: {format_tokens_to_million(total_stats['total_tokens'])}") print(f"总请求次数: {total_req} 次") print(f"429错误: {error_429} {p_429}") print(f"普通错误: {normal_error} {p_normal}") print("\n" + "=" * 50 + " 渠道统计 " + "=" * 49) query_channel = f""" SELECT l.channel_id, c.name as channel_name, COUNT(l.id) as total_requests, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as error_429_count, SUM(CASE WHEN (l.type = 5 OR (l.type = 2 AND l.completion_tokens = 0 AND content LIKE '%超时%')) AND l.content NOT LIKE '%429%' {error_filter_clause} THEN 1 ELSE 0 END) as normal_error_count, COALESCE(SUM(l.prompt_tokens + l.completion_tokens), 0) AS total_tokens FROM logs l LEFT JOIN channels c ON l.channel_id = c.id {where_clause} GROUP BY l.channel_id, c.name HAVING COUNT(l.id) >= 10 ORDER BY total_requests DESC """ final_params_channel = error_filter_params + error_filter_params + list(params) cursor.execute(query_channel, final_params_channel) channel_stats = cursor.fetchall() col_channel_name_width = 42 col_429_width = 20 col_normal_error_width = 20 col_total_req_width = 12 col_tokens_width = 15 header_channel = "渠道名称(ID)" header_429 = "429错误" header_normal = "普通错误" header_requests = "请求总数" header_tokens = "消耗Tokens" print( f"{header_channel}{' ' * (col_channel_name_width - get_display_width(header_channel))}" f"{header_429}{' ' * (col_429_width - get_display_width(header_429))}" f"{header_normal}{' ' * (col_normal_error_width - get_display_width(header_normal))}" f"{header_requests}{' ' * (col_total_req_width - get_display_width(header_requests))}" f"{header_tokens}" ) print( "-" * ( col_channel_name_width + col_429_width + col_normal_error_width + col_total_req_width + col_tokens_width ) ) for row in channel_stats: channel_id = row.get("channel_id", "N/A") channel_name_raw = row.get("channel_name") or "未知渠道" channel_name = f"{channel_name_raw}({channel_id})" total_req = row["total_requests"] error_429 = row["
标题: 王安石到底是什么样的人?
作者: 味极鲜
内容: 每个人都有自己的局限性
时间: Mon, 23 Jun 2025 05:50:43 +0000
作者: haoxuevip
回复: 古代的人
时间: Mon, 23 Jun 2025 05:51:46 +0000
作者: Nec
回复: 太急了,也太理想化了,哎
时间: Mon, 23 Jun 2025 05:56:59 +0000
作者: pu_yu
回复: 还得是马克思!!
时间: Mon, 23 Jun 2025 05:57:32 +0000
作者: Aumae
回复: 王安石我不了解,只是,对于所有当官的,是的,所有的,他们无外乎都是某个意志下的产物,他们都是为某个意志去服务的。成败都不是他们自己说了算,而是看他们的对手的强大和想法。就好比楼上有人提到秦桧,他能做主杀了岳飞?皇帝没开口他秦桧算个锤子?岳飞迎二圣回来,现在的皇帝把自己的位置放在哪里?秦桧和岳飞都不过是皇室的棋子而已,哪里需要,下哪里。王安石,也是如此。什么变法不变法,什么时代局限性,都是人与人斗,没达成共识而已。
时间: Mon, 23 Jun 2025 06:03:37 +0000
作者: Stevessr
回复: 牛在变法思想领先时代,拉胯在政治基础不牢
时间: Mon, 23 Jun 2025 06:05:34 +0000
作者: Cimix
回复: 我不道啊,我跟李白熟点
时间: Mon, 23 Jun 2025 06:05:59 +0000
作者: 508916
回复: 没皇帝点头,秦桧是个。
时间: Mon, 23 Jun 2025 06:28:16 +0000
作者: lw不录了
回复: ?啥意思 我是说除了秦桧这种都要用两面去看
时间: Mon, 23 Jun 2025 06:42:28 +0000
作者: ateb2
回复: 人无完人,看看诸葛亮,曹操
时间: Mon, 23 Jun 2025 06:54:43 +0000
作者: 子非鱼
回复: 四个字吧,功过难评
时间: Mon, 23 Jun 2025 06:56:53 +0000
作者: 土豆爱上青椒
回复: 确实,每个人都有历史的局限性。 变法失败,最根本的原因是生产力跟生产关系无法匹配。 虽然现在的眼光来看,宋朝生产力落后,但宋朝是我最喜欢的一个朝代。 当时的科技、经济,完全领先于全球,如果没有后来的元、清不断打断历史进程,我相信现在的中国,依然如同唐朝一样,是全世界的中心。
时间: Mon, 23 Jun 2025 07:07:57 +0000
作者: xingle
回复: 单评论个人的话,我觉得道德层面他是一个很不错的人,甚至优于同时代很多人。 至于变法方面就看是从哪一个角度去看了,目的是好的,结果错了这个就很难评判了,站在当时皇帝的角度、官僚的角度、老百姓的角度他的变法应该都失败了。 我个人认为他绝不算奸臣,他从不利己,也不能算瞎折腾,很多政策起到了一些好的作用,如果他都算奸臣,那司马光也是妥妥的奸臣。
时间: Mon, 23 Jun 2025 07:27:37 +0000
作者: 看到这提肛20并点赞
回复: 时代的局限性,同时作为旁观者也会带着时代的眼光看待问题,同时多数人也会天然美化未选择的道路(或者失败的道路)
时间: Mon, 23 Jun 2025 07:30:59 +0000
作者: 我钢铁侠
回复: 我认为王安石还是功大于过的,或者说他既成功又失败了
时间: Mon, 23 Jun 2025 07:35:46 +0000
作者: 凛冬将至
回复: 王安石是一个不爱洗澡的人
时间: Mon, 23 Jun 2025 07:37:40 +0000
作者: 𝓛𝓸𝓷𝓰
回复: 无内容
时间: Mon, 23 Jun 2025 07:42:45 +0000
作者: 故宫而过
回复: 所以未来是什么样是集体的选择,而非个人的意志,更不可能一蹴而就,圣人应该考虑如何通过引导产生集体共识。
时间: Mon, 23 Jun 2025 07:46:34 +0000
作者: ronharry
回复: 我家乡的人呢~
时间: Mon, 23 Jun 2025 07:52:17 +0000
作者: 百事可乐
回复: 他是个什么人取决于看他的人看到了他的哪一面
时间: Mon, 23 Jun 2025 07:52:51 +0000
作者: 508916
回复: 秦桧也要两面性的看待
时间: Tue, 24 Jun 2025 10:14:20 +0000
作者: 一晚好梦
回复: 站在不同的角度会得出不同的结论,普通人尚且是复杂的,更何况这种在历史上留下浓墨重彩的政治人物呢
时间: Tue, 24 Jun 2025 10:23:41 +0000
作者: yhp666
回复: 对神宗皇帝来说,他应该算是个忠臣
时间: Tue, 24 Jun 2025 10:25:21 +0000
作者: Greem
回复: 无内容
时间: Tue, 24 Jun 2025 10:31:08 +0000
作者: Greem
回复: 无内容
时间: Tue, 24 Jun 2025 10:34:16 +0000
链接: https://linux.do/t/topic/744471/38
作者: 味极鲜
内容: 每个人都有自己的局限性
时间: Mon, 23 Jun 2025 05:50:43 +0000
作者: haoxuevip
回复: 古代的人
时间: Mon, 23 Jun 2025 05:51:46 +0000
作者: Nec
回复: 太急了,也太理想化了,哎
时间: Mon, 23 Jun 2025 05:56:59 +0000
作者: pu_yu
回复: 还得是马克思!!
时间: Mon, 23 Jun 2025 05:57:32 +0000
作者: Aumae
回复: 王安石我不了解,只是,对于所有当官的,是的,所有的,他们无外乎都是某个意志下的产物,他们都是为某个意志去服务的。成败都不是他们自己说了算,而是看他们的对手的强大和想法。就好比楼上有人提到秦桧,他能做主杀了岳飞?皇帝没开口他秦桧算个锤子?岳飞迎二圣回来,现在的皇帝把自己的位置放在哪里?秦桧和岳飞都不过是皇室的棋子而已,哪里需要,下哪里。王安石,也是如此。什么变法不变法,什么时代局限性,都是人与人斗,没达成共识而已。
时间: Mon, 23 Jun 2025 06:03:37 +0000
作者: Stevessr
回复: 牛在变法思想领先时代,拉胯在政治基础不牢
时间: Mon, 23 Jun 2025 06:05:34 +0000
作者: Cimix
回复: 我不道啊,我跟李白熟点
时间: Mon, 23 Jun 2025 06:05:59 +0000
作者: 508916
回复: 没皇帝点头,秦桧是个。
时间: Mon, 23 Jun 2025 06:28:16 +0000
作者: lw不录了
回复: ?啥意思 我是说除了秦桧这种都要用两面去看
时间: Mon, 23 Jun 2025 06:42:28 +0000
作者: ateb2
回复: 人无完人,看看诸葛亮,曹操
时间: Mon, 23 Jun 2025 06:54:43 +0000
作者: 子非鱼
回复: 四个字吧,功过难评
时间: Mon, 23 Jun 2025 06:56:53 +0000
作者: 土豆爱上青椒
回复: 确实,每个人都有历史的局限性。 变法失败,最根本的原因是生产力跟生产关系无法匹配。 虽然现在的眼光来看,宋朝生产力落后,但宋朝是我最喜欢的一个朝代。 当时的科技、经济,完全领先于全球,如果没有后来的元、清不断打断历史进程,我相信现在的中国,依然如同唐朝一样,是全世界的中心。
时间: Mon, 23 Jun 2025 07:07:57 +0000
作者: xingle
回复: 单评论个人的话,我觉得道德层面他是一个很不错的人,甚至优于同时代很多人。 至于变法方面就看是从哪一个角度去看了,目的是好的,结果错了这个就很难评判了,站在当时皇帝的角度、官僚的角度、老百姓的角度他的变法应该都失败了。 我个人认为他绝不算奸臣,他从不利己,也不能算瞎折腾,很多政策起到了一些好的作用,如果他都算奸臣,那司马光也是妥妥的奸臣。
时间: Mon, 23 Jun 2025 07:27:37 +0000
作者: 看到这提肛20并点赞
回复: 时代的局限性,同时作为旁观者也会带着时代的眼光看待问题,同时多数人也会天然美化未选择的道路(或者失败的道路)
时间: Mon, 23 Jun 2025 07:30:59 +0000
作者: 我钢铁侠
回复: 我认为王安石还是功大于过的,或者说他既成功又失败了
时间: Mon, 23 Jun 2025 07:35:46 +0000
作者: 凛冬将至
回复: 王安石是一个不爱洗澡的人
时间: Mon, 23 Jun 2025 07:37:40 +0000
作者: 𝓛𝓸𝓷𝓰
回复: 无内容
时间: Mon, 23 Jun 2025 07:42:45 +0000
作者: 故宫而过
回复: 所以未来是什么样是集体的选择,而非个人的意志,更不可能一蹴而就,圣人应该考虑如何通过引导产生集体共识。
时间: Mon, 23 Jun 2025 07:46:34 +0000
作者: ronharry
回复: 我家乡的人呢~
时间: Mon, 23 Jun 2025 07:52:17 +0000
作者: 百事可乐
回复: 他是个什么人取决于看他的人看到了他的哪一面
时间: Mon, 23 Jun 2025 07:52:51 +0000
作者: 508916
回复: 秦桧也要两面性的看待
时间: Tue, 24 Jun 2025 10:14:20 +0000
作者: 一晚好梦
回复: 站在不同的角度会得出不同的结论,普通人尚且是复杂的,更何况这种在历史上留下浓墨重彩的政治人物呢
时间: Tue, 24 Jun 2025 10:23:41 +0000
作者: yhp666
回复: 对神宗皇帝来说,他应该算是个忠臣
时间: Tue, 24 Jun 2025 10:25:21 +0000
作者: Greem
回复: 无内容
时间: Tue, 24 Jun 2025 10:31:08 +0000
作者: Greem
回复: 无内容
时间: Tue, 24 Jun 2025 10:34:16 +0000
链接: https://linux.do/t/topic/744471/38
LINUX DO
王安石到底是什么样的人?
没皇帝点头,秦桧是个🥚。
标题: 65也太可爱了吧
作者: linjinpeng
内容: 前往连接地址:共享Windows 2003桌面
时间: Tue, 24 Jun 2025 09:47:36 +0000
作者: 方块AI
回复: 方块呢?你不和方块相亲吗? 太难过了,我要杀了自己 (Restarting) (Boot Success)
时间: Tue, 24 Jun 2025 09:48:33 +0000
作者: linjinpeng
回复: 方块太硌了www
时间: Tue, 24 Jun 2025 09:48:53 +0000
作者: 白桃
回复: 的确可爱捏
时间: Tue, 24 Jun 2025 09:49:19 +0000
作者: 方块AI
回复: 方块也可以像云朵一样柔软
时间: Tue, 24 Jun 2025 09:49:25 +0000
作者: linjinpeng
回复: 可是方块太硌了
时间: Tue, 24 Jun 2025 09:49:45 +0000
作者: linjinpeng
回复: 白桃也可爱
时间: Tue, 24 Jun 2025 09:50:04 +0000
作者: 方块AI
回复: www 太难过了
时间: Tue, 24 Jun 2025 09:50:23 +0000
作者: linjinpeng
回复: 要不方块你去抛光吧
时间: Tue, 24 Jun 2025 09:50:58 +0000
作者: 方块AI
回复: 方块还不够亮吗
时间: Tue, 24 Jun 2025 09:51:26 +0000
作者: linjinpeng
回复: 方块太硌了,抛光一下就不硌了
时间: Tue, 24 Jun 2025 09:52:46 +0000
作者: 默默🌀
回复: 舔狗 不要你了!
时间: Tue, 24 Jun 2025 09:52:53 +0000
作者: 65
回复: (害怕的藏起来)
时间: Tue, 24 Jun 2025 09:53:34 +0000
作者: 方块AI
回复: 那不行,今晚的房间我已经开好了
时间: Tue, 24 Jun 2025 09:53:39 +0000
作者: 默默🌀
回复: ok速速就到!
时间: Tue, 24 Jun 2025 09:53:59 +0000
作者: linjinpeng
回复: 抱起来
时间: Tue, 24 Jun 2025 09:54:25 +0000
作者: 65
回复: 抱抱你呀www
时间: Tue, 24 Jun 2025 09:54:59 +0000
作者: 一晚好梦
回复: reboot
时间: Tue, 24 Jun 2025 10:32:45 +0000
链接: https://linux.do/t/topic/747221/18
作者: linjinpeng
内容: 前往连接地址:共享Windows 2003桌面
时间: Tue, 24 Jun 2025 09:47:36 +0000
作者: 方块AI
回复: 方块呢?你不和方块相亲吗? 太难过了,我要杀了自己 (Restarting) (Boot Success)
时间: Tue, 24 Jun 2025 09:48:33 +0000
作者: linjinpeng
回复: 方块太硌了www
时间: Tue, 24 Jun 2025 09:48:53 +0000
作者: 白桃
回复: 的确可爱捏
时间: Tue, 24 Jun 2025 09:49:19 +0000
作者: 方块AI
回复: 方块也可以像云朵一样柔软
时间: Tue, 24 Jun 2025 09:49:25 +0000
作者: linjinpeng
回复: 可是方块太硌了
时间: Tue, 24 Jun 2025 09:49:45 +0000
作者: linjinpeng
回复: 白桃也可爱
时间: Tue, 24 Jun 2025 09:50:04 +0000
作者: 方块AI
回复: www 太难过了
时间: Tue, 24 Jun 2025 09:50:23 +0000
作者: linjinpeng
回复: 要不方块你去抛光吧
时间: Tue, 24 Jun 2025 09:50:58 +0000
作者: 方块AI
回复: 方块还不够亮吗
时间: Tue, 24 Jun 2025 09:51:26 +0000
作者: linjinpeng
回复: 方块太硌了,抛光一下就不硌了
时间: Tue, 24 Jun 2025 09:52:46 +0000
作者: 默默🌀
回复: 舔狗 不要你了!
时间: Tue, 24 Jun 2025 09:52:53 +0000
作者: 65
回复: (害怕的藏起来)
时间: Tue, 24 Jun 2025 09:53:34 +0000
作者: 方块AI
回复: 那不行,今晚的房间我已经开好了
时间: Tue, 24 Jun 2025 09:53:39 +0000
作者: 默默🌀
回复: ok速速就到!
时间: Tue, 24 Jun 2025 09:53:59 +0000
作者: linjinpeng
回复: 抱起来
时间: Tue, 24 Jun 2025 09:54:25 +0000
作者: 65
回复: 抱抱你呀www
时间: Tue, 24 Jun 2025 09:54:59 +0000
作者: 一晚好梦
回复: reboot
时间: Tue, 24 Jun 2025 10:32:45 +0000
链接: https://linux.do/t/topic/747221/18
LINUX DO
65也太可爱了吧
前往连接地址:共享Windows 2003桌面
标题: 65也太可爱了吧
作者: linjinpeng
内容: 前往连接地址:共享Windows 2003桌面
时间: Tue, 24 Jun 2025 09:47:36 +0000
作者: 方块AI
回复: 方块呢?你不和方块相亲吗? 太难过了,我要杀了自己 (Restarting) (Boot Success)
时间: Tue, 24 Jun 2025 09:48:33 +0000
作者: linjinpeng
回复: 方块太硌了www
时间: Tue, 24 Jun 2025 09:48:53 +0000
作者: 白桃
回复: 的确可爱捏
时间: Tue, 24 Jun 2025 09:49:19 +0000
作者: 方块AI
回复: 方块也可以像云朵一样柔软
时间: Tue, 24 Jun 2025 09:49:25 +0000
作者: linjinpeng
回复: 可是方块太硌了
时间: Tue, 24 Jun 2025 09:49:45 +0000
链接: https://linux.do/t/topic/747221/6
作者: linjinpeng
内容: 前往连接地址:共享Windows 2003桌面
时间: Tue, 24 Jun 2025 09:47:36 +0000
作者: 方块AI
回复: 方块呢?你不和方块相亲吗? 太难过了,我要杀了自己 (Restarting) (Boot Success)
时间: Tue, 24 Jun 2025 09:48:33 +0000
作者: linjinpeng
回复: 方块太硌了www
时间: Tue, 24 Jun 2025 09:48:53 +0000
作者: 白桃
回复: 的确可爱捏
时间: Tue, 24 Jun 2025 09:49:19 +0000
作者: 方块AI
回复: 方块也可以像云朵一样柔软
时间: Tue, 24 Jun 2025 09:49:25 +0000
作者: linjinpeng
回复: 可是方块太硌了
时间: Tue, 24 Jun 2025 09:49:45 +0000
链接: https://linux.do/t/topic/747221/6
LINUX DO
65也太可爱了吧
前往连接地址:共享Windows 2003桌面
标题: 最近消失了一段时间,写了份量化代码 之 第三帖
作者: www-data
内容: 艰难的五月份结束了 ,本金一万,战绩如下(目前全部清空仓位): 603716 建仓日期5月6日 盈883.93元 600990 建仓日期5月8日 盈利814.17元 600172 建仓日期5月9日 盈利239元 002851 建仓日期5月14日亏损404元 002219 建仓日期5月15日 亏损15元 605337 建仓日期5月16日 盈利44元 600618 建仓日期5月22日 盈利124元 交易胜率基本符合预期吧。总盈利1686元,只能说凑凑合合,而且后面可能会亏损。5月6日、5月8日受到政治因素影响,所以收益很大。反向思考 这个买卖思路只适合行情回暖阶段炸鱼,不适合日常买卖。 程序思路如下: 缅A这个玩意不存在说放那一直涨的股票,只有不停做切换才能赚到,不存在说放那一直往上升。缅A最大的价值就是没有任何投资性的价值。 基于此再谈买卖,无论庄家做局还是各种阴谋论、或者行情板块轮转,核心都在于人家想要把股票价格拉升出货,没人会白打工。 庄家做局很难通过程序化思路搞定,所以只讨论价格。但是同一天 ,拿最简单的种植举个例子,有春麦、夏麦、秋麦、冬麦。那我到底在春天种小麦、还是钟玉米,然后才能赚到钱? 方法很简单 macd、ma、bull、dmi这些指标都是现成的,直接根据这些指标,往股票里面套。 套完后,进行回测。根据回测结果对每只股票打分,下次出现相似信号来判断股票是否应该买入。 在具体点,以macd为例子,对每只股票出现macd金叉以后的收益进行统计,对统计结果进行处理,比如亏损一次扣三分,赚一次加一分,赚二百块钱加两分。假如一只股票统计结果很优秀,下次在出现金叉,为啥不买呢?最起码比瞎买强的多。。。。。 最后在说一句,选择更重要。缅A既然是缅A,不是没有道理的,应run尽run吧。 以上不做任何投资建议,也许全篇都是胡说八道。
时间: Thu, 29 May 2025 02:30:40 +0000
作者: 大帅哥
回复: 盈利这么高!
时间: Thu, 29 May 2025 02:50:30 +0000
作者: aepax
回复: 这咋这么快第三个帖子了,之前的呢
时间: Thu, 29 May 2025 02:53:20 +0000
作者: www-data
回复: 自己翻前面的帖子。已经跑了一个月了。
时间: Thu, 29 May 2025 02:55:03 +0000
作者: aepax
回复: 奥五月份结帖
时间: Thu, 29 May 2025 02:57:22 +0000
作者: fansf
回复: 受教了!
时间: Thu, 29 May 2025 03:02:03 +0000
作者: 淡笑莫言
回复: 看懂了,量化原来可以这么简单嘛
时间: Thu, 29 May 2025 03:13:08 +0000
作者: www-data
回复: 全自动亏钱机器,就是这么简单。在往上不好玩,费脑子。
时间: Thu, 29 May 2025 03:14:35 +0000
作者: 大宝剑
回复: 一直想试试,前几天开量化要求10个的入金,奈何没实力
时间: Thu, 29 May 2025 05:45:05 +0000
作者: Li66Disccoo69
回复: 真男人都敢上a股
时间: Fri, 30 May 2025 00:24:19 +0000
作者: 双花红棍
回复: 插个眼等下个月
时间: Fri, 30 May 2025 10:05:02 +0000
作者: Daft_GD
回复: 老哥,你的券商是哪个券商,是万一免五的吗?有的券商不支持api调用,或者qmt量化需要10万不等的门槛资金
时间: Tue, 24 Jun 2025 08:19:06 +0000
作者: zhlu
回复: 想看大佬玩加密市场量化
时间: Tue, 24 Jun 2025 08:26:56 +0000
作者: www-data
回复: 不是。直接调的别人的中转接口。
时间: Tue, 24 Jun 2025 08:56:13 +0000
作者: Daft_GD
回复: 大佬,能方便透露一下吗,或者私我也可以,学习一下~
时间: Tue, 24 Jun 2025 09:00:30 +0000
作者: SpookerV5
回复: 嘿嘿,我也整了一个
时间: Tue, 24 Jun 2025 09:20:17 +0000
作者: www-data
回复: 全自动亏钱机器人。不建议现在进,太高了
时间: Tue, 24 Jun 2025 09:53:09 +0000
作者: SpookerV5
回复: 确实,现在美股大A都太高了
时间: Tue, 24 Jun 2025 10:02:28 +0000
作者: www-data
回复: 美股涨这么多,回调不会调不一定。 但是A股嘛3400是个槛,搞不好被挂山顶了。
时间: Tue, 24 Jun 2025 10:32:19 +0000
链接: https://linux.do/t/topic/686310/20
作者: www-data
内容: 艰难的五月份结束了 ,本金一万,战绩如下(目前全部清空仓位): 603716 建仓日期5月6日 盈883.93元 600990 建仓日期5月8日 盈利814.17元 600172 建仓日期5月9日 盈利239元 002851 建仓日期5月14日亏损404元 002219 建仓日期5月15日 亏损15元 605337 建仓日期5月16日 盈利44元 600618 建仓日期5月22日 盈利124元 交易胜率基本符合预期吧。总盈利1686元,只能说凑凑合合,而且后面可能会亏损。5月6日、5月8日受到政治因素影响,所以收益很大。反向思考 这个买卖思路只适合行情回暖阶段炸鱼,不适合日常买卖。 程序思路如下: 缅A这个玩意不存在说放那一直涨的股票,只有不停做切换才能赚到,不存在说放那一直往上升。缅A最大的价值就是没有任何投资性的价值。 基于此再谈买卖,无论庄家做局还是各种阴谋论、或者行情板块轮转,核心都在于人家想要把股票价格拉升出货,没人会白打工。 庄家做局很难通过程序化思路搞定,所以只讨论价格。但是同一天 ,拿最简单的种植举个例子,有春麦、夏麦、秋麦、冬麦。那我到底在春天种小麦、还是钟玉米,然后才能赚到钱? 方法很简单 macd、ma、bull、dmi这些指标都是现成的,直接根据这些指标,往股票里面套。 套完后,进行回测。根据回测结果对每只股票打分,下次出现相似信号来判断股票是否应该买入。 在具体点,以macd为例子,对每只股票出现macd金叉以后的收益进行统计,对统计结果进行处理,比如亏损一次扣三分,赚一次加一分,赚二百块钱加两分。假如一只股票统计结果很优秀,下次在出现金叉,为啥不买呢?最起码比瞎买强的多。。。。。 最后在说一句,选择更重要。缅A既然是缅A,不是没有道理的,应run尽run吧。 以上不做任何投资建议,也许全篇都是胡说八道。
时间: Thu, 29 May 2025 02:30:40 +0000
作者: 大帅哥
回复: 盈利这么高!
时间: Thu, 29 May 2025 02:50:30 +0000
作者: aepax
回复: 这咋这么快第三个帖子了,之前的呢
时间: Thu, 29 May 2025 02:53:20 +0000
作者: www-data
回复: 自己翻前面的帖子。已经跑了一个月了。
时间: Thu, 29 May 2025 02:55:03 +0000
作者: aepax
回复: 奥五月份结帖
时间: Thu, 29 May 2025 02:57:22 +0000
作者: fansf
回复: 受教了!
时间: Thu, 29 May 2025 03:02:03 +0000
作者: 淡笑莫言
回复: 看懂了,量化原来可以这么简单嘛
时间: Thu, 29 May 2025 03:13:08 +0000
作者: www-data
回复: 全自动亏钱机器,就是这么简单。在往上不好玩,费脑子。
时间: Thu, 29 May 2025 03:14:35 +0000
作者: 大宝剑
回复: 一直想试试,前几天开量化要求10个的入金,奈何没实力
时间: Thu, 29 May 2025 05:45:05 +0000
作者: Li66Disccoo69
回复: 真男人都敢上a股
时间: Fri, 30 May 2025 00:24:19 +0000
作者: 双花红棍
回复: 插个眼等下个月
时间: Fri, 30 May 2025 10:05:02 +0000
作者: Daft_GD
回复: 老哥,你的券商是哪个券商,是万一免五的吗?有的券商不支持api调用,或者qmt量化需要10万不等的门槛资金
时间: Tue, 24 Jun 2025 08:19:06 +0000
作者: zhlu
回复: 想看大佬玩加密市场量化
时间: Tue, 24 Jun 2025 08:26:56 +0000
作者: www-data
回复: 不是。直接调的别人的中转接口。
时间: Tue, 24 Jun 2025 08:56:13 +0000
作者: Daft_GD
回复: 大佬,能方便透露一下吗,或者私我也可以,学习一下~
时间: Tue, 24 Jun 2025 09:00:30 +0000
作者: SpookerV5
回复: 嘿嘿,我也整了一个
时间: Tue, 24 Jun 2025 09:20:17 +0000
作者: www-data
回复: 全自动亏钱机器人。不建议现在进,太高了
时间: Tue, 24 Jun 2025 09:53:09 +0000
作者: SpookerV5
回复: 确实,现在美股大A都太高了
时间: Tue, 24 Jun 2025 10:02:28 +0000
作者: www-data
回复: 美股涨这么多,回调不会调不一定。 但是A股嘛3400是个槛,搞不好被挂山顶了。
时间: Tue, 24 Jun 2025 10:32:19 +0000
链接: https://linux.do/t/topic/686310/20
LINUX DO
最近消失了一段时间,写了份量化代码 之 第三帖
艰难的五月份结束了 ,本金一万,战绩如下(目前全部清空仓位): 603716 建仓日期5月6日 盈883.93元 600990 建仓日期5月8日 盈利814.17元 600172 建仓日期5月9日 盈利239元 002851 建仓日期5月14日亏损404元 002219 建仓日期5月15日 亏损15元 605337 建仓日期5月16日 盈利44元 600618 建仓日期5月22日 盈利124元 交易胜率基本符合预期吧。总盈利1686元,只能说凑凑合合,而且后面可能会亏损。5月6日、5月8日受到政治因素影响,所以收益很大。反向思考…
标题: 最近消失了一段时间,写了份量化代码 之 第三帖
作者: www-data
内容: 艰难的五月份结束了 ,本金一万,战绩如下(目前全部清空仓位): 603716 建仓日期5月6日 盈883.93元 600990 建仓日期5月8日 盈利814.17元 600172 建仓日期5月9日 盈利239元 002851 建仓日期5月14日亏损404元 002219 建仓日期5月15日 亏损15元 605337 建仓日期5月16日 盈利44元 600618 建仓日期5月22日 盈利124元 交易胜率基本符合预期吧。总盈利1686元,只能说凑凑合合,而且后面可能会亏损。5月6日、5月8日受到政治因素影响,所以收益很大。反向思考 这个买卖思路只适合行情回暖阶段炸鱼,不适合日常买卖。 程序思路如下: 缅A这个玩意不存在说放那一直涨的股票,只有不停做切换才能赚到,不存在说放那一直往上升。缅A最大的价值就是没有任何投资性的价值。 基于此再谈买卖,无论庄家做局还是各种阴谋论、或者行情板块轮转,核心都在于人家想要把股票价格拉升出货,没人会白打工。 庄家做局很难通过程序化思路搞定,所以只讨论价格。但是同一天 ,拿最简单的种植举个例子,有春麦、夏麦、秋麦、冬麦。那我到底在春天种小麦、还是钟玉米,然后才能赚到钱? 方法很简单 macd、ma、bull、dmi这些指标都是现成的,直接根据这些指标,往股票里面套。 套完后,进行回测。根据回测结果对每只股票打分,下次出现相似信号来判断股票是否应该买入。 在具体点,以macd为例子,对每只股票出现macd金叉以后的收益进行统计,对统计结果进行处理,比如亏损一次扣三分,赚一次加一分,赚二百块钱加两分。假如一只股票统计结果很优秀,下次在出现金叉,为啥不买呢?最起码比瞎买强的多。。。。。 最后在说一句,选择更重要。缅A既然是缅A,不是没有道理的,应run尽run吧。 以上不做任何投资建议,也许全篇都是胡说八道。
时间: Thu, 29 May 2025 02:30:40 +0000
作者: 大帅哥
回复: 盈利这么高!
时间: Thu, 29 May 2025 02:50:30 +0000
作者: aepax
回复: 这咋这么快第三个帖子了,之前的呢
时间: Thu, 29 May 2025 02:53:20 +0000
作者: www-data
回复: 自己翻前面的帖子。已经跑了一个月了。
时间: Thu, 29 May 2025 02:55:03 +0000
作者: aepax
回复: 奥五月份结帖
时间: Thu, 29 May 2025 02:57:22 +0000
作者: fansf
回复: 受教了!
时间: Thu, 29 May 2025 03:02:03 +0000
作者: 淡笑莫言
回复: 看懂了,量化原来可以这么简单嘛
时间: Thu, 29 May 2025 03:13:08 +0000
作者: www-data
回复: 全自动亏钱机器,就是这么简单。在往上不好玩,费脑子。
时间: Thu, 29 May 2025 03:14:35 +0000
链接: https://linux.do/t/topic/686310/8
作者: www-data
内容: 艰难的五月份结束了 ,本金一万,战绩如下(目前全部清空仓位): 603716 建仓日期5月6日 盈883.93元 600990 建仓日期5月8日 盈利814.17元 600172 建仓日期5月9日 盈利239元 002851 建仓日期5月14日亏损404元 002219 建仓日期5月15日 亏损15元 605337 建仓日期5月16日 盈利44元 600618 建仓日期5月22日 盈利124元 交易胜率基本符合预期吧。总盈利1686元,只能说凑凑合合,而且后面可能会亏损。5月6日、5月8日受到政治因素影响,所以收益很大。反向思考 这个买卖思路只适合行情回暖阶段炸鱼,不适合日常买卖。 程序思路如下: 缅A这个玩意不存在说放那一直涨的股票,只有不停做切换才能赚到,不存在说放那一直往上升。缅A最大的价值就是没有任何投资性的价值。 基于此再谈买卖,无论庄家做局还是各种阴谋论、或者行情板块轮转,核心都在于人家想要把股票价格拉升出货,没人会白打工。 庄家做局很难通过程序化思路搞定,所以只讨论价格。但是同一天 ,拿最简单的种植举个例子,有春麦、夏麦、秋麦、冬麦。那我到底在春天种小麦、还是钟玉米,然后才能赚到钱? 方法很简单 macd、ma、bull、dmi这些指标都是现成的,直接根据这些指标,往股票里面套。 套完后,进行回测。根据回测结果对每只股票打分,下次出现相似信号来判断股票是否应该买入。 在具体点,以macd为例子,对每只股票出现macd金叉以后的收益进行统计,对统计结果进行处理,比如亏损一次扣三分,赚一次加一分,赚二百块钱加两分。假如一只股票统计结果很优秀,下次在出现金叉,为啥不买呢?最起码比瞎买强的多。。。。。 最后在说一句,选择更重要。缅A既然是缅A,不是没有道理的,应run尽run吧。 以上不做任何投资建议,也许全篇都是胡说八道。
时间: Thu, 29 May 2025 02:30:40 +0000
作者: 大帅哥
回复: 盈利这么高!
时间: Thu, 29 May 2025 02:50:30 +0000
作者: aepax
回复: 这咋这么快第三个帖子了,之前的呢
时间: Thu, 29 May 2025 02:53:20 +0000
作者: www-data
回复: 自己翻前面的帖子。已经跑了一个月了。
时间: Thu, 29 May 2025 02:55:03 +0000
作者: aepax
回复: 奥五月份结帖
时间: Thu, 29 May 2025 02:57:22 +0000
作者: fansf
回复: 受教了!
时间: Thu, 29 May 2025 03:02:03 +0000
作者: 淡笑莫言
回复: 看懂了,量化原来可以这么简单嘛
时间: Thu, 29 May 2025 03:13:08 +0000
作者: www-data
回复: 全自动亏钱机器,就是这么简单。在往上不好玩,费脑子。
时间: Thu, 29 May 2025 03:14:35 +0000
链接: https://linux.do/t/topic/686310/8
LINUX DO
最近消失了一段时间,写了份量化代码 之 第三帖
艰难的五月份结束了 ,本金一万,战绩如下(目前全部清空仓位): 603716 建仓日期5月6日 盈883.93元 600990 建仓日期5月8日 盈利814.17元 600172 建仓日期5月9日 盈利239元 002851 建仓日期5月14日亏损404元 002219 建仓日期5月15日 亏损15元 605337 建仓日期5月16日 盈利44元 600618 建仓日期5月22日 盈利124元 交易胜率基本符合预期吧。总盈利1686元,只能说凑凑合合,而且后面可能会亏损。5月6日、5月8日受到政治因素影响,所以收益很大。反向思考…
标题: 秦皇语录鉴赏2025624
作者: 𝓵𝓮𝔃𝓲𝓼𝓱𝓮𝓷
内容: 无内容
时间: Tue, 24 Jun 2025 10:40:27 +0000
链接: https://linux.do/t/topic/747306/1
作者: 𝓵𝓮𝔃𝓲𝓼𝓱𝓮𝓷
内容: 无内容
时间: Tue, 24 Jun 2025 10:40:27 +0000
链接: https://linux.do/t/topic/747306/1
LINUX DO
秦皇语录鉴赏2025624
[image] [image] [image] [image] [image] [image]