公共信息说明 - wolfcon/NGA-API-Documents GitHub Wiki

2 一些公共部分的格式和解释

2.1 当前用户信息

{//当前访问者的用户信息 如果未登录则没有此项
  "uid":58,//用户id
  "group_bit":1034239,//用户权限bit 见2.1.1
  "admincheck":1,//用户是否在当前页有部分权限
  "rvrc":465//用户的威望(论坛的威望显示值是此数值/10
}

2.1.1 用户权限bit

用户权限bit是一个32位bit数据

bitmask如下

const _GB_ADMIN = 1;#有管理员权限
const _GB_SUPER = 2;#有超版权限
const _GB_GREATER = 4;#有版主权限
const _GB_SUPERLESSER = 8;#有超级次级版主权限
const _GB_LESSER = 16;#有次级版主权限
const _GB_NORMAL = 32;#有普通用户权限

2.2 公共变量文件

公共变量是一个xml文件 储存了论坛的一些公用数据

格式如下

<?xml version="1.0" encoding="GBK"?>
<root>
   <__IMG_BASE>http://img4.ngacn.cc</__IMG_BASE><!--公共图片服务器-->
   <__IMGPATH>http://img4.ngacn.cc/ngabbs</__IMGPATH><!--公共图片地址-->
   <__IMG_STYLE>http://img4.ngacn.cc/ngabbs/nga_classic</__IMG_STYLE><!--当前模版图片地址-->
   <__COMMONRES_PATH>http://img4.ngacn.cc/common_res</__COMMONRES_PATH><!--公共资源地址-->
   <__COMMONIMG_PATH>http://img4.ngacn.cc/common_res</__COMMONIMG_PATH><!--公共图片地址-->
   <__RES_PATH>http://img4.ngacn.cc/ngabbs/nga_classic</__RES_PATH><!--当前模版资源地址-->
   <__FORUM_ICON_PATH>http://img4.ngacn.cc/ngabbs/nga_classic/f</__FORUM_ICON_PATH><!--版面图标地址-->
   <__FORUM_ICON>
      <forum fid="320" icon="10"/><!--fid:版面id(整数)   icon:图标文件名 (扩展名是 .png)  如 __FORUM_ICON_PATH+'/'+icon+'.png'-->
      <forum fid="181" icon="0"/><!--icon为0则图标是 "版面id.png"   如 __FORUM_ICON_PATH+'/'+fid+'.png'-->
      ...
      <forum fid="0" icon="37"/><!--默认图标(扩展名是.png) 其他所有未指定图标的都使用这个 如  __FORUM_ICON_PATH+'/37.png'-->
   </__FORUM_ICON>
</root>

2.3 主题(回复)类型bit

主题(回复)类型bit是一个32位bit数据

bitmask如下

_POST_IF_COMMENT=1;  //是否是评论
_POST_IF_HIDDEN=2;  //是否隐藏
_POST_IF_HAVE_COMMENT=4;  //是否有评论

_POST_IF_EXTRA_USER_INFO=16;  //是否在列表显示更多用户信息

_POST_IF_NO_HINT=64;  //是否阻止回复提示
_POST_IF_FREE_EDIT=128;  //是否超期可编辑
_POST_IF_SELF_REPLY=256;  //是否只能自己回复

_POST_IF_LOCK=1024;  //是否锁定

_POST_IF_HAS_AUTO_TRANSLATE=4096;  //是否有可以自动翻译的内容
_POST_IF_HAS_UPLOAD=8192;  //是否有上传文件

2.4 版面的类型bit

版面的类型bit是一个32位bit数据

bitmask如下

const __FORUM_IF_AUTO_TRANSLATE=8; #版主设置了同义词翻译表
const __FORUM_IF_FILTER_KEY=32; #是否有设置监视关键字
const __FORUM_IF_TOPIC_KEY_COLOR=64; #是否有设置分类颜色
const __FORUM_IF_CUSTOM_LEVEL=128; #是否有设置声望级别
const __FORUM_IF_FORCE_TOPICKEY=256; #是否有设置强制分类
const __FORUM_IF_FORUM_BG=512; #是否设置了背景图

2.5 成功/失败信息

论坛的一些信息提示的格式是固定的 在此加以说明 后不赘述

2.5.1论坛前台功能的信息格式

window.script_muti_get_var_store={
  "data":{
    "__MESSAGE":{//提示信息
      "0":123, //错误ID 可能没有
      "1":"vfedwvgfd", //提示信息文字 (html格式
      "2":"vfedwvgfd", //提示信息更详细的提示 可能没有(html格式
      "3":200  //此提示的http状态 (无实际用途
      }
    },
  "encode":"GBK",
  "time":1375213298
  }

2.5.2后台功能(/nuke.php)的信息格式

window.script_muti_get_var_store={
  "data":{//成功时的数据/信息
    "0":...//可能有多条数据 一般只有一个
    "1":...
    },
  "error":{//错误时的提示信息
    "0":...//可能有多条数据 一般只有一个
    "1":...
    },
  "encode":"GBK",
  "time":1375213298
  }

2.6 主题其他数据(topic_misc)

由于论坛数据库结构难以修改, 所以在某些地方使用了在一个字段中储存多个数据的方式以增加扩展性

2.6.1 如果第一个字节是 '~' 字符

则为旧格式标题字体数据 将字符串转为小写 按 '~' 字符分割 每一段可能取值如下

