Coder Social home page Coder Social logo

sns-sdks / python-facebook Goto Github PK

View Code? Open in Web Editor NEW
325.0 10.0 85.0 1.68 MB

A simple Python wrapper for facebook graph api :sparkles: :cake: :sparkles: .

Home Page: https://sns-sdks.github.io/python-facebook/

Python 99.73% Makefile 0.27%
python facebook-graph-api facebook-sdk instagram-api instagram-sdk facebook-api

python-facebook's Introduction

Python Facebook

A Python wrapper for the Facebook & Instagram Graph APIs.

Build Status Documentation Status Codecov PyPI

Introduction

We have refactored this library after v0.10.0. If you want to use the old version, please, see branch v0.

The new structure is as follows

docs/docs/images/structure.png

Note

This new structure may still change.

Now, you can use base class GraphAPI to get data.

Installing

You can install this library from pypi:

pip install --upgrade python-facebook-api

Note

If you want to use an old version, you can set the version to 0.9.*, which also supports Python 2.7.

Usage

GraphAPI

You can use the GraphAPI class to communicate with the Facebook Graph API.

You can initialize a GraphAPI object with three different methods, depending on your needs.

  1. If you already have an access token, you can initialize it with

    >>> from pyfacebook import GraphAPI
    >>> api = GraphAPI(access_token="token")
    
  2. If you need to generate an app token automatically using the app/client ID and secret, you can do

    >>> from pyfacebook import GraphAPI
    >>> api = GraphAPI(app_id="id", app_secret="secret", application_only_auth=True)
    
  3. If you want to perform the authorization process for a user, you can do

    >>> from pyfacebook import GraphAPI
    >>> api = GraphAPI(app_id="id", app_secret="secret", oauth_flow=True)
    >>> api.get_authorization_url()
    # ('https://www.facebook.com/dialog/oauth?response_type=code&client_id=id&redirect_uri=https%3A%2F%2Flocalhost%2F&scope=public_profile&state=PyFacebook', 'PyFacebook')
    # let user to do oauth at the browser opened by link.
    # then get the response url
    >>> api.exchange_user_access_token(response="url redirected")
    # Now the api will get the user access token.
    

For more info about the different access tokens, see https://developers.facebook.com/docs/facebook-login/guides/access-tokens.

Once you have the user access token, you can get the Facebook data. For example,

>>> api.get_object(object_id="20531316728")
>>> {'name': 'Facebook App', 'id': '20531316728'}

See the code for more operations.

FacebookAPI

To get the user data:

>>> fb.user.get_info(user_id="413140042878187")
>>> User(id='413140042878187', name='Kun Liu')

To get the page data:

>>> fb.page.get_info(page_id="20531316728")
>>> Page(id='20531316728', name='Facebook App')

For more info, please, see the code or the docs.

Features

The library has the following features.

Facebook Graph API:

  • Application and Application's edges
  • Page and Page's edges
  • User and User's edges
  • Group and Group's edges
  • Event and Event's edges
  • Server-Sent Events

IG Business Graph API:

  • User and User's edges
  • Media and Media's edges

IG Basic Display API:

  • User and User's edges
  • Media and Media's edges

SUPPORT

python-facebook-api has been developed with Pycharm under the free JetBrains Open Source license(s) granted by JetBrains s.r.o., hence I would like to express my thanks here.

Jetbrains

python-facebook's People

Contributors

jbarno avatar merleliukun avatar mikeysan avatar nbro10 avatar osikun avatar pietzschke avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python-facebook's Issues

get_user_insights method for the metrics with "lifetime" period dose not work properly

The get_user_insights method leads to error for the metrics with "lifetime" period, while the same code for period="day" and metrics=["follower_count","impressions"] works properly.

res = api.get_user_insights(
user_id=api.instagram_business_id,
period="lifetime",
metrics=["audience_gender_age", "audience_city", "online_followers"], #"audience_gender_age", "audience_city", "online_followers"
since=1612422000,
until=1612508400,
access_token=api._access_token
)

