LagrangeDev / Lagrange.Core

An Implementation of NTQQ Protocol, with Pure C#, Derived from Konata.Core
GNU General Public License v3.0
1.93k stars 235 forks source link

[Bug?]: 发送 https://multimedia.nt.qq.com.cn/ 域名的图片时会报错 #315

Closed xuetu0606 closed 5 months ago

xuetu0606 commented 5 months ago

请确保您已阅读以上注意事项,并勾选下方的确认框。

Lagrange项目

OneBot

所使用/依赖的Lagrange项目对应的commit

e55ed79203061f9ff200de4ff00e044666293489

运行环境

Linux

运行架构

x64

连接方式

反向 WebSocket

重现步骤

使用 nonebot.adapters.onebot.v11 发送图片时报错 图片地址 https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=CgozMjk2MTMyNjUxEhTB9IpgDFjncZODQma9FBjGqwpbshjOkZEBIP8KKMmI2cWLwYUDUIC9owE&rkey=CAQSMLhE1BzKB7G4ezEtcO-3ZHqMrrDifo2LG1uDFAQqKmt_fSXf_tw4XCUmD6TeiQGDyg&spec=0 能正常访问 image

期望的结果是什么?

能够正常发送图片.并且不会再次执行上传图片的行为

实际的结果是什么?

发送报错,并没有发送成功图片消息 这个是报错信息 image

简单的复现代码/链接(可选)

# 框架规则
from nonebot import on_command
# 通讯协议
from nonebot.adapters.onebot.v11 import MessageSegment

# 随机图片
image = on_command('随机图片')

@image.handle()
async def _():
    url = 'https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=CgozMjk2MTMyNjUxEhTB9IpgDFjncZODQma9FBjGqwpbshjOkZEBIP8KKMmI2cWLwYUDUIC9owE&rkey=CAQSMLhE1BzKB7G4ezEtcO-3ZHqMrrDifo2LG1uDFAQqKmt_fSXf_tw4XCUmD6TeiQGDyg&spec=0'
    await image.send(MessageSegment.image(url))
    await image.finish()

日志记录(可选)

info: Lagrange.Core.BotContext[0]
      [2024-04-14 14:39:56] [MessagingLogic] [VERBOSE]: [MessageChain(761290459)(3218366812)] [Text]: 随机图片trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"message_type":"group","sub_type":"normal","message_id":93102705,"group_id":761290459,"user_id":3218366812,"anonymous":null,"message":[{"type":"text","data":{"text":"\u968F\u673A\u56FE\u7247"}}],"raw_message":"\u968F\u673A\u56FE\u7247","font":0,"sender":{"user_id":3218366812,"nickname":"\u96EA\u5154","card":"","sex":"unknown","age":0,"area":"","level":"83","role":"owner","title":""},"time":1713076796,"self_id":3296132651,"post_type":"message"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
      [ReverseWSService] Receive: {"action": "send_msg", "params": {"user_id": 3218366812, "group_id": 761290459, "message_type": "group", "message": [{"type": "image", "data": {"file": "https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=CgozMjk2MTMyNjUxEhTB9IpgDFjncZODQma9FBjGqwpbshjOkZEBIP8KKMmI2cWLwYUDUIC9owE&rkey=CAQSMLhE1BzKB7G4ezEtcO-3ZHqMrrDifo2LG1uDFAQqKmt_fSXf_tw4XCUmD6TeiQGDyg&spec=0", "type": null, "cache": "true", "proxy": "true", "timeout": null}}]}, "echo": "1"}
