yutto-dev / bilili Goto Github PK
View Code? Open in Web Editor NEW:beers: bilibili video (including bangumi) and danmaku downloader | B站视频(含番剧)、弹幕下载器
Home Page: https://bilili.nyakku.moe
License: GNU General Public License v3.0
:beers: bilibili video (including bangumi) and danmaku downloader | B站视频(含番剧)、弹幕下载器
Home Page: https://bilili.nyakku.moe
License: GNU General Public License v3.0
起止与结合符的混合,比如 1,4~5,7,9~11
以后再说
SynataxaError:invalid syntax
'apm_id_from' 不是内部或外部命令,也不是可运行的程序。
是不是那个ffmpeg的原因,他已经添加到环境变量了。
在我这边都可以,他那边不行,还需要重启电脑吗?
$ bilili -c $SESSDATA https://www.bilibili.com/bangumi/play/ss24588 -p 2
工作细胞
全 14 话
已选择第 2 话
[warn] 第2话 擦伤 无法下载,原因:「-10403」 大会员专享限制
✖ 第2话 擦伤 「」
以上标 ✖ 为需要进行下载的视频,是否立刻进行下载?[Y/n]
顺便一提,使用 Y
回复后,整个脚本就卡掉无响应了(
WSL1 Ubuntu 20.04
Python 3.8.5
1.3.7
cmd/bash
cmd/Git Bash
Y/-y
后继续下载,最后无限刷新使界面卡住。卡顿界面强行 Ctrl + C 时的输出:
Traceback (most recent call last):
File "/usr/local/bin/bilili", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.8/dist-packages/bilili/__main__.py", line 441, in main
time.sleep(max(1 / refresh_rate - (time.time() - now_t), 0.01))
KeyboardInterrupt
顺便一提,符号「✖」有些花活,在大部分常规平台均无法正常显示,建议替换成常规Unicode符号(如-
/+
)。
该符号还会导致一些终端的交互锅掉,比如说如下是 Git Bash
的显示:
abc17@Jerry MINGW64 /h
$ bilili -c [SECRET] https://www.bilibili.com/bangumi/play/ss24588 -p 2
Traceback (most recent call last):
File "c:\python38\lib\runpy.py", line 194, in _run_module_as_main
return _run_code(code, main_globals, None,
File "c:\python38\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Python38\Scripts\bilili.exe\__main__.py", line 7, in <module>
File "c:\python38\lib\site-packages\bilili\__main__.py", line 264, in main
print("{} {}".format(symbol, str(container)))
UnicodeEncodeError: 'gbk' codec can't encode character '\u2716' in position 0: illegal multibyte sequence
工作细胞
全 14 话
已选择第 2 话
[warn] 第2话 擦伤 无法下载,原因:「-10403」 大会员专享限制
编码处理不好时,在使用 subprocess 简易交互时也会吐类似信息使交互失败,(我现在已经被迫用写入 bat 再执行的屑 workaround 了)
🍻 𝓫𝓲𝓵𝓲𝓵𝓲 多半情况下也无法显示,暂且不提。
扫了一眼,倒是没看懂 API 实现。
如何修改默认设置
想将弹幕默认格式修改为ass
目前B站港澳台的番剧都是CC字幕,工具好像并没有把字幕下载下来,所以建议在ffmpeg合并的时候把字幕也封装进去,这样用potplayer之类的播放器打开就可以看了
###ps:
因为之前花寄的事,我加急敲了个爬虫,下载器还是引用别人的。
即使如此这个程式还是只能用惨不忍睹来形容。所以我打算重写一个。
当我使用
``pip search bili`
的时候,我发现了'bilili'。它的代码的整洁性令我惊叹,而那极其不友好的使用方式亦让我惊讶。
所以我来的了Github并发起了Issues,希望可以将我的想法传达给作者
###ps2:
头一回使用Github,如果让你产生了什么不好的感受或者我有什么不对的地方希望可以告诉我
不擅长和人交流,见笑了(- _ -)
我已经fork了这份项目,但是我的python技术并不是特别好,所以分析代码的架构和修改可能花费不少时间
我希望也能为bilili出一份力
希望作者不要介意参考bilili的设计思路和部分源码并将其用在我的项目上
请问能自动合并一个bvid的所有episodes吗
bilili https://www.bilibili.com/bangumi/media/md102392 -y --danmaku ass -q 120 --disable-proxy --use-mirrors -d "E:\[02]动漫"
运行命令后,在解析过程中会抛出错误。如下文:
Traceback (most recent call last):
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connection.py", line 169, in _new_conn
conn = connection.create_connection(
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\util\connection.py", line 73, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "c:\users\administrator\appdata\local\programs\python\python39\lib\socket.py", line 953, in getaddrinfo
for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
socket.gaierror: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connectionpool.py", line 699, in urlopen
httplib_response = self._make_request(
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connectionpool.py", line 382, in _make_request
self._validate_conn(conn)
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connectionpool.py", line 1010, in _validate_conn
conn.connect()
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connection.py", line 353, in connect
conn = self._new_conn()
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connection.py", line 181, in _new_conn
raise NewConnectionError(
urllib3.exceptions.NewConnectionError: <urllib3.connection.HTTPSConnection object at 0x00000147AB53DD60>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\requests\adapters.py", line 439, in send
resp = conn.urlopen(
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\connectionpool.py", line 755, in urlopen
retries = retries.increment(
File "c:\users\administrator\appdata\local\programs\python\python39\lib\site-packages\urllib3\util\retry.py", line 574, in increment
raise MaxRetryError(_pool, url, error or ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='xy59x53x113x158xy.mcdn.bilivideo.cn', port=4483): Max retries exceeded with url: /upgcxcode/58/08/51640858/51640858_da8-1-30112.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1619077722&gen=playurlv2&os=mcdn&oi=2936792839&trid=2f43f53ce2694338ac895bc7a00af31cp&platform=pc&upsig=b2670e02acd181db60a906766173ee27&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,platform&mcdnid=8000024&mid=30632061&orderid=0,3&agrr=1&logo=A0000080 (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x00000147AB53DD60>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed'))
是因为我网络有问题吗?我正常访问都是没问题的。
正常下载
不是很稳定,有时候抓取第一集信息就报错了, 有时候抓到第6集才报错
我有大会员cookie 估计操作和biliutil那边差不多
不过请问这个下载视频的接口 有没有说大会员cookie每天下载上限是多少
因为找不到b站官方文档有说这个。。。。。。
里面有 flask 写的api 接口。里面关于解释器的用法,头一次见到学习到了,封装成这样写也可以。
大佬NB
还有就是如何解决频繁访问的问题,采用代理的话成本就显得略高,不采用的代理的话,这个好像直接套用B站的接口也可以,所以实用性可能差一些。
想到了几个合适单独拿出来的接口,
对于avid bvid cid 的相互转化可以单独列一个接口。
为B站现在根据字幕只能获取到bvid,能否直接做一个页面,输入bvid 下面可以出现 bvid 下面挂了几个cid 然后点击下载,就下载了。
安装一切正常,运行 bilili https://www.bilibili.com/video/BV1Sa4y1H7cy报错。
File "/Users/xxx/anaconda3/envs/bilbili/lib/python3.7/site-packages/bilili-1.3.6-py3.7.egg/bilili/__main__.py", line 144
if (avid_match := regex.acg_video.av.origin.match(args.url)) or \
^
SyntaxError: invalid syntax
现在 bilili 会清空终端的屏幕,我希望能有一个不清屏的选项。
不是啥大问题,手动安装即可,但是最好还是在requirements.txt里面加上哈哈哈
将主函数的逻辑抽解为
argparser() -> config
for loop:
# 此处可增加循环以处理批量下载、UP 主个人空间下载等问题
biliparse(config) -> containers
downloader(container)
WIP, #47
目前用了海象运算符所以最低版本需要python 3.8,这个需不需要在README说明一下?
如果是我看漏了抱歉请忽略
添加外部 API,支持通过 Python 调用和 WSGI 方式(部署到 vercel)引用
WIP
可以简单一点,默认设置直接读取项目文件夹内的“download_list.txt”之类的文件,然后设置一个新的参数,比如-list
,搭配参数就可以批量下载了。
我是一个文科生,所以... 额...
B站的视频的url的bv大小写都是合法的(bv, BV),但是现在填写包含小写的bv号url会出错
比如:
python bilili.py https://www.bilibili.com/video/bv1Gi4y187Jh
视频地址有误!
目前bilili即使使用-d参数设置了目标目录,也会在目标目录创建多层目录存放文件
而不少使用者其实只是很单纯的想将视频.mp4下到指定的目录,并不需要Playlist.dpl、Video等等这种额外的文件与目录
解析下载流的时候为什么要进行两次请求,是否可以合成一次请求?
B站有防爬,为了更有效的进行下载,我重新对下载逻辑进行了调正,添加了数据库用来缓存相关接口保存的数据,在研究下载流的解析的时候发现,在获取流的时候要对流接口进行两次访问
见 billil/api/acg_video.py:
80 touch_message = spider.get(play_api.format(avid=avid, bvid=bvid, cid=cid, quality=80)).json()
81 if touch_message["code"] != 0:
raise CannotDownloadError(touch_message["code"], touch_message["message"])
accept_quality = touch_message["data"]["accept_quality"]
for quality in video_quality_sequence:
if quality in accept_quality:
break
play_url = play_api.format(avid=avid, bvid=bvid, cid=cid, quality=quality)
res = spider.get(play_url)
为什么要获取accept_quality ? 去除之后对下载的内容似乎不影响
在下载少数文件时,不影响,如果进行大量下载,多一个http 请求,必然会让接口更早的进行ip封锁
仅作为想法,不提供 PR
(旧有特性,重构后未添加,正在考虑是否重新添加)
将每个资源都切分成多个小块,每个小块分发到一个线程进行下载,提高多线程下载的利用率,而且这样下载开始会集中于前几话
比如 M4S 资源,共 7 话的番剧,每话 1GB,那么最大利用 14 个线程(每话包含声音流和视频流),当然跑满带宽应该是没什么问题,但大多数情况是几话同时下载,而第一话下载完往往是总进度过了 50%,这与本下载器设计理念中允许边下边播的理念(即时刷新播放列表、即时生成 ass 弹幕、下载后即时合并等等)相悖
而分块下载,每块 100MB,那么 30 个线程(默认的最大线程数)将集中于下载前 3 话,第一话基本能保证在总进度过 25% 之前完成
Aria2 确实有开箱即用的分段特性,因此重构后最开始我就用了 Aria2(01e441c),但速度很慢,且忽快忽慢(我也不清楚为啥),而且不太方便设计进度统计界面……因此我就重新花了好几天写 Python 的下载器了,但这次还没有添加分块的特性
まあー、还木有想好要不要添加呐~
先试试是否好添加,如果好弄的话,就去开 PRPRPRR
已解决
-d/--dir 指定存储目录,默认为项目根目录
bilili.py
parser.add_argument("-d", "--dir", default=r"", help="下载目录")
大佬,这里怎么指定存储目录啊?请多指教
我今天才安裝v1.4.8,bilili https://www.bilibili.com/bangumi/play/ep380634
下載19,20集後晚上8pm開始降的原本600多k變5k以下在跑
是有下載影片數目限制嗎(1天以內)?
順帶一題降速時我開網頁測試發現網頁開的不慢,也下檔案測試也是500~600k在跑
還有明明19集檔案大小只有233.2mb,跑的量卻超過了?!
https://imgur.com/a/1nQF8y7
也不算是一个feature request,可能只算一个小问题 , 我看discussion没人 就写这了
不知道有没有打算加个直播流截取的模块
大概可能是给一个直播房间url
然后去把房间的rmtp源路径找出来
估计这个源路径也是给m3u8文件response而已
然后用ffpmeg持续下载这个流到本地 (话说我感觉ffpmeg好用就是因为里面更新直播�m3u8 playlist的过程没有谁用python写出来)
不知道是不是已经有相关工具了,关于直播流截取的配置应该也不少
添加视频块合并进度,下了个《星际穿越》 6个多G,49个视频块,不知道有没有和合并,一直在等待,等了20分钟了没反应😂😂
隔壁BBDown可以使用TV端解析模式,实现无需cookies就能下载大会员4k60帧版本,并可以解析hevc编码版本,希望在此也加上,优先下载hevc版本,没有的话再下载h264版本,对于分p多的4k视频可省一些空间,提高完成速度。
命令行里
-danmaku 默认修改为ass
增加 cookie 保存,输入一次之后自动保存
cookieFile = "cookie.txt"
if(args.sess_data == None):
if (os.path.exists(cookieFile)):
file = open(cookieFile, mode='r')
args.sess_data =file.read()
file.close()
else:
file = open(cookieFile, mode='w')
file.write(args.sess_data)
file.close()
修改了 tools.py 中的 一些正则,让网址的匹配更容易进行
regex_acg_video_av = re.compile(r".*?av(?P\d+)")
regex_acg_video_av_short = re.compile(r"https?://b23.tv/av(?P\d+)")
regex_acg_video_bv = re.compile(r".*?(?P(bv|BV)\w+)")
regex_acg_video_bv_short = re.compile(r"https?://b23.tv/(?P(bv|BV)\w+)")
regex_bangumi_md = re.compile(r".*?/bangumi/media/md(?P<media_id>\d+)")
regex_bangumi_ep = re.compile(r".*?/bangumi/play/ep(?P<episode_id>\d+)")
regex_bangumi_ep_short = re.compile(r"https?://b23.tv/ep(?P<episode_id>\d+)")
regex_bangumi_ss = re.compile(r".*?/bangumi/play/ss(?P<season_id>\d+)")
regex_bangumi_ss_short = re.compile(r"https?://b23.tv/ss(?P<season_id>\d+)")
#space ID
regex_sapce = re.compile(r".*?space.bilibili.com/(?P<space_id>\d+)")
增加的space 解析api ,同时为了配合该api 对程序进行了一定的修改
为了下载up视频,参考 番剧,增加了space api 和相关解析
@export_api(route="/space/title")
def get_space_title(spaceid: str = "") -> str:
if not (spaceid):
raise Exception(spaceid +"不存在")
home_url = (
"https://space.bilibili.com/{spaceid}/".format(spaceid=spaceid)
)
res = spider.get(home_url)
regex_title = re.compile(r"<title>(.)的个人空间.?</title>")
if regex_title.search(res.text):
title = regex_title.search(res.text).group(1)
else:
title = "呐,我也不知道是什么标题呢~"
return title
@export_api(route="/space/title")
def get_space_video(mid: str = "" ,pn=1) -> str:
if not (mid):
raise Exception(mid +"不存在")
list_api = "https://api.bilibili.com/x/space/arc/search?mid={mid}&pn={pn}&ps=100&jsonp=jsonp"
album_list = []
while True:
res = spider.get(list_api.format(mid=mid, pn=pn))
# 循环获取列表
album_list.extend(
[
{
"id": i + 1,
"name": re.sub(r"[/\:*?"<>|]", "", item["title"]),
"avid": str(item["aid"]),
"bvid": item["bvid"],
}
for i,item in enumerate(res.json()["data"]["list"]["vlist"])
]
)
if len(album_list) < int(res.json()['data']["page"]['count']):
pn += 1
else:
break
return album_list
为了更好白嫖,理应给下载的视频点赞+评论
除了sessdata 还需要bili_jct 同样也在cookie 中获取
不提供PR ,仅提供想法
headers = {
"cookie": "SESSDATA=; bili_jct="
}
bili_jct =""
SESSDATA =""
replayaddurl ="https://api.bilibili.com/x/v2/reply/add"
def replayadd(avid: str = "", bvid: str = "",message: str=""):
replaydata = {
"oid": avid,
# "bvid": "BV1LK4y177wV",
"type": "1",
"message": message,
"plat": "1",
"ordering": "heat",
"jsonp": "jsonp",
"csrf": bili_jct
}
r = requests.post(replayaddurl, data=replaydata, headers=headers)
return r.text
likeurl ="https://api.bilibili.com/x/web-interface/archive/like"
def like(avid: str = "", bvid: str = "",like:str ="1",):
likedata = {
"aid":avid,
"bvid": bvid,
"like": 1,
"csrf": bili_jct
}
r = requests.post(likeurl, data=likedata, headers=headers)
return r.text
有时候不需要下载弹模,但似乎没有开关,建议添加禁用弹幕下载的选项。
优化包括但不限于文档布局、文档内容、文档风格等等的问题
欢迎各位提出意见,内容修改直接点击各页底部「帮我改进我的风格!」即可修改~
如果是其他问题请在本 Issue 中提出~
const { exec } = require('child_process');
exec(command, (err, stdout, stderr) => {});
错报信息
Traceback (most recent call last):
File "/usr/local/bin/bilili", line 5, in <module>
from bilili.__main__ import main
File "/usr/local/lib/python3.9/site-packages/bilili/__main__.py", line 19, in <module>
from .utils.console.ui import ColorString, Line, LineList, ProgressBar, String, View
File "/usr/local/lib/python3.9/site-packages/bilili/utils/console/ui.py", line 204, in <module>
class ProgressBar(Component):
File "/usr/local/lib/python3.9/site-packages/bilili/utils/console/ui.py", line 205, in ProgressBar
def __init__(self, symbols: Union[str, List[str]] = "░▏▎▍▌▋▊▉█", width: int = View.get_width()):
File "/usr/local/lib/python3.9/site-packages/bilili/utils/console/ui.py", line 50, in get_width
width = os.get_terminal_size().columns
OSError: [Errno 102] Operation not supported on socket
报错位置
https://github.com/SigureMo/bilili/blob/main/bilili/utils/console/ui.py#L50
在我的一个 Node.js 小项目 download-webhook 使用时遇到的问题,从 v1.4.7 更新至 v1.4.8 后出现
现在的标题表示方式是这样了,现有的表达式会抓取不到视频标题:
<title data-vue-meta="true">【鬼谷闲谈】病毒:生于三界之外 不灭六道之中_哔哩哔哩_bilibili</title>最近下得有点慢诶……不知道出了啥状况,所以想试试从多个 bilibili 镜像下载的话,也许会变快?
(ฅ>ω<*ฅ)
bilili -t flv -c "$(gpg --decrypt 2>/dev/null $HOME/.secrets/BILIBILI_SESSDATA.gpg)" https://www.bilibili.com/bangumi/media/md28231773
开始下载后,b 站消息通知:
如果可能的话,下载时不收到 b 站的登录提醒。
不知道 bilili 有没有设置 User Agent 之类的,可能和这相关?
还没仔细看源码,说不定可以(:dove:
[root@localhost ~]# pip3.8 install bilili==1.4.4
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting bilili==1.4.4
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/41/cf/ab19c6f7c98cf88829fe83bda1e8c54fe8a10afc4857c77b8c34a4787c73/bilili-1.4.4-py2.py3-none-any.whl (60 kB)
Requirement already satisfied: requests in /usr/local/lib/python3.8/site-packages (from bilili==1.4.4) (2.25.1)
Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.8/site-packages (from requests->bilili==1.4.4) (1.26.4)
Requirement already satisfied: chardet<5,>=3.0.2 in /usr/local/lib/python3.8/site-packages (from requests->bilili==1.4.4) (4.0.0)
Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.8/site-packages (from requests->bilili==1.4.4) (2.10)
Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.8/site-packages (from requests->bilili==1.4.4) (2020.12.5)
Installing collected packages: bilili
Successfully installed bilili-1.4.4
WARNING: Running pip as root will break packages and permissions. You should install packages reliably by using venv: https://pip.pypa.io/warnings/venv
[root@localhost ~]# bilili
Traceback (most recent call last):
File "/usr/local/bin/bilili", line 5, in <module>
from bilili.__main__ import main
File "/usr/local/lib/python3.8/site-packages/bilili/__main__.py", line 9, in <module>
from .api.danmaku import get_danmaku
File "/usr/local/lib/python3.8/site-packages/bilili/api/danmaku.py", line 4, in <module>
from ..tools import spider
File "/usr/local/lib/python3.8/site-packages/bilili/tools.py", line 3, in <module>
from .handlers.status import DownloaderStatus
File "/usr/local/lib/python3.8/site-packages/bilili/handlers/status.py", line 3, in <module>
from ..utils.console.logger import Logger
File "/usr/local/lib/python3.8/site-packages/bilili/utils/console/logger.py", line 3, in <module>
from ..functiontools.singleton import Singleton
ModuleNotFoundError: No module named 'bilili.utils.functiontools'
for audio in res.json()["data"]["dash"]["audio"]:
TypeError: 'NoneType' object is not iterable
重构,无新特性,进一步提高代码可读性
通过 hook 的方式来代替原有各处杂糅的 middleware 直接通讯方式,下载器应不出现任何外部状态信息
尽可能将合并器与下载器改为相似的逻辑,均不出现外部信息
WIP
主python环境是3.6版本的(不方便重装3.8的python,否则一堆第三方库还要再装,而且一定会有很多兼容性问题需要手动排查修复)。
于是就用不了bilili,但是又很想尝试,看着就很可爱不是嘛。
一个办法是用虚拟环境,另一个办法就是请作者直接发布一个自带3.8环境的预打包版本。
pyinstaller打包挺方便的,一条命令一般就行了,情况比较特殊的话也就多加几条命令,要不烦请您试试?
space.bilibili.com/ajax/member/getSubmitVideos 是biliutil用的一个接口
返回该用户所有视频资料, 但该接口下线了
请问这个bilili有能下载一个用户所有视频的函数吗?
C:\Users\GYL>bilibili https://www.bilibili.com/video/BV1vZ4y1M7mQ
请输入正确的房间号!
不论后面跟的网址是什么,都提示请输入正确的房间号!
我查了你的文档各处也没有相关信息,源码中也没有找到相关字段,不知道什么原因。
辛苦作者大大查一下错误。
任意方式
通过 cls
刷新屏幕时会提示 系统找不到指定的路径。
,但很快被刷新掉,不影响整体体验,但观感不太佳
而注释掉调用 cls
的代码时,不会出现该问题,就很奇怪……目前未发现具体问题所在以及相应解决方案
不会出现该问题
无
暂无计划,Windows 仅为测试系统,不常用
欢迎贡献~
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.