depler / curl-impersonate-win Goto Github PK
View Code? Open in Web Editor NEWA special build of curl for Windows that can impersonate Chrome and Safari
A special build of curl for Windows that can impersonate Chrome and Safari
I got this error (find attached the full log):
F:\curl-impersonate-win-main\boringssl>ninja.exe -C lib crypto ssl
ninja: Entering directory `lib'
[32/308] Building C object crypto/fipsmodule/CMakeFiles/fipsmodule.dir/bcm.c.obj
In file included from F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/bcm.c:31:
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u32_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:868:3,
inlined from 'sha256_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha256.c:150:5,
inlined from 'SHA224_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha256.c:168:10:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 4 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
In file included from F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/bcm.c:104:
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha256.c: In function 'SHA224_Final':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha256.c:164:26: note: at offset 28 into destination object 'out' of size [0, 28]
164 | int SHA224_Final(uint8_t out[SHA224_DIGEST_LENGTH], SHA256_CTX *ctx) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA384_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:167:10,
inlined from 'SHA384' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:132:3:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
In file included from F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/bcm.c:105:
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA384':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:128:25: note: at offset 48 into destination object 'out' of size [0, 48]
128 | uint8_t out[SHA384_DIGEST_LENGTH]) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA384_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:167:10,
inlined from 'SHA384' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:132:3:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA384':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:128:25: note: at offset 56 into destination object 'out' of size [0, 48]
128 | uint8_t out[SHA384_DIGEST_LENGTH]) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA512_256_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:182:10,
inlined from 'SHA512_256' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:152:3:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA512_256':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:148:29: note: at offset 32 into destination object 'out' of size [0, 32]
148 | uint8_t out[SHA512_256_DIGEST_LENGTH]) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA512_256_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:182:10,
inlined from 'SHA512_256' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:152:3:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA512_256':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:148:29: note: at offset 40 into destination object 'out' of size [0, 32]
148 | uint8_t out[SHA512_256_DIGEST_LENGTH]) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA512_256_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:182:10,
inlined from 'SHA512_256' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:152:3:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA512_256':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:148:29: note: at offset 48 into destination object 'out' of size [0, 32]
148 | uint8_t out[SHA512_256_DIGEST_LENGTH]) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA512_256_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:182:10,
inlined from 'SHA512_256' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:152:3:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA512_256':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:148:29: note: at offset 56 into destination object 'out' of size [0, 32]
148 | uint8_t out[SHA512_256_DIGEST_LENGTH]) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA384_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:167:10:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA384_Final':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:163:26: note: at offset 48 into destination object 'out' of size [0, 48]
163 | int SHA384_Final(uint8_t out[SHA384_DIGEST_LENGTH], SHA512_CTX *sha) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
In function 'OPENSSL_memcpy',
inlined from 'CRYPTO_store_u64_be' at F:/curl-impersonate-win-main/boringssl/crypto/internal.h:879:3,
inlined from 'sha512_final_impl' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:273:5,
inlined from 'SHA384_Final' at F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:167:10:
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c: In function 'SHA384_Final':
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:163:26: note: at offset 56 into destination object 'out' of size [0, 48]
163 | int SHA384_Final(uint8_t out[SHA384_DIGEST_LENGTH], SHA512_CTX *sha) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/internal.h: In function 'SHA512_256_Final':
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:178:30: note: at offset 32 into destination object 'out' of size [0, 32]
178 | int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:178:30: note: at offset 40 into destination object 'out' of size [0, 32]
178 | int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:178:30: note: at offset 48 into destination object 'out' of size [0, 32]
178 | int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/internal.h:824:10: warning: writing 8 bytes into a region of size 0 [-Wstringop-overflow=]
824 | return memcpy(dst, src, n);
| ^~~~~~~~~~~~~~~~~~~
F:/curl-impersonate-win-main/boringssl/crypto/fipsmodule/sha/sha512.c:178:30: note: at offset 56 into destination object 'out' of size [0, 32]
178 | int SHA512_256_Final(uint8_t out[SHA512_256_DIGEST_LENGTH], SHA512_CTX *sha) {
| ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[308/308] Linking CXX static library ssl\libssl.a
...
_LIBZ -DHAVE_ZLIB_H -DHAVE_ZSTD -DHAVE_BROTLI -DUSE_LIBIDN2 -DENABLE_IPV6 -c vauth/krb5_sspi.c -o vauth/krb5_sspi.o
http.c: In function 'Curl_http_merge_headers':
http.c:2093:7: warning: unused variable 'i' [-Wunused-variable]
2093 | int i;
| ^
...
_LIBZ -DHAVE_ZLIB_H -DHAVE_ZSTD -DHAVE_BROTLI -DUSE_LIBIDN2 -DENABLE_IPV6 -c vssh/wolfssh.c -o vssh/wolfssh.o
windres --include-dir=../include -DDEBUGBUILD=0 -O coff -F pe-x86-64 -i libcurl.rc -o libcurl.res
vtls/openssl.c: In function 'parse_sig_algs':
vtls/openssl.c:354:19: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
354 | for (i = 0; i < MAX_SIG_ALGS; i++) {
| ^
vtls/openssl.c: In function 'DecompressZlibCert':
vtls/openssl.c:2741:29: warning: unused parameter 'ssl' [-Wunused-parameter]
2741 | int DecompressZlibCert(SSL ssl,
| ~~~~~^~~
vtls/openssl.c: In function 'DecompressBrotliCert':
vtls/openssl.c:2786:31: warning: unused parameter 'ssl' [-Wunused-parameter]
2786 | int DecompressBrotliCert(SSL ssl,
| ~~~~~^~~
vtls/openssl.c: In function 'add_cert_compression':
vtls/openssl.c:2847:18: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
2847 | for(i = 0; i < NUM_CERT_COMPRESSION_ALGS; i++) {
| ^
In file included from vtls/openssl.c:57:
vtls/openssl.c: In function 'ossl_connect_step1':
vtls/vtls.h:154:17: warning: pointer targets in passing argument 2 of 'SSL_add_application_settings' differ in signedness [-Wpointer-sign]
154 | #define ALPN_H2 "h2"
| ^~~~
| |
| char *
vtls/openssl.c:3560:51: note: in expansion of macro 'ALPN_H2'
3560 | SSL_add_application_settings(backend->handle, ALPN_H2, ALPN_H2_LENGTH,
| ^~~~~~~
In file included from vtls/openssl.c:65:
F:\curl-impersonate-win-main\boringssl/include/openssl/ssl.h:2880:74: note: expected 'const uint8_t *' {aka 'const unsigned char *'} but argument is of type 'char *'
2880 | OPENSSL_EXPORT int SSL_add_application_settings(SSL *ssl, const uint8_t *proto,
| ~~~~~~~~~~~~~~~^~~~~
gcc -m64 -s -static -shared -o libcurl.dll
...
no bianries:
MINGW64 /f/curl-impersonate-win-main
total 10132
drwxr-xr-x 1 Dave Nincs 0 Jun 22 15:06 .
drwxr-xr-x 1 Dave Nincs 0 Jun 22 15:06 ..
-rwxr-xr-x 1 Dave Nincs 4723712 Jun 22 15:06 curl.exe
-rw-r--r-- 1 Dave Nincs 1001802 Jun 22 15:06 libcurl.a
-rwxr-xr-x 1 Dave Nincs 4573696 Jun 22 15:06 libcurl.dll
-rw-r--r-- 1 Dave Nincs 58418 Jun 22 15:06 libcurldll.a
How to clone this repository? I have aproblem with that:
"Clone this repository with --recursive attribute to get BoringSSL and Curl submodules."
Just copy the "boringssl_original" to "boringssl"?
after setting up necessary packages in msys2 and patching sources, running build.bat, i encounter the following errors after moving into the curl source directory and running "mingw32-make mingw32-clean":
Next, it attempts to run "mingw32-make mingw32 -j", failing at the very end:
As expected, because of this error (most likely), directory "lib" in the curl source tree is empty
What should I be doing to fix this? Here is a screenshot of my environment variables, if they are of any use:
My path variable has nothing on it that would interfere, but I can post it if you want.
Is it possible to automatically build new binaries with github actions? I see that windows machines are available. With that implemented, the packages can be up-to-date with upstream curl-impersonate and no one need to build themselves.
please update to the current version. don't abandon the project!
Not a project issue - Information only!
This would be great for my purposes.
I need to just check that a site is actually 'up' (via HEAD or GET).
I have some sites (all https, using Cloudflair) that just time out using Curl (or ping, or tracert), but run fine from a browser.
I updated MSYS, followed your directions and was off to the races when compilation stopped.
Here's the last error:
windres --include-dir=../include -DDEBUGBUILD=0 -O coff -F pe-x86-64 -i libcurl.rc -o libcurl.res
In file included from C:/msys64/mingw64/include/windef.h:9,
from C:/msys64/mingw64/include/windows.h:69,
from C:/msys64/mingw64/include/winsock2.h:23,
from ../include/curl/system.h:408,
from ../include/curl/curl.h:37,
from curl_setup.h:161,
from version.c:25:
C:/msys64/mingw64/include/minwindef.h:6:10: fatal error: ./specstrings.h: Invalid argument
6 | #include <specstrings.h>
| ^~~~~~~~~~~~~~~
compilation terminated.
This looks like a ming error, but checking the include dir, specstrings.h is indeed there.
Any idea what ming wants to correct it?
Thanks for porting this to win, it'd be a lifesaver if I can get it to compile!
Will there be any more updates?
Hi,
I am using the precompiled curl-impersonate-win files: https://github.com/depler/curl-impersonate-win/releases/tag/7.84.0
I moved libcurl.dll to my PHP ext folder: C:\wamp\bin\php\php7.1.9\ext
Then, I updated php.ini, uncommenting this:
;extension=php_curl.dll
And adding this:
extension=libcurl.dll
However, it gives me the following error:
Fatal error: Uncaught Error: Call to undefined function curl_init()
I also tried simply replacing php_curl.dll with libcurl.dll from the precompiled binaries, but it also gives the same error.
Any ideas on how I can use this with WAMP?
Hello,
would be nice to have dependencies as Submodules for git. You can download everything with the --recursive attribute on the git clone at one time.
Cuz some sites even can detect new curl. With GET no problem but POST cant bypass properly sometimes. Tried that curl_chrome116 -X POST https://stake.com/_api/graphql -H "Connection: keep-alive" -H "x-language: en" -H "Keep-Alive: timeout=5, max=100" -H "Accept: application/graphql+json, application/json" -H "Accept-Language: en-US,en;q=0.5" -H "Content-Type: application/json" --json '{"query":"query ActiveRacesStatus {\n activeRaces {\n id\n status\n scope\n }\n}\n","variables":{"limit":10}}' --tlsv1.3 --include --tls13-ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA --http2 --proxy-tls13-ciphers TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA:AES256-SHA
with ciphers but no luck. I know that with different TLS emulation works pretty fine. So any way to change it or mb some fixes you know brothers?
curl_chrome110.bat -s 'https://example.org/urlparam&urlparam1=1&urlparam2=2'
'urlparam1' is not recognized as an internal or external command,
operable program or batch file.
'urlparam2' is not recognized as an internal or external command,
operable program or batch file.
I created a new build. Did curl.exe --version and got
Release-Date: 2023-10-11
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS HTTPS-proxy IDN IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI threadsafe Unicode UnixSockets
I guess my question is, do I have to complete other steps to pull the latest from https://github.com/lwthiker/curl-impersonate/releases or is that done automatically?
Looking for WebSocket support.
I want to integrate curl_chrome_104 with node-libcurl library. So, that I can make api calls with customized headers. any help would be appreciated. Thanks.
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.