下一页(2)

NGA数据接口

NGA数据接口


索引占楼



===1 获得数据的方法与格式===


===1.1 标准格式的数据===

论坛大部分功能在添加了lite参数后可以直接输出标准格式的数据

lite取值可选 js 或 xml

选择js数据输出为javascript对象 (类似jsonp 较json更为宽松 某些json解析器可以解析
使用论坛默认编码 (GBK

选择xml数据输出为xml

输出的数据格式为

[code=javascript]
window.script_muti_get_var_store={
"data":{}, //数据部分 根据不同的功能而定
"time":1375213298 //当前时间
}
[/code]

例:

[url]http://bbs.ngacn.cc/read.php?tid=6441992&lite=js[/url]

===1.1.1 更多的输出格式===

论坛的后台功能(nuke.php)可以使用 __output 参数指定更多的输出样式

__output=1 js输出 同lite=js

__output=9 xml输出 同lite=xml

__output=8 类似json输出 同lite=js 但是没有开头 "window.script_muti_get_var_store=" 的部分 使用论坛默认编码 (GBK

__output=11 标准json

__output=12 标准json 官方app专用格式

__output=3 html输出 同lite=js 但以html输出 如
[code]
<html>
<head>
  <meta http-equiv='Content-Type' content='text/html; charset=GBK'>
</head>
<body>
  <script>window.script_muti_get_var_store={data:{0:'testtest'}}</script>
</body>
</html>
[/code]


===1.2 非标准格式的数据===

论坛的一些后台功能没有标准格式的数据输出

一部分输出js数据 一部分直接输出html

可以自己解析返回信息

有其他格式需求可以联系管理员修改

===1.3 输入参数的字符集===

本论坛默认编码GBK 提交请求时使用的参数也应是GBK编码

如参数使用UTF-8编码可在请求中增加参数 __inchst=UTF8


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

===2.1 当前用户信息===

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

===2.1.1 用户权限bit===

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

bitmask如下

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

===2.2 公共变量文件===

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

格式如下
[code=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>
[/code]

===2.3 主题(回复)类型bit===

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

bitmask如下

[code=javascript]
_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;  //是否有上传文件


[/code]

===2.3 版面的类型bit===

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

bitmask如下

[code=php]
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; #是否设置了背景图
[/code]

===2.4 成功/失败信息===

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

论坛前台功能的信息格式如下

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

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

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

===2.5 主题其他数据(topic_misc)===

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

===2.5.1 如果第一个字节是 '~' 字符===
则为旧格式标题字体数据
将字符串转为小写 按 '~' 字符分割 每一段可能取值如下
[code]
red //标题字体红色
blue //标题字体蓝色
green //标题字体绿色
orange //标题字体橙色
silver //标题字体银色
b //标题字体粗体
i //标题字体斜体
u //标题字体有下划线
[/code]

===2.5.2 如果第一个字节不是 '~' 字符===
则是使用base64编码后的二进制字串, 其中可能包含多条数据, 解码方式如下
1 将字串使用base64解码
2 截取第一个字节转化为无符号整数(ascii值)判断数据类型,截取从第二个字节开始特定长度(根据类型决定)的一段数据
3 循环进行第二步 直到字串全部被截取

第一个字节(数据类型) 可能取值如下
[code]
1 //"主题bit数据1" (包括主题颜色字体等数据) 其后数据长度为4字节
2 //"主题集合ID" 其后数据长度为4字节
[/code]

"主题bit数据1" 为4字节无符号整数(big-endian)的二进制字符串 转化成整数后bitmask如下
[code]
1 //标题字体红色
2 //标题字体蓝色
4 //标题字体绿色
8 //标题字体橙色
16 //标题字体银色
32 //标题字体粗体
64 //标题字体斜体
128 //标题字体有下划线
65536 //表示主题是一个直播~应从直播系统取出数据
[/code]

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


相关解码程序的javascript范例
[code=js]
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('标题字体是粗体')
  }

[/code]


===2.6 用户的buff===

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

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

buff id对应名称与效果如下

[code=php]
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;#对贴禁制  禁止其他用户对此用户的帖子使用道具 此用户也无法对其他人的帖子使用道具
[/code]

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

输入地址
[code]
/nuke.php?
[/code]

输入参数
[code]
__lib //固定为 safe_reg
__act //固定为 user_center_send
_act //同用户中心接口

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

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

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

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

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

连接失败时会返回 SERVER ERROR 0

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


===3 论坛首页===

论坛首页包括公开版面的列表

输入地址

[code=javascript]
/index.php
[/code]

输入参数

[code=javascript]
lite //输出格式 见1.1
[/code]

格式如下

[code=javascript]
window.script_muti_get_var_store={
  "data":{
    "__CU":{//当前访问者的用户信息 如果未登录则没有此项 见2.1
      "uid":58,
      "group_bit":1034239,
      "admincheck":1,
      "rvrc":465
      },
    "__GLOBAL":"./template/js/nga_global.xml",//公共变量文件 xml格式 见2.2
    "index":"./template/js/nga_index_forums.xml"// 论坛首页的公开版面列表文件 见3.1
    },
  "encode":"GBK",
  "time":1375213298
  }
[/code]

===3.1 公开版面列表===

公开版面列表是一个xml文件

格式如下

[code=xml]
<?xml version="1.0" encoding="GBK"?>
<root>
  <category id="1" name="魔兽世界综合讨论"><!--大类 id:大类id name:大类名-->
    <group><!--子类-->
      <forum fid="7" name="艾泽拉斯议事厅" info="魔兽主讨论区" nameshort="议事厅" heightlight="1"/><!--fid:版面id name:版面名 info:说明 nameshort:版面名的缩写 heightlight:高亮-->
      <forum fid="338" name="魔兽世界8周年活动" nameshort="魔兽8周年"/>
      ....
    </group>
    <section name="职业讨论区"><!--子类 name:子类名-->
      <forum fid="390" name="五晨寺" info="武僧"/>
      <forum fid="320" name="黑锋要塞" info="死亡骑士"/>
      ....
    </group>
    .... 可能有很多子类
  </category>
  .... 可能有很多大类
</root>
[/code]


[url]http://bbs.ngacn.cc/read.php?tid=6441992&pid=116097568[/url]
我最近看到useragent好像可以识别手机型号了.
请教一下zeg,什么格式的才会被识别出来. 还有就是json结果中 from_client:的值, 1是ios企业客户端, 3是安卓客户端,是这样吗?

评论

UID:58
+ 现在没空搞!等等的……


现在没空搞!等等的……


===4 主题列表 帖子列表 主题搜索 收藏的主题===

输入地址
[code=javascript]
/thread.php
[/code]

输入参数
[code=javascript]
fid   版面ID  整数 或 逗号分隔的整数
page  页  整数
authorid  主题作者用户id  整数
key  搜索关键字  字符串urlencode
fidgroup  搜索的版面组  取值为user时表示全部用户版 无此参数为全部非用户版
favor  收藏的主题  为1时显示收藏的主题
recommend  推荐精华加分的主题  为1时显示推荐 精华 加分的主题
lite  //输出格式 见1.1
[/code]

输入参数可组合使用 如

/thread.php?fid=7&page=1&lite=js (版面id7的主题第一页

/thread.php?authorid=58&page=1&lite=js (发布人id是58的主题第一页

/thread.php?authorid=58&key=keyword&fid=7&page=1&lite=js (发布人id是58 在版面id7中 发布的主题

/thread.php?key=keyword&fid=7&page=1&lite=js (在版面id7中搜索标题包含keyword的主题

/thread.php?key=keyword&fid=7,10&page=1&lite=js (在版面id7和10中搜索

/thread.php?key=keyword&fidgroup=user&page=1&lite=js (在所有用户版面(fid<0)中搜索

/thread.php?key=keyword&page=1&lite=js (在所有非用户版面(fid>0)中搜索

/thread.php?favor=1 (自己收藏的主题

/thread.php?recommend=1 (所有精华 推荐 加分的主题

/thread.php?fid=7&recommend=1 (版面id7中所有精华 推荐 加分的主题

/thread.php?fid=7&recommend=1&authorid=58 (版面id7中发布人用户id是58的所有精华 推荐 加分的主题

返回数据格式大致解释如下

[code=javascript]
window.script_muti_get_var_store={
"data":{
  "__CU":{//当前访问者的用户信息 如果未登录则没有此项 见2.1
    "uid":58,
    "group_bit":1034239,
    "admincheck":1,
    "rvrc":465
    },
  "__GLOBAL":"./template/js/nga_global.xml",//公共变量文件 xml格式
  "__F":{//版面信息
    "fid":335,//当前版面id (搜索用户发帖等情况是没有当前版面id
    "topped_topic":2330562,//置顶贴的主题ID 主题内容即为置顶信息
    "topped_topic_extra":"xxoo"//额外的置顶贴内容 可能没有
    "sub_forums":{//当前版面的子论坛或者联合版面等 版面图标在公共变量文件里 见2.2
      "0":{
        "0":311,//版面ID
        "1":"游戏综合讨论区",//版面名称
        "2":"游戏话题来这里讨论"//版面说明
        },
      .....//可能有多个
      },
    "__UNION_FORUM":'',//联合版面中默认设置的版面ID 逗号分隔
    "__UNION_FORUM_DEFAULT":'',//联合版面中默认显示的版面ID 逗号分隔
    "__SELECTED_FORUM":""//联合版面中用户选择显示的版面id 逗号分隔 (如选择了一个以上会包括联合版面本身的id)
    },
  "__ROWS":1246,//数据的总行数
  "__T":{//本页的主题数据
    "0":{
      "tid":5627431,//主题id
      "fid":335,//主题所在版面id
      "quote_from":0,//引用自主题 (如果这个有值则tid属性应改为这个
      "quote_to":"5630264|5647212",//此主题引用到主题
      "icon":0,//图标
      "topic_misc":"",//主题其他数据 包括主题集ID 标题颜色等 见章节2.5
      "author":"lintx",//作者
      "authorid":7989705,//作者uid
      "subject":"黑科技之 NGA插件设置中心插件+NGA UBB编辑器插件",//标题
      "ifmark":143,
      "type":8196,//主题类型bit 见2.3
      "type_2":0,
      "postdate":1350226550,//发帖时间
      "lastpost":1374123445,//最后回复时间
      "lastposter":"云归无处",//最后回复人
      "replies":352,//回复数量 (回复页数=回复数量/__R__ROWS_PAGE
      "locked":0,
      "digest":0,
      "ifupload":1,
      "lastmodify":1374123508,//最后修改时间
      "recommend":80,
      "admin_ui":3,//用户是否对此主题有权限bit
      "tpcurl":"read.php?tid=5627431",//主题地址
      "ispage":" "
      },

    .....//可能有多个主题


    },
  "__T__ROWS":35//本页的主题数量
  "__T__ROWS_PAGE":35,  //主题列表每页的主题数
  "__R__ROWS_PAGE":20  //阅读主题时每页的回复数
  },
"encode":"gbk",//编码
"time":1374141799//当前时间
}
[/code]


===5 阅读主题===

输入地址
[code=javascript]
/read.php
[/code]

输入参数
[code=javascript]
tid  //主题id  整数
pid  //回复id  整数
page  //页  整数
authorid  //作者用户id  整数
lite  //输出格式 见1.1
v2  //固定为1
[/code]

一些参数可以组合使用 如

/read.php?tid=123&page=1&lite=js&v2  (阅读主题id是123的主题
/read.php?pid=123&page=1&lite=js&v2  (阅读回复id是123的单条回复
/read.php?pid=123&page=1  (阅读回复id是123的单条回复
/read.php?tid=123&authorid=123  (用户id是123的用户在主题id是123的主题中的帖子

返回数据格式大致解释如下

[code]
window.script_muti_get_var_store={
"data":{
  "__CU":{//当前访问者的用户信息 如果未登录则没有此项 见2.1
    "uid":58,
    "group_bit":1034239,
    "admincheck":1,
    "rvrc":465
    },
  "__GLOBAL":"./template/js/nga_global.xml",//公共变量文件 xml格式
  "__U":{//用户数据
    "1234567":{//uid为key
      "uid":1234567,//uid
      "username":"xxx",//用户名
      "credit":20,//无用
      "medal":54,//徽章id 逗号分隔
      "reputation":"46_100",//无用
      "groupid":-1,//用户组 如果是-1使用下一个用户组
      "memberid":39,//用户组
      "avatar":"",//头像 和以前一样 可能是字符串也可能是object
      "yz":1,//激活状态 1激活 0未激活 -1nuke -2往下账号禁用
      "site":"",//个人版名
      "honor":"",//头衔
      "regdate":1199856844,//注册日期
      "mute_time":0,//禁言到期时间
      "postnum":2409,//发帖数
      "rvrc":0,//威望
      "money":23741,//金钱 铜币数
      "thisvisit":1363859920,//最后一次访问
      "signature":"",//签名
      "nickname":"",//无用
      "bit_data":20//用户状态bit
      "buffs":{//用户的buff数据 如果没buff可能无此项 可能有已经结束的buff buff列表参看2.6
        99:[//buffid为key 99是变羊
          123,  //此buff来自用户 的用户id
          123456789,  //此buff的结束时间
          99,  //此buff的id
          0,  //此buff的附加数据0
          0  //此buff的附加数据1
          ],
        102:[//buffid为key 102是变企鹅
          123,  //此buff来自用户 的用户id
          123456789,  //此buff的结束时间
          102,  //此buff的id 102是变企鹅
          0,  //
          0  //
          ]
        105:[//有多个同ID的buff的情况 105是禁言
          [
            0,  //
            123456789,  //此buff的结束时间
            105,  //此buff的id 105是禁言
            108,  //
            12346  //在此tid的主题合集中被禁言
            ],
          [
            0,  //
            123456789,  //此buff的结束时间
            105,  //此buff的id 105是禁言
            109,  //在此fid被禁言
            0  //
            ],
          ],
        ... //可能有很多个buff
        }
      },
    
    .....//可能有很多个用户

    "__GROUPS":{//用户组数据
      "39":{//用户组id为key
        "0":"xoo",//用户组名
        "1":622816//用户组属性bit
        "2":39//用户组id
        },
      
      .....//可能有很多个用户组
      },

    "__MEDALS":{//徽章数据
      "54":{//徽章id为key
        "0":"54.gif",//图标
        "1":"xxoo",//名字
        "2":"xooxoxox"//说明 可能没有
        "3":54//徽章id
        }

      .....//可能有很多个徽章
      },
    
    "__REPUTATIONS":{//声望数据
      "-12345":{//声望id为key
        "1234567":6988,//用户uid : 用户声望值
        
        .....//可能有很多个用户的声望

        "0":xooxoxoxo"//0 : 声望的名字
        },

      .....//可能有多个声望的数据

      }
    },


  "__R":{//帖子数据
    "0":{
      "content":"xooxoxox",//帖子内容
      "alterinfo":"",//修改/加分信息
      "type":0,//帖子状态bit 见2.3
      "authorid":1234567,//发帖人uid
      "postdate":"2013-03-21 17:56",//无用
      "subject":"xxoooo",//帖子标题
      "pid":0,//回复id 主贴本身为0
      "tid":6078630,//主题id
      "fid":-46468,//所在版面id
      "content_length":217,//内容长度
      "from_client":'8 Xiaomi MI 2SC(Android 4.1.1)'//发布此贴的客户端信息
        //开头的数字代表客户端
        //7为官方IOS客户端
        //8为官方android客户端
        //9为官方wp客户端
        //100为安卓平台浏览器
        //101为IOS平台浏览器
        //103为WP平台浏览器)
        //之后的文字为硬件和系统信息
      "org_fid":-46468,//发帖时所在版面id
      "attachs":{//附件
        "-46468_514ad8ec10795":{
          "aid":"-46468_514ad8ec10795",
          "url_utf8_org_name":"vk2_1.jpg",//文件的原名 urlencode的utf8编码
          "path":"mon_201303/21",
          "dscp":"",
          "size":155,
          "ext":"jpg",
          "name":"-46468_514ad8ec10795.jpg",
          "thumb":64,//缩略图bit数据 bitmask如下
            //8 有60*45的缩略图 附件地址后加 .thumb_ss.jpg
            //16 有130*97的缩略图 附件地址后加 .thumb_s.jpg
            //32 有320*240的缩略图 附件地址后加 .thumb.jpg
            //64 有640*?的缩略图 附件地址后加 .medium.jpg
          "attachurl":"mon_201303/21/-46468_514ad8ec10795.jpg",//附件地址
          "type":"img",
          "subid":0
          },
        
        .....//可能有多个附件
        },
      "lou":0,//楼层
      "postdatetimestamp":1363859796,//发帖时间
      "14":{//对此贴使用的道具记录 可能没有此项
        "1":3,  //key为所使用道具的子类(sub_type) (type固定为5) value为同种道具对本贴使用的个数
        "2":1  
        .... //可能有多个种类的道具对一个帖子使用
        }
      }

    .....//可能有多个帖子数据
    }

  "__T":{//主题数据
    "tid":1234567,//主题id
    "fid":-46468,//所在版面id
    "quote_from":0,//被引用主题id 如果不是0 实际tid应该是这个
    "quote_to":"",//引用这个主题的主题id 无用
    "icon":0,//图标
    "topic_misc":"",//主题其他数据 包括主题集ID 标题颜色等 见章节2.5
    "author":"xxoxox",//主题作者名
    "authorid":1234567,//主题作者uid
    "subject":"xooxoxo",//主题标题
    "ifmark":0,//无用
    "type":0,//主题状态bit
    "type_2":0,//无用
    "postdate":1363859796,//发布时间
    "lastpost":1363860072,//最后回复时间
    "lastposter":"xxooxox",//最后回复人的用户名
    "replies":5,//回复数量
    "locked":0,//无用
    "digest":0,//无用
    "ifupload":1,//是否有附件
    "lastmodify":1363860448,//最后改动时间 (主题或任何一个回复的 修改 评分 回复等
    "recommend":10,//推荐值 加分或加精华或置顶
    "this_visit_rows":6,//无用
    "view_count":57//无用
    },

  "__F":{//版面数据
    "custom_level":"xxoooxoxo",//自定义声望级别 一个js格式的字符串
    "name":"xxoo"//版面名
    },
  "__ROWS":33,//贴数总和 (总页数=ceil(__ROWS/__R__ROWS_PAGE)
  "__R__ROWS":6,//本页帖子数据 的数量
  "__R__ROWS_PAGE":20  //每页的帖子数
  },

"encode":"gbk",

"time":1363861131//当前时间
}

[/code]

xml输出时声望如下
[code=xml]
<__REPUTATIONS>
  <item>
    <item>
      <item>16041664</item> //用户id
      <item>1000</item> //声望值
    </item>
    ... 可能有多个

    <name>声望-2342912</name> //声望名字
    <id>-2342912</id> //声望id
  </item>
  <item>
    <item>
      <item>16041664</item> //用户id
      <item>0</item> //声望值
    </item>
    ... 可能有多个

    <name>地精科技</name> //声望名字
    <id>15</id> //声望id
  </item>
  ... 可能有多个

</__REPUTATIONS>
[/code]


===6 发帖===

以下子章节叙述发布帖子的过程 按照章节顺序处理

===6.1 获取发布信息===

输入地址
[code=javascript]
/post.php
[/code]

输入参数
[code=javascript]
action  //动作  new为新主题 reply为回复(或评论/贴条) quote为引用 modify为编辑
comment: 1 //发布评论/贴条时设1 其他功能勿设此参数
pid  //回复id  整数
tid  //主题id  整数
fid  //版面id  整数
lite  //输出格式 见1.1
[/code]

参数可以组合使用 如

/post.php?fid=123 //在id是123的版面发新贴
/post.php?action=reply&tid=123 //回复主题id是123的主题
/post.php?action=reply&tid=123&pid=1234 //回复主题123里回复id是1234的回复
/post.php?action=quote&tid=123 //引用主题id是123的主题
/post.php?action=quote&tid=123&pid=1234 //引用主题123里回复id是1234的回复
/post.php?action=modify&tid=123&pid=1234 //编辑主题123里回复id是1234的回复
/post.php?action=modify&tid=123 //编辑主题id是123的主题

返回数据格式大致解释如下

[code=javascript]
window.script_muti_get_var_store={
"data":{
  "__CU":{//当前访问者的用户信息 如果未登录则没有此项 见2.1
    "uid":58,
    "group_bit":1034239,
    "admincheck":1,
    "rvrc":465
    },
  "__F":{//所在版面数据
    'fid':123,//版面id
    'bit_data':124//版面的类型数据bit 见2.3
    "name":"xxoo"//版面名
    },
  "__GLOBAL":"./template/js/nga_global.xml",//公共变量文件 xml格式
  'content':'vsdcds',//引用或者编辑时帖子的预置内容
  'pid':123,//回复id
  'fid':123,//版面id
  'tid':123,//主题id
  'subject':'vfdsfds',//主题标题
  'auth':'0000003a52b1749023e6b27e545af5bbfa53fc9648.....',//上传附件的验证码
  'attachs':{//已经上传的附件信息(编辑时
    },
  'attach_url':'vfedgvfdvsf', //上传附件的接口地址 见6.2
  'if_hidden':1,//此贴是否是隐藏的(编辑时
  'if_self_reply':1,//此贴是否只有自己和版主能回复(编辑时
  'modify_append':1,//是否超出编辑时限(编辑时
  'content_org':'vtfredvf',//帖子的内容(超出编辑时限时
  },
"encode":"gbk",//编码
"time":1374141799//当前时间
}
[/code]


===6.1.1 获取主题分类信息===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib  //固定为'topic_key'
__act  //固定为'get'
fid  //发帖版面的ID
lite  //输出格式 见1.1
[/code]


服务器返回如下数据

[code=javascript]
window.script_muti_get_var_store={
data:{
  0:{
    0:{
      0:'[分类1]',  //分类名字 带方括号
      1:1  //==1时是版主设置的分类 否则为用户添加的分类
      }
    }
    1:{
      0:'[分类2]',
      1:1
      }
    }
    2:{
      0:'[分类3]',
      1:0
      }
    }
    ... //可能有很多
  }
}
[/code]


===6.2 上传附件===

使用post(enctype=multipart/form-data)方法将如下数据上传至第一步数据中的附件上传地址 见6.1

输入参数
[code=javascript]
v2:1,  //固定为1
attachment_file1:file,//附件文件
attachment_file1_watermark:'tl', //水印位置tl/tr/bl/br 左上右上左下右下 不设为无水印
attachment_file1_dscp:'gvsrf',//附件的说明
attachment_file1_url_utf8_name:'gvsrf',//附件文件UTF8编码文件原名再urlencode
fid:123,//发帖所在的版面id
func:'upload',
auth:'0000003a52b1749023e6b27e545af5bbfa53fc9648.....',//在上一步(6.1)中取得的上传附件验证码
lite  //输出格式 见1.1
[/code]

上传成功后服务器返回如下数据

[code=javascript]
window.script_muti_get_var_store={
attachments:'vgrfasdvcrfd',  //上传后的文件地址
attachments_check:'vfdsavfd',  //此文件的验证码
url:'gtrfegtrf',  //附件上传后的地址
thumb:1  //附件是否有缩略图 (3只有最小缩略图 (2有最小和中等 (1有小中大三种 (未设为无缩略图
//缩略图地址为上传后地址后加 .thumb_ss.jpg(最小) .thumb_s.jpg(中) .thumb.jpg(大)
}
[/code]

将attachments连接至发帖表单的attachments参数末尾(如有多个附件用\t分隔)
将attachments_check连接至发帖表单的attachments_check参数末尾 (如有多个附件用\t分隔)


===6.2.1 发帖后删除附件===
[collapse]
输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
func //固定为delattach
pid  //所在的回复id  整数
tid  //所在的主题id  整数
aid  //附件id
lite  //输出格式 见1.1
[/code]

必须使用post 提交后服务器会返回成功或失败信息
[/collapse]

===6.3 用户编辑帖子内容===

===6.4 检查===

===6.4.1 检查强制分类===
可跳过

===6.4.2 检查自动翻译===
可跳过

===6.5 发帖===

准备好所有内容后提交

输入地址
[code=javascript]
/post.php
[/code]

输入参数
[code=javascript]
step:2  //固定为2
action:'reply',//操作 new / reply / quote / modify 新主题 / 回复(或评论、贴条) / 引用 / 编辑
pid:123//回复id
tid:123//主题id
fid:123//版面id
post_subject:'bfdsg'  //标题
post_content:'nyrdcgr'  //内容
attachments:'ngyxdhbt'  //附件
attachments_check:'nhyfhg'  //附件验证码
comment: 1 //为1 时作为评论/贴条发布 其他功能勿设此参数
lite //输出格式 见1.1
[/code]

action pid tid fid参数应与6.1中相同

提交后会返回成功或失败信息


===7 用户信息===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 ucp
__act //固定取值 get
uid  //用户id  整数
username  //用户名  字符串
lite  //输出格式 见1.1
[/code]

如有用户id则使用用户id
否则使用用户名查询
用户名编码应与论坛一致使用GBK

返回数据格式大致解释如下

[code]
window.script_muti_get_var_store={
"data":{
  "0":{
    "uid":58,//用户id
    "username":"zeg",//用户名
    "memberid":3,//用户组id
    "group":"Titan",//用户组名
    "posts":6135,//发帖数
    "fame":465,//威望 除10为威望显示值
    "money":936650,//金钱 铜币数
    "title":" 1310494018 伊藤周 地精动力",//头衔
    "verified":1,//激活状态 0为未激活 1为激活 -1为被nuke禁止发言 小于-1为其他原因禁止发言
    "lastpost":1378953174,//最后发帖时间
    "bit":7,//用户bit
    "regdate":1034682132,//注册日期
    "medal":'2,3,4,5,6',//用户佩戴的徽章id 逗号分隔 取徽章信息见章节17.1和17.3
    "muteTime":0,//禁言到期时间, 到期时间>当前时间 为禁言状态
    "avatar":"{\"l\":1,\"0\":{\"0\":\"http://pic1.178.com/avatars/00/00/00/nga_58.jpg\",\"cX\":0.39,\"cY\":0.52}}",//头像
    "sign":"123 &quot;456&quot; frew",//签名
    "email":"xxooo",//邮箱地址 不会显示完整的地址
    "reputation":{//用户声望
      "0":{"0":"PvE","1":4371,"2":"任务讨论、副本专区、成就讨论、地精商会、公会管理声望"},// {0:声望名, 1:声望值, 3:声望说明}
      "1":{"0":"艾泽拉斯卫士","1":16,"2":"裁判所声望"},
      "2":{"0":"远古守卫","1":600,"2":"DotA区声望"},
      ...
      },
    "adminForums":{//担任版主的版面
      "9":"印记城 Sigil",//版面id : 版面名字
      ...
      },
    "userForum":1,
    "items":2,//为2时表示用户有道具
    "_admin":1,//拥有管理员权限
    "_super":1,//拥有超级版主权限
    "_greater":1,//拥有版主权限
    "_lesser":1//拥有次级版主权限
    }
  },

"encode":"gbk",

"time":1363861131//当前时间
}

[/code]

===7.2 获取用户的头像===
输入地址
[code]
/nuke.php
[/code]

输入参数
[code]
__act //固定取值 get_avatar
__lib //固定取值 ucp
uid //用户ID
__nodb
__output //输出格式 见1.1.1
[/code]

返回的数据大致如下
[code]
window.script_muti_get_var_store={
"data":{
"0":图像地址
}
}
[/code]

图像地址可能是网址

也可能是json字符串
[code]
{
  "l":1,
  "0":{
    "0":"http://pic1.178.com/avatars/00/00/00/nga_58.jpg",//图像地址
    "cX":0.39,//头像中心点位置
    "cY":0.52//头像中心点位置
    }
  ... //可能有多个 随机选一个
  }
[/code]

多头像选择的js范例
[code=js]
//用户头像选择=================
//{t:(int)type, l:(int)length, 0:{0:(str)avatar,cX:(int)centerX,cY:(int)centerY}, 1:(str)avatar }
commonui.selectUserPortrait = function(a,buff){
var y='',i
while(!i){
  i = 1
  if(buff){
    if(buff[99] || buff[102] || buff[107]){
      var y = new String(__PORTRAIT_PATH+'/'+(buff[102] ? 'a_sheep_b.png' : (buff[99] ? 'a_sheep.png' : 'a_sheep_c.png')))
      y.noborder=1
      break
      }
    if(buff[111])
      break
    }
  if(!a)
    break
  if (a.constructor==String){
    if(a.substr(0,1)=='{' || a.indexOf('|')!=-1)
      break
    if(a.substr(0,8)=='/*$js$*/')
      eval('var a='+a)
    else{
      y = a.substr(0,7)!='http://' ? __PORTRAIT_PATH+'/'+a : a
      break
      }
    }
  if(a.constructor==Object){
    if (a.t==1 || !a.t)//随机
      i=Math.floor(Math.random()*a.l)//时段
    else if (a.t==2 && window.date){
      i = (date.getHours()+8)/24
      if (i>=1)i = i-1
      i=Math.floor(i*a.l)
      }
    if(a[i].constructor==Object){
      y = new String(a[i][0])
      y.cX = a[i].cX
      y.cY = a[i].cY
      y.id = i
      }
    else{
      y = new String(a[i])
      y.id = i
      }
    if(y.substr(0,7)!='http://')
      y= __PORTRAIT_PATH+'/'+y
    break
    }

  }
return y

}
[/code]


===8 收发短消息===

===8.1 获取短消息列表===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 list
page  //页数  整数
lite  //输出格式 见1.1
[/code]

返回数据格式大致解释如下

[code]
window.script_muti_get_var_store={
  "data":{
    "0":{
      "0":{
        "mid":139382,//消息id
        "last_modify":1378975106,//最后更新时间
        "bit":0,//消息类型bit 见8.1.1
        "subject":"bvgtfrebvhgtrfbehvgrf",//标题
        "from":58,//发起人用户id
        "time":1378975106,//发起时间
        "last_from":58,//最后回复人用户id
        "posts":1,//回复数
        "from_username":"zeg",//发起人
        "last_from_username":"zeg"//最后回复人
        },
      "1":{
        "mid":109771,
        "last_modify":1373465880,
        "bit":0,
        "subject":"你评论的主题被删除",
        "from":58,
        "time":1373465880,
        "last_from":58,
        "posts":1,
        "from_username":"zeg",
        "last_from_username":"zeg"
        },
      ... //可能有多条信息

      "rowsPerPage":35,//每页的消息数
      "nextPage":1,//是否有下一页
      "currentPage":1//当前所在页
      }
    },
  "time":1379063513
}
[/code]






===8.1.1 短消息类型bit mask===

短消息类型是一个32位bit数据

bitmask如下

[code=php]
const _MULTI_CONV=1; #是否是多人(2人以上)对话
const _UNREAD=2; #是否有未读内容
[/code]






===8.2 获取短消息内容===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 read
mid  //消息id  整数
page  //页数  整数   如取-1则为消息的最后一页
lite  //输出格式 见1.1
[/code]


返回数据格式大致解释如下

[code]
window.script_muti_get_var_store={
"data":{
  "0":{
    "0":{
      "subject":"xxoo...",  //标题
      "content":"xxoo...xxoo...",  //内容
      "from":123245,//发信人uid
      "time":1377079518,//发信时间
      "id":178492//消息id
      },
    "1":{
      "subject":"",
      "content":"xxooxxoo...",
      "from":4321,
      "time":1377080704,
      "id":178498
      },
    ... //可能有多条信息

    "userInfo":{//用户数据 此部分与第5节中的 用户数据 部分结构一致
      ...

      },
    "starterUid":19936013,//发起短信会话的用户的id
    "allUsers":"4321  asd  123245  fds",//参与会话的所有的 用户id  用户名...
    "currentPage":1 //当前所在的页
    'nextPage':1//是否有下一页
    }
  },
"time":1378972453
}
[/code]





===8.3 发送新短消息===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 new
subject  //消息标题
content  //消息内容
to  //收信人用户名或用户id 多个收信人用空格或英文逗号分隔
lite  //输出格式 见1.1
[/code]


短消息可以进行多人会话

必须使用post提交数据


===8.4 回复短消息===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 reply
mid  //欲回复的消息id  整数
subject  //消息标题
content  //消息内容
lite  //输出格式 见1.1
[/code]

必须使用post提交数据




===8.5 向短消息会话中添加更多的参与者===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 add
mid  //消息id  整数
to  //欲添加的参与者的用户名或用户id 多个用空格或英文逗号分隔
lite  //输出格式 见1.1
[/code]

必须使用post提交数据




===8.6 从短消息会话中移除讨论者/退出===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 leave_topic
mid  //消息id  整数
luid  //欲移除的用户id  整数  只有短消息的发起者 才可以指定将某个用户从会话中移除 其他参与者只能移除自己
lite  //输出格式 见1.1
[/code]

短消息的发起者 可以指定将某个参与者从会话中移除

短消息的其他参与者 可以自己退出会话

退出之后将不能看见此条短消息

必须使用post提交数据





===8.7 短消息黑名单添加===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 add_block
buids  //欲屏蔽的用户id  整数
lite  //输出格式 见1.1
[/code]

被屏蔽的用户将不能给自己发送新短消息

也不能将自己添加到短消息会话中

必须使用post提交数据






===8.8 短消息黑名单解除===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 del_block
buids  //欲解除屏蔽的用户id  整数
lite  //输出格式 见1.1
[/code]

取消一个被屏蔽的屏蔽用户

必须使用post提交数据



===8.8 短消息黑名单列表===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
__lib //固定取值 message
__act //固定取值 message
act //固定取值 list_block
lite  //输出格式 见1.1
[/code]

列出自己屏蔽的用户 返回的数据大致如下

[code]
window.script_muti_get_var_store={
  "data":{
    "0":{
      "0":{
        "uid":2342912,//用户id
        "username":"tempuser50"//用户名
        }
      ... //可能有多个
      }
    },
  "time":1379264224
  }
[/code]


真心碉堡了

唔,我得好好想想如何使用这些接口来开发应用了 或许能使公会论坛更有趣...


===9 设置头像与签名===

===9.1 设置头像===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
func  //固定取值 avatar
icon  //头像图片的url
lite  //输出格式 见1.1
[/code]

必须使用post提交数据


===9.2 设置签名===

输入地址
[code=javascript]
/nuke.php
[/code]

输入参数
[code=javascript]
func //固定取值 sign
sign //签名内容
lite  //输出格式 见1.1
[/code]

必须使用post提交数据


这是zeg会做的事吗………………2个月把20年的活给做完了啊


二哥最近很空闲啊...


请问可以统一返回json格式的数据么 这样解析起来方便些


===10 登录===

因为NGA和178使用不同的cookie名字……所以登录了178之后NGA可能依然是未登录状态

这时可以访问
[code]
http://nga.178.com/nuke.php?__lib=login&__act=set_cookie
[/code]


此地址会接受178的用户信息cookie
[code]
//需要的178 cookie
_sid //cookie id
_178c //用户id

//或者nga的cookie也可以
ngaPassportCid //cookie id
ngaPassportUid //用户id
[/code]


验证成功会返回跳转,跟随服务器的跳转指示即可
返回信息大致如下,如果不能自动跟随跳转指示,可以依次访问返回数据中的地址
[code]
window.script_muti_get_var_store={
"data":{
"0":"http://nga.178.com/nuke.php?__lib=login&__act=set_cookie&token=..." //nga.178.com的登录
"1":"http://bbs.ngacn.cc/nuke.php?__lib=login&__act=set_cookie&token=..." //bbs.ngacn.cc的登录
}
}
[/code]


跳转后返回信息大致如下
[code]
window.script_muti_get_var_store={
"data":{
"0":"SUCCESS"
}
}
[/code]
返回SUCCESS之后即为验证成功
此时客户端应接受服务器设置的cookie,即可变为登录状态


===11 杂项===

===11.1 获取主题的最后回帖时间===
输入地址
[code]
/nuke.php
[/code]

输入参数
[code]
__api //固定取值 1
__act //固定取值 get
__lib //固定取值 get_topic_modify_time
tid //主题ID
__output //输出格式 见1.1.1
[/code]

返回的数据大致如下
[code]
window.script_muti_get_var_store={
"data":{
"0":1379264224 //主题的最后回复时间 如果主题发布时间过久会返回0
"1":1379264224 //主题的最后修改时间 如果主题发布时间过久会返回0
"2":1234 //主题的回复数 如果主题发布时间过久会返回0
}
}
[/code]


===11.2 更新主题的最后回复时间===
仅限服务器对服务器使用 需要认证码

输入地址
[code]
/nuke.php
[/code]

输入参数
[code]
__act //固定取值 push
__lib //固定取值 topic_push
tid //主题ID
time //当前时间戳(秒
addreply //==1时主题的回复数会+1
checksum //验证码 取值为md5(tid + 当前时间戳 + 认证码)
__output //输出格式 见1.1.1
[/code]

返回的数据大致如下
[code]
window.script_muti_get_var_store={
"data":{
"0":'操作成功'
}
}
[/code]


===12 一些源图===

===12.1 版面图标===

psd原图
[attach]./mon_201507/16/335_55a731312128a.zip?filename=forum_icon.zip[/attach]

自制版面图标需在原图基础上修改,提交给管理员分层的PSD文件

动手做之前请先就图标设计咨询管理员意见

===12.2 nga logo===

使用nga.cn域名的黑白logo源文件 今后统一用这个

PSD矢量图形 粗细字体各一种 附带参考色

如在颜色样式上做修改 需先做样稿向管理员征询意见

[attach]./mon_201503/24/335_5511151f851f9.zip?filename=nga_logo.zip[/attach]

===12.3 徽章===

徽章样例

用矢量图形制作 不要点像素图

动手做之前请先就徽章设计咨询管理员意见

[attach]./mon_201602/16/335_56c2d1df7fb15.zip?filename=16_16.zip[/attach]

附件


===13 指定客户端信息===

===13.1 user-agent格式===

客户端软件提供适当客户端信息可以让服务器能够识别之

使用http header中的user-agent或x-user-agent字段来指定客户端信息

举例如下 硬件信息和操作系统信息共计(尽量)不要超过20字节

[code]
客户端软件名/版本 (硬件信息; 操作系统信息)
AndroidNga/571 (Xiaomi MI 2S; Android 4.1.1)
[/code]

===13.2 客户端认证===

论坛将会给认证过的客户端提供一些额外的功能(比如显示发帖人使用的app信息/硬件设备信息等~)

考虑到程序效率问题 论坛使用比较简单的验证方式

认证过的客户端将得到一段[b]需要保密的认证码[/b]

在需要验证的场合(比如发帖时)客户端软件在http请求中增加__ngaClientChecksum参数

输入参数
[code]
__ngaClientChecksum //取值为 md5(当前用户数字uid+认证码+当前时间戳)+当前时间戳
[/code]

服务器会通过user-agent中声明的软件名与__ngaClientChecksum参数来验证http请求是否为认证码所对应的客户端所发

认证或更换认证码请联络管理员

下一页(2)