Code Monkey home page Code Monkey logo

onebots's Introduction

使用ts实现的oneBot应用启动器,支持icqq、qq官方机器人、微信以及钉钉机器人

Build Package Build Docs

npm dm oneBot V11 oneBot V12 node engine qq group

Docs

使用示例

全局安装(0.4.8以后不推荐)

1 安装依赖

  • 注意:
npm install -g onebots

2 初始化配置文件

在你想存放配置文件的目录执行如下命令

onebots

3 更改生成的默认配置文件成你想要的配置配置后再次运行上面的指令,启动项目

局部安装

1 初始化node项目

npm init -y

2. 安装onebots以及对应适配器的依赖

npm install onebots
npm install @icqqjs/icqq # 如需使用icqq适配器,请务必安装
npm install web-wechat # 如需使用微信适配器,请务必安装
npm install qq-official-bot # 如需使用qq官方机器人适配器,请务必安装
npm install node-dd-bot # 如需使用钉钉机器人适配器,请务必安装
  • 关于@icqqjs的安装引导:

安装:

  1. 在你的项目根目录新建文件 .npmrc ,并录入以下内容
@icqqjs:registry=https://npm.pkg.github.com
  1. 命令行输入 npm login --scope=@icqqjs --auth-type=legacy --registry=https://npm.pkg.github.com ,回车,根据提示登录github
npm login --scope=@icqqjs --auth-type=legacy --registry=https://npm.pkg.github.com

UserName: # 你的github账号
Password: # 前往 https://github.com/settings/tokens/new  获取,scopes勾选 read:packages 
E-Mail: # 你的公开邮箱地址
  1. 安装依赖
npm install @icqqjs/icqq  # or > yarn add @icqqjs/icqq

3. 执行如下命令生成配置文件

npx onebots -r icqq #注册icqq适配器并启动onebots
npx onebots -r wechat #注册微信适配器并启动onebots
npx onebots -r qq #注册qq官方适配器并启动onebots
npx onebots -r dingtalk #注册钉钉适配器并启动onebots
# 你也可以同时注册多个适配器,多次使用-r即可,例如 npx onebots -r qq -r icqq -r wechat

4. 更改生成的默认配置文件成你想要的配置配置后再次运行上面的指令,启动项目

默认配置文件

port: 6727 # 监听端口
log_level: info # 日志等级
platform: 5 # 机器人客户端协议(1:Android 2:APad 3:Watch 4:IMac 5:IPad)
timeout: 30 #登录超时时间(秒)
general: # 通用配置,在单个配置省略时的默认值
  V11: # oneBotV11的通用配置
    heartbeat: 3 # 心跳间隔 (秒)
    access_token: "" # 访问api的token
    post_timeout: 15 # 上报超时时间,(秒)
    secret: "" # 上报数据的sha1签名密钥
    rate_limit_interval: 4 # ws心跳间隔(秒)
    post_message_format: string # "string"或"array"
    reconnect_interval: 3 # 重连间隔 (秒)
    use_http: true # 是否使用 http
    enable_cors: true # 是否允许跨域
    filters: {} # 过滤器配置
    use_ws: true # 是否使用websocket
    http_reverse: [] # http上报地址
    ws_reverse: [] # 反向ws连接地址
  V12: # oneBotV12的通用配置
    heartbeat: 3 # 心跳间隔 (秒)
    access_token: "" # 访问api的token
    request_timeout: 15 # 上报超时时间 (秒)
    reconnect_interval: 3 # 重连间隔 (秒)
    enable_cors: true # 是否允许跨域
    use_http: true # 是否启用http
    use_ws: true # 是否启用 websocket
    filters: {} # 过滤器配置
    webhook: [] # http 上报地址
    ws_reverse: [] # 反向ws连接地址
  protocol:
    platform: 2
    sign_api_addr: "" #你的签名地址
    password: "" # 账号密码,未配置则扫码登陆
    # ...其他配置项参考icqq的Config配置
# 每个账号的单独配置(用于覆盖通用配置)
icqq.123456789:
  password: "" # 账号密码,未配置则扫码登陆
  version: V11 # 使用的oneBot版本
  # ...其他配置项参见上方对应oneBot版本的通用配置
  protocol:
    platform: 2
    sign_api_addr: "" #你的签名地址
    # ...其他配置项参考icqq的Config配置

qq.123456789: # `${适配器名称}:${appId}`
  versions:
    - version: V11
  # 。。。其他配置项参见上方对应oneBot版本的通用配置
  protocol: # 将会覆盖通用配置中的protocol
    token: '' # qq机器人token
    secret: '' # qq机器人secret
    sandbox: false # 是否沙箱环境
    intents: # 需要监听的intents
      - 'GROUP_AT_MESSAGE_CREATE' # 群聊@事件 没有群聊权限请注释
      - 'C2C_MESSAGE_CREATE' # 私聊事件 没有私聊权限请注释
      - 'DIRECT_MESSAGE' # 频道私信事件
      #     - 'GUILD_MESSAGES' # 私域机器人频道消息事件,公域机器人请注释
      - 'GUILDS' # 频道变更事件
      - 'GUILD_MEMBERS' # 频道成员变更事件
      - 'GUILD_MESSAGE_REACTIONS' # 频道消息表态事件
      - 'INTERACTION' # 互动事件
      - 'PUBLIC_GUILD_MESSAGES' # 公域机器人频道消息事件,私域机器人请注释
  # 。。。其他配置项参见上方对应oneBot版本的通用配置
  
dingtalk.abcedfg: # `${适配器名称}:${clientId}`
  versions:
    - version: V11
    - version: V12
  protocol:
    clientSecret: '' # 钉钉机器人秘钥 必填
    username: '钉钉机器人' #钉钉后台配置的机器人名称 不填则显示'钉钉机器人'
    avatar: '' # 机器人头像 不填则显示钉钉logo

wechat.bot1: # `${适配器名称}:${机器人唯一标识}`
  versions:
    - version: V11
    - version: V12
  protocol: {}

配置解释

Config

配置项 类型 默认值 desc
port number 6727 服务监听端口
logLevel string info 日志级别
general {V11:V11.Config,V12:V12.Config} general 通用配置
[adapter].[number] OneBotConfig - 机器人配置

OneBotConfig

配置项 类型 默认值 desc
password string - 仅icqq生效,账号密码 未填写或填写为空则扫码登陆
V11 V11.Config configV11 V11配置
V12 V12.Config configV12 V12配置
protocol 传递给client初始化的配置 {}

ConfigV11

配置项 类型 默认值 desc
heartbeat number 3 心跳间隔 单位:秒
access_token string - 访问令牌
secret string - 签名密钥
rate_limit_interval number 4 限速间隔 单位:秒
post_message_format string string 消息格式化
reconnect_interval number 3 重连间隔 单位:秒
use_http boolean false 是否使用http协议
enable_cors boolean false 是否允许跨域
filters Filters {} 事件过滤器配置
use_ws boolean false 是否使用ws协议
http_reverse_url string[] - http上报地址地址
ws_reverse_url string[] - 反向ws连接地址

ConfigV12

配置项 类型 默认值 desc
heartbeat number 3 心跳间隔 单位:秒
access_token string - 访问令牌
request_timeout number 15 请求超时 单位:秒
reconnect_interval number 3 重连间隔 单位:秒
enable_cors boolean false 是否允许跨域
filters Filters {} 事件过滤器配置
use_http boolean false 是否使用http协议
use_ws boolean false 是否使用ws协议
webhook_reverse_url string[] - webhook上报地址
ws_reverse_url string[] - 反向ws连接地址

事件过滤器

