project-mirai / mirai-api-http

Mirai HTTP API (console) plugin
GNU Affero General Public License v3.0
1.66k stars 343 forks source link

adapter配置顺序导致请求头丢失 #543

Closed single-ptilopsis closed 2 years ago

single-ptilopsis commented 2 years ago
import requests
resp = requests.get('http://localhost:29010/botProfile'),headers={'sessionKey': session})

返回 {'code': 3, 'msg': 'Session失效或不存在'} mirai-console版本2.10.0,mirai-http-api版本为2.4.0,运行平台windows11 将session传递置于url参数后调用正常,确认http适配器配置无误,session有效且请求无误 切换请求api(friendProfile)后结果依旧,将header格式换为Authorization: session YourSessionKey和Authorization: sessionKey YourSessionKey进行尝试结果仍为{'code': 3, 'msg': 'Session失效或不存在'}

wyapx commented 2 years ago

你好,码错了

import requests
resp = requests.get('http://localhost:29010/botProfile') 
# ,headers={'sessionKey': session})

headers那段你都没用上

ryoii commented 2 years ago

我测试都没问题,应该是你header传错了

ryoii commented 2 years ago

我以下几种写法都没有问题,请检查下自己的代码

import requests

if __name__ == '__main__':
    headers = {"sessionKey": "8mdOWNCg"}
    res = requests.get("http://localhost:8080/botProfile", headers=headers)
    print(res.text)
import requests

if __name__ == '__main__':
    headers = {"Authorization": "session 8mdOWNCg"}
    res = requests.get("http://localhost:8080/botProfile", headers=headers)
    print(res.text)
import requests

if __name__ == '__main__':
    headers = {"Authorization": "sessionKey 8mdOWNCg"}
    res = requests.get("http://localhost:8080/botProfile", headers=headers)
    print(res.text)
single-ptilopsis commented 2 years ago

提交Issue时语法码错了,实际运行时是正常传参的 以下是我测试时使用的完整代码

import requests
import json

host = 'localhost'
port = 8080
verify_key = 'TestKey'
qq = 174***

url = f'http://{host}:{port}/'

res = requests.post(f'{url}verify', json={'verifyKey': verify_key})
print(res.text)

session = json.loads(res.text)['session']

res = requests.post(f'{url}bind', json={'qq': qq, 'sessionKey': session})
print(res.text)

headers = {'sessionKey':session}

try:
    res = requests.get(f'{url}botProfile',headers=headers)
    print(res.text)

finally:
    res = requests.post(f'{url}release', json={'qq': qq, 'sessionKey': session})
    print(res.text)

这是config\net.mamoe.mirai-api-http\setting.yml的配置

adapters: 
  - ws
  - http
debug: false
enableVerify: true
verifyKey: TestKey
singleMode: false
cacheSize: 4096
adapterSettings:
  ws:
    host: localhost
    port: 8080
    reservedSyncId: -1
  http:
    host: localhost
    port: 8080

我通过socket模块搭建本地服务和云服务器检测header传递,得到的结果为传递正常,且sessionKey大小写准确,本地服务收集到的header结果如下

b'GET / HTTP/1.1\r\nHost: localhost:2344\r\nUser-Agent: python-requests/2.26.0\r\nAccept-Encoding: gzip, deflate\r\nAccept: */*\r\nConnection: keep-alive\r\nsessionKey: QW0Ohs4E\r\n\r\n'

在本地的另一台设备(WindowsServer2019)上我从github下载mirai-console(v2.10.0)和mirai-api-http(v2.4.0)并进行安装,配置文件同上,运行上述测试代码时结果为(此设备从未安装过mirai,python版本3.9.10,requests版本2.15.1)

{"code":0,"session":"SYlnDR26"}
{"code":0,"msg":"success"}
{"code":3,"msg":"Session失效或不存在"}
{"code":0,"msg":"success"

我尝试切换到以前的mirai-api-http版本(直到v2.0.0)结果依旧没发生变化 java版本为默认的11.0.14.1

java -version
openjdk version "11.0.14.1" 2022-02-08
OpenJDK Runtime Environment Temurin-11.0.14.1+1 (build 11.0.14.1+1)
OpenJDK 64-Bit Server VM Temurin-11.0.14.1+1 (build 11.0.14.1+1, mixed mode)
ryoii commented 2 years ago

中间是不是经过什么http代理、反向代理导致请求头被丢弃了

single-ptilopsis commented 2 years ago

笔记本(最开始测试的设备)和本地的WinSrv2019均装过v2ray以稳定访问github 但在关闭v2ray(关闭开机自启的情况下开机)后测试的结果并未改善,且启用v2ray的情况下成功检测请求头传递 为了排除本地环境因素,我在三台云服务器上也安装了python,mirai-console和mirai-http-api,以下是检测的结果 ( 1 ) WinSrv2019 2c2t4g 此设备之前安装过v2ray,但在使用完毕后就删除了所有文件 (操作时间4月前),mirai-console(v2.8.?)和mirai-http-api(v2.3.3)也是在此时安装 此后进行过一次更新,mirai-console更新为v2.9.0-M1 运行结果

{"code":0,"session":"AvSy7Gv3"}
{"code":0,"msg":"success"}
{"code":3,"msg":"Session失效或不存在"}
{"code":0,"msg":"success"}

( 2 ) WinSrv2016 1c1t2g 此设备未安装过v2ray,也未安装过miria相关配件,安装为直连,java使用默认版本(11)进行安装 mirai-console(v2.10.0) mirai-http-api(v2.4.0) 运行结果

{"code":0,"session":"B7p7kmMG"}
{"code":0,"msg":"success"}
{"code":3,"msg":"Session失效或不存在"}
{"code":0,"msg":"success"}

( 3 ) WinSrv2019 2c2t4g 此设备为重装系统后安装mirai和python解释器,python(v3.10.2),mirai-console(v2.10.0),mirai-http-api(v2.4.0),安装为直连,java使用默认版本(11)进行安装 运行结果

{"code":0,"session":"YgPdSgj5"}
{"code":0,"msg":"success"}
{"code":3,"msg":"Session失效或不存在"}
{"code":0,"msg":"success"}

在此设备上进行的操作已用录屏的方式记录,抹去了一些包含隐私的信息,全长~10min,如有需要我可以提供此视频到合适的地址

ryoii commented 2 years ago

抱歉,我用你的代码也完全复现不了

wyapx commented 2 years ago

试试使用默认设置?(删掉settings.yml)

single-ptilopsis commented 2 years ago

找到问题所在了,是配置文件的问题

adapters: 
  - http
  - ws

这是能正常使用header传递的adapters项配置 然而,当颠倒了http与ws的顺序后

adapters: 
  - ws
  - http

header传递就会失效,但其他一切正常 adapterSettings中http与ws的配置顺序颠倒并不会影响header传递

ryoii commented 2 years ago

这真是个有趣的现象,晚上再测试一下

ryoii commented 2 years ago

请求头丢失了,准备构造最小demo判断是否ktor的bug