warn: Lagrange.OneBot.Core.Operation.OperationService[0]
      Unexpected error encountered while handling message.
      System.AggregateException: One or more errors occurred. (The SSL connection could not be established, see inner exception.)
       ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
       ---> System.Security.Authentication.AuthenticationException: Authentication failed, see inner exception.
       ---> Interop+OpenSsl+SslException: SSL Handshake failed with OpenSSL error - SSL_ERROR_SSL.
       ---> Interop+Crypto+OpenSslCryptographicException: error:0A000410:SSL routines::sslv3 alert handshake failure
         --- End of inner exception stack trace ---
         at Interop.OpenSsl.DoSslHandshake(SafeSslHandle context, ReadOnlySpan`1 input, Byte[]& sendBuf, Int32& sendCount)
         at System.Net.Security.SslStreamPal.HandshakeInternal(SafeDeleteSslContext& context, ReadOnlySpan`1 inputBuffer, Byte[]& outputBuffer, SslAuthenticationOptions sslAuthenticationOptions)
         --- End of inner exception stack trace ---
         at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         --- End of inner exception stack trace ---
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
         at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
         at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
         --- End of inner exception stack trace ---
         at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
         at Lagrange.OneBot.Message.Entity.CommonResolver.ResolveStream(String url)
         at Lagrange.OneBot.Message.Entity.ImageSegment.Build(MessageBuilder builder, SegmentBase segment)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.BuildMessages(MessageBuilder builder, List`1 segments)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.ParseChain(OneBotMessage message)
         at Lagrange.OneBot.Core.Operation.Message.SendMessageOperation.HandleOperation(BotContext context, JsonNode payload)
         at Lagrange.OneBot.Core.Operation.OperationService.HandleOperation(MsgRecvEventArgs e)
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"status":"failed","retcode":200,"data":null,"echo":"1"}
trce: Lagrange.Core.BotContext[0]
      [2024-04-14 14:39:58] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"interval":5000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1713076799,"self_id":3296132651,"post_type":"meta_event"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"interval":5000,"status":{"app_initialized":true,"app_enabled":true,"app_good":true,"online":true,"good":true},"meta_event_type":"heartbeat","time":1713076804,"self_id":3296132651,"post_type":"meta_event"}
trce: Lagrange.Core.BotContext[0]

补充说明(可选)

No response

ghost commented 5 months ago

无法复现

liushi2024 commented 4 months ago

遇到类似问题,其他图片都可以发送,这个域名的图片均无法发送 https://view.nicemoe.cn/static/da8441d729ab4ee3ae6858e5c542a5acf4f3725d743bb258abfc008633d28688.jpg

复现步骤 linux环境,使用docker部署ghcr.io/konatadev/lagrange.onebot:sha-4efd0d5 已测试过,在Release下载的win版本正常发送,无法复现

日志记录

info: Lagrange.Core.BotContext[0]
      [2024-04-22 06:10:21] [MessagingLogic] [VERBOSE]: [MessageChain(322128384)(1225207523)] [Text]: 金价
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"message_type":"group","sub_type":"normal","message_id":473974698,"group_id":322128384,"user_id":1225207523,"anonymous":null,"message":[{"type":"text","data":{"text":"\u91D1\u4EF7"}}],"raw_message":"\u91D1\u4EF7","font":0,"sender":{"user_id":1225207523,"nickname":"\u957F\u751F\u3002","card":"","sex":"unknown","age":0,"area":"","level":"22","role":"owner","title":""},"time":1713766222,"self_id":3751290936,"post_type":"message"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
      [ReverseWSService] Receive: {"action":"send_group_msg","params":{"group_id":"322128384","auto_escape":false,"message":"[CQ:at,qq=1225207523][CQ:image,file=https://view.nicemoe.cn/static/d23016854d70cd7e0a26682b58d5f1c6f652404422db7fe8a1887f127e072359.jpg,type=show,id=40004]"}}
trce: Lagrange.Core.BotContext[0]
      [2024-04-22 06:10:23] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.OneBot.Core.Operation.OperationService[0]
      Unexpected error encountered while handling message.
      System.AggregateException: One or more errors occurred. (The SSL connection could not be established, see inner exception.)
       ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
       ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
         at System.Net.Security.SslStream.ReceiveHandshakeFrameAsync[TIOAdapter](CancellationToken cancellationToken)
         at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         --- End of inner exception stack trace ---
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
         at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
         at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
         --- End of inner exception stack trace ---
         at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
         at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
         at Lagrange.OneBot.Message.Entity.CommonResolver.ResolveStream(String url)
         at Lagrange.OneBot.Message.Entity.ImageSegment.Build(MessageBuilder builder, SegmentBase segment)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.BuildMessages(MessageBuilder builder, String message)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.ParseChain(OneBotGroupMessageText message)
         at Lagrange.OneBot.Core.Operation.Message.SendGroupMessageOperation.HandleOperation(BotContext context, JsonNode payload)
         at Lagrange.OneBot.Core.Operation.OperationService.HandleOperation(MsgRecvEventArgs e)
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"status":"failed","retcode":200,"data":null,"echo":null}
liushi2024 commented 4 months ago

无法复现

linux版本无法发送,win版本能正常发送

https://view.nicemoe.cn/static/dde706d9f40176020ffa26eb30306d3a62d378cb243af4daae83c9a6d9ef72a7.jpg

dogdie233 commented 4 months ago

你试试在你的linux机器上能不能用wget/curl下载这个图片

liushi2024 commented 4 months ago

你试试在你的linux机器上能不能用wget/curl下载这个图片

root@ls:~# curl -o image.jpg https://view.nicemoe.cn/static/dde706d9f40176020ffa26eb30306d3a62d378cb243af4daae83c9a6d9ef72a7.jpg % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 702k 100 702k 0 0 635k 0 0:00:01 0:00:01 --:--:-- 635k root@ls:~# ls image.jpg

curl能下载成功

dogdie233 commented 4 months ago

遇到类似问题,其他图片都可以发送,这个域名的图片均无法发送 https://view.nicemoe.cn/static/da8441d729ab4ee3ae6858e5c542a5acf4f3725d743bb258abfc008633d28688.jpg

复现步骤 linux环境,使用docker部署ghcr.io/konatadev/lagrange.onebot:sha-4efd0d5 已测试过,在Release下载的win版本正常发送,无法复现

日志记录

info: Lagrange.Core.BotContext[0]
      [2024-04-22 06:10:21] [MessagingLogic] [VERBOSE]: [MessageChain(322128384)(1225207523)] [Text]: 金价
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"message_type":"group","sub_type":"normal","message_id":473974698,"group_id":322128384,"user_id":1225207523,"anonymous":null,"message":[{"type":"text","data":{"text":"\u91D1\u4EF7"}}],"raw_message":"\u91D1\u4EF7","font":0,"sender":{"user_id":1225207523,"nickname":"\u957F\u751F\u3002","card":"","sex":"unknown","age":0,"area":"","level":"22","role":"owner","title":""},"time":1713766222,"self_id":3751290936,"post_type":"message"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
      [ReverseWSService] Receive: {"action":"send_group_msg","params":{"group_id":"322128384","auto_escape":false,"message":"[CQ:at,qq=1225207523][CQ:image,file=https://view.nicemoe.cn/static/d23016854d70cd7e0a26682b58d5f1c6f652404422db7fe8a1887f127e072359.jpg,type=show,id=40004]"}}
trce: Lagrange.Core.BotContext[0]
      [2024-04-22 06:10:23] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.OneBot.Core.Operation.OperationService[0]
      Unexpected error encountered while handling message.
      System.AggregateException: One or more errors occurred. (The SSL connection could not be established, see inner exception.)
       ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
       ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
         at System.Net.Security.SslStream.ReceiveHandshakeFrameAsync[TIOAdapter](CancellationToken cancellationToken)
         at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         --- End of inner exception stack trace ---
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
         at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
         at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
         --- End of inner exception stack trace ---
         at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
         at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
         at Lagrange.OneBot.Message.Entity.CommonResolver.ResolveStream(String url)
         at Lagrange.OneBot.Message.Entity.ImageSegment.Build(MessageBuilder builder, SegmentBase segment)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.BuildMessages(MessageBuilder builder, String message)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.ParseChain(OneBotGroupMessageText message)
         at Lagrange.OneBot.Core.Operation.Message.SendGroupMessageOperation.HandleOperation(BotContext context, JsonNode payload)
         at Lagrange.OneBot.Core.Operation.OperationService.HandleOperation(MsgRecvEventArgs e)
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"status":"failed","retcode":200,"data":null,"echo":null}

报错还是这个嘛 (这个报错是onebot在下载这个图片的时候,无法与view.nicemoe.cn建立SSL连接)

liushi2024 commented 4 months ago

遇到类似问题,其他图片都可以发送,这个域名的图片均无法发送 https://view.nicemoe.cn/static/da8441d729ab4ee3ae6858e5c542a5acf4f3725d743bb258abfc008633d28688.jpg 复现步骤 linux环境,使用docker部署ghcr.io/konatadev/lagrange.onebot:sha-4efd0d5 已测试过,在Release下载的win版本正常发送,无法复现 日志记录

info: Lagrange.Core.BotContext[0]
      [2024-04-22 06:10:21] [MessagingLogic] [VERBOSE]: [MessageChain(322128384)(1225207523)] [Text]: 金价
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"message_type":"group","sub_type":"normal","message_id":473974698,"group_id":322128384,"user_id":1225207523,"anonymous":null,"message":[{"type":"text","data":{"text":"\u91D1\u4EF7"}}],"raw_message":"\u91D1\u4EF7","font":0,"sender":{"user_id":1225207523,"nickname":"\u957F\u751F\u3002","card":"","sex":"unknown","age":0,"area":"","level":"22","role":"owner","title":""},"time":1713766222,"self_id":3751290936,"post_type":"message"}
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[2]
      [ReverseWSService] Receive: {"action":"send_group_msg","params":{"group_id":"322128384","auto_escape":false,"message":"[CQ:at,qq=1225207523][CQ:image,file=https://view.nicemoe.cn/static/d23016854d70cd7e0a26682b58d5f1c6f652404422db7fe8a1887f127e072359.jpg,type=show,id=40004]"}}
trce: Lagrange.Core.BotContext[0]
      [2024-04-22 06:10:23] [ServiceContext] [DEBUG]: Outgoing SSOFrame: Heartbeat.Alive
warn: Lagrange.OneBot.Core.Operation.OperationService[0]
      Unexpected error encountered while handling message.
      System.AggregateException: One or more errors occurred. (The SSL connection could not be established, see inner exception.)
       ---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
       ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
         at System.Net.Security.SslStream.ReceiveHandshakeFrameAsync[TIOAdapter](CancellationToken cancellationToken)
         at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         --- End of inner exception stack trace ---
         at System.Net.Http.ConnectHelper.EstablishSslConnectionAsync(SslClientAuthenticationOptions sslOptions, HttpRequestMessage request, Boolean async, Stream stream, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.AddHttp11ConnectionAsync(QueueItem queueItem)
         at System.Threading.Tasks.TaskCompletionSourceWithCancellation`1.WaitWithCancellationAsync(CancellationToken cancellationToken)
         at System.Net.Http.HttpConnectionPool.SendWithVersionDetectionAndRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)
         at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)
         at System.Net.Http.HttpClient.<SendAsync>g__Core|83_0(HttpRequestMessage request, HttpCompletionOption completionOption, CancellationTokenSource cts, Boolean disposeCts, CancellationTokenSource pendingRequestsCts, CancellationToken originalCancellationToken)
         --- End of inner exception stack trace ---
         at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
         at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
         at Lagrange.OneBot.Message.Entity.CommonResolver.ResolveStream(String url)
         at Lagrange.OneBot.Message.Entity.ImageSegment.Build(MessageBuilder builder, SegmentBase segment)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.BuildMessages(MessageBuilder builder, String message)
         at Lagrange.OneBot.Core.Operation.Message.MessageCommon.ParseChain(OneBotGroupMessageText message)
         at Lagrange.OneBot.Core.Operation.Message.SendGroupMessageOperation.HandleOperation(BotContext context, JsonNode payload)
         at Lagrange.OneBot.Core.Operation.OperationService.HandleOperation(MsgRecvEventArgs e)
