A comand-line utility for taking automated screenshots of websites

Overview

shot-scraper

PyPI Changelog Tests License

A comand-line utility for taking automated screenshots of websites

For background on this project see shot-scraper: automated screenshots for documentation, built on Playwright.

Documentation

Full documentation can be found at shot-scraper.datasette.io

Get started with GitHub Actions

To get started without installing any software, use the shot-scraper-template template to create your own GitHub repository which takes screenshots of a page using shot-scraper. See Instantly create a GitHub repository to take screenshots of a web page for details.

Quick installation

You can install the shot-scraper CLI tool using pip:

pip install shot-scraper
# Now install the browser it needs:
shot-scraper install

Taking your first screenshot

You can take a screenshot of a web page like this:

shot-scraper https://datasette.io/

This will create a screenshot in a file called datasette-io.png.

Many more options are available, see Taking a screenshot for details.

Examples

Comments
  • Selecting elements for screenshotting based on tag content

    Selecting elements for screenshotting based on tag content

    Selecting elements as the target for screenshots based on CSS selectors does not (currently) allow for the selection of elements based on tag content, or relative to DOM elements selected based on tag content.

    However, elements can be selected based on tag content using Javascript. It would be useful to allow for the selection of elements via Javascript as well as CSS.

    Alternatively, support a method that can be called from a javascript scraper call that will apply a screen shot to a Javascript selected element.

    At the moment, selector based screenshots seem to be focused in _selector_javascript(selectors) by:

    https://github.com/simonw/shot-scraper/blob/e40070d9bc5334ad8b2ff9e4e3565263aad545f4/shot_scraper/cli.py#L520

    As well as passing --selector(s), s, one approach might be to pass element(s) el returned from a --js-selector script?

    enhancement 
    opened by psychemedia 21
  • Initial prototype

    Initial prototype

    The initial prototype of this will involve a YAML file that defines multiple screenshots to be taken, and a GitHub Actions workflow that takes those screenshots.

    enhancement 
    opened by simonw 20
  • shot-scraper GitHub repository template implementation

    shot-scraper GitHub repository template implementation

    A repository template that helps users create a repo that takes screenshots of a page.

    Create your own template from the repo and it will give you a YAML file that you can then edit - it writes screenshots to the same repository.

    documentation 
    opened by simonw 18
  • Support returning output from evaluated JavaScript, including as status code

    Support returning output from evaluated JavaScript, including as status code

    This is a bit of an out-there idea: what if you could execute custom JavaScript that returned a result, and then write that result to disk?

    You could even skip the screenshot entirely and use this as a generic scraping tool at that point.

    Bonus: if it can affect the exit code in some way it could be used as part of a CI flow to test something.

    enhancement research 
    opened by simonw 17
  • Split up README into multiple pages of documentation

    Split up README into multiple pages of documentation

    I can use the same tech as https://django-sql-dashboard.datasette.io/en/stable/ - see https://github.com/simonw/django-sql-dashboard/tree/main/docs

    • [x] Configure Read the Docs
    • [x] Split documentation up into pages
    • [x] Add new Contributing page with notes on how docs work (including Cog)
    • [x] Vanity domain - probably shot-scraper.datasette.io
    • [x] Shrink the README and point it to the new docs
    • [x] Ship a release and check that Read the Docs has a "stable" as well as a "latest"
    documentation enhancement 
    opened by simonw 9
  • `--selector-all` to screenshot of all elements matching a selector

    `--selector-all` to screenshot of all elements matching a selector

    This then made me think that I actually want the same ability for just raw CSS selectors. But what should that look like?

    Originally posted by @simonw in https://github.com/simonw/shot-scraper/issues/43#issuecomment-1095338690

    enhancement 
    opened by simonw 8
  • shot-scraper GitHub repository template

    shot-scraper GitHub repository template

    A repository template that helps users create a repo that takes screenshots of a page.

    Create your own template from the repo and it will give you a YAML file that you can then edit - it writes screenshots to the same repository.

    documentation 
    opened by simonw 8
  • Support taking a shot that boxes multiple selectors

    Support taking a shot that boxes multiple selectors

    This is a bit of an unconventional need, but I think it's worth exploring.

    When taking screenshots for tutorials, I often want to grab an area of the screen that incorporates more than one element - where there's no convenient wrapper element that I can use to get the shot that I want.

    Imagine if you could specify multiple selectors and get back a screenshot of the smallest area of the screen that incorporates all of those elements.

    The implement would look at the founding box of all of those elements, generate a new box that wraps all of those, inject an absolutely positioned box of that size and take the screenshot of that area.

    It could even optionally add some padding to that box before taking the shot.

    research 
    opened by simonw 8
  • Protocol error (Network.getResponseBody): No resource with given identifier found

    Protocol error (Network.getResponseBody): No resource with given identifier found

    Got this error when running:

    shot-scraper https://lite.datasette.io/ --wait-for 'document.querySelector("h2")' --log-requests - | tee /tmp/datasette-lite.txt
    
    Exception in callback SyncBase._sync.<locals>.callback(<Task finishe...ifier found')>) at /Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_sync_base.py:104
    handle: <Handle SyncBase._sync.<locals>.callback(<Task finishe...ifier found')>) at /Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_sync_base.py:104>
    Traceback (most recent call last):
      File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/asyncio/events.py", line 80, in _run
        self._context.run(self._callback, *self._args)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_sync_base.py", line 105, in callback
        g_self.switch()
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_browser_context.py", line 122, in <lambda>
        lambda params: self._on_response(
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_browser_context.py", line 397, in _on_response
        page.emit(Page.Events.Response, response)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/pyee/_base.py", line 113, in emit
        handled = self._call_handlers(event, args, kwargs)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/pyee/_base.py", line 96, in _call_handlers
        self._emit_run(f, args, kwargs)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/pyee/_asyncio.py", line 42, in _emit_run
        self.emit('error', exc)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/pyee/_base.py", line 116, in emit
        self._emit_handle_potential_error(event, args[0] if args else None)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/pyee/_base.py", line 86, in _emit_handle_potential_error
        raise error
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/pyee/_asyncio.py", line 40, in _emit_run
        coro = f(*args, **kwargs)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_impl_to_api_mapping.py", line 88, in wrapper_func
        return handler(
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/shot_scraper/cli.py", line 734, in on_response
        "size": len(response.body()),
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/sync_api/_generated.py", line 574, in body
        self._sync("response.body", self._impl_obj.body())
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_sync_base.py", line 111, in _sync
        return task.result()
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_network.py", line 375, in body
        binary = await self._channel.send("body")
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_connection.py", line 39, in send
        return await self.inner_send(method, params, False)
      File "/Users/simon/.local/pipx/venvs/shot-scraper/lib/python3.10/site-packages/playwright/_impl/_connection.py", line 63, in inner_send
        result = next(iter(done)).result()
    playwright._impl._api_types.Error: Protocol error (Network.getResponseBody): No resource with given identifier found
    

    This was logged out a bunch of times, even though the command itself ran to completion.

    I think this is likely caused by the new log requests feature from:

    • #88
    bug 
    opened by simonw 7
  • How to send POST to url?

    How to send POST to url?

    Is there any option to add params to send post to url?

    I need to send this key:value pair: "data-raw": "page=21&limit=15"

    Or maybe with javascript there is a way to send POST to url?

    I tried in javascript doing something like that, but no success:

    --javascript "var xhr = new XMLHttpRequest(); xhr.open('POST', <url>, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify({'data-raw': 'page=21&limit=15'}));"
    
    enhancement wontfix 
    opened by ZobaJakColbert 7
  • Idea: shot-scraper multi --if-not-exists or --skip-existing

    Idea: shot-scraper multi --if-not-exists or --skip-existing

    Only does the screenshot if the output: file doesn't exist yet.

    This could be used to build a very neat GitHub mechanism for creating a portfolio of screenshots of your projects.

    enhancement 
    opened by simonw 7
  • SDK or sample code to run scraper via a Worker?

    SDK or sample code to run scraper via a Worker?

    I know you use Playwright here @simonw - but I noted this recently: https://blog.cloudflare.com/introducing-workers-browser-rendering-api/

    If it's possible to use an alternative rendering engine and offload scraping to a CF Worker, that would be awesome.

    Just parking here for your thoughts, and potentially if others are interested. Cloudflare should perhaps be told to use alternative rendering engines too :)

    opened by amitkoth 0
  • Ability to pass CLI options to `shot-scraper multi`

    Ability to pass CLI options to `shot-scraper multi`

    https://discord.com/channels/823971286308356157/1034259126076833873/1034303037914746942 @jefftriplett

    I was curious about the multi subcommand and if it made sense to expose screenshot api options (width + height + quality) as cli options. it's not a deal breaker but it felt like it should be a pass-through since I might have a file of 50 urls and I want them to all use the same options. it's slightly more maintainable to keep track of one list of settings and it's nice because I can grab a list for the full width images and then do another for a different size but it's doable without

    I like the idea that you can pass options to shot-scraper multi which will be used for YAML items that don't over-ride them.

    enhancement 
    opened by simonw 2
  • add more ways to configure web browser from command-line

    add more ways to configure web browser from command-line

    • option to use system browser
    • option to add custom browser command-line arguments
    • option to ignore https headers

    :books: Documentation preview :books:: https://shot-scraper--91.org.readthedocs.build/en/91/

    research 
    opened by looran 4
  • weired pdf error

    weired pdf error

    url to pdf ERROR b'Traceback (most recent call last):\n File "/opt/hostedtoolcache/Python/3.10.4/x64/bin/shot-scraper", line 8, in \n sys.exit(cli())\n File "/opt/hostedtoolcache/Python/3.10.4/x64/lib/python3.10/site-packages/click/core.py", line 1130, in call\n return self.main(*args, **kwargs)\n File "/opt/hostedtoolcache/Python/3.10.4/x64/lib/python3.10/site-packages/click/core.py", line 1055, in main\n rv = self.invoke(ctx)\n File "/opt/hostedtoolcache/Python/3.10.4/x64/lib/python3.10/site-packages/click/core.py", line 1657, in invoke\n return _process_result(sub_ctx.command.invoke(sub_ctx))\n File "/opt/hostedtoolcache/Python/3.10.4/x64/lib/python3.10/site-packages/click/core.py", line 1404, in invoke\n return ctx.invoke(self.callback, **ctx.params)\n File "/opt/hostedtoolcache/Python/3.10.4/x64/lib/python3.10/site-packages/click/core.py", line 760, in invoke\n return __callback(*args, **kwargs)\n File "/opt/hostedtoolcache/Python/3.10.4/x64/lib/python3.10/site-packag...

    pdfname=url.split('/')[-1]
    
    if not os.path.exists(join(pdfpath,pdfname+'.pdf')):
        cmd='shot-scraper pdf {url} -o {pdfname}.pdf'
        isdone=subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        out, err = isdone.communicate()
    
    bug help wanted 
    opened by shopconan 3
  • Question: Simulate hover, mouseover, mouseenter for dropdown menu activation

    Question: Simulate hover, mouseover, mouseenter for dropdown menu activation

    I'm trying to make a screenshot for the page with dropdown menu activated. See example here: https://demoqa.com/menu# ( .nav-menu-container #nav li:nth-child(2) :hover element).

    I would appreciate any tips and workflow examples.

    hover_example

    help wanted 
    opened by annjulyleon 1
Releases(1.0.1)
  • 1.0.1(Oct 24, 2022)

  • 1.0(Oct 15, 2022)

  • 0.17(Oct 14, 2022)

    • New shot-scraper multi -o option for specifying a subset of one or more output files to execute that are defined in the YAML. This is useful for testing a larger shots.yml file without re-taking every screenshot every time the command is run. #94
    Source code(tar.gz)
    Source code(zip)
  • 0.16(Sep 15, 2022)

    • Fixed error message displayed when attempting to use --log-requests on a page that includes a redirect. #90
    • --log-requests output now includes a "status": 200 field indicating the HTTP status code returned by that response.
    Source code(tar.gz)
    Source code(zip)
  • 0.15.1(Sep 13, 2022)

  • 0.15(Sep 12, 2022)

    • New --log-requests option for logging out newline-delimited JSON showing all requests made while rendering a page, including image and asset loads. #88
    • New shot-scraper pdf formatting options: --format, --width, --height, --scale and --print-background. Thanks, Eddie Chapman. #87
    • Removed -h shortcut for help - use --help instead. -h was clashing with the shorter version of --height. Thanks, Matthew Bafford. #84
    Source code(tar.gz)
    Source code(zip)
  • 0.14.3(Aug 2, 2022)

  • 0.14.2(Jul 28, 2022)

  • 0.14.1(May 22, 2022)

  • 0.14(May 19, 2022)

    Source code(tar.gz)
    Source code(zip)
  • 0.13(Apr 18, 2022)

    • shot-scraper auth --devtools option for opening DevTools when authenticating with a site. #66
    • shot-scraper multi -n/--no-clobber option for skipping screenshots where the output image already exists on disk. #70
    Source code(tar.gz)
    Source code(zip)
  • 0.12(Apr 11, 2022)

    • --selector-all option to take a screenshot that encompasses every element matching the specified CSS selector - complements --selector which takes a screenshot of just the first element matching that selector. See Specifying elements using JavaScript filters. #64
    • selector_all: and selectors_all: keys in the shot-scraper multi YAML format.
    • --js-selector and --js-selector-all options for specifying elements to screenshot using a JavaScript expression, for cases which cannot be handled using CSS selectors #43. The following example takes a screenshot of the first paragraph on the page that mentions shot-scraper:
      shot-scraper https://github.com/simonw/shot-scraper \
        --js-selector 'el.tagName == "P" && el.innerText.includes("shot-scraper")'
      
    • js_selector:, js_selectors:, js_selector_all: and js_selectors_all: equivalent keys in the shot-scraper multi YAML format.
    • --user-agent option for setting a custom user agent header. #63
    • --browser webkit option for running WebKit - thanks, Ryan Murphy. #56
    Source code(tar.gz)
    Source code(zip)
  • 0.11(Apr 8, 2022)

    • New shot-scraper accessibility --timeout option, thanks Ben Welsh. #59
    • shot-scraper auth --browser option for authentication using a browser other than Chromium. #61
    • Using --quality now results in a JPEG file with the correct .jpg extension. Thanks, Ian Wootten. #58
    • New --reduced-motion flag for emulating the "prefers-reduced-motion" media feature. Thanks, Ryan Murphy. #49
    Source code(tar.gz)
    Source code(zip)
  • 0.10(Mar 29, 2022)

    Source code(tar.gz)
    Source code(zip)
  • 0.9(Mar 14, 2022)

    • New shot-scraper javascript command for executing JavaScript against a web page and returning the result to the console as JSON: #38

      % shot-scraper javascript datasette.io document.title
      "Datasette: An open source multi-tool for exploring and publishing data"
      

      This can be used for web scraping and data extraction. Any JavaScript errors will cause the command to return an exit code of 1, so this can also be used to run tests against a website from within a continuous integration environment such as GitHub Actions.

    • The shot-scraper pdf and shot-scraper accessibility commands can both now be used with local files in addition to URLs. #37

    • The output: key is no longer required in YAML shot configuration: if omitted, an automatic filename will be used instead. #40

    • An empty YAML file no longer produces an error. #41

    Source code(tar.gz)
    Source code(zip)
  • 0.8(Mar 13, 2022)

    • shot-scraper can now take screenshots of local files on disk: #35

      shot-scraper index.html -o index.png
      
    • If you call shot-scraper on a URL with no protocol, http:// will be assumed. Redirects will be followed:

      shot-scraper datasette.io -o datasette.png
      
    Source code(tar.gz)
    Source code(zip)
  • 0.7(Mar 13, 2022)

    • The shot-scraper shot and shot-scraper pdf commands both now default to writing a file to disk if no filename is specified, using a name derived from the URL. If you want to write the PNG or PDF content to standard output you can do so using -o -. #32
    • New --retina flag for shot-scraper shot and shot-scraper multi which causes the screenshot to be taken with a device scale factor of 2. #33
    • shot-scraper shot --devtools option opens an interactive browser window with the browser developer tools enabled. #34
    Source code(tar.gz)
    Source code(zip)
  • 0.6(Mar 12, 2022)

    • Now supports taking screenshots of pages that require authentication. #18

      The following command will open a browser window for the specified website, wait for you to manually authenticate and hit <enter> in the terminal, and then write the resulting authentication context out to auth.json:

      shot-scraper auth https://github.com/ auth.json`
      

      You can then take authenticated screenshots like this:

      shot-scraper https://github.com/notifications \
        --auth auth.json -o notifications.png
      

      The -a/--auth option is also supported by the multi, pdf and accessibility commands.

    • The shot-scraper command can now open a browser in which you can interact with a page before the screenshot is taken: #31

      shot-scraper https://simonwillison.net/ \
        -o after-interaction.png \
        --height 800 --interactive
      

      This will output:

      Hit <enter> to take the shot and close the browser window:
        # And after you hit <enter>...
      Screenshot of 'https://simonwillison.net/' written to 'after-interaction.png'
      
    • You can now pass multiple CSS selectors in order to take a screenshot of the smallest area that encompasses all of the content referenced by those selectors: #21

      shot-scraper https://simonwillison.net/ \
        -s '#bighead' -s .overband \
        -o bighead-multi-selector.png
      

      Add --padding 20 to include an additional 20px of padding around the specified area.

      The YAML format used by snap-shotter multi also now supports multiple CSS selectors, which look like this:

      - output: bighead-multi-selector.png
        url: https://simonwillison.net/
        selectors:
        - "#bighead"
        - .overband
        padding: 20
      
    • Scripted tests can now be run using tests/run_examples.sh #29

    Source code(tar.gz)
    Source code(zip)
  • 0.5(Mar 12, 2022)

    • New shot-scraper pdf command for creating a PDF export of a web page. #24
    • shot-scraper accessibility --javascript option for executing custom JavaScript before taking the accessibility snapshot. #23
    • shot-scraper accessibility -o filename.json option. #25
    • README demos section now links to @newshomepages Twitter bot by @palewire
    • README now includes tips on executing JavaScript. #20
    • README now includes the --help output of the various commands.
    Source code(tar.gz)
    Source code(zip)
  • 0.4(Mar 10, 2022)

    • Added shot-scraper accessibility URL command, which dumps out a JSON copy of the Chromium accessibility tree for the page. #22
    • Fixed error in the --help output for the shot-scraper multi command.
    Source code(tar.gz)
    Source code(zip)
  • 0.3(Mar 9, 2022)

  • 0.2(Mar 9, 2022)

    • shot-scraper --selector SELECTOR option to specify an element on the page using a CSS selector and take a screenshot of just that element. #8
    • selector: ... key in YAML file to specify an element by CSS selector.
    • --javascript SCRIPT option to specify custom JavaScript to be executed after the page has loaded but before the screenshot is taken. #12
    • javascript: key in YAML to specify JavaScript to execute.
    • --width and --height options to set the width and height of the browser window used for the screenshot. If a height is specified, the resulting screenshot will be that height rather than being the full height of the page. #13
    • Equivalent width: and height: keys in the YAML configuration.
    Source code(tar.gz)
    Source code(zip)
  • 0.1(Mar 9, 2022)

    • Switched from npm Playwright to Python Playwright. #3
    • New shot-scraper install command for installing the browser needed by Playwright. #6
    • New shot-scraper shot URL command (also the default if you just run shot-scraper ...) which takes a single screenshot. #5
    • shot-scraper multi shots.yml command now executes the YAML file with a list of shots in it.
    Source code(tar.gz)
    Source code(zip)
  • 0.1a0(Mar 8, 2022)

Flood discord webhooks

Webhook-Spammer Flood discord webhooks Asynchronous webhook spammer Fast & Efficient Usage - Use it with atleast 500 threads Put a valid webhook Use a

trey 1 Apr 22, 2022
This is a simple collection of instructions and scripts to accompany the computerphile video about mininet and openflow.

How to get going. This project should work on Linux or MacOS. I used Ubuntu 20.04 and provide some notes here. Note, this is certainly not intended as

Richard G. Clegg 70 Jan 02, 2023
Grocy-create-product - A script supports the batch creation of new products in Grocy

grocy-create-product This script supports the batch creation of new products in

André Heuer 6 Jul 28, 2022
Solcast rooftop api for HA

Solcast Solar Home Assistant(https://www.home-assistant.io/) Component This custom component integrates the Solcast API into Home Assistant. Modified

Greg 1 Oct 11, 2021
Deploy your apps on any Cloud provider in just a few seconds

The simplest way to deploy your apps in the Cloud Deploy your apps on any Cloud providers in just a few seconds ⚡ Qovery Engine is an open-source abst

Qovery 1.9k Dec 26, 2022
WIOpy - Walmart Affiliate API Python wrapper

WalmartIO Python Wrapper - WIOpy A python wrapper for the Walmart io API. Only s

6 Nov 14, 2022
Simple script to extract useful informations from the combo BloodHound + Neo4j

bloodhound-quickwin Simple script to extract useful informations from the combo BloodHound + Neo4j. Can help to choose a target. Prerequisites python3

140 Dec 21, 2022
A fork of discord.py for anime enjoyers

A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. Key Features Modern Pythonic API using async and await

Senpai Development 4 Nov 05, 2021
Simple base for a telethon bot!

Telethon Bot Simple base used to make a Telegram Bot in telethon. Join @BotzHub! Note: The client, here, is named BotzHub. Fork and add your plugins t

Aditya 54 Oct 21, 2022
How to add reaction on message discord.py

BA / HR / RS: Python (discord.py) skripta pomocu koje dodajete reakciju na vasu poruku putem komande !v ili da se dodaje samo u nekoj odredjenoj sobi.

Seekii 3 Dec 23, 2021
Discord bot that generates boba drinks. Submission for sunhacks 2021

boba-bot Team Poggies' submission for Sunhacks 2021. Find our project page on Devpost, and a video demonstration can be found on YouTube. Commands $he

Joshua Tenorio 3 Nov 02, 2022
This project, search all entities related to A2P in twilio

Mirror A2P Twilio This project, search all entities related to A2P in twilio (phone numbers, messaging services, campaign, A2P brand information and P

Iván Cárdenas 2 Nov 03, 2022
A Python client for the Softcite software mention recognizer server

Softcite software mention recognizer client Python client for using the Softcite software mention recognition service. It can be applied to individual

4 Feb 02, 2022
NFT which pays royalties to its creator each time it is sold.

Chialisp NFT with Perpetual Creator Royalties This is a chialisp NFT in which the creator/minter defines a puzzle hash which will capture a fixed perc

Geoff Walmsley 20 Jun 28, 2022
just another discord bot

boredbot just another discord bot made to learn python this bots main function is to cache teams meeting links and send them right before the classes

macky 3 Sep 03, 2021
Uses discords api to see if a token has a valid payment method.

Discord Payment Checker Uses discords api to see if a token has a valid payment method. Report Bug · Request Feature Features Checks tokens Checks all

dropout 10 Dec 01, 2022
Just a simple discord bot a create for try

WAIFU MATERIAL DISCORD BOT! French ver. here HOW TO LAUNCH First, clone this rep

1 Jan 08, 2022
google-resumable-media Apache-2google-resumable-media (🥉28 · ⭐ 27) - Utilities for Google Media Downloads and Resumable.. Apache-2

google-resumable-media Utilities for Google Media Downloads and Resumable Uploads See the docs for examples and usage. Experimental asyncio Support Wh

Google APIs 36 Nov 22, 2022
This is a simple bot for running Python code through Discord

Python Code Runner Discord Bot This is a simple bot for running Python code through Discord. It was originally developed for the Beginner.Codes Discor

beginner.py 1 Feb 14, 2022
A repository of publicly verifiable token Sale contracts

Token-Sale-Plutus-Contract A repository of publicly verifiable token sale and royalty contracts. This will be the storage solution since it is easily

Logical Mechanism 29 Aug 18, 2022