mobeigi / fb2cal Goto Github PK
View Code? Open in Web Editor NEWFetch Facebook Birthdays events and create an ICS file for use with calendar apps
Home Page: https://go.mobeigi.com/fb2cal
License: GNU General Public License v3.0
Fetch Facebook Birthdays events and create an ICS file for use with calendar apps
Home Page: https://go.mobeigi.com/fb2cal
License: GNU General Public License v3.0
If you have 2FA enabled on your Facebook account, you can't login
I was getting that domops error so I changed all www.facebook.com to web.facebook.com
I still cannot get it to work. It doesn't find any birthday on my list.
[2019-09-21 23:56:43,703] fb2cal INFO () Starting fb2cal v1.0.3 (Production) [https://git.io/fjMwr]
[2019-09-21 23:56:43,703] fb2cal INFO () This project is released under the GPLv3 license.
[2019-09-21 23:56:43,704] fb2cal INFO (main) Attemping to parse config file config.ini...
[2019-09-21 23:56:43,705] fb2cal INFO (main) Config successfully loaded.
[2019-09-21 23:56:43,706] fb2cal INFO (main) Logging level set to: INFO
[2019-09-21 23:56:43,706] fb2cal INFO (main) Attemping to authenticate with Facebook...
[2019-09-21 23:56:48,353] fb2cal INFO (main) Successfully authenticated with Facebook.
[2019-09-21 23:56:48,353] fb2cal INFO (main) Fetching all Birthdays via async endpoint...
[2019-09-21 23:56:48,355] fb2cal INFO (get_async_birthdays) Processing birthdays for month September.
[2019-09-21 23:56:51,013] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month September.
[2019-09-21 23:56:51,013] fb2cal INFO (get_async_birthdays) Processing birthdays for month October.
[2019-09-21 23:56:51,359] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month October.
[2019-09-21 23:56:51,360] fb2cal INFO (get_async_birthdays) Processing birthdays for month November.
[2019-09-21 23:56:51,665] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month November.
[2019-09-21 23:56:51,665] fb2cal INFO (get_async_birthdays) Processing birthdays for month December.
[2019-09-21 23:56:51,974] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month December.
[2019-09-21 23:56:51,975] fb2cal INFO (get_async_birthdays) Processing birthdays for month January.
[2019-09-21 23:56:52,296] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month January.
[2019-09-21 23:56:52,296] fb2cal INFO (get_async_birthdays) Processing birthdays for month February.
[2019-09-21 23:56:52,582] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month February.
[2019-09-21 23:56:52,582] fb2cal INFO (get_async_birthdays) Processing birthdays for month March.
[2019-09-21 23:56:52,902] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month March.
[2019-09-21 23:56:52,902] fb2cal INFO (get_async_birthdays) Processing birthdays for month April.
[2019-09-21 23:56:53,191] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month April.
[2019-09-21 23:56:53,192] fb2cal INFO (get_async_birthdays) Processing birthdays for month May.
[2019-09-21 23:56:53,509] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month May.
[2019-09-21 23:56:53,509] fb2cal INFO (get_async_birthdays) Processing birthdays for month June.
[2019-09-21 23:56:53,809] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month June.
[2019-09-21 23:56:53,809] fb2cal INFO (get_async_birthdays) Processing birthdays for month July.
[2019-09-21 23:56:54,120] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month July.
[2019-09-21 23:56:54,120] fb2cal INFO (get_async_birthdays) Processing birthdays for month August.
[2019-09-21 23:56:54,449] fb2cal INFO (get_async_birthdays) Found 0 birthdays for month August.
[2019-09-21 23:56:54,450] fb2cal WARNING (main) Birthday list is empty. Failed to fetch any birthdays.
Traceback (most recent call last):
File "src/fb2cal.py", line 813, in
File "src/fb2cal.py", line 120, in main
SystemError
In get_entity_id_from_vanity_name
I was frequently getting an empty list back in json_response['payload']['entries']
, so I inspected the json and noticed the lid
key. I tried using that when there weren't any 'entries'
, and everything worked like magic - something like:
if not json_response['payload']['entries']:
return json_response['lid']
Not sure if anyone else is having this issue, but thought I would post anyway.
Thanks so much for creating this!
Use a template file like config.template.ini
which is tracked.
Remove config.ini
as tracked file.
Right now config.ini
is tracked and thus any changes will be picked up by git.
I wasn't able to download the birthdays of the next week because them are written like "monday" and not like "day/month".
The workaround was to replace the 'weekday name' with 'day/month'.
My FB locale is italian so I replaced sabato (Saturday) with 10/8, domenica (Sunday) with 11/8 and so on.
I added the following dates at line 608, before parsed_date = datetime.strptime(birthday_date_str, locale_date_format_mapping[user_locale])
Here is the code, simple but working:
if birthday_date_str == 'sabato':
birthday_date_str = '10/8'
if birthday_date_str == 'domenica':
birthday_date_str = '11/8'
if birthday_date_str == 'lunedì':
birthday_date_str = '12/8'
if birthday_date_str == 'martedì':
birthday_date_str = '13/8'
if birthday_date_str == 'mercoledì':
birthday_date_str = '14/8'
if birthday_date_str == 'giovedì':
birthday_date_str = '15/8'
if birthday_date_str == 'venerdì':
birthday_date_str = '16/8'```
Is there any possibility of having an easier installation or some instructions for dummies? I'm already confused by step 1, but I'm assuming that this is only relevant for Linux users.
If a Facebook checkpoint is hit (security error, especially if logging in on new device) the script continues without any error being thrown and uploads an empty calendar file. An error should be thrown instead.
When the birthday date is the 29 of February the toll will fail with a fail to parse message
[2020-01-05 21:20:36,777] fb2cal ERROR (parse_birthday_day_month) Failed to parse birthday day/month. Parse failed with tooltip_content: " (2/29)", locale: "en_US". Day name "2/29" is not in the offset dict {'monday': 1, 'tuesday': 2, 'wednesday': 3, 'thursday': 4, 'friday': 5, 'saturday': 6, 'sunday': 7}
I'm no good with Python to help you out with this but take a look at
https://stackoverflow.com/questions/44327109/sorting-a-list-of-string-dates-with-no-year-but-with-29th-feb
Keep the good work!
Nice thing to show progress as script is running.
Also useful for those who want to output/append stdout to a log file every time they run the script.
I have this strange error: if I open google calendar on pc accented characters are displayed correctly, but in samsung calendar on my galaxy s8 I see "ò" instead of "ò".
How can I solve this issue?
Heya!
I live in Finland and our language doesn't really work well with any code or system unfortunately.
I got error message stating the following:
fb2cal ERROR (parse_birthday_day_month) Failed to parse birthday day/month. Parse failed with tooltip_content: "Firstname Lastname (torstai)", locale: "fi_FI". Day name "torstai" is not in the offset dict {'maanantaina': 1, 'tiistaina': 2, 'keskiviikkona': 3, 'torstaina': 4, 'perjantaina': 5, 'lauantaina': 6, 'sunnuntaina': 7}
Basically the ending "na" could be left out and I'd be happy.
Is there any way I can force certain locale like en_GB for the output file because it'd be OK for me to have those birthdays in English. Or do you have any other suggestions?
[2019-08-12 14:51:00,396] fb2cal INFO (main) Fetching all Birthdays via async endpoint...
[2019-08-12 14:51:04,866] fb2cal INFO (get_async_birthdays) Processing birthdays for month August.
[2019-08-12 14:51:07,053] fb2cal ERROR (parse_birthday_async_output) KeyError: 'domops'
Traceback (most recent call last):
File "./fb2cal.py", line 437, in parse_birthday_async_output
birthday_card_html = json_response['domops'][0][3]['__html']
KeyError: 'domops'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./fb2cal.py", line 770, in
main()
File "./fb2cal.py", line 111, in main
birthdays = get_async_birthdays(browser)
File "./fb2cal.py", line 395, in get_async_birthdays
birthdays_for_month = parse_birthday_async_output(browser, response.text)
File "./fb2cal.py", line 445, in parse_birthday_async_output
raise SystemError
SystemError
The 'about me' section of a user also shows the birthday in full format alongside the year:
Endpoint:
https://www.facebook.com/profile/async/infopage/nav/
This could potentially be used a faster approach.
However, you'd need to get a list of Facebook friends, iterate over them all, check the field.
Upon authorizing Google Drive API (first time), an exception is still thrown even if script continunes to execute with no issues till the end.
Example:
[Running] py -3 "c:\Users\mobeigi\Desktop\fb2cal\src\fb2cal.py"
C:\Python36\lib\site-packages\oauth2client\_helpers.py:255: UserWarning: Cannot access token.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Your browser has been opened to visit:
https://accounts.google.com/o/oauth2/auth?client_id=<REDACTED>
If your browser is on a different machine then exit and re-run this
application with the command-line parameter
--noauth_local_webserver
Authentication successful.
[Done] exited with code=0 in 170.441 seconds
First off thanks for the tool.
Second: I'm NOT a dev, nor anything like that. But can follow (easy and simple) steps.
Third: Working on a Mac.
Fourth: Did everything that was explained in the Readme file and ended up with the following upon starting step 6 (Run script manually once for testing purposes: python ....../src/fb2cal.py)
File "src/fb2cal.py", line 60
return f'{self.name} ({self.day}/{self.month})'
^
SyntaxError: invalid syntax
Did I do something wrong or is it just that Mac ain't supported? Want to create the file once only, not as a regular thing. Stopped Facebook-2FA for this procedure before starting with the first step.
Thanks for any help!
C:\Git\fb2cal\fb2cal\src>python ./fb2cal.py
C:\Users\Home\AppData\Local\Programs\Python\Python37\lib\site-packages\oauth2client_helpers.py:255: UserWarning: Cannot access token.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Traceback (most recent call last):
File "./fb2cal.py", line 386, in
main()
File "./fb2cal.py", line 72, in main
service = google_api_authenticate()
File "./fb2cal.py", line 151, in google_api_authenticate
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
File "C:\Users\Home\AppData\Local\Programs\Python\Python37\lib\site-packages\oauth2client_helpers.py", line 133, in positional_wrapper
return wrapped(*args, **kwargs)
File "C:\Users\Home\AppData\Local\Programs\Python\Python37\lib\site-packages\oauth2client\client.py", line 2135, in flow_from_clientsecrets
cache=cache)
File "C:\Users\Home\AppData\Local\Programs\Python\Python37\lib\site-packages\oauth2client\clientsecrets.py", line 165, in loadfile
return _loadfile(filename)
File "C:\Users\Home\AppData\Local\Programs\Python\Python37\lib\site-packages\oauth2client\clientsecrets.py", line 126, in _loadfile
return _validate_clientsecrets(obj)
File "C:\Users\Home\AppData\Local\Programs\Python\Python37\lib\site-packages\oauth2client\clientsecrets.py", line 101, in _validate_clientsecrets
prop_name, client_type))
oauth2client.clientsecrets.InvalidClientSecretsError: Missing property "redirect_uris" in a client type of "web".
At the end of going through all my friends (3k), no file is generated and this is the output. I attempted both storing the file to drive and to local with no success. Any ideas?
Traceback (most recent call last):
File "src/fb2cal.py", line 814, in <module>
File "src/fb2cal.py", line 117, in main
File "src/fb2cal.py", line 401, in get_async_birthdays
File "src/fb2cal.py", line 460, in parse_birthday_async_output
File "src/fb2cal.py", line 699, in get_entity_id_from_vanity_name
KeyError: 'vertical_type'
I think it may be because of too many requests. Is there a way to split up and do smaller batches perhaps?
Following link to get birthdays is not available anymore:
https://www.facebook.com/async/birthdays/?
ref code line: https://github.com/mobeigi/fb2cal/blob/master/src/fb2cal.py#L373
I have this error:
$ git clone [email protected]:mobeigi/fb2cal.git
Cloning into 'fb2cal'...
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
The names with differences to the letter "e" are not correctly displayed. So far I only noticed the following:
ę = ę Feręc becomes Feręc's
é = é Fréderique becomes Fréderique
ë = ë Zoë becomes Zoë
Script worked really well (on a Mac) when i ran it first time for my profile then tried running it again for my girlfriends.
Script ran rapidly through the first 6 months then suddenly slowed right down and displayed the following message for every name:
"fb2cal WARNING (get_entity_id_from_vanity_name) Falling back to getting entity id from profile page for vanity name example.name. This method is significantly slower."
Seems strange that it was fine for mine and also the first 6 months of hers?
Please make a manual password method available through the script for storagless password entry.
Alternatively you can use "pass" or Hashicorp Vault to store passwords, and have a key to unlock during operation.
Here is the error:
Jias-MBP:fb2cal-master jiawen$ python3 src/fb2cal.py
[2019-08-26 21:00:52,728] fb2cal INFO () Starting fb2cal v1.0.3 (Production) [https://git.io/fjMwr]
[2019-08-26 21:00:52,728] fb2cal INFO () This project is released under the GPLv3 license.
[2019-08-26 21:00:52,728] fb2cal INFO (main) Attemping to parse config file config.ini...
[2019-08-26 21:00:52,729] fb2cal INFO (main) Config successfully loaded.
[2019-08-26 21:00:52,729] fb2cal INFO (main) Logging level set to: INFO
[2019-08-26 21:00:52,729] fb2cal INFO (main) Authenticating with Google Drive API...
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauth2client/_helpers.py:255: UserWarning: Cannot access token.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Traceback (most recent call last):
File "src/fb2cal.py", line 813, in
main()
File "src/fb2cal.py", line 102, in main
service = google_drive_api_authenticate()
File "src/fb2cal.py", line 275, in google_drive_api_authenticate
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauth2client/_helpers.py", line 133, in positional_wrapper
return wrapped(*args, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauth2client/client.py", line 2135, in flow_from_clientsecrets
cache=cache)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauth2client/clientsecrets.py", line 165, in loadfile
return _loadfile(filename)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauth2client/clientsecrets.py", line 126, in _loadfile
return _validate_clientsecrets(obj)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/oauth2client/clientsecrets.py", line 101, in _validate_clientsecrets
prop_name, client_type))
oauth2client.clientsecrets.InvalidClientSecretsError: Missing property "redirect_uris" in a client type of "web".
At this point of the setup process - https://youtu.be/UnsbV8EJ8-Y?t=259
I get the following error -
File "src/fb2cal.py", line 73
CONFIG_FILE_PATH = f'../config/{CONFIG_FILE_NAME}'
^
SyntaxError: invalid syntax
Using Python 3.7.3, requirements.txt modules installed. On V1.0.3 - Point Release of the repo.
Has anyone faced this issue?
Upon authenticating, one user got this Facebook error:
Cookies are disabled in your browser. Enable cookies in the browser settings to continue.
Will add further details soon.
Add a fall back method: scraping a users profile page directly in get_entity_id_from_vanity_name
if we fail to use composer query search.
Which is probably what tools like this do: https://findmyfbid.com/
So far I haven't run into a case where current solution fails though.
Hi.
I was struggling to make it work, getting Failed to authenticate with Facebook with email ***@gmail.com. Please check provided email/password
. Re-checked the credentials multiple times and found out what's going on only after printing the password to a console.
I have the following symbols in my password – %%
, which were recognized as %
by the script. After changing it in the config to %%%%
I was able to proceed. Not sure if this is the case with other special characters, but that's how it is with percent one.
I had renamed the config file, yet getting this error
[2019-08-19 13:30:32,196] fb2cal INFO () Starting fb2cal v1.0.2 (Production) [https://git.io/fjMwr]
[2019-08-19 13:30:32,198] fb2cal INFO () This project is released under the GPLv3 license.
[2019-08-19 13:30:32,199] fb2cal INFO (main) Attemping to parse config file config.ini...
[2019-08-19 13:30:32,205] fb2cal ERROR (main) ../config/config.ini does not exist. Please rename config-template.ini if you have not done so already.
[2019-08-19 13:30:32,206] fb2cal CRITICAL () Critical error encountered. Terminating.
Hey, first of all thank you for your script. It would be nice to have the year of birth as well (if provided by user).
I myself would love a CSV output like
userid,username,birthdate,year_of_birth rather than a ics file which outdates the next year, but thats just me.
Script runs successfully, authentication flow completes.
But no ics file is created, "Failed to authenticate with Facebook. Please check provided email/password"
Had 2FA on, but turned it off. Same error occurs. Triple checked login info, and login info is correct.
Example run with account with 581 friends (but only processing 386 with linked Facebook birthday).
[Running] python3 -u "F:\Google Drive\Git\Github\mobeigi\fb2cal\src\fb2cal.py"
[Done] exited with code=0 in 158.374 second
Need to profile script and make improvements.
Unfortunately need to make request per friend which seems to be the bulk of the processing time.
Instead throw a nicer error message.
C:\Python36\lib\site-packages\oauth2client\_helpers.py:255: UserWarning: Cannot access token.json: No such file or directory
warnings.warn(_MISSING_FILE_MESSAGE.format(filename))
Traceback (most recent call last):
File "C:\Python36\lib\site-packages\oauth2client\clientsecrets.py", line 121, in _loadfile
with open(filename, 'r') as fp:
FileNotFoundError: [Errno 2] No such file or directory: 'credentials.json'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "c:\Users\mobeigi\Desktop\fb2cal\src\fb2cal.py", line 362, in <module>
main()
File "c:\Users\mobeigi\Desktop\fb2cal\src\fb2cal.py", line 53, in main
service = google_api_authenticate()
File "c:\Users\mobeigi\Desktop\fb2cal\src\fb2cal.py", line 127, in google_api_authenticate
flow = client.flow_from_clientsecrets('credentials.json', SCOPES)
File "C:\Python36\lib\site-packages\oauth2client\_helpers.py", line 133, in positional_wrapper
return wrapped(*args, **kwargs)
File "C:\Python36\lib\site-packages\oauth2client\client.py", line 2135, in flow_from_clientsecrets
cache=cache)
File "C:\Python36\lib\site-packages\oauth2client\clientsecrets.py", line 165, in loadfile
return _loadfile(filename)
File "C:\Python36\lib\site-packages\oauth2client\clientsecrets.py", line 125, in _loadfile
exc.strerror, exc.errno)
oauth2client.clientsecrets.InvalidClientSecretsError: ('Error opening file', 'credentials.json', 'No such file or directory', 2)
I was trying to use the script but it's failing because of the error -
ValueError: month must be in 1..12
I added a line to print birthday.month and birthday.day. The birthday month is being parsed as 13 and day as 7.
Going into that user's about page the Birthday shows as 13 July 1996.
I am from India and we use DD/MM format for dates.
If any other is info is required please let me know.
For those that do not want to upload to the cloud, provide alternative of dumping ics to local file disk.
PS C:\Users\jonic\Desktop\fb2cal-master_1.0.2\fb2cal-master\src> python .\fb2cal.py
[2019-08-02 19:45:27,926] fb2cal INFO () Starting fb2cal v1.0.2 (Production) [https://git.io/fjMwr]
[2019-08-02 19:45:27,926] fb2cal INFO () This project is released under the GPLv3 license.
[2019-08-02 19:45:27,926] fb2cal INFO (main) Attemping to parse config file config.ini...
[2019-08-02 19:45:27,927] fb2cal INFO (main) Config successfully loaded.
Traceback (most recent call last):
File ".\fb2cal.py", line 732, in
main()
File ".\fb2cal.py", line 82, in main
logger.setLevel(getattr(logging, config['LOGGING']['level']))
File "C:\Users\jonic\AppData\Local\Programs\Python\Python37\lib\configparser.py", line 958, in getitem
raise KeyError(key)
KeyError: 'LOGGING'
Should make note about Facebook password reseting in FAQ so people do not have their password unexpectedly reset.
After successfully processing (All months):
get the following error:
Traceback (most recent call last):
File "SRC./fb2cal.py", line 813, in
File "SRC./fb2cal.py", line 126, in main
File "SRC./fb2cal.py", line 782, in populate_birthdays_calendar
AttributeError: 'Calendar' object has no attribute '_unused'
No ICS file is created. (Tried creating both local files as well as google drive)
Not sure whats going on! Can someone help?
Was following the youtube video for windows ( thanks for doing that btw ) . but i'm getting this issue.
File "src/fb2cal.py", line 812, in
File "src/fb2cal.py", line 110, in main
File "C:\Users\chris\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 1252, in getitem
return self._parser.get(self._name, key)
File "C:\Users\chris\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 799, in get
d)
File "C:\Users\chris\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 394, in before_get
self._interpolate_some(parser, option, L, value, section, defaults, 1)
File "C:\Users\chris\AppData\Local\Programs\Python\Python37-32\lib\configparser.py", line 444, in _interpolate_some
"found: %r" % (rest,))
configparser.InterpolationSyntaxError: '%' must be followed by '%' or '(', found: '%****'
config file setup, google drive setup and all requirements downloaded.
When I run the .py file I get this error:
python ./fb2cal.py
File "./fb2cal.py", line 51
return f'{self.name} ({self.day}/{self.month})'
^
SyntaxError: invalid syntax
fb2cal INFO (main) Creating birthday ICS file...
Traceback (most recent call last):
File "fb2cal.py", line 813, in
main()
File "fb2cal.py", line 126, in main
c = populate_birthdays_calendar(birthdays)
File "fb2cal.py", line 782, in populate_birthdays_calendar
c._unused.append(ics.parse.ContentLine(name='X-WR-CALNAME', params={}, value='Facebook Birthdays (fb2cal)'))
AttributeError: 'Calendar' object has no attribute '_unused'
See #11 for context.
The following locales need parsing support:
When I run the application and have people who's names contain Cyrillic letters, the following data gets saved in the .ics
file
SUMMARY:Н\;и\;н\;а\; П\;е\;т\;р\;о\;в\;а\;'s Birthday
And the same text is displayed later on in the actual calendar.
Shouldn't the saved names be encoded in UTF-8
?
PS: Thanks for this product very, very much 😄
See context in #22.
Well, looks like the character ï
in a facebook name make it crash without any warning or crash logs
Originally posted by @MayeulChassagnard in #22 (comment)
A lot of non-dev users have trouble setting this script up.
For such people, a one-click solution would be ideal.
Rough outline of what tool would do:
Birthdays don't change that often, so why is it recommended in the documentation, in bold, to run the script every 24 hours?
Are there any plans for adding support for past and future Facebook events? I can export future events but not any events from the past - would be a neat feature!
See #11 for context.
All non-English locales need day name translations to properly work out the close/relative dates.
Possible approaches:
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.