error:
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\pyfacebook\api\instagram.py", line 926, in get_user_insights
return [IgProInsight.new_from_json_dict(item) for item in data["data"]]
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\pyfacebook\api\instagram.py", line 926, in
return [IgProInsight.new_from_json_dict(item) for item in data["data"]]
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\pyfacebook\models\base.py", line 22, in new_from_json_dict
instance = cattr.structure(data, cls)
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\cattr\converters.py", line 201, in structure
return self.structure_func.dispatch(cl)(obj, cl)
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\cattr\converters.py", line 326, in structure_attrs_fromdict
return cl(**conv_obj) # type: ignore
File "", line 8, in init
self.attrs_post_init()
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\pyfacebook\models\ig_pro_models.py", line 186, in attrs_post_init
self.values = [IgProInsightValue.new_from_json_dict(item) for item in values]
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\pyfacebook\models\ig_pro_models.py", line 186, in
self.values = [IgProInsightValue.new_from_json_dict(item) for item in values]
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\pyfacebook\models\base.py", line 22, in new_from_json_dict
instance = cattr.structure(data, cls)
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\cattr\converters.py", line 201, in structure
return self.structure_func.dispatch(cl)(obj, cl)
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\cattr\converters.py", line 323, in structure_attrs_fromdict
dispatch(type
)(val, type
) if type_ is not None else val
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\cattr\converters.py", line 396, in _structure_union
return self._structure_func.dispatch(other)(obj, other)
File "C:\Users\ASUS-PC\AppData\Local\Programs\Python\Python37\lib\site-packages\cattr\converters.py", line 277, in _structure_call
return cl(obj)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'dict'

Cant acces public page content with Api.get_pages_post()