red //标题字体红色
blue //标题字体蓝色
green //标题字体绿色
orange //标题字体橙色
silver //标题字体银色
b //标题字体粗体
i //标题字体斜体
u //标题字体有下划线

2.6.2 如果第一个字节不是 '~' 字符

则是使用base64编码后的二进制字串, 其中可能包含多条数据, 解码方式如下

  1. 将字串使用base64解码
  2. 截取第一个字节转化为无符号整数(ascii值)判断数据类型,截取从第二个字节开始特定长度(根据类型决定)的一段数据
  3. 循环进行第二步 直到字串全部被截取

第一个字节(数据类型) 可能取值如下

1 //"主题bit数据1" (包括主题颜色字体等数据) 其后数据长度为4字节
2 //"主题集合ID" 其后数据长度为4字节

"主题bit数据1" 为4字节无符号整数(big-endian)的二进制字符串 转化成整数后bitmask如下

1 //标题字体红色
2 //标题字体蓝色
4 //标题字体绿色
8 //标题字体橙色
16 //标题字体银色
32 //标题字体粗体
64 //标题字体斜体
128 //标题字体有下划线
65536 //表示主题是一个直播~应从直播系统取出数据

"主题集合ID" 为4字节无符号整数(big-endian)的二进制字符串 转化成整数后 表明此主题所在的主题集合的ID 详见主题集合章节 (目前未完成

相关解码程序的javascript范例

topicMiscVar = {
_BIT1:1,
_STID:2,

_FONT_RED:1,
_FONT_BLUE:2,
_FONT_GREEN:4,
_FONT_ORANGE:8,
_FONT_SILVER:16,
_FONT_B:32,
_FONT_I:64,
_FONT_U:128,

unpack:function(x){
if(x.match(/~1?$/))
  return;
var z={},x = this.b642bin(x),i=0,y;
if(x==='')
  return z;
while(y = this.bin2UInt(x.substr(i,1))){
  if(y==this._BIT1){
    z._BIT1 = this.bin2UInt(x.substr(i+1,4));
    i+=5;
    }
  else if(y==this._STID){
    z._STID = this.bin2UInt(x.substr(i+1,4));
    i+=5;
    }
  }
return z;
},//fe
bin2UInt : function(x){//二进制字符串转为多字节整数(big-endian)
var z = 0,y=0
for(var i=0;i<x.length;i++){
  y = x.charCodeAt(i)
  z = (z<<(y>255?16:8))+y//如果输入字符串中有utf16字符则一次移动两字节
  }
return z
},//fe
b642bin : function (s) {//base64解码 如字符串中有多字节字符,解码会变为多个ascii字符
    var e={},i,b=0,c,x,l=0,a,r='',w=String.fromCharCode,L=s.length;
    if(L%4==3){s+='=';L+=1;}
    else if(L%4==2){s+='==';L+=2;}
    var A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    for(i=0;i<64;i++){e[A.charAt(i)]=i;}
    for(x=0;x<L;x++){
        c=e[s.charAt(x)];b=(b<<6)+c;l+=6;
        while(l>=8){((a=(b>>>(l-=8))&0xff)||(x<(L-2)))&&(r+=w(a));}
    }
    return r;
}//fe
}//ce

var topic_misc=topicMiscVar.unpack('AQAAACE')

if(topic_misc._STID)
  alert('标题的所在的主题集合ID是'+topic_misc._STID)

if(topic_misc._BIT1){
  if(topic_misc._BIT1 & topicMiscVar._FONT_RED)
    alert('标题字体是红色')
  if(topic_misc._BIT1 & topicMiscVar._FONT_B)
    alert('标题字体是粗体')
  }

2.7 用户的buff

用户的buff可以用来表示用户的某种临时性的状态

每个buff都有结束时间 结束时间超过当前时间则不在生效

buff id对应名称与效果如下

const _BUFF_SHEEP = 99; #变羊  用户的头像应显示为羊
const _BUFF_DISABLE_BUFF = 101;  #禁制  其他人无法对此用户使用道具 此用户也无法对其他人使用道具
const _BUFF_EDIART = 102;#变企鹅  用户的头像应显示为企鹅
const _BUFF_ANONY=103;#匿名状态  如果用户信息中有此buff则说明此信息是匿名发帖的假用户信息
const _BUFF_NO_POST_DELAY=104;#没有新注册用户禁言的限制  有此buff的新注册用户可以不受注册时间发帖限制
const _BUFF_MUTE=105;#禁言  用户在某个版或某个合集中是禁言状态
const _BUFF_DISABLE_POST_BUFF=106;#对贴禁制  禁止其他用户对此用户的帖子使用道具 此用户也无法对其他人的帖子使用道具

2.8 官方客户端用户中心接口转发

输入地址

/nuke.php?

输入参数

__lib //固定为 safe_reg
__act //固定为 user_center_send
_act //同用户中心接口

__output //输出格式 见1.1.1 官方客户端可选用专用格式

//其他输入参数同用户中心接口定义 必须使用post

需要登录状态的功能可以使用cookieid验证或token验证

必须使用post提交数据 必须使用https

成功时原样返回接口返回的信息

连接失败时会返回 SERVER ERROR 0

不在接口范围内的操作会返回 参数错误

⚠️ **GitHub.com Fallback** ⚠️