trce: Lagrange.OneBot.Core.Network.Service.ReverseWSService[1]
      [ReverseWSService] Send: {"status":"failed","retcode":200,"data":null,"echo":null}

报错还是这个嘛 (这个报错是onebot在下载这个图片的时候,无法与view.nicemoe.cn建立SSL连接)

是的,在win版本可以,在linux就不行

dogdie233 commented 4 months ago

只有这张图发不出去?还是只要用了这个域名都发不出去

liushi2024 commented 4 months ago

这个域名下的都发不出去,其他HTTPS域名的能正常发

Lilyltt commented 4 months ago

问题是这张图浏览器都打不开哇,图链本身有问题

liushi2024 commented 4 months ago

问题是这张图浏览器都打不开哇,图链本身有问题

https://view.nicemoe.cn/static/dde706d9f40176020ffa26eb30306d3a62d378cb243af4daae83c9a6d9ef72a7.jpg 这张,之前那张是很久之前的了,过期了

Lilyltt commented 4 months ago

破案了,trustaisa证书有问题,那玩意很多浏览器不信的,国产证书就这个样子,如果可以不走ssl的话就不走,不然就得自己去搞定这个证书

dogdie233 commented 4 months ago

哈哈我就知道()

Ailitonia commented 3 months ago

破案了,trustaisa证书有问题,那玩意很多浏览器不信的,国产证书就这个样子,如果可以不走ssl的话就不走,不然就得自己去搞定这个证书