语法说明

  • onebots 的事件过滤器最外层是一个JSON对象,其中的键是键如果是运算法,则值作为运算符的参数,如果不是运算符,则表示对事件数据对象相应 key 进行过滤。
  • 过滤规则中任何一个对象, 只有在它的所有项都匹配的情况下, 才会让事件通过(等价于一个 and 运算),如果值为一个数组,则表示事件对应 key 值需满足其中一个。
  • 可用逻辑运算符有:$and (逻辑与) 、$or (逻辑或) 、 $not (逻辑非)、$nor (逻辑异或)、$regexp (文本正则匹配)、$like (文本模糊匹配)、$gt (数值大于比较)、$gte (数值大于等于比较)、$lt (数值小于比较)、$lte (数值小于等于比较)、$between (数值范围比较)

示例

1. 仅上报私聊事件

filters:
  message_type: private

2. 私聊或指定群聊

filters:
  $or:
    message_type: private
    group_id:
      - 123456789 987654321

3. 私聊事件且不是指定用户

filters:
  message_type: private
  $not:
    user_id:
      - 123456789 987654321

4. 私聊事件(排除指定用户的事件)或指定群聊事件

filters:
  $or:
    - message_type: private
      $not:
        user_id: 123456789
    - message_type: group
      group_id: 987654321

5. 仅上报消息事件且用户年龄大于18岁

filters:
  type: message
  sender:
    age:
      $gt: 18

6. 仅上报消息事件且消息内容以!开头的消息

filters:
  type: message
  raw_message:
    .regexp: '^!|\!'

7. 不上报消息内容包含cnm的消息

filters:
  $not:
    type: message
    raw_message:
      $like: cnm

使用API管理oneBot

url method params desc
/list GET 获取当前运行的机器人列表
/detail GET uin 获取指定机器人配置
/qrcode GET uin 获取指定机器人登录二维码
/add POST {uin,...config} 添加机器人 config 为机器人配置
/edit POST {uin,...config} 修改机器人配置 config 为机器人配置
/remove get uin,force 移除机器人,force为true时,将删除机器人data目录

鸣谢

  1. icqqjs/icqq 底层服务支持
  2. takayama-lily/onebot oneBot V11 原先版本

onebots's People

Contributors

github-actions[bot] avatar kghost avatar lc-cn avatar lgc2333 avatar ltxhhz avatar marrydream avatar misaka-mikoto-tech avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

onebots's Issues

BUG:v11协议通过发送base64的图片数据时无法成功发送

bot端代码:
image
image

onebot侧现象:
image

nonebot2版本:2.1.2
nonebot-adapter-onebot版本:2.3.1
onebots版本:0.6.1

发送图片时会提示无message,如果是文字+图片,图片会直接消失掉:
image

可以保证的是bytesIO返回的图片数据是正确的,因为gocq可以正常发送

BUG:v11协议通过发送base64的语音数据时无法成功发送

bot端代码:
image
image
(其中wav_encode_to_tencent_silk函数将wav格式语音转换为silk格式的bytes)

onebot侧现象:
image

nonebot2版本:2.1.2
nonebot-adapter-onebot版本:2.3.1
onebots版本:0.6.1
发送语音时会将整个"[cq:record.....]"的字符串完整发送过来,而不是语音
image

可以保证的是语音转换正确,choronocat的red协议原样发送wav_encode_to_tencent_silk返回的bytes是可以正常播放的

如何配置sign_api_addr?

不太懂nodejs,现在手表登录过一阵就会被风控,查了解决办法说是配置qsign服务,我直接在config.yaml里加了sign_api_addr的字段好像没有用,有配置方法吗?

重要提醒

onebots0.0.3一下版本在公网环境部署时有安全性bug,请尽快升级到0.0.3版本

onebot v11是否不能发送图片类型?

image
经过测试,使用base64和路径格式发送消息都无法发送图片,所以问一下这里发送图片是否有别的格式要求或者问题,

使用的是8.9.80的apad协议sgin登录

多个反向ws出现bug

onebots在设置多个反向ws地址时,会对每个地址建立 设置过的反向地址数量 次的连接
Cache_709b99409cfcae49.png

Cache_-5429aa541cd42404.png

Cache_-443280510409d8da.png

Cache_2b310f4f6c9f4df7.png

OneBot v12撤回消息事件detail_type错误

协议:OneBot-V12
连接方式:Websocket正向

现象:
在客户端收到撤回消息通知中detail_type为friend,而根据OneBot-v12协议,detail_type应为private_message_delete

{
    "id": "...",
    "impl": "onebots",
    "version": 12,
    "platform": "qq",
    "self": {
        "user_id": "xxx",
        "platform": "qq",
        "nickname": "xxx",
        "user_displayname": "",
    },
    "self_id": 1919810,
    "time": 1678650186,
    "detail_type": "friend",
    "type": "notice",
    "sub_type": "recall",
    "post_type": "notice",
    "notice_type": "friend",
    "user_id": "114514",
    "friend": {},
    "message_id": "xxxx",
    "operator_id": 114514,
    "seq": 22355,
    "rand": 603984703,
}

V11的合并转发再次无法发送

最新版的onebotsicqqjs/icqq 又出现了合并转发一直超时的问题,我这边用的时候好像 action 匹配不到就会一直超时,应该是 V11 没有像 V12 那样匹配不到 action 就抛出 404 异常的兜底。

V11自定义合并转发节点消息无法发送

{
    "action":"send_private_msg",
    "params":{
        "user_id":10000000,
        "message":[
            {
                "type":"node",
                "data":{
                    "user_id":100006,
                    "nickname":"BOT",
                    "content":[
                        {
                            "type":"text",
                            "data":{
                                "text":"测试forward消息"
                            }
                        }
                    ]
                }
            },
            {
                "type":"node",
                "data":{
                    "user_id":100006,
                    "nickname":"BOT",
                    "content":[
                        {
                            "type":"image",
                            "data":{
                                "file":"https://cdn.seovx.com/?mom=302",
                                "cache":1,
                                "proxy":1
                            }
                        }
                    ]
                }
            }
        ]
    },
    "echo":"lqmfcxia1i3WIt"
}

发送的是这样的一个消息,onebots 端好像无法处理,我将参数中的 content 更换为 message 后只保留第一个纯文本时可以成功发送(但是会多发送一个undefined消息),如果加入第二个图片类型消息就会跟之前一样无法发送,错误类型是408,请求超时。

image

OneBotV11的自定义合并转发节点

WebConsole 无法选中日志及输入ticket报错

  • WebConsole 无法选中日志并复制
  • 输入滑动验证码后报错

第一个问题,[email protected] 这个版本是可以选中复制的。

第二个问题,以下是输入内容后的报错信息:

[2024-03-26T14:46:40.187] [MARK] [OneBots:icqq] - 请输入滑块验证返回的ticket
unhandledRejection TypeError: process_1.default.stdin.write is not a function
    at WebSocket.<anonymous> (/app/node_modules/onebots/lib/server/app.js:221:56)
    at WebSocket.emit (node:events:517:28)
    at Receiver.receiverOnMessage (/app/node_modules/ws/lib/websocket.js:1209:20)
    at Receiver.emit (node:events:517:28)
    at /app/node_modules/ws/lib/receiver.js:608:16
    at node:internal/process/task_queues:140:7
    at AsyncResource.runInAsyncScope (node:async_hooks:203:9)
    at AsyncResource.runMicrotask (node:internal/process/task_queues:137:8)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

[BUG] refreshToken错误

OS: Arch Linux x86_64
Node: v21.5.0
OneBots: 0.4.50
Icqq: 0.6.8

icqq的协议版本指定为8.9.93
使用aPad扫码登录

