Giter VIP home page Giter VIP logo

wechat-gptbot's Introduction

Welcome to wechat-gptbot 👋

Version License: MIT Python Version litellm

A wechat robot based on ChatGPT with no risk, very stable! 🚀
English | 中文文档

🎤 Introduction

When I use bots based on itchat and wechaty, I often encounter the risk of account restrictions when scanning codes to log in. Refer to #158. Is there a safe way to use wechat bots? Here it is~

🌟 Features

  • Extremely Stable: Implement based on windows hook, no worry about risk of wechat account restriction
  • Basic Conversation: Smart reply for private chat and group chat, support multiple rounds of session context memory, support GPT-3, GPT-3.5, GPT-4, Claude-2, Claude Instant-1, Command Nightly, Palm models and other models in litellm
  • Image Generation: Support image generation, Dell-E only model for now
  • Flexible Configuration: Support prompt settings, proxy, command settings and etc.
  • Plugin System: Support personalized plugin extensions, you can easily integrate the functions you want

📝 Changelog

2023.07.13: Introduce plugin system to make gptbot have more possibilities and easy to expand #46. Here's the first interesting plugin: tiktok, try it and have fun! Also refer to docs to learn the usage and how to contribute~

🚀 Getting Start

Environment

Support Windows system(probably support Linux in the future based on sandbox) and Python needs to be installed at the same time

It is recommended that the Python version be between 3.8.X~3.10.X, version 3.10 is perfect

1. Clone repo

git clone https://github.com/iuiaoin/wechat-gptbot && cd wechat-gptbot

2. Install dependencies

pip install -r requirements.txt

Configuration

config.template.json in the root directory contains the configs template, you need to copy the template to create the final effective config.json

  cp config.template.json config.json

Then fill in the configuration in config.json, the following is the description of the default configuration, which can be customized according to the needs:

{
  "openai_api_key": "YOUR API SECRET KEY",             # Fill in your OpenAI API Key
  "model": "gpt-3.5-turbo",                            # ID of the model to use, support gpt-3.5-turbo, gpt-4, gpt-4-32k etc.
  "use_azure_chatgpt": false,                          # Whether use Azure OpenAI API
  "azure_deployment_id": "",                           # Azure model deployment name
  "role_desc": "You are a helpful assistant.",         # Role description as system prompt
  "session_expired_duration": 3600,                    # Session memory kept duration
  "max_tokens": 1000,                                  # Max tokens of characters for session memory
  "temperature": 0.9,                                  # Between 0 and 2. Higher values make the output more random, while lower values more focused
  "proxy": "127.0.0.1:3000",                           # Proxy client ip and port
  "openai_api_base": "",                               # api url used by openai service
  "create_image_size": "256x256",                      # Dall-E image size, support 256x256, 512x512, 1024x1024
  "create_image_prefix": ["draw", "paint", "imagine"], # Text prefix for image generation
  "clear_current_session_command": "#clear session",   # Clear current session
  "clear_all_sessions_command": "#clear all sessions", # Clear all sessions
  "chat_group_session_independent": false,             # Whether sessions of users are independent in chat group
  "single_chat_prefix": ["bot", "@bot"],               # Start conversation with "bot" or "@bot" in single chat to trigger the bot, leave it empty if you wanna make the bot active all the time
  "group_chat_reply_prefix": "",                       # Reply prefix in group chat
  "group_chat_reply_suffix": "",                       # Reply suffix in group chat
  "single_chat_reply_prefix": "",                      # Reply prefix in single chat
  "single_chat_reply_suffix": "",                      # Reply suffix in single chat
  "query_key_command": "#query key"                    # Querying the usage of the api key
  "recent_days": 5                                     # The usage in <recent_days> days
  "plugins": [{ "name": <plugin name>, other configs }]# Add the your favorite plugins
}

Running

1. Prepare

We need the specific wechat version and dll to make windows hook work.

  1. Download assets from the release
  2. Install WeChatSetup-3.2.1.121.exe and login
  3. Run the wechat-dll-injectorV1.0.3.exe
  4. Select 3.2.1.121-LTS.dll and click inject dll, you will see "Successfully injected: 3.2.1.121-LTS.dll"

2. Run command

python app.py

Voilà! Enjoy your exploring journey~

✨ Generous Backers

Thank you very much for your support, it will be my biggest motivation!

🤝 Contributing

Contributions, issues and feature requests are welcome!
Feel free to check issues page.

🙏 Show your support

Give a ⭐️ if you like this project!

📢 Announcements

The WeChatSetup is coming from wechat-windows-versions and wechat-dll-injector from wechat-bot, so you can use it without concern. Also thanks the two repo's owners for their contributions.

💖 Sponsor

Become a Sponsor on AFDIAN. Your name will be specifically listed under Generous Backers~

wechat-gptbot's People

Contributors

h1xy avatar ishaan-jaff avatar iuiaoin avatar latorc avatar maq917 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wechat-gptbot's Issues

[Bug]: 突然不行了。私聊、群聊都不行

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

other

Issue description

[INFO][2023-07-15 14:06:54][wechat.py:40] - App startup successfully!
[INFO][2023-07-15 14:06:54][wechat.py:178] - [Websocket] connected
[ERROR][2023-07-15 14:07:20][wechat.py:184] - [Websocket] Error: "Message" object has no field "_raw_msg"
[ERROR][2023-07-15 14:07:37][wechat.py:184] - [Websocket] Error: "Message" object has no field "_raw_msg"
[ERROR][2023-07-15 14:08:10][wechat.py:184] - [Websocket] Error: "Message" object has no field "_raw_msg"
[ERROR][2023-07-15 14:08:36][wechat.py:184] - [Websocket] Error: "Message" object has no field "_raw_msg"

Repro steps

No response

Relevant log output

No response

[Feat]:可以新增一个对指定用户发送消息的功能吗?

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

如果能有一个接口向指定的wxid发送消息,那就可以不仅仅被动触发啦,可以主动调用做一个小助理了!!如果这个功能可以实现那就泰裤辣~

Motivation

No response

[Feat]: 可以添加一个每10轮对话总结之前所有对话历史并加深记忆的功能吗

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

我尝试使用这个项目做一个客服机器人,它可以记下产品参数,在一开始的几轮对话中都可以和测试人员尽职的对话并讲解产品,但是多轮对话后,它依然在完美的扮演客服人员这个职业,产品参数却忘记了,开始用自己搜索出来的一些知识编造回复,所以我希望能加上一个每隔几轮对话总结历史记录,巩固它自己记忆的功能。

Motivation

No response

[Feat]: 作者有打赏链接吗?:)

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

项目不错。有打赏链接吗?:)
另: 作者有群 交流吗?
另:弄个方便小白的部署脚本和教程? 比如:
部署脚本:
git clone https://github.com/iuiaoin/wechat-gptbot && cd wechat-gptbot
call ".venv\Scripts\activate.bat"
REM Run the Python script
cd wechat-gptbot
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

运行脚本:
copy /y config.json .\wechat-gptbot\
call ".venv\Scripts\activate.bat"
cd wechat-gptbot
python app.py

Motivation

No response

[Feat]: support one key running

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

希望有bat方式支持一键注入,忽略打开exe->点击注入DLL的过程。

Motivation

No response

[Bug]: AttributeError: 'str' object has no attribute 'get'

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.8

Issue description

已经尝试在chatgpt.py中 print(type(conf())),结果显示确实为“dict”而非“str” object。新手小白,不知道如何解决bug,求解答,谢谢!

Repro steps

No response

Relevant log output

[INFO][2023-07-28 00:29:58][manager.py:42] - Checking plugins...
[INFO][2023-07-28 00:29:58][manager.py:54] - All plugins are installed
[INFO][2023-07-28 00:29:58][api.py:34] -
                wechat login info:

                nickName: test
                account: **
                wechatId: **
                startTime: 2023-07-28 00:29:58

[INFO][2023-07-28 00:29:58][wechat.py:40] - App startup successfully!
[INFO][2023-07-28 00:29:58][wechat.py:178] - [Websocket] connected
[INFO][2023-07-28 00:30:14][wechat.py:90] - message received: Message(room_id=None, sender_id=wxid_mrpa2pahtcbj22, sender_name=**, receiver_id=wxid_gkz7sggq422229, receiver_name=test, content=如何学习Python, type=1, is_group=False, create_time=2023-07-28 0
0:30:14, is_at=False)
[INFO][2023-07-28 00:30:14][chatgpt.py:26] - [ChatGPTBot] Query=如何学习Python
[ERROR][2023-07-28 00:30:16][chatgpt.py:81] - [ChatGPTBot] Exception: 'str' object has no attribute 'get'
Traceback (most recent call last):
  File "D:\Desktop\wechat-gptbot\bot\chatgpt.py", line 53, in reply_text
    response = openai.ChatCompletion.create(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_resources\chat_completion.py", line 25, in create
    return super().create(*args, **kwargs)
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_resources\abstract\engine_api_resource.py", line 153, in create
    response, _, api_key = requestor.request(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 298, in request
    resp, got_stream = self._interpret_response(result, stream)
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 700, in _interpret_response
    self._interpret_response_line(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 763, in _interpret_response_line
    raise self.handle_error_response(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 418, in handle_error_response
    error_code=error_data.get("code"),
AttributeError: 'str' object has no attribute 'get'

Support midjourney

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

No response

Motivation

No response

[Bug]: wechat.py中的问题

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.10

Issue description

启动app.py后,使用两个不同的个人微信号与登录的这个微信号对话。其中一个可以正常获取gpt的回答,另一个会被识别为公众号消息被忽略“message sent by public/subscription account, ignore”,请问如何修复这个问题?
另外,是否可以设定开启文字回复的唤醒词?谢谢

Repro steps

No response

Relevant log output

No response

[Feat]: 私聊中,Ai回复可选加前缀

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

有些时候希望能让对方区分出是我还是Ai在回复他

Motivation

No response

[Bug]: How to send message directly in group? Don't use At msg?

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.8

Issue description

我的问题有两个:

  1. 如何向群里发送普通消息,目前我看代码里需要传入 wxid 和 nickname 构建成一个 const.AT_MSG 。可是我的需求就是发普通的消息而不是At。如果我不传入 wxid 和 nickname 就会出现 @null 的情况。如果我强行写死 const.TXT_MSG ,消息就无法发送到群里。所以如何构建一个往群里发的普通消息?

  2. 上哪里查看websocket支持的API和参数?没找到文档。例如 ‘/api/get_personal_info’ 这个请求是在哪里知道的呢?哪里有文档可以查到所有接口和参数呢?

谢谢

Repro steps

No response

Relevant log output

No response

[Bug]: 更新到新版之后在群里at 机器人无任何回复

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.8

Issue description

LOG如下

[INFO][2023-07-14 15:57:58][wechat.py:90] - message received: Message(room_id=18107XXXXX0@chatroom, sender_id=surfee, sender_name=ㅤTink, receiver_id=wxid_vz4g37XXXXXX12, receiver_name=锅巴, content=@锅巴 冯旸赫是谁, type=1, is_group=True, create_time=2023-07-14 15:57:57, at_list=['<![CDATA[wxid_vz4g37XXXXXX12]]>'])

Repro steps

No response

Relevant log output

No response

[Bug]: 微信被限制扫码登陆

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.9

Issue description

微信被限制扫码登陆

Repro steps

Uploading B8BA4C83196BDFEA8BC068C143547223.png…

Relevant log output

No response

Get personal info failed

[ERROR][2023-06-09 17:47:53][wechat.py:200] - Get personal info failed!
[ERROR][2023-06-09 17:47:53][wechat.py:201] - 'wx_name'
Traceback (most recent call last):
File "C:\Users\Administrator\Desktop\GPT\wechat-gptbot\channel\wechat.py", line 192, in get_personal_info
nickName: {content['wx_name']}
KeyError: 'wx_name'

[Feat]: support audio voice

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

好像暂时没有看到代码中能够支持添加语音信息的途径。
希望添加。

Motivation

No response

Integrate google search

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

No response

Motivation

No response

[Bug]:

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.8

Issue description

已经尝试在chatgpt.py中 print(type(conf())),结果显示确实为“dict”而非“str” object。新手小白,不知道如何解决bug,求解答,谢谢!

Repro steps

No response

Relevant log output

[INFO][2023-07-28 00:29:58][manager.py:42] - Checking plugins...
[INFO][2023-07-28 00:29:58][manager.py:54] - All plugins are installed
[INFO][2023-07-28 00:29:58][api.py:34] -
                wechat login info:

                nickName: test
                account: **
                wechatId: **
                startTime: 2023-07-28 00:29:58

[INFO][2023-07-28 00:29:58][wechat.py:40] - App startup successfully!
[INFO][2023-07-28 00:29:58][wechat.py:178] - [Websocket] connected
[INFO][2023-07-28 00:30:14][wechat.py:90] - message received: Message(room_id=None, sender_id=wxid_mrpa2pahtcbj22, sender_name=**, receiver_id=wxid_gkz7sggq422229, receiver_name=test, content=如何学习Python, type=1, is_group=False, create_time=2023-07-28 0
0:30:14, is_at=False)
[INFO][2023-07-28 00:30:14][chatgpt.py:26] - [ChatGPTBot] Query=如何学习Python
[ERROR][2023-07-28 00:30:16][chatgpt.py:81] - [ChatGPTBot] Exception: 'str' object has no attribute 'get'
Traceback (most recent call last):
  File "D:\Desktop\wechat-gptbot\bot\chatgpt.py", line 53, in reply_text
    response = openai.ChatCompletion.create(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_resources\chat_completion.py", line 25, in create
    return super().create(*args, **kwargs)
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_resources\abstract\engine_api_resource.py", line 153, in create
    response, _, api_key = requestor.request(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 298, in request
    resp, got_stream = self._interpret_response(result, stream)
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 700, in _interpret_response
    self._interpret_response_line(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 763, in _interpret_response_line
    raise self.handle_error_response(
  File "D:\Anaconda\anaconda3\lib\site-packages\openai\api_requestor.py", line 418, in handle_error_response
    error_code=error_data.get("code"),
AttributeError: 'str' object has no attribute 'get'
[INFO][2023-07-28 00:30:16][chatgpt.py:33] - [ChatGPTBot] Response=Please ask me again
[INFO][2023-07-28 00:30:16][wechat.py:83] - message sent successfully

Support summarizing chat history

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

No response

Motivation

No response

[Bug]: 微信一样会被封禁言

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.9

Issue description

83930b2b4fa94a959b85a3640467aaaf
一下突然收到3条,之前一条都没收到过

Repro steps

No response

Relevant log output

No response

Implement wikipedia plugin

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

No response

Motivation

No response

[Feat]: 给自定义的插件传递参数

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

怎么给自定义的插件传递参数?示例的tiktok是命令式的,怎么给它附加参数,就是用户输入command后加入搜索参数,让插件功能更丰富

Motivation

No response

[Feat]: 希望插件系统能够支持系统级定时器及通过配置文件指定私聊或群聊对象

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

具体来说就是我实现了一个早报的功能,但是目前只能通过指定command来触发。

希望插件系统能够从接口层面支持两个功能 1.定时器 2.指定发送对象

以此来实现每天早上9:00自动发送新闻早报到指定的私聊/群聊对象。

Motivation

No response

Integrate Claude api

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

No response

Motivation

No response

Support linux/macos via sandbox

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

No response

Motivation

No response

[Bug]: Get personal info failed!

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.10

Issue description

大佬,我启动的时候发生这个报错
Traceback (most recent call last):
File "E:\gpt\wechat-gptbot\channel\wechat.py", line 195, in get_personal_info
response = self.fetch(uri, data)
File "E:\gpt\wechat-gptbot\channel\wechat.py", line 231, in fetch
response = requests.post(url, json={"para": base_data}, timeout=5)
File "C:\Users\NORTHSEA.virtualenvs\wechat-gptbot-CoTc_QE1\lib\site-packages\requests\api.py", line 115, in post
return request("post", url, data=data, json=json, **kwargs)
File "C:\Users\NORTHSEA.virtualenvs\wechat-gptbot-CoTc_QE1\lib\site-packages\requests\api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
File "C:\Users\NORTHSEA.virtualenvs\wechat-gptbot-CoTc_QE1\lib\site-packages\requests\sessions.py", line 587, in request
resp = self.send(prep, **send_kwargs)
File "C:\Users\NORTHSEA.virtualenvs\wechat-gptbot-CoTc_QE1\lib\site-packages\requests\sessions.py", line 701, in send
r = adapter.send(request, **kwargs)
File "C:\Users\NORTHSEA.virtualenvs\wechat-gptbot-CoTc_QE1\lib\site-packages\requests\adapters.py", line 565, in send
raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPConnectionPool(host='127.0.0.1', port=5555): Max retries exceeded with url: //api/get_personal_info (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x00000213D71783D0>: Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。'))
[INFO][2023-06-18 14:47:01][wechat.py:34] - App startup successfully!
[ERROR][2023-06-18 14:47:03][wechat.py:241] - [Websocket] Error: [WinError 10061] 由于目标计算机积极拒绝,无法连接。
[ERROR][2023-06-18 14:47:03][wechat.py:241] - [Websocket] Error: WeChatChannel.on_close() takes 2 positional arguments but 4 were given

Process finished with exit code 0
请问该如何解决?

Repro steps

No response

Relevant log output

No response

[Bug]: tiktok 插件装不上

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.9

Issue description

image

image

tiktok 插件装不上,群聊能正常回复

Repro steps

No response

Relevant log output

No response

[Bug]: http://127.0.0.1:5555/api/get_personal_info 返回contents错误

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.10

Issue description

http://127.0.0.1:5555/api/get_personal_info 返回contents错误

Repro steps

api.py文件中的
def fetch(path, data):
base_data = {
"id": gen_id(),
"type": "null",
"roomid": "null",
"wxid": "null",
"content": "null",
"nickname": "null",
"ext": "null",
}
base_data.update(data)
url = f"http://{const.IP}:{const.PORT}/{path}"
response = requests.post(url, json={"para": base_data}, timeout=5)

response 返回的内容出错,
{'content': '[json.exception.type_error.316] invalid UTF-8 byte at index 0: 0x90', 'id': '20230728145737', 'receiver': 'CLIENT', 'sender': 'SERVER', 'srvid': 1, 'status': 'FAILED', 'time
': '2023-07-28 14:57:37', 'type': 6500}

编码错误,需要调整一下服务端。
导致无法输出
logger.info(
f"""
wechat login info:

            nickName: {content['wx_name']}
            account: {content['wx_code']}
            wechatId: {content['wx_id']}
            startTime: {response['time']}
            """
    )

信息。

整个代码无法继续执行下去。

Relevant log output

无法正常执行

[Bug]: get_personal_info() failed

Search for answers in existing issues

  • I have searched issues, there is no issue related to the problem I encountered

Python version

python 3.10

Issue description

其他均正常,注册也成功了,也能正常监听消息,但是启动时候不能正常载入 personal info.
[ERROR][2023-07-08 11:39:43][wechat.py:212] - Get personal info failed!
[ERROR][2023-07-08 11:39:43][wechat.py:213] - 'wx_name'
Traceback (most recent call last):
File "C:\d\llm\wechat-gptbot\channel\wechat.py", line 204, in get_personal_info
nickName: {content['wx_name']}
KeyError: 'wx_name'

打印response为:
{'content': '[json.exception.type_error.316] invalid UTF-8 byte at index 0: 0xF8', 'id': '20230708113048', 'receiver': 'CLIENT', 'sender': 'SERVER', 'srvid': 1, 'status': 'FAILED', 'time': '2023-07-08 11:30:48', 'type': 6500}

Repro steps

No response

Relevant log output

No response

[Bug]: @bot in group chat not work

Search for answers in existing issues

  • I have searched issues, there is no similar issue related

Feature description

新手第一次用。似乎没找到群聊的配置,是没开发呢还是我不会设置?

Motivation

No response

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.