i m trying to run the example provided ,
i got this error
pyfacebook.error.PyFacebookException: FacebookException(code=10,type=OAuthException,message=(#10) This endpoint requires the 'pages_read_engagement' permission or the 'Page Public Content Access' feature. Refer to https://developers.facebook.com/docs/apps/review/login-permissions#manage-pages and https://developers.facebook.com/
docs/apps/review/feature#reference-PAGES_ACCESS for details.)

Doesn't work with "responses" v0.12.1

Hey there,

When I try to use the lib with the latest 0.12.1 responses I get

Cannot install -r /tmp/requirements.txt and responses==0.12.1 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested responses==0.12.1
    python-facebook-api 0.8.0 depends on responses<0.12.0 and >=0.11.0

Please fix.

OAuth flow

Oauth flow need independent from api instance.

get post mentioning @username? get content of comments?

HI, Thanks for your updating. Your API helps me a lot!
I have two more questions to confirm:
(1) Is it possible for me to get all medias mentioning an IG account @username?
(2) through business discovery, I can get the metadata of all of a posted user's media. For each media, can I get the textual content of each comment?

My gut feeling is that I cannot get the above two, due to the access token authorization. But I want to confirm with you, because you're very familiar with it. thanks:)

Errors find when calling `discovery_user_medias`

HI, when I run the following codes to get all the posts by user @Dior,
api = IgProApi(APP_ID, SECRET, long_term_token=LONG_TERM_TOKEN, instagram_business_id=INSTAGRAM_BUSINESS_ID, sleep_on_rate_limit=True) api.discovery_user_medias(username='dior', since_time=None, count=None, limit=500)

Then I found the following errors:
Traceback (most recent call last):
File "/Users/xshuai/Documents/Projects/wissee_dev_old/projects/alba_capital/instagram_analysis/ig_api_extraction.py", line 35, in
media = api.discovery_user_medias(username=query, since_time=None, count=None, limit=500)
File "/usr/local/lib/python3.7/site-packages/pyfacebook/api/instagram.py", line 151, in discovery_user_medias
business_discovery=True
File "/usr/local/lib/python3.7/site-packages/pyfacebook/api/instagram.py", line 231, in paged_by_cursor
data = self._parse_response(resp)
File "/usr/local/lib/python3.7/site-packages/pyfacebook/api/base.py", line 216, in _parse_response
self._check_graph_error(data)
File "/usr/local/lib/python3.7/site-packages/pyfacebook/api/base.py", line 230, in _check_graph_error
raise PyFacebookException(error_data)
pyfacebook.error.PyFacebookException: FacebookException(code=1,type=None,message=Please reduce the amount of data you're asking for, then retry your request)

Could you please take a look at the problematic codes? thanks!

Doesn't work on python 3.9

So recommend to use the latest version of Python 3.

Hey!
The latest version is 3.9, but the lib doesn't work on it.
When I import Api I get the following

    from pyfacebook import Api
/usr/local/lib/python3.9/site-packages/pyfacebook/__init__.py:5: in <module>
    from .api import *  # noqa
/usr/local/lib/python3.9/site-packages/pyfacebook/api/__init__.py:1: in <module>
    from .base import BaseApi
/usr/local/lib/python3.9/site-packages/pyfacebook/api/base.py:18: in <module>
    from pyfacebook.models import AccessToken, AuthAccessToken
/usr/local/lib/python3.9/site-packages/pyfacebook/models/__init__.py:1: in <module>
    from .access_token import AccessToken, AuthAccessToken
/usr/local/lib/python3.9/site-packages/pyfacebook/models/access_token.py:7: in <module>
    from .base import BaseModel
/usr/local/lib/python3.9/site-packages/pyfacebook/models/base.py:6: in <module>
    import cattr
/usr/local/lib/python3.9/site-packages/cattr/__init__.py:2: in <module>
    from .converters import Converter, UnstructureStrategy
/usr/local/lib/python3.9/site-packages/cattr/converters.py:15: in <module>
    from ._compat import (
/usr/local/lib/python3.9/site-packages/cattr/_compat.py:87: in <module>
    from typing import _Union
E   ImportError: cannot import name '_Union' from 'typing' (/usr/local/lib/python3.9/typing.py)

Is there a way to fix this?

Thanks!

Do you mind if I make some grammatical corections

Hey, sorry I hit [enter] not knowing I would open the event before I finished typing. I have only just discovered your very awesome work in bringing us a Facebook API. I am currently reading through the readme file to learn how to use the API and have noticed a few typos that could use some correcting to help make reading easier.

Please let me know if this is okay, and I will proceed.

ps. I don't care about hacktoberfest, I just want to give back 😄

Inconsistent Fields being set for API requests

I have noticed when using IgProApi, I am receiving different data on subsequent API requests. Usually this results in timestamps, media_urls, or media_types missing. In looking at the API calls being made, I can see that the fields being set are different every time I run the same script. Here's a minimal example:

from pyfacebook import IgProApi
access_token = XXXXXXXX
account_id = 12345
api = IgProApi(
    long_term_token = access_token,
    debug_http=True,
    instagram_business_id=account_id
)
posts = api.discovery_user_medias(
    username='sandradewi88', 
    limit=1,
    count=1
)

This should be using the default fields but running the same script 3 times, the fields are completely different:

/v8.0/12345?fields=business_discovery.username(sandradewi88){media.limit(1){media_type,comments_count,username,media_url,children{media_type,timestamp,permalink,id},id,caption,like_count}}
/v8.0/12345?fields=business_discovery.username(sandradewi88){media.limit(1){like_count,timestamp,media_url,caption,permalink,children{timestamp,id,username,media_type,permalink},comments_count}}
/v8.0/12345?fields=business_discovery.username(sandradewi88){media.limit(1){caption,children{permalink,username,timestamp,media_type,media_url,id},comments_count,like_count,permalink,id}}

The default INSTAGRAM_MEDIA_PUBLIC_FIELD set looks correct and should contain the following fields:

{'media_url', 'media_type', 'username', 'children{media_type,username,permalink,media_url,timestamp,id}', 'comments_count', 'permalink', 'caption', 'like_count', 'timestamp', 'id'}

So I assume that in the enf_comma_separated function, the fields are being omitted, and that the timestamp, media_type, or media_url in the "children" section is causing the function to deduplicate the fields for the parent post, or vice-versa.

enf_comma_separated should handle the case of the children fields being the same as the parent fields and not strip those from the field list.

No data in insights

Request:
api.get_user_insights(user_id=api.instagram_business_id, period="day", metrics=["impressions", "reach"])

Expected Result:
[IgProInsight(name='impressions', period='day', values=[IgProInsightValue(value=1038, end_time='2020-01-08T08:00:00+0000'), IgProInsightValue(value=136, end_time='2020-01-09T08:00:00+0000')]),
IgProInsight(name='reach', period='day', values=[IgProInsightValue(value=751, end_time='2020-01-08T08:00:00+0000'), IgProInsightValue(value=54, end_time='2020-01-09T08:00:00+0000')])]

Real result:
[IgProInsight(name='impressions', period='day'), IgProInsight(name='reach', period='day')] without any value

pyfacebook.error.PyFacebookException issue

Hi! I'm now heavily using your API. Everything looks good except that when I use
api.discovery_user_medias(...) I often come across the following errors:

pyfacebook.error.PyFacebookException: FacebookException(code=1,type=None,message=Please reduce the amount of data you're asking for, then retry your request)
I believe it does no exceed the request limit....

Do you ever seen the above error before?

How to get pages_read_engagement authorization?

In order to get public pages info, we need pages_read_engagement authorization. Do you have advice on how to get it? Facebook review process assumes I'm using the app to some user interaction, but I just want to get and analyze some public page data. Any idea how?

Question: is there a function to fetch a user's pages, from the User Accounts Endpoint.

Please correct me if I am just not seeing this in the code. But are there functions that call this functionality User Accounts (https://developers.facebook.com/docs/graph-api/reference/user/accounts/) .

Context: I have a user for whom I have the user-access-token and would like to only read data from pages that this user owns. I believe I would need to call this endpoint to retrieve those pages. So I would like to know if I have overlooked something and this functionality already exists in this library before going and implementing this myself.

ExtApi

Running ExtApi example produces this error
ValueError: Only unions of attr classes supported currently. Register a loads hook manually.

Return generators instead of lists

Hi, i'm proposing a change for methods that return lists of results as I 've just used get_page_published_posts for a long period search and realized that the method took quite a long time to return, as it fetches all data in one shot instead of returning results lazily on demand.
would you consider doing that kind of change to the library?

IgProApi cannot be imported?

I tried to use:
from pyfacebook.api.instagram import IgProApi
Traceback (most recent call last):
File "<pyshell#0>", line 1, in
from pyfacebook.api.instagram import IgProApi
ImportError: cannot import name 'IgProApi' from 'pyfacebook.api.instagram' (/usr/local/lib/python3.7/site-packages/pyfacebook/api/instagram.py)

In addition, hope you can add more instagraph API functionalities soon! like insights, mentions, tag search, etc..

Note: The order of the set is unreliable.

what that means i copy the code from the example

"""
This show how to get facebook page public posts.
"""

import json

from pyfacebook import Api

Use version 5+, Call API need app secret proof. So need provide your app secret.

If not have, you can just use version 4.0.

APP_ID = "Your APP ID"
APP_SECRET = "Your APP SECRET"

ACCESS_TOKEN = "Your Access Token"

def get_posts(page_username):
api = Api(
app_id=APP_ID,
app_secret=APP_SECRET,
long_term_token=ACCESS_TOKEN,
)
data = api.get_page_posts(
page_id=page_username,
since_time="2020-05-01",
count=None,
limit=100,
return_json=True,
)
return data

def processor():
page_username = "WHO"
data = get_posts(page_username)
with open("wto_posts.json", 'w') as f:
json.dump(data, f)

if name == "main":
processor()

IgBasicApi.get_user_info() fails in __init__ of RateLimiting attr object.

Traceback (most recent call last):                                                                                                                            
  File "embed.py", line 18, in <module>                                                                                                                       
    fire.Fire()                                                                                                                                               
  File "/mnt/src/shirlywhirlmd/python/venv/lib/python3.6/site-packages/fire/core.py", line 138, in Fire                                                       
    component_trace = _Fire(component, args, parsed_flag_args, context, name)                                                                                 
  File "/mnt/src/shirlywhirlmd/python/venv/lib/python3.6/site-packages/fire/core.py", line 468, in _Fire                                                      
    target=component.__name__)                                                                                                                                
  File "/mnt/src/shirlywhirlmd/python/venv/lib/python3.6/site-packages/fire/core.py", line 672, in _CallAndUpdateTrace                                        
    component = fn(*varargs, **kwargs)                                                                                                                        
  File "embed.py", line 14, in user                                                                                                                           
    print(api.get_user_info())                                                                                                                                
  File "/mnt/src/shirlywhirlmd/python/venv/lib/python3.6/site-packages/pyfacebook/api/instagram_basic.py", line 147, in get_user_info                         
    args=args                                                                                                                                                 
  File "/mnt/src/shirlywhirlmd/python/venv/lib/python3.6/site-packages/pyfacebook/api/base.py", line 207, in _request                                         
    self.rate_limit.set_limit(headers)                                                                                                                        
  File "/mnt/src/shirlywhirlmd/python/venv/lib/python3.6/site-packages/pyfacebook/ratelimit.py", line 113, in set_limit                                       
    self.resources["app"] = RateLimitData(**app_usage)                                                                                                        
TypeError: __init__() got an unexpected keyword argument 'call_volume'   

Fixed locally by adding call_volume and cpu_time with defaults of 0 to the RateLimitData.

pyfacebook.error.PyFacebookException: FacebookException(code=100,type=GraphMethodException,message=Invalid appsecret_proof provided in the API argument)

i m trying to run the example provided ,
i got this error
pyfacebook.error.PyFacebookException: FacebookException(code=100,type=GraphMethodException,message=Invalid appsecret_proof provided in the API argument)

for the app id, i gave my facebook id
for the secret, my fb password
and for the token , the access token that i generated from facebook graph devellopers
code

error

Error when using the function api.get_media_info: pyfacebook.error.PyFacebookException: FacebookException

Hi guys,

I'm having trouble collecting post information. According to Instagram Reference Page of IG Media I already meet all requirements (I think). However, I cannot collect the information using a valid post id, and also using a user token with the instagram_basic, pages_read_engagement, pages_show_list permissions and the Instagram Puclic Content Access feature. All have already gone through the app review. Even so, using the function api.get_media_info I get the following error message: pyfacebook.error.PyFacebookException: FacebookException (code = 100, type = GraphMethodException, message = Unsupported get request. Object with ID '...' does not exist, cannot be loaded due to missing permissions, or does not support this operation. Please read the Graph API documentation at https://developers.facebook.com/docs/graph-api)

Thanks!

Here is an image of the debugged access token:
Sem título

Unable to access public page content

page_info = self.api.get_page_info(page_id='20531316728')

On trying to access the page info like above I am getting error as below,

pyfacebook.error.PyFacebookError: {'message': '(#100) Pages Public Content Access requires either app secret proof or an app token', 'type': 'OAuthException', 'code': 100, 'fbtrace_id': 'ACYiJkevpIouKlDsqNtSq-9'}

Groups and private groups

Dear,
I would like to know if your code permit to access to the groups and private groups that a user belong to and read the posts from it

Future. Can you add the support of LeadGen object.

Hello.
Can you add the support of LeadGen object.

Yes, request is simple, but create model of object is not succeeded.

def get_leads(self, lead_id: str):
        target = lead_id
        resp = self._request(
            method='GET',
            path='{0}/{1}'.format(self.version, target)
        )
        data = self._parse_response(resp.content.decode('utf-8'))
        return data

Do I need instagramAPI to use the Instagram parts of your library

Here's what happens when I try to install python-facebook and instagramAPI using poetry.

% poetry install
Creating virtualenv testingfb-api-mIQnEUP0-py3.8 in /Users/user1/Library/Caches/pypoetry/virtualenvs
Updating dependencies
Resolving dependencies... (0.9s)

  SolverProblemError

  Because no versions of python-facebook-api match >0.7.1,<0.8.0
   and python-facebook-api (0.7.1) depends on requests (>=2.24.0,<3.0.0), python-facebook-api (>=0.7.1,<0.8.0) requires requests (>=2.24.0,<3.0.0).
  And because instagramapi (1.0.2) depends on requests (2.11.1)
   and no versions of instagramapi match >1.0.2,<2.0.0, python-facebook-api (>=0.7.1,<0.8.0) is incompatible with InstagramAPI (>=1.0.2,<2.0.0).
  So, because testingfb-api depends on both InstagramAPI (^1.0.2) and python-facebook-api (^0.7.1), version solving failed.

  at ~/.poetry/lib/poetry/puzzle/solver.py:241 in _solve
      237│             packages = result.packages
      238│         except OverrideNeeded as e:
      239│             return self.solve_in_compatibility_mode(e.overrides, use_latest=use_latest)
      240│         except SolveFailure as e:
    → 241│             raise SolverProblemError(e)
      242│ 
      243│         results = dict(
      244│             depth_first_search(
      245│                 PackageNode(self._package, packages), aggregate_package_nodes

Unfortunately, it would appear that the instagramAPI project is no longer available on GitHub, so I cannot query them directly about it.

Update:

When I remove instagramapi from my list of dependencies python-facebook instals just fine, which is why I'm asking if I might need instagramAPI later.

% vim pyproject.toml 
% poetry install    
Updating dependencies
Resolving dependencies... (1.5s)

Writing lock file

Package operations: 12 installs, 0 updates, 0 removals

  • Installing certifi (2020.6.20)
  • Installing chardet (3.0.4)
  • Installing idna (2.10)
  • Installing urllib3 (1.25.11)
  • Installing attrs (20.2.0)
  • Installing oauthlib (3.1.0)
  • Installing requests (2.24.0)
  • Installing six (1.15.0)
  • Installing cattrs (1.0.0)
  • Installing requests-oauthlib (1.3.0)
  • Installing responses (0.11.0)
  • Installing python-facebook-api (0.7.1)

Any thoughts?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.