unhandledRejection TypeError: this.getT544 is not a function
at Client.tokenLogin (/home/kinare/Services/OneBots/node_modules/.pnpm/[email protected]/node_modules/icqq/lib/core/base-client.js:646:34)
at Client.refreshToken (/home/kinare/Services/OneBots/node_modules/.pnpm/[email protected]/node_modules/icqq/lib/core/base-client.js:1382:86)
at Client.refreshToken (/home/kinare/Services/OneBots/node_modules/.pnpm/[email protected]/node_modules/icqq/lib/core/base-client.js:521:35)
at heartbeatSuccess (/home/kinare/Services/OneBots/node_modules/.pnpm/[email protected]/node_modules/icqq/lib/core/base-client.js:1343:28)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)

发送图文混合内容时图片刷屏且没有发送出去

我原来是 gocq 反向连接的 nb, 之前是正常使用的,现在换到 onebots,但是在发送图文混合内容时出错,发送代码:

@help.handle()
async def _(event: MessageEvent, bot:Bot):
    bot_id = int(bot.self_id)
    if bot_id in config.bot_names:
        message = f"<font color=green><b>{config.bot_names[bot_id]}目前支持的功能:</b></font>\n(请将UID替换为需要操作的B站UID)\n"
    else:
        message = "<font color=green><b>Bot目前支持的功能:</b></font>\n(请将UID替换为需要操作的B站UID)\n"

    plugin_names:List[str] = []
    for matchers_list in matchers.values():
        for matcher in matchers_list:
            if (
                matcher.plugin_name
                and matcher.plugin_name.startswith("haruka_bot")
                and matcher.__doc__
            ):
                doc = matcher.__doc__
                plugin_names.append(doc)

                func_name = doc[2:]
                open_func = f"开启{func_name}"
                close_func = f"关闭{func_name}"
                if (open_func in plugin_names) and (close_func in plugin_names):
                    plugin_names.remove(open_func)
                    plugin_names.remove(close_func)
                    plugin_names.append(f"开启|关闭{func_name}")

    message += '\n'.join(plugin_names) + "\n"
    message += "点歌\n"
    message += "绘画\n------------------------\n"
    message += "示例:开启动态 123456\n"
    message += "Tips:只发送 \"绘画\" 两个字将显示详细绘画帮助内容\n"
    
    message = MessageSegment.image(await text_to_img(message, width=425))
    message += f"\n当前版本:v{__version__}\n" "https://github.com/Misaka-Mikoto-Tech"
    await help.finish(message)

其中 text_to_image 的返回类型是 bytes, 我看 onebot 是以 base64:// 格式发出去的

QQ里显示的:
3F}XQ8AH7FQ8I1

控制台屏显:
7F2%IKA62S8F19P78_M)BZ8

看现象应该是把base64给打印到屏幕上了

未找到 <qq号>_v11.jsondb 文件

原gocqhttp + nonebot2 的机器人项目,拟迁移到onebots
运行环境:Windows Server 2012

已使用 npm 安装 icqq 和 onebots 模块,并配置了config文件
使用命令npx onebots -r icqq启动项目时,报 未找到 /根目录/data/<qq号>_v11.jsondb 文件 错误

文档和issue里没找到解决方法,不太清楚这个文件是怎么生成的

bug:发送消息响应数据有误

onebotV11规定发送消息响应数据message_id应为number类型

image
image

代码中为string类型

image
image

使用OneBot开发框架Shiro发送消息获取到的Message_id为String字符串就像是这样“VHrJvQAACLeJ0L3QZMVuXgE=”的字符串数据

bug: onebotV11 上报数据的字段类型有误

onebot协议V11
使用ws正向连接到机器人后,接收群消息上报数据得到了如下数据
{ "post_type": "message", "message_id": "H6oYlHh+63gAAXkXCGrChWSDAE0B", "user_id": "2021583736", "time": 1686306893, "seq": 96535, "rand": 141214341, "font": "微软雅黑", "message": "test", "raw_message": "test", "message_type": "group", "sender": { "user_id": 2021583736, "nickname": "咕咕咕", "card": "", "sex": "unknown", "age": 0, "area": "", "level": 1, "role": "owner", "title": "" }, "group_id": "531241100", "group_name": "交流群", "block": false, "sub_type": "normal", "anonymous": null, "atme": false, "atall": false, "group": {}, "member": {}, "self_id": 1667047824 }
其中 message_id 和 font 为字符串类型
按onebotV11标准群消息应当都为int类型,望修复