+1 使用 aiohttp 甚至不能直接 get 在 multimedia.nt.qq.com.cn 这个域名下的图片

复现步骤

使用 nonebot2, 配置 DRIVER=~fastapi+~aiohttp

from nonebot import on_message, get_driver
from nonebot.drivers import Request

from nonebot.adapters.onebot.v11 import MessageEvent

@on_message().handle()
async def _(event: MessageEvent):
    for seg in event.get_message():
        if seg.type == 'image':
            print(await get_driver().request(setup=Request(method='GET', url=seg.data.get('url'))))

发送任意图片

05-26 00:57:43 [SUCCESS] nonebot | OneBot V11 xxx | [message.group.normal]: Message 21432191 from xxx@[群:xxx] '[image:file=https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=Cgk2MjUz...,url=https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=Cgk2MjUz...,summary=[动画表情]]'
05-26 00:57:43 [DEBUG] nonebot | Checking for matchers in priority 1...
05-26 00:57:43 [INFO] nonebot | Event will be handled by Matcher(type='message', module=test.v2.ntqq_image, lineno=17)
05-26 00:57:43 [DEBUG] nonebot | Running Matcher(type='message', module=test.v2.ntqq_image, lineno=17)
05-26 00:57:43 [DEBUG] nonebot | Running handler Dependent(call=_)
05-26 00:57:45 [INFO] nonebot | Matcher(type='message', module=test.v2.ntqq_image, lineno=17) running complete
05-26 00:57:45 [ERROR] nonebot | Running Matcher(type='message', module=test.v2.ntqq_image, lineno=17) failed.
Traceback (most recent call last):
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1025, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1113, in create_connection
    transport, protocol = await self._create_connection_transport(
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1146, in _create_connection_transport
    await waiter
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\sslproto.py", line 578, in _on_handshake_complete
    raise handshake_exc
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\sslproto.py", line 560, in _do_handshake
    self._sslobj.do_handshake()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\ssl.py", line 979, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\bot.py", line 70, in <module>
    nonebot.run()
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\__init__.py", line 335, in run
    get_driver().run(*args, **kwargs)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\drivers\fastapi.py", line 186, in run
    uvicorn.run(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\uvicorn\main.py", line 575, in run
    server.run()
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\uvicorn\server.py", line 65, in run
    return asyncio.run(self.serve(sockets=sockets))
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 641, in run_until_complete
    self.run_forever()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\windows_events.py", line 321, in run_forever
    super().run_forever()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 608, in run_forever
    self._run_once()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1936, in _run_once
    handle._run()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\events.py", line 84, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\message.py", line 476, in check_and_run_matcher
    await _run_matcher(
> File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\message.py", line 428, in _run_matcher
    await matcher.run(bot, event, state, stack, dependency_cache)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\internal\matcher\matcher.py", line 850, in run
    await self.simple_run(bot, event, state, stack, dependency_cache)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\internal\matcher\matcher.py", line 825, in simple_run
    await handler(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\dependencies\__init__.py", line 94, in __call__
    return await cast(Callable[..., Awaitable[R]], self.call)(**values)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\test\v2\ntqq_image.py", line 21, in _
    print(await get_driver().request(setup=Request(method='GET', url=seg.data.get('url'))))
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\drivers\aiohttp.py", line 159, in request
    return await session.request(setup)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\drivers\aiohttp.py", line 109, in request
    async with await self.client.request(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\client.py", line 581, in _request
    conn = await self._connector.connect(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 544, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 944, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1257, in _create_direct_connection
    raise last_exc
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1226, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1029, in _wrap_create_connection
    raise ClientConnectorSSLError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorSSLError: Cannot connect to host multimedia.nt.qq.com.cn:443 ssl:default [[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)]
05-26 00:57:45 [DEBUG] nonebot | Stop event propagation
05-26 00:57:45 [DEBUG] nonebot | Checking for matchers completed
pk5ls20 commented 3 months ago

破案了,trustaisa证书有问题,那玩意很多浏览器不信的,国产证书就这个样子,如果可以不走ssl的话就不走,不然就得自己去搞定这个证书

+1 使用 aiohttp 甚至不能直接 get 在 multimedia.nt.qq.com.cn 这个域名下的图片

复现步骤

使用 nonebot2, 配置 DRIVER=~fastapi+~aiohttp

from nonebot import on_message, get_driver
from nonebot.drivers import Request

from nonebot.adapters.onebot.v11 import MessageEvent

@on_message().handle()
async def _(event: MessageEvent):
    for seg in event.get_message():
        if seg.type == 'image':
            print(await get_driver().request(setup=Request(method='GET', url=seg.data.get('url'))))

发送任意图片

05-26 00:57:43 [SUCCESS] nonebot | OneBot V11 xxx | [message.group.normal]: Message 21432191 from xxx@[群:xxx] '[image:file=https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=Cgk2MjUz...,url=https://multimedia.nt.qq.com.cn/download?appid=1407&fileid=Cgk2MjUz...,summary=[动画表情]]'
05-26 00:57:43 [DEBUG] nonebot | Checking for matchers in priority 1...
05-26 00:57:43 [INFO] nonebot | Event will be handled by Matcher(type='message', module=test.v2.ntqq_image, lineno=17)
05-26 00:57:43 [DEBUG] nonebot | Running Matcher(type='message', module=test.v2.ntqq_image, lineno=17)
05-26 00:57:43 [DEBUG] nonebot | Running handler Dependent(call=_)
05-26 00:57:45 [INFO] nonebot | Matcher(type='message', module=test.v2.ntqq_image, lineno=17) running complete
05-26 00:57:45 [ERROR] nonebot | Running Matcher(type='message', module=test.v2.ntqq_image, lineno=17) failed.
Traceback (most recent call last):
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1025, in _wrap_create_connection
    return await self._loop.create_connection(*args, **kwargs)
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1113, in create_connection
    transport, protocol = await self._create_connection_transport(
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1146, in _create_connection_transport
    await waiter
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\sslproto.py", line 578, in _on_handshake_complete
    raise handshake_exc
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\sslproto.py", line 560, in _do_handshake
    self._sslobj.do_handshake()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\ssl.py", line 979, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\bot.py", line 70, in <module>
    nonebot.run()
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\__init__.py", line 335, in run
    get_driver().run(*args, **kwargs)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\drivers\fastapi.py", line 186, in run
    uvicorn.run(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\uvicorn\main.py", line 575, in run
    server.run()
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\uvicorn\server.py", line 65, in run
    return asyncio.run(self.serve(sockets=sockets))
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 190, in run
    return runner.run(main)
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\runners.py", line 118, in run
    return self._loop.run_until_complete(task)
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 641, in run_until_complete
    self.run_forever()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\windows_events.py", line 321, in run_forever
    super().run_forever()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 608, in run_forever
    self._run_once()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\base_events.py", line 1936, in _run_once
    handle._run()
  File "C:\Users\Ailit\AppData\Local\Programs\Python\Python311\Lib\asyncio\events.py", line 84, in _run
    self._context.run(self._callback, *self._args)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\message.py", line 476, in check_and_run_matcher
    await _run_matcher(
> File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\message.py", line 428, in _run_matcher
    await matcher.run(bot, event, state, stack, dependency_cache)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\internal\matcher\matcher.py", line 850, in run
    await self.simple_run(bot, event, state, stack, dependency_cache)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\internal\matcher\matcher.py", line 825, in simple_run
    await handler(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\dependencies\__init__.py", line 94, in __call__
    return await cast(Callable[..., Awaitable[R]], self.call)(**values)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\test\v2\ntqq_image.py", line 21, in _
    print(await get_driver().request(setup=Request(method='GET', url=seg.data.get('url'))))
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\drivers\aiohttp.py", line 159, in request
    return await session.request(setup)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\nonebot\drivers\aiohttp.py", line 109, in request
    async with await self.client.request(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\client.py", line 581, in _request
    conn = await self._connector.connect(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 544, in connect
    proto = await self._create_connection(req, traces, timeout)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 944, in _create_connection
    _, proto = await self._create_direct_connection(req, traces, timeout)
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1257, in _create_direct_connection
    raise last_exc
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1226, in _create_direct_connection
    transp, proto = await self._wrap_create_connection(
  File "C:\Users\Ailit\PycharmProjects\nonebot2_miya\venv\Lib\site-packages\aiohttp\connector.py", line 1029, in _wrap_create_connection
    raise ClientConnectorSSLError(req.connection_key, exc) from exc
aiohttp.client_exceptions.ClientConnectorSSLError: Cannot connect to host multimedia.nt.qq.com.cn:443 ssl:default [[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:1006)]
05-26 00:57:45 [DEBUG] nonebot | Stop event propagation
05-26 00:57:45 [DEBUG] nonebot | Checking for matchers completed

aiohttp的话,不介意的话可以使用http拉取multimedia.nt.qq.com.cn下的图片,或者修改SSL_CONTEXT也可以

可以参考下我的修改:https://gist.github.com/pk5ls20/a2ded67daf09b38458d7d56e4c30b53f

Ailitonia commented 3 months ago

aiohttp的话,不介意的话可以使用http拉取multimedia.nt.qq.com.cn下的图片,或者修改SSL_CONTEXT也可以

可以参考下我的修改:https://gist.github.com/pk5ls20/a2ded67daf09b38458d7d56e4c30b53f

只用 set_ciphers 就能解决问题, 但如果只禁用 SSL 和低版本 TLS 就没有效果, 有点奇怪

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

通过

('AES128-GCM-SHA256', 'TLSv1.2', 128)
TLSv1.2
pk5ls20 commented 3 months ago

aiohttp的话,不介意的话可以使用http拉取multimedia.nt.qq.com.cn下的图片,或者修改SSL_CONTEXT也可以 可以参考下我的修改:gist.github.com/pk5ls20/a2ded67daf09b38458d7d56e4c30b53f

只用 set_ciphers 就能解决问题, 但如果只禁用 SSL 和低版本 TLS 就没有效果, 有点奇怪

import ssl
import socket

def verify_ssl(hostname: str, port: int = 443):
    context = ssl.create_default_context()
    context.set_ciphers('AES')

    with socket.create_connection((hostname, port)) as sock:
        with context.wrap_socket(sock, server_hostname=hostname) as ssock:
            print(ssock.cipher())
            print(ssock.version())

verify_ssl('multimedia.nt.qq.com.cn')

通过

('AES128-GCM-SHA256', 'TLSv1.2', 128)
TLSv1.2

省流:如果使用NoneBot2的朋友遇到了无法拉取multimedia.nt.qq.com.cn下的图片的问题,不想改代码的话可以直接使用httpx驱动器解决

今天有群友又提到了这个问题,回去看了下,真正的问题应该是ssl握手阶段,客户端和服务器端的密码套件对不上

8fc530695c9dd80b3e6317b93d006fc0

左面的是客户端(aiohttp/requests/urllib3,使用的都是ssl模块的默认密码套件),右面的是 multimedia.nt.qq.com.cn 支持的密码套件


在我这里,multimedia.nt.qq.com.cn 支持的密码套件不在ssl模块的默认密码套件中,而 ssl.set_ciphers ('DEFAULT')之后的密码套件就包含了multimedia.nt.qq.com.cn所支持的密码套件

由于 aiohttp, requests, urllib3 默认情况下不修改ssl模块使用的加密套件^1 ^3,但是 httpx 在导入ssl模块后还会修改密码套件^4,所以使用httpx可以直接请求 multimedia.nt.qq.com.cn 而不会handshake failure,而 aiohttp, requests, urllib3 就需要按照上面所说的修改下ssl的密码套件才可以正常请求。