如何调用VNDB API?非HTTP协议API使用及工具适配疑问
刚好用过VNDB的API,它和你平时用的HTTP接口完全不一样,是自定义的TCP文本协议,所以axios这类HTTP工具直接用不了,我来给你拆解清楚怎么操作:
先搞懂VNDB API的消息格式
你看到的示例login { "protocol" : 1, "username" : "ayo" } 0x04 0x04其实是三个部分的组合:
- 开头是命令名称(比如
login、dbstats、vn查询等) - 空格后跟着标准JSON格式的参数(不是非标准,只是和命令拼在一起了)
- 结尾必须加两个ASCII EOT字符(十六进制0x04,对应键盘的Ctrl+D),这是协议规定的消息结束标记
如何发送请求(代码示例)
因为是TCP协议,你需要用TCP客户端来连接,下面给两个常用语言的例子:
Node.js(用TLS加密连接)
const tls = require('tls'); // 连接VNDB的TLS加密端口19535 const socket = tls.connect({ host: 'api.vndb.org', port: 19535 }, () => { console.log('已连接到VNDB API'); // 发送登录命令(即使匿名登录也需要这一步,protocol必须设为1) const loginCommand = 'login { "protocol": 1, "client": "MyTestClient", "clientver": 0.1 }' + String.fromCharCode(4) + String.fromCharCode(4); // 两个EOT字符 socket.write(loginCommand); }); // 接收API返回的消息 socket.on('data', (data) => { const response = data.toString().trim(); console.log('收到响应:', response); // 登录成功后可以发送查询命令,比如获取数据库统计 if (response.includes('loginok')) { const dbstatsCommand = 'dbstats' + String.fromCharCode(4) + String.fromCharCode(4); socket.write(dbstatsCommand); } }); socket.on('error', (err) => { console.error('连接出错:', err); });
Python(用SSL加密连接)
import ssl import socket # 创建SSL上下文,连接加密端口19535 context = ssl.create_default_context() sock = socket.create_connection(('api.vndb.org', 19535)) secure_sock = context.wrap_socket(sock, server_hostname='api.vndb.org') # 发送登录命令 login_cmd = b'login { "protocol": 1, "client": "MyPythonClient", "clientver": 0.1 }\x04\x04' secure_sock.sendall(login_cmd) # 读取登录响应 response = secure_sock.recv(4096) print('收到登录响应:', response.decode()) # 发送数据库统计查询 dbstats_cmd = b'dbstats\x04\x04' secure_sock.sendall(dbstats_cmd) response = secure_sock.recv(4096) print('收到统计响应:', response.decode()) # 关闭连接 secure_sock.close()
能不能用Postman访问?
很遗憾,Postman是专门针对HTTP/REST接口的工具,不支持自定义TCP文本协议,所以没法直接用。不过你可以用这些TCP客户端工具来测试:
- 命令行工具:
telnet api.vndb.org 19534(明文端口),输入命令后按两次Ctrl+D发送;或者用nc api.vndb.org 19534(netcat) - 图形化工具:比如Hercules、SocketTest这类TCP/UDP客户端,支持手动输入文本并添加特殊字符(比如EOT)
几个关键注意事项
- 必须先发送
login命令:哪怕是匿名访问,也要发送login { "protocol": 1 },否则其他命令会被API拒绝 - 消息结尾的两个EOT字符不能少:这是API识别消息结束的唯一标记,少一个都不行
- 优先用TLS端口19535:明文端口19534不加密,容易泄露数据,生产环境一定要用加密连接
- 响应格式和请求类似:返回的消息也是「命令名+JSON数据+EOT」,你需要自己拆分解析
内容的提问来源于stack exchange,提问作者chachathok
相关产品推荐
相关产品推荐