Bug: V11 文本消息上报报错

node: 18.0.0
npm: 8.6.0

[email protected]
[email protected]
[email protected]

[2023-12-07T10:45:02.745] [INFO] [OneBots:icqq-V11(**********)] - ws客户端(/icqq/**********/V11)已连接
[2023-12-07T10:45:08.113] [INFO] [icqq] - recv from: [Private: **********(friend)] sss
unhandledRejection TypeError: Cannot read properties of undefined (reading 'text')
    at /bot/onebot/node_modules/onebots/lib/adapters/icqq/index.js:210:34
    at Array.map (<anonymous>)
    at IcqqAdapter.toCqcode (/bot/onebot/node_modules/onebots/lib/adapters/icqq/index.js:208:38)
    at V11.dispatch (/bot/onebot/node_modules/onebots/lib/service/V11/index.js:224:45)
    at IcqqAdapter.<anonymous> (/bot/onebot/node_modules/onebots/lib/service/V11/index.js:107:18)
    at IcqqAdapter.emit (node:events:527:28)
    at Client.<anonymous> (/bot/onebot/node_modules/onebots/lib/adapters/icqq/index.js:279:18)
    at Client.trip (/bot/onebot/node_modules/triptrap/lib/index.js:75:22)
    at Client.emit (/bot/onebot/node_modules/icqq/lib/core/base-client.js:245:21)
    at Client.em (/bot/onebot/node_modules/icqq/lib/client.js:720:18)

苹果手机扫描,扫码后提示禁止登陆,错误码45

icqq协议,已经更新了最新版本qq
使用协议:Android_9.0.8.14755 [2024-01-23T10:48:12.849] [WARN] [icqq] - [禁止登录]登录失败,请前往QQ官网im.qq.com下载最新版QQ后重试,或通过问题反馈与我们联系。(错误码:45)

群消息上报数据的字段类型有误

onebot协议V11
使用ws正向连接到机器人后,接收群消息上报数据得到了如下数据
{ "post_type": "message", "message_id": "H6oYlHh+63gAAXkXCGrChWSDAE0B", "user_id": "2021583736", "time": 1686306893, "seq": 96535, "rand": 141214341, "font": "微软雅黑", "message": "test", "raw_message": "test", "message_type": "group", "sender": { "user_id": 2021583736, "nickname": "咕咕咕", "card": "", "sex": "unknown", "age": 0, "area": "", "level": 1, "role": "owner", "title": "" }, "group_id": "531241100", "group_name": "交流群", "block": false, "sub_type": "normal", "anonymous": null, "atme": false, "atall": false, "group": {}, "member": {}, "self_id": 1667047824 }
其中 user_id 和 group_id 为字符串类型
按onebotV11标准群消息应当为int类型,望修复

Feature: 希望兼容无 TTY 环境

想在 Docker 等容器环境中使用,而这类环境难以完成 ticket 、 短信验证码等用户输入的传输。

参考方案一:

提供类似 go-cqhttp 那种网页直接辅助用户获取 ticket ,短信验证码可以写个简易网页,给个表单,通过这个表单传递短信验证码,onebots 轮询查询 ticket 和短信验证码。这又分为统一的域名服务和本地服务两种实现。

参考方案二:

指定文件名,用户可以将 ticket 和 短信验证码写入到指定文件中,客户端轮询读取文件内容,当文件内容不为空时即视为用户提交了所需要的参数。

pm2 后台运行怎么搞

module.exports = {
  apps: [{
    name: 'your-app-name',
    script: 'onebots',
    args: '-c config.yaml'
  }]
}
pm2 start ecosystem.config.js

AI 给了我这个代码,但是跑不起来 (╯﹏╰)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.