alfred82santa / whalesong Goto Github PK
View Code? Open in Web Editor NEWWhalesong is an asyncio python library to manage WebApps remotely. Currently WhatsappWeb is implemented
Home Page: https://whalesong.readthedocs.io
License: MIT License
Whalesong is an asyncio python library to manage WebApps remotely. Currently WhatsappWeb is implemented
Home Page: https://whalesong.readthedocs.io
License: MIT License
I have gone through the examples . The stream of whalesong is monitored for events . But what I want to know is that is it possible to get the current status of the driver in an async fashion ?
Hi all, I'm trying to run the minibot, but this is giving the following error
Would you help me
Version python 3.6.2
@alfred82santa
I used to be able to retrieve an auth QR code via the Firefox driver using qr() or screenshot_element("div[data-ref]") but that's no longer the case. I suspect WhatsApp changed their page layout and the CSS query selector "div[data-ref]" doesn't seem to work anymore.
Hi. I think some changes occurred in Whatsapp Web page, so the module wap
is not found. So, with this, the ChatManager will not be created.
With this you snippet from the WAPI, you can see that the module is not being found.
if (!window.Store) {
(function() {
function getStore(modules) {
let foundCount = 0;
let neededObjects = [
{ id: "WapQuery", conditions: (module) => (module.queryExist || module.getCapabilities) ? module : null }
];
for (let idx in modules) {
if ((typeof modules[idx] === "object") && (modules[idx] !== null)) {
let first = Object.values(modules[idx])[0];
if ((typeof first === "object") && (first.exports)) {
for (let idx2 in modules[idx]) {
let module = modules(idx2);
if (!module) {
continue;
}
neededObjects.forEach((needObj) => {
if(!needObj.conditions || needObj.foundedModule) return;
let neededModule = needObj.conditions(module);
if(neededModule !== null) {
console.log("FOUNDED!");
foundCount++;
needObj.foundedModule = neededModule;
}
});
if(foundCount == neededObjects.length) {
break;
}
}
}
}
}
}
webpackJsonp([], {'parasite': (x, y, z) => getStore(z)}, 'parasite');
})();
}
The workaround I can see, is to implement ChatManager without the wap module. Do you think this can work?
If you use actual location (mi ubicación actual in Spanish) all goes OK....BUT if you use "on real time" (en tiempo real) you get this..
year 49122572 is out of range
Traceback (most recent call last):
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/managers/message.py", line 101, in call
return cls.message_classes[t](data=data, *args, **kwargs)
KeyError: 'location'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/driver_firefox.py", line 149, in poll
await self.result_manager.set_partial_result(result['exId'], result['params'])
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/results.py", line 280, in set_partial_result
await cast(BasePartialResult, self._pendant[result_id]).set_partial_result(data)
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/results.py", line 115, in set_partial_result
await self._set_result(self.map(data))
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/results.py", line 47, in map
return self.fn_map(data)
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/managers/init.py", line 161, in
fn_map=lambda evt: cls.MODEL_MANAGER_CLASS.map_model(evt['item'])))
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/managers/init.py", line 93, in map_model
return cls.MODEL_CLASS(data)
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/managers/message.py", line 104, in call
return cls.message_classes[MessageTypes(t)](data=data, *args, **kwargs)
File "/home/ubuntu/.local/lib/python3.6/site-packages/whalesong/managers/message.py", line 90, in call
return super(MessageMetaclass, cls).call(data=data, *args, **kwargs)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/models.py", line 182, in init
self.import_data(data)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/models.py", line 301, in import_data
self._import_data(data)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/models.py", line 308, in _import_data
setattr(self, key, value)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/fields.py", line 116, in set
set_value(value)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/fields.py", line 112, in set_value
self.set_value(obj, self.use_value(v))
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/fields.py", line 58, in use_value
return self.convert_value(value)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/fields.py", line 152, in inner
return func(self, value)
File "/home/ubuntu/.local/lib/python3.6/site-packages/dirty_models/fields.py", line 567, in convert_value
return datetime.fromtimestamp(value, tz=self.default_timezone)
ValueError: year 49122572 is out of range
Found the error is over ""sequence = DateTimeField()"" on the 505 lines message.py file, buy as long I dont know what else afect this line I wont make upload the file.
Here is my test script
import asyncio
import os
import whalesong
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
PROFILE_PATH = os.path.join(BASE_DIR, 'test-profile')
driver: whalesong.Whalesong = whalesong.Whalesong(
profile=PROFILE_PATH,
loadstyles=True,
)
async def start():
await driver.start()
await driver.stop()
if __name__ == '__main__':
driver.loop.run_until_complete(start())
And here the exception
selenium.common.exceptions.InvalidSessionIdException: Message: Tried to run command without establishing a connection
I am trying to make a REST API for whalesong so that it can be put on the server. And I want to contribute to the examples. Can you suggest me an async web framework to get the work done ?
Can somebody post a small example on how I get the MessageInfoManager, the issue is to get the status of a message [delivery, read]
Reference: miyakogi/pyppeteer#160
It is possible to workaround using websockets 0.6.x.
hi there
is possible to use flask / tornado / bottle / django to implement an API with this library ?
thank you
Hey @alfred82santa awesome job with this framework, probably the must stable web whatsapp interface i found, i m already running a complete core based on the minibot, i just want to know how can i contribute to your testing and try to understand a bit more of the build it self to become a collaborator
We need users who ask for new features. We have to improve communication:
Is there a method to log out ?
ERROR in ./src/index.js
Module build failed (from ../node_modules/babel-loader/lib/index.js):
Error: Cannot find module '@babel/core'
babel-loader@8 requires Babel 7.x (the package '@babel/core'). If you'd like to use Babel 6.x ('babel-core'), you should install 'babel-loader@7'.
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (/home/srvws/whalesong/node_modules/v8-compile-cache/v8-compile-cache.js:159:20)
at Object. (/home/srvws/whalesong/node_modules/babel-loader/lib/index.js:10:11)
at Module._compile (/home/srvws/whalesong/node_modules/v8-compile-cache/v8-compile-cache.js:178:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (/home/srvws/whalesong/node_modules/v8-compile-cache/v8-compile-cache.js:159:20)
at loadLoader (/usr/lib/node_modules/webpack/node_modules/loader-runner/lib/loadLoader.js:18:17)
at iteratePitchingLoaders (/usr/lib/node_modules/webpack/node_modules/loader-runner/lib/LoaderRunner.js:169:2)
at runLoaders (/usr/lib/node_modules/webpack/node_modules/loader-runner/lib/LoaderRunner.js:365:2)
at NormalModule.doBuild (/usr/lib/node_modules/webpack/lib/NormalModule.js:280:3)
at NormalModule.build (/usr/lib/node_modules/webpack/lib/NormalModule.js:427:15)
at Compilation.buildModule (/usr/lib/node_modules/webpack/lib/Compilation.js:635:10)
at moduleFactory.create (/usr/lib/node_modules/webpack/lib/Compilation.js:1021:12)
at factory (/usr/lib/node_modules/webpack/lib/NormalModuleFactory.js:405:6)
at hooks.afterResolve.callAsync (/usr/lib/node_modules/webpack/lib/NormalModuleFactory.js:155:13)
at AsyncSeriesWaterfallHook.eval [as callAsync] (eval at create (/usr/lib/node_modules/webpack/node_modules/tapable/lib/HookCodeFactory.js:32:10), :6:1)
at AsyncSeriesWaterfallHook.lazyCompileHook (/usr/lib/node_modules/webpack/node_modules/tapable/lib/Hook.js:154:20)
at resolver (/usr/lib/node_modules/webpack/lib/NormalModuleFactory.js:138:29)
at process.nextTick (/usr/lib/node_modules/webpack/lib/NormalModuleFactory.js:342:9)
at _combinedTickCallback (internal/process/next_tick.js:131:7)
at process._tickCallback (internal/process/next_tick.js:180:9)
Is whalesong whatsapp can detect when someone new want to send message to you, whalesong able to send message to that person right away?
Is there any indication for this? Thanks. @alfred82santa
Hi, is there a way to get the quoted message object, instead of only the quoted_stanza_id, wich references the id of the quoted message. The thing I saw which maybe could affect is this property.
But turning the property to True, and executing the make commands again I only obtained the quoted message id.
Is there a way to get the full object body?
Suppose calling await driver.qr()
times out . How to refresh the qr code ? Is there an api to refresh the qr ?
#38 is required.
Hi. Is there a way to send a message to chat not present in the ChatCollection?
I've created a method that discover the Chat by it's phone number, based in a method from the mukulhase wrapper. But I was not able to add the found chat in the ChatCollection, or update the ChatCollection in some way.
So what I did was to discover the new chat and send the message at the same method, but again, the chat did not go to the ChatCollection and I did not like this method very much.
There is already a way to send message in this scenery where the chat is not initialized or could you give some help to implement this?
Yeah, this would go against with some spam ethics. :/
Congratulations, I'm really liking the lib,
Give me a little help, please.
I want to send an image
I'm doing the following
self._driver.chats [message.chat.id] .send_media ('/ home / profiles / archive / voucher.jpeg', caption = 'test')
but I think I'm wrong, what's the right way?
Ubuntu 14.04.5 LTS - Python 3.4.3 - pip3 18.0
pip3 install whalesong[firefox]
Collecting aiohttp>=3.0 (from whalesong[firefox])
Could not find a version that satisfies the requirement aiohttp>=3.0 (from whalesong[firefox]) (from versions: 0.1, 0.2, 0.3, 0.4, 0.4.1, 0.4.2, 0.4.3, 0.4.4, 0.5.0, 0.6.0, 0.6.1, 0.6.2, 0.6.3, 0.6.4, 0.6.5, 0.7.0, 0.7.1, 0.7.2, 0.7.3, 0.8.0, 0.8.1, 0.8.2, 0.8.3, 0.8.4, 0.9.0, 0.9.1, 0.9.2, 0.9.3, 0.10.0, 0.10.1, 0.10.2, 0.11.0, 0.12.0, 0.13.0, 0.13.1, 0.14.0, 0.14.1, 0.14.2, 0.14.3, 0.14.4, 0.15.0, 0.15.1, 0.15.2, 0.15.3, 0.16.0, 0.16.1, 0.16.2, 0.16.3, 0.16.4, 0.16.5, 0.16.6, 0.17.0, 0.17.1, 0.17.2, 0.17.3, 0.17.4, 0.18.0, 0.18.1, 0.18.2, 0.18.3, 0.18.4, 0.19.0, 0.20.0, 0.20.1, 0.20.2, 0.21.0, 0.21.1, 0.21.2, 0.21.4, 0.21.5, 0.21.6, 0.22.0a0, 0.22.0b0, 0.22.0b1, 0.22.0b2, 0.22.0b3, 0.22.0b4, 0.22.0b5, 0.22.0b6, 0.22.0, 0.22.1, 0.22.2, 0.22.3, 0.22.4, 0.22.5, 1.0.0, 1.0.1, 1.0.2, 1.0.3, 1.0.5, 1.1.0, 1.1.1, 1.1.2, 1.1.3, 1.1.4, 1.1.5, 1.1.6, 1.2.0, 1.3.0, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 2.0.0rc1, 2.0.0, 2.0.1, 2.0.2, 2.0.3, 2.0.4, 2.0.5, 2.0.6, 2.0.6.post1, 2.0.7, 2.1.0, 2.2.0, 2.2.1, 2.2.2, 2.2.3, 2.2.4, 2.2.5, 2.3.0a1, 2.3.0a2, 2.3.0a4, 2.3.0, 2.3.1a1, 2.3.1, 2.3.2b2, 2.3.2b3, 2.3.2, 2.3.3, 2.3.4, 2.3.5, 2.3.6, 2.3.7, 2.3.8, 2.3.9, 2.3.10)
No matching distribution found for aiohttp>=3.0 (from whalesong[firefox])
I was using the whalesong installing it with pip, but this was creating a lot of communicatino between other js modules I have running in my project. So, I want to ask if its ok to you if I create a simple Whalesong version (monitor messages and chats in the beginning), using
you js script working with puppeteer?
I'll create a repo and publish in npm for others to use it, if it's ok.
hi there
is possible to run with Remote Selenium ?
thanks
Hello
I don't understand how I can run one of example with "headless=True".
I am try start minibot.py in docker container, but output was empty.
Which the moment I can call method get_qr() and get him?
I would like to send a message to a person who has not yet talked, is it possible to perform this task with lib?
thank you very much.
When you send any file with audio mime type sending fails.
(Seems like the download function in the minibot example also cannot handle mp3 send.)
How about an send_audio function where the file gets sent like an voice recording?
How I can run two bots?
I try create two objects Minibot and start in one event loop, but I have error
0 info it worked if it ends with ok
1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'audit', 'fix' ]
2 info using [email protected]
3 info using [email protected]
4 verbose npm-session f7c3fce32977bd48
5 verbose stack Error: No package.json found: Cannot audit a project without a package.json
5 verbose stack at Bluebird.all.spread (/usr/local/lib/node_modules/npm/lib/audit.js:139:19)
5 verbose stack at tryCatcher (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/util.js:16:23)
5 verbose stack at Promise._settlePromiseFromHandler (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:509:35)
5 verbose stack at Promise._settlePromise (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:569:18)
5 verbose stack at Promise._settlePromise0 (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:614:10)
5 verbose stack at Promise._settlePromises (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:693:18)
5 verbose stack at Promise._fulfill (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:638:18)
5 verbose stack at PromiseArray._resolve (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise_array.js:126:19)
5 verbose stack at PromiseArray._promiseFulfilled (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise_array.js:144:14)
5 verbose stack at PromiseArray._iterate (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise_array.js:114:31)
5 verbose stack at PromiseArray.init [as _init] (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise_array.js:78:10)
5 verbose stack at Promise._settlePromise (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:566:21)
5 verbose stack at Promise._settlePromise0 (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:614:10)
5 verbose stack at Promise._settlePromises (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:693:18)
5 verbose stack at Promise._fulfill (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise.js:638:18)
5 verbose stack at PromiseArray._resolve (/usr/local/lib/node_modules/npm/node_modules/bluebird/js/release/promise_array.js:126:19)
6 verbose cwd /Users/marcelocecin/Downloads/whalesong-master
7 verbose Darwin 18.0.0
8 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "audit" "fix"
9 verbose node v8.9.1
10 verbose npm v6.1.0
11 error code EAUDITNOPJSON
12 error audit No package.json found: Cannot audit a project without a package.json
13 verbose exit [ 1, true ]
I have a few questions to ask .
1 . Is there a way to ensure that the contact id exists?
2. How to avoid sending to a non existent contact id ?
Hello, how I mark message is read?
How I can set permanent online status while driver work?
Thanks
We need more users who tests code, finds bugs and submits issues.
Hey!
I got a problem with execute the minibot.py :/
Hope you can help me :)
Versions:
Ubuntu 18.04 is the active os - I tested Debian 9 bevore
Geckodriver: v0.21.0
Selenium & Firefox: newest Version from setup.
Setup works without errors.
I get this error two times after I send python3 examples/minibot.py
Traceback (most recent call last): File "examples/minibot.py", line 125, in <module> bot.loop.run_until_complete(bot.start()) File "/usr/lib/python3.6/asyncio/base_events.py", line 468, in run_until_complete return future.result() File "examples/minibot.py", line 116, in start await self._driver.start() File "/bot/servo000/whalesong/__init__.py", line 43, in start await self._driver.start_driver() File "/bot/servo000/whalesong/driver.py", line 56, in start_driver await self._start_fut File "/bot/servo000/whalesong/driver.py", line 83, in start_driver self.driver = await self._start_fut File "/bot/servo000/whalesong/driver.py", line 52, in _run_async return await self.loop.run_in_executor(self._pool_executor, partial(method, *args, **kwargs)) File "/usr/lib/python3.6/concurrent/futures/thread.py", line 56, in run result = self.fn(*self.args, **self.kwargs) File "/bot/servo000/whalesong/driver.py", line 76, in start service_args=['--marionette-port', '2828']) File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/firefox/webdriver.py", line 170, in __init__ keep_alive=True) File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 156, in __init__ self.start_session(capabilities, browser_profile) File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 251, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py", line 320, in execute self.error_handler.check_response(response) File "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.SessionNotCreatedException: Message: Unable to find a matching set of capabilities
Thanks!
WhatsappWeb detect whether window/tab has focus. It has not focus reduce some transfers. One of theme is presence updates.
I tried to look for the piece of code which is monitoring window focus. But it is hide...
Hey, I actually just want to mess around with some of the functions you've build in the JS.
I've tried pasting the whole JS in the console of a running Whatsapp Web Session in Chrome and it did find the modules and everything but I couldn't find a variable where to access the Managers etc. Like, what is the root variable where you put everything that the python scripts can access then?
If it's too hard interacting with the JS that way, I'd be grateful if you could explain running the python code to me. I've googled a lot to even get it installed but running the init.py directly in the terminal gives me No module named '__main__.driver'; '__main__' is not a package
. Removing 'main.' as in making it only say driver
in the import statement works at least for this issue, but continuing this throughout the other files causes other issues.
I am using python3.7 on macOS
Thank you
EDIT: I personally have no need for it anymore, I was able to solve my issue without this API. Still, very good work, I am seriously amazed!
Is there an api exposed to send current location (not live location)?
Is there a way to wait for the driver status to be CONNECTED possibly with a timeout ?
Hi guys, I able to run minibot.py and use the whatsapp.
It just shows below words in python console.
Monitor new messages
How is those 3 features in minibot.py works? Thanks
Hi there! I've made a gateway to handle whatsapp web using your library to communicate with my server. Executing in my machine it work perfectly, but when I try to run inside a Docker image I've got this error, when I used the headless Firefox:
Traceback (most recent call last):
File "test.py", line 105, in <module>
monitor.loop.run_until_complete(monitor.start())
File "/usr/lib/python3.6/asyncio/base_events.py", line 468, in run_until_complete
return future.result()
File "test.py", line 89, in start
await self._driver.start()
File "/c/python/venv/lib/python3.6/site-packages/whalesong/__init__.py", line 45, in start
await self._driver.connect()
File "/c/python/venv/lib/python3.6/site-packages/whalesong/driver.py", line 91, in connect
await self.run_scriptlet()
File "/c/python/venv/lib/python3.6/site-packages/whalesong/driver.py", line 102, in run_scriptlet
self.driver.execute_script(script.read())
File "/usr/lib/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 69150: ordinal not in range(128)
I installed the library with:
pip install whalesong
The error above it's with the test statemonitor.py. My Dockerfile is:
FROM ubuntu
MAINTAINER Neppo "[email protected]"
USER root
ENV LC_ALL C
ENV DEBIAN_FRONTEND noninteractive
ENV DEBCONF_NONINTERACTIVE_SEEN true
# Update the sources list
RUN apt-get -y update
RUN apt-get install -y -q software-properties-common wget
RUN add-apt-repository -y ppa:mozillateam/firefox-next
RUN apt-get update -y
RUN apt-get install -y -q \
firefox \
openjdk-8-jre-headless \
xvfb \
xfonts-100dpi \
xfonts-75dpi \
xfonts-scalable \
xfonts-cyrillic
RUN rm -rf /var/lib/apt/lists/*
RUN firefox -CreateProfile "headless /moz-headless" -headless
# Update again
RUN apt-get -y update
# Install basic applications
RUN apt-get install -y tar vim nodejs git curl unzip npm nano wget dialog net-tools \
build-essential software-properties-common
# Install Firefox
RUN apt-get install -y firefox
# Install and setup Gecko
ENV GECKODRIVER_VERSION 0.21.0
RUN wget --no-verbose -O /tmp/geckodriver.tar.gz https://github.com/mozilla/geckodriver/releases/download/v$GECKODRIVER_VERSION/geckodriver-v$GECKODRIVER_VERSION-linux32.tar.gz \
&& rm -rf /opt/geckodriver \
&& tar -C /opt -zxf /tmp/geckodriver.tar.gz \
&& rm /tmp/geckodriver.tar.gz \
&& mv /opt/geckodriver /opt/geckodriver-$GECKODRIVER_VERSION \
&& chmod 755 /opt/geckodriver-$GECKODRIVER_VERSION \
&& ln -fs /opt/geckodriver-$GECKODRIVER_VERSION /usr/bin/geckodriver \
&& ln -fs /opt/geckodriver-$GECKODRIVER_VERSION /usr/bin/wires
# Install Python and Basic Python Tools
RUN apt-get install -y python3.6 python3-venv python3-pip
COPY . /c
WORKDIR /c
CMD sleep 3600;
With sleep the error occurred, but when I execute my code in Dockerfile CMD, looks like a loop, I don't get any error message, nothing.
A ubuntu image is used, with:
Mozilla Firefox 62.0
geckodriver 0.21.0
Python 3.6.5
Inside the Docker, a script install Selenium Standalone Server 2.44 and start it.
The geckodriver log did not throw any error also. The Firefox processes also starts, with:
/usr/lib/firefox/firefox -marionette -headless -profi...
/usr/lib/firefox/firefox -contentproc -childID 1 -isF ...
/usr/lib/firefox/firefox -contentproc -childID 2 -isF ...
Because of the Docker resolution I couldn't get the full description.
Thanks in advance!
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.