This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
This repository was archived by the owner on Jun 12, 2018. It is now read-only.

Latest commit

History

59 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

fbconsole

fbconsole is a small Facebook API client for use in Python scripts.

You can install fbconsole using pip:

pip install fbconsole

Quick Start Guide

Authentication

For many API calls, you will need to authenticate your script with Facebook. fbconsole makes this easy by providing an authenticate function. If your script needs extended permissions, such as the permission to post a status update, you can specify which extended permissions to request using the AUTH_SCOPE setting. For example:

import fbconsole
fbconsole.AUTH_SCOPE = ['publish_stream', 'publish_checkins']
fbconsole.authenticate()

You can find a list of permissions in the Facebook Login Permissions reference.

During the authentication process, a browser window will be opened where you can enter in your Facebook credentials. After logging in, you can close the browser window. Your script will continue executing in the background.

The access token used for authentication will be stored in a file, so the next time your script is executed, the authenticate() function won't have to do anything. To remove this access token, you can call logout():

fbconsole.logout()

See below for other modes of authentication.

Graph API Basics

You can make HTTP POST requests using the post function. Here is how you would update your status:

status = fbconsole.post('/me/feed', {'message':'Hello from my awesome script'})

You can make HTTP GET requests using the get function. Here is how you would fetch likes on a status update:

likes = fbconsole.get('/'+status['id']+'/likes')

You can make HTTP DELETE requests using the delete function. Here is how you would delete a status message:

fbconsole.delete('/'+status['id'])

To upload a photo, you can provide a file-like object as a POST parameter:

fbconsole.post('/me/photos', {'source':open('my-photo.jpg')})

You can also make FQL queries using the fql function. For example:

friends = fbconsole.fql("SELECT name FROM user WHERE uid IN "
"(SELECT uid2 FROM friend WHERE uid1 = me())")

If you just want a URL to a particular Graph API endpoint, for example to download a profile picture, you can use the graph_url function:

profile_pic = graph_url('/zuck/picture')
urlretrieve(profile_pic, 'zuck.jpg')

Advanced Graph API

fbconsole also provides access and utilities around some more advanced Graph API features.

iter_pages

If you are trying to fetch a lot of data, you may be required to make multiple requests to the Graph API via the "paging" values that are sent back. You can use iter_pages to automatically iterate through multiple requests. For example, you can iterate through all of your posts:

for post in iter_pages(fbconsole.get('/me/posts')):
print post['message']

More Authentication Options

By default, fbconsole will make all its requests with the app ID of the fbconsole Facebook app. If you want the requests to be made by your own Facebook app, you must modify the APP_ID setting. For example:

fbconsole.APP_ID = '<your-app-id>'
fbconsole.authenticate()

For the authentication flow to work, you must configure your Facebook app correctly by setting the "Site URL" option to http://local.fbconsole.com:8080.

If you don't want to change your app settings, you can also specify an access token to use directly, in which case you can skip authentication altogether:

fbconsole.ACCESS_TOKEN = '<your-access-token>'

As a means to set the ACCESS_TOKEN, fbconsole provides an automatic mechanism (Python 2.x only) for authenticating server-side scripts by completing the OAuth process automatically:

# WARNING: only supported for Python 2.x
fbconsole.automatically_authenticate(
username, # Facebook username for authentication
password, # Facebook password for authentication
app_secret, # App secret from Facebook app settings
redirect_uri, # Redirect URI specified in Facebook app settings
)

This authentication method is particularly helpful when running cron jobs that grab data from the Graph API on a daily basis. If you have any trouble using the automatic_authentication method, be sure to double-check that the username, password, app secret, and redirect URI are all consistent with your app's settings.

Other Options

There are a few other options you can specify:

  • SERVER_PORT controls which port the local server runs on. If you modify this, make sure your app's settings on Facebook, specifically the "Site URL" field, reflect the port number you are using. The default is 8080.

  • ACCESS_TOKEN_FILE controls where the access token gets stored on the file system. The default is .fb_access_token.

  • AUTH_SUCCESS_HTML is the HTML page content displayed to the user in their browser window once they have successfully authenticated.

  • SANDBOX_DOMAIN lets you specify a special domain to use for all requests. For example, setting SANDBOX_DOMAIN to "beta" will allow you to test Facebook's Beta Tier by sending all requests to http://graph.beta.facebook.com. See the Beta Tier docs for more information.

Feedback

For issues pertaining to fbconsole only, file an issue on GitHub. For issues with the Graph API or other aspects of Facebook's platform, please refer to the developer docs or file a bug.

License Information

fbconsole is licensed under the license found in the LICENSE file in the root directory of this source tree.

About

A micro api client for writing scripts against the Facebook Graph API.

Resources

Stars

323 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages