projectdiscovery / uncover Goto Github PK
View Code? Open in Web Editor NEWQuickly discover exposed hosts on the internet using multiple search engines.
License: MIT License
Quickly discover exposed hosts on the internet using multiple search engines.
License: MIT License
Provider - https://hunter.how
API - https://hunter.how/search-api
-e, -engine string[] search engine to query (shodan,shodan-idb,fofa,censys,quake,hunter,zoomeye,netlas,criminalip,hunterhow) (default shodan)
-hh, -hunterhow string[] search query for hunter.how (example: -hh 'query.txt')
New provider source - https://publicwww.com
API endpoint and details - https://publicwww.com/profile/api (Public signup with API is available)
host
(existing)url
(new)echo "/wp-content/themes/twentysixteen/" | uncover -silent -e publicwwww -f url
https://www.mcmaster.ca
https://winaero.com
https://getitfree.us
https://semioffice.com
https://www.saberia.com
https://bezux.pl
http://thespacereporter.com
https://www.cbrc.jp
https://obrnadzor.gov.ru
https://www.infokids.gr
https://techmixx.de
....
echo "/wp-content/themes/twentysixteen/" | uncover -silent -e publicwwww -f host
www.mcmaster.ca
winaero.com
getitfree.us
semioffice.com
www.saberia.com
bezux.pl
thespacereporter.com
www.cbrc.jp
obrnadzor.gov.ru
....
be23df8 compiled using go version devel go1.19-5bb2628c6f darwin/amd64
$ cat $HOME/.config/uncover/config.yaml
query:
- 'org:"Something, Inc."'
engine: shodan
...
Results in the following queries issues by the tool:
[shodan] unexpected status code 502 received from https://api.shodan.io/shodan/host/search?key=REDACTED&query=org:"Something&page=1
[shodan] unexpected status code 502 received from https://api.shodan.io/shodan/host/search?key=REDACTED&query= Inc."&page=1
A single query is issued using my raw string, urlencoding it if needed.
$ SHODAN_API_KEY=REPLACE-WITH-YOURS uncover -q 'org:"Something, Inc."' -v
For now I've fixed this by doing the needed changes in order for the program to handle Query parameter as a string type rather than goflags.FileCommaSeparatedStringSlice
. Please, note this required more changes but I avoided pasting them there.
diff --git a/runner/options.go b/runner/options.go
index 17804d6..a23b7e5 100644
--- a/runner/options.go
+++ b/runner/options.go
@@ -23,7 +23,7 @@ var (
// Options contains the configuration options for tuning the enumeration process.
type Options struct {
- Query goflags.FileCommaSeparatedStringSlice
+ Query string
Would be happy to contribute a change to use Query as a string
, but maybe the proper fix is to make goflags.FileCommaSeparatedStringSlice
properly handle quotted commas? I'll leave that decision to your team! 😃
When performing multiple searches using the -e zoomeye command along with other search engines, an error occasionally occurs with the following panic message:
panic: interface conversion: interface {} is string, not float64
goroutine 58 [running]:
github.com/projectdiscovery/uncover/uncover/agent/zoomeye.(*Agent).query(0x0?, {0x1286f8b?, 0x0?}, 0x0?, 0x0?, 0x0?)
/home/runner/work/uncover/uncover/uncover/agent/zoomeye/zoomeye.go:94 +0x4e5
github.com/projectdiscovery/uncover/uncover/agent/zoomeye.(*Agent).Query.func1()
/home/runner/work/uncover/uncover/uncover/agent/zoomeye/zoomeye.go:42 +0x10b
created by github.com/projectdiscovery/uncover/uncover/agent/zoomeye.(*Agent).Query
/home/runner/work/uncover/uncover/uncover/agent/zoomeye/zoomeye.go:31 +0xcc
1.0.3
-r -silent -e shodan,censys,zoomeye -q "apache"
Note that this issue occurs intermittently, not consistently with every search.
Taking the example from https://github.com/projectdiscovery/uncover#field-formatting
uncover -f https://ip:port/version
TODO:
ip
, host
, port
) e.g. http://10.10.10.10:1234/host
-f https://ip:port/hipster
would also translate to something like https://10.10.10.10:1234/h10.10.10.10ster
{{ip}}
NA
While trying to install Uncover I am getting the following error:
Error:
github.com/modern-go/reflect2
gopkg.in/yaml.v3
go/pkg/mod/github.com/modern-go/[email protected]/unsafe_map.go:9:2: undefined: unsafeType
go/pkg/mod/github.com/modern-go/[email protected]/unsafe_link.go:18:55: undefined: sliceHeader
go/pkg/mod/github.com/modern-go/[email protected]/go_above_118.go:17:20: type2.rtype undefined (type *UnsafeMapType has no field or method rtype)
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:145:22: undefined: unpackEFace
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:157:22: undefined: unpackEFace
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:168:14: undefined: safeType
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:172:12: undefined: safeStructType
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:174:10: undefined: newUnsafeStructType
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:177:12: undefined: safeSliceType
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:179:10: undefined: newUnsafeArrayType
go/pkg/mod/github.com/modern-go/[email protected]/reflect2.go:179:10: too many errors
go/pkg/mod/gopkg.in/[email protected]/decode.go:33:11: undefined: yaml_parser_t
go/pkg/mod/gopkg.in/[email protected]/decode.go:34:11: undefined: yaml_event_t
go/pkg/mod/gopkg.in/[email protected]/decode.go:35:12: undefined: Node
go/pkg/mod/gopkg.in/[email protected]/decode.go:36:23: undefined: Node
go/pkg/mod/gopkg.in/[email protected]/decode.go:80:27: undefined: yaml_event_type_t
go/pkg/mod/gopkg.in/[email protected]/decode.go:99:25: undefined: yaml_event_type_t
go/pkg/mod/gopkg.in/[email protected]/decode.go:140:28: undefined: Node
go/pkg/mod/gopkg.in/[email protected]/decode.go:147:27: undefined: Node
go/pkg/mod/gopkg.in/[email protected]/decode.go:314:11: undefined: Node
go/pkg/mod/gopkg.in/[email protected]/decode.go:315:15: undefined: Node
go/pkg/mod/gopkg.in/[email protected]/decode.go:147:27: too many errors
OS Info:
NAME=EndeavourOS
PRETTY_NAME=EndeavourOS
ID=endeavouros
ID_LIKE=arch
latest
unlike other API keys / token, QUAKE_TOKEN
is not supported to read as ENV variable.
Reading QUAKE_TOKEN
from env variable.
Initial PR: #46
I'm getting the following when trying to run hunterhow:
$/home/kali/go/bin/uncover -q hunterhow.query -e hunterhow -l 1000 -o hunterhow.txt
[INF] Current uncover version v1.0.3 (latest)
[hunterhow] couldn't create new session: no default rate limit found for engine hunterhow
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xc9cbd8]
goroutine 36 [running]:
github.com/projectdiscovery/uncover/uncover/agent/hunterhow.(*Agent).Query(0xc0004b5350?, 0xe3f9d9?, 0xdd7d93?)
/home/kali/go/pkg/mod/github.com/projectdiscovery/[email protected]/uncover/agent/hunterhow/hunterhow.go:24 +0x18
github.com/projectdiscovery/uncover/runner.(*Runner).Run.func1({0x1031a70, 0x162eaf0}, 0xc00040e450?)
/home/kali/go/pkg/mod/github.com/projectdiscovery/[email protected]/runner/runner.go:184 +0x4af
created by github.com/projectdiscovery/uncover/runner.(*Runner).Run
/home/kali/go/pkg/mod/github.com/projectdiscovery/[email protected]/runner/runner.go:165 +0x1cdb
Am I missing something? Do I need to edit something?
Also, there's no HunterHow's key section in the provider-config.yaml file.
https://github.com/projectdiscovery/uncover/blob/main/uncover/agent/fofa/fofa.go#L17
I guess you are planning to use domain
field to represent the result domain name information, but in FOFA domain
field represents the primary domain name of the target.
Example, when the result is: api.baidu.com
, then domain
value of the field is baidu.com
. If a user wants to query all Baidu domain names in FOFA, your way of writing will only return one record baidu.com
.
You should use the host
field in the FOFA API to represent domain information.
echo sonylive.com | uncover -e shodan,fofa,censys -v
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/ v0.0.2
projectdiscovery.io
Use with caution. You are responsible for your actions
Developers assume no liability and are not responsible for any misuse or damage.
By using uncover, you also agree to the terms of the APIs used.
[WRN] couldn't parse env vars: missing censys secret
Hi !
I saw that CIDR targets are only being searched on shodan/shodan-idb, but you can also use CIDR on Censys Search (ex : https://search.censys.io/search?resource=hosts&sort=RELEVANCE&per_page=25&virtual_hosts=EXCLUDE&q=51.91.110.0%2F24)
I didn't managed to make a PR for it, but I think it could be a useful feature ? 😄
Fofa can't get data(ips) fofa not work fofa not showing ips
As of now all the query will be passed to all the engines if multiple engines that are specified (-e shodan,censys
), instead for use case where different and specific query needs to be searched with specific engine is not possible.
pseudo example:
uncover -shodan "ssl:'Uber Inc'" -censys "ssl.dns:'Uber Inc'" -fofa "ssl = uber.com"
Search engine specific queries can be searched against multiple platform from same run.
From user:
I just configured uncover it works perfectly... but how can i use multiple query for particular search engine , like sodan uses different query than censys like sodan uses ssl:"program name" to search but censys uses a different one to search for the same query and same goes to other search engines .... is there any default query list set in uncover ...
Here are the messages covered also in this task: #157
from:
I think it will be better if we change ratelimit logic in uncover i.e in uncover we use delay to configure ratelimit while we have -rlm and -rl options in nuclei,subfinder,httpx . I think keeping options uniform will help rather than providing different formats for same functionality. Example
If source has ratelimit say 30 req/min
In nuclei we pass -rlm 30
In uncover we have to pass -delay 2
Apart from obvious calculation required another thing we miss is bucket refill rate.
Based on censys docs it's has rate limited
so while I used uncover I got too many requests so it's possible to add delay between requests when using censys engine to bypass rate limited , plus I think uncover doesn't randomize multiple tokens because I used one token and got 12K result then I got too many requests so I used multiple tokens and got the same result , I think if uncover randomize the multiple tokens we can bypass the rate limited
RATE-LIMIT:
-delay int delay in seconds between requests to the same host (default 1)
Took me some time to figure out why shodan module wasn't working... So I added API key 1 because I only have one key, but I did not delete - SHODAN_API_KEY_2
from provider-config.yaml
For some reason, uncover decided not to use the real key and just kept trying to use SHODAN_API_KEY_2
as a key. Once I removed
- SHODAN_API_KEY_2
everything started working fine.
root@m3An-MAcHIn3:/dsk# uncover -q 'nginx' -o test.txt
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/ v0.0.8
projectdiscovery.io
Use with caution. You are responsible for your actions
Developers assume no liability and are not responsible for any misuse or damage.
By using uncover, you also agree to the terms of the APIs used.
184.72.249.120:80
34.69.144.173:80
192.0.78.12:443
151.101.2.133:443
35.231.23.183:80
...
root@m3An-MAcHIn3:/dsk# cat test.txt | wc -l
0
Uncover is not writing results to file
The Provider Test action is failing with this error:
Invalid workflow file: .github/workflows/provider-integration.yml#L9
The workflow is not valid. .github/workflows/provider-integration.yml (Line: 9, Col: 5): Required property is missing: runs-on
Originally posted by blacklist-arcc March 7, 2022
It would be nice to have a list of ip addresses as input instead of queries in order to quickly identify open ports on specific targets from various engines instead of a port scan running by naabu for example. Maybe there is an option already using a specific search string e.g. ip:1.1.1.1
In this case a command line parameter "prepend" may be a smooth solution in order to prepend a specific string to every line that comes from std in order to get a pipeline like:
subfinder -d TARGET | dnsx -resp-only -a | uncover | httpx | nuclei -t cve
Hopefully I have not overseeing something :)
Cheers.
IP and CIDR (using mapcidr) input needs to be supported.
echo 51.83.59.99/24 | uncover
51.83.59.99:22
51.83.59.99:80
51.83.59.99:443
51.83.59.99:500
echo 51.83.59.99 | uncover -json
{
"timestamp":1648469130,
"source":"shodan-internetdb",
"ip":"5.9.248.1",
"ports":[
22,
80,
443,
500
],
"cpes":[
"cpe:/a:igor_sysoev:nginx",
"cpe:/a:openbsd:openssh:7.4"
],
"host":[
"www.sampleresponse.fr"
],
"tags":[
"vpn"
],
"vulns":[
"CVE-2017-15906"
]
}
As the default shodan
search API gets used, need to confirm if IP/CIDR input can be determined to use shodan-idb
instead, otherwise, engine name needs to be specified to use the new source.
Reference: https://internetdb.shodan.io
The current implementation of uncover in nuclei is not abstract and is affected by minor changes, as noted in this GitHub issue (link to the issue). This is already a breaking change and we need to design a minimalistic Uncover API that abstracts everything.
As talked with @tarunKoyalwar, we create a new API that encapsulates all uncover-related functionality and expose it via a simple and stable interface. This will make it easier for developers to use uncover in their projects without worrying about the underlying implementation details.
By doing so, we can avoid having to update nuclei every time we add or update uncover.
refs: https://github.com/projectdiscovery/tlsx/blob/main/pkg/tlsx/tlsx.go
There seems to be a bug in relation to the number of results which can be extracted by uncover. Without -l it is not 100 but 300. With -l being provided it is still limited to 500 max. Even if you set -l 5000 , it won't go beyond 500. Now, the actual Quake website allows to browse and download 10 000's of results.
root@m3An-MAcHIn3:/dsk# uncover -q 'nginx' -o test.txt -limit 10 | wc -l
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/ v0.0.8
projectdiscovery.io
Use with caution. You are responsible for your actions
Developers assume no liability and are not responsible for any misuse or damage.
By using uncover, you also agree to the terms of the APIs used.
100
root@m3An-MAcHIn3:/dsk# uncover -q 'nginx' -o test.txt -limit 150 | wc -l
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/ v0.0.8
projectdiscovery.io
Use with caution. You are responsible for your actions
Developers assume no liability and are not responsible for any misuse or damage.
By using uncover, you also agree to the terms of the APIs used.
200
root@m3An-MAcHIn3:/dsk# uncover -q 'nginx' -o test.txt -limit 210 | wc -l
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/ v0.0.8
projectdiscovery.io
Use with caution. You are responsible for your actions
Developers assume no liability and are not responsible for any misuse or damage.
By using uncover, you also agree to the terms of the APIs used.
300
The limit logic is not working properly, For eg in the above case Shodan responds with 100 results per api call, Currently if uncover's limit parameter is < 100
then uncover will make single api request which will output 100 results, if the limit parameter is between 100-200 uncover will send 2 requests and show 200 results and so on, The proper logic should be as follows :
-limit 50 => Make single request to shodan's endpoint, 100 results retrieved => split top 50 results => output
-limit 150 => Make 2 requests to shodan's endpoint, 200 results retrieved => split top 150 results => output
and so on.
v1.0.5 (latest)
When running the command 'uncover.exe -r -q "any query"' in the latest version (v1.0.5), I encounter a problem.
I expected the command to execute and provide the desired output.
I have noticed that the latest version (v1.0.5) don't produce any output with -j and -r flags
without -r or -j it works normally. but i need json for scripting.
uncover.exe -r -q element
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/
projectdiscovery.io
[INF] Current uncover version v1.0.5 (latest)
uncover.exe -j -q element
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/
projectdiscovery.io
[INF] Current uncover version v1.0.5 (latest)
with 1.0.3
uncover.exe -r -q element
__ ______ _________ _ _____ _____
/ / / / __ \/ ___/ __ \ | / / _ \/ ___/
/ /_/ / / / / /__/ /_/ / |/ / __/ /
\__,_/_/ /_/\___/\____/|___/\___/_/
projectdiscovery.io
[INF] Current uncover version v1.0.3 (outdated)
{"_shodan":{"crawler": .....
Add netlas
(https://netlas.io/) as search engine for uncover.
Add -ne
/-netlas
[]string to search for queries on netlas.
I have 70 queries in the file and nothing goes through.
The site responds with
[criminalip] unexpected status code 500 received from https://api.criminalip.io/v1/banner/search?offset=1&query=
Currently, there is no integration test for supported search engines/providers that can be implemented.
Integration test will be using ENV variable to read API information.
New search engine support:
API Document - https://www.zoomeye.org/doc
UPDATE:
-up, -update update uncover to latest version
-duc, -disable-update-check disable automatic uncover update check
Running from dev | main
./uncover -zoomeye 'title:"gogs"'
94.103.206.187:443
110.40.191.14:443
110.42.188.156:443
110.42.193.145:443
128.199.39.72:8443
92.242.45.237:443
119.45.254.3:443
202.164.44.246:3000
panic: interface conversion: interface {} is string, not float64
goroutine 20 [running]:
github.com/projectdiscovery/uncover/uncover/agent/zoomeye.(*Agent).query(0x0?, {0x100bafdde?, 0x0?}, 0x0?, 0x0?, 0x0?)
/Users/geekboy/Github/uncover/uncover/agent/zoomeye/zoomeye.go:104 +0x3c0
github.com/projectdiscovery/uncover/uncover/agent/zoomeye.(*Agent).Query.func1()
/Users/geekboy/Github/uncover/uncover/agent/zoomeye/zoomeye.go:51 +0xd0
created by github.com/projectdiscovery/uncover/uncover/agent/zoomeye.(*Agent).Query
/Users/geekboy/Github/uncover/uncover/agent/zoomeye/zoomeye.go:40 +0x134
Internal logic to resolve domain, use as input for internetdb, return all ports for all ips for that domain, ( projectdiscovery/naabu#293 )
echo google.com | uncover -json
{
"timestamp":1648469130,
"source":"shodan-internetdb",
"ip":[
"142.250.218.142",
"142.250.218.141"
],
"ports":[
80,
443
],
"cpes":[
"cpe:/a:igor_sysoev:nginx",
"cpe:/a:openbsd:openssh:7.4"
],
"host":[
"google.com"
],
"tags":[
""
],
"vulns":[
""
]
}
subfinder -d TARGET | uncover -json | jq '.host[]+":"+(.ports[]|tostring)' |httpx
main | dev
$HOME/.config/uncover
does not exist . fileutil.Unmarshal treats it as a string and unmarshal its which causes unmarshal errorno error
mv ~/.config/uncover ~/.config/uncoverold
$ nuclei
[ERR] failed to load provider keys got yaml: unmarshal errors:
line 1: cannot unmarshal !!str `/Users/...` into sources.Provider
__ _
____ __ _______/ /__ (_)
/ __ \/ / / / ___/ / _ \/ /
/ / / / /_/ / /__/ / __/ /
/_/ /_/\__,_/\___/_/\___/_/ v2.9.5
projectdiscovery.io
[WRN] Found 3 templates loaded with deprecated protocol syntax, update before v2.9.5 for continued support.
[INF] Current nuclei version: v2.9.5 (latest)
[INF] Current nuclei-templates version: v9.5.0 (latest)
[INF] New templates added in latest release: 62
[INF] Templates loaded for current scan: 5961
^C[INF] CTRL+C pressed: Exiting
^ this happens because we try to unmarshal string
Line 99 in f84b0a3
In the queries file for shodan I have about 100 similar requests. I can cram them all into a single query and shodan works (slowly) just fine but if brake them up into shorter queries, the module struggles:
As you can see, shodan returns 503 and 429.
# number of times to retry a failed request
retry: 10
^^^
I have edited the config file to try to address the issue but the edit seems to be irrelevant in this particular case. Basically, in order to extract all results I have to pack multiple requests into a single one.
Use utils.
Please add an option similar to nuclei for exporting results to elasticsearch.
=> uncover.exe -qk 'google.com' -v -config /provider-config.yaml
=> [�[33mquake�[0m] json: cannot unmarshal string into Go struct field Response.code of type int
api key is 100% correct and working
Current Version: v0.0.5
When I run echo org:"Uber" | uncover -e shodan
or
uncover -e shodan -q 'org:"Uber"'
It doesn't show any result. I have checked my shodan key.
It works on shodan.io, just enter org:"Uber" in search.
Where is the result?
A server timeout may result in Shodan returning no results for a query. There should be an argument -retries int
similar to httpx to retry the query if the response is unexpected and the default value set to 1.
CLI flag to add:
-retries int number of times to retry a failed request (default 1)
0.0.1
uncover -q 'ssl:"Sony Global"'
parsed as ssl:Sony+Global
uncover -q 'ssl:"Sony Global"'
parsed as ssl:"Sony+Global"
I can see the results in the terminal, however, the output is not saved and there's no output file at all.
Currently the Censys agent exclude all Virtual Hosts:
uncover/uncover/agent/censys/censys.go
Line 15 in b0993e2
I think those should be included or there should be an option to include them if needed.
This won't return any results:
echo 'name: "*.arvala7.space" or name: "*.kintan.space"' | uncover -e censys -v
but the same query on Censys with Virtual Hosts included will return 7 results.
if there is one token is give us error we can test to next token
[shodan] unexpected status code 401 received from https://api.shodan.io/shodan/host/search?key=xxxxxx07e7-4e3a-8bf7-f0e7b7e783bf&query=jira&page=1
there is error in this token so check next token
According to the uncover document, you can search for multiple dorks
My idea is to read multiple statements in the dork.txt file, which can be combined together, and one request can get the return results of all statements
dork.txt
ssl:"Uber Technologies, Inc."
title:"Grafana"
For example, all engines support || or
flag
fofa : ssl:"Uber Technologies, Inc." || title:"Grafana"
censys : ip="1.1.1.1" or ip="1.1.1.1"
1.0.1
/ # uncover -q 'cert="baidu" && (icon_hash="-1374555452" || icon_hash="1684500512")' -l 2000 -json -o /tmp/result.json -e fofa
/ # wc -l /tmp/result.json
91 /tmp/result.json
-l 2000
return little record, more fewer than 2000.
besides, the search result is bigger than 2000.
-l 2000
return 2000 result
/ # uncover -q 'cert="baidu" && (icon_hash="-1374555452" || icon_hash="1684500512")' -l 2000 -json -o /tmp/result.json -e fofa
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.