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)

A GUI Application that creates a Spotify Playlist from any year in the past, by just entering your preferred date

A GUI Application that creates a Spotify Playlist from any year in the past, by just entering your preferred date

David .K. Danso 1 Jan 17, 2022
You cant check for conflicts until course enrolment actually opens. I wanted to do it earlier.

AcornICS I noticed that Acorn it does not let you check if a timetable is valid based on the enrollment cart, it also does not let you visualize it ea

Isidor Kaplan 2 Sep 16, 2021
Easy way to use Telegram bot to hide your identity.

telegram-support-bot Easy way to use Telegram bot to hide your identity. Useful for support, anonymous channel management. Free clone of Livegram Bot.

Daniil Okhlopkov 197 Dec 23, 2022
Amazon AWS Web Tool (view only)

Amazon AWS Web Tool (AAWT) discontinued Features Cloudfront (simple) EC2 (With Charts and Prices) EC2 Reserved EBS ELB (With Charts) Obs:. only classi

Carlos Augusto Malucelli 9 Nov 07, 2022
A simple Discord Bot that uses the free CryptoCompare API to display cryptocurrency prices

What is this? This is a simple Discord Bot coded in Python that uses the free CryptoCompare API to display cryptocurrency prices Download Use git to c

Kevin 10 Apr 17, 2022
Discord bot for the IOTA Wiki

IOTA Wiki Bot Discord bot for the IOTA Wiki Report Bug ยท Request Feature About The Project This is a Discord bot for the IOTA Wiki. It's currently use

IOTA Community 2 Nov 14, 2021
Opensea-upload-with-recaptcha-solution - Updated opensea uploading solution with recaptcha pass

opensea-upload-with-recaptcha-solution updated opensea uploading solution with r

byeonggeon sim 25 Nov 15, 2022
This repository is used to provide data to zzhack,

This repository is used to provide data to zzhack, but you don't have to care about anything, just write your thinking down, and you can see your thinking is rendered in zzhack perfectly

5 Apr 29, 2022
Export Statistics for a Telegram Group Chat

Telegram Statistics Export Statistics for a Telegram Group Chat How to Run First, in main repo directory, run the following code to add src to your PY

Ali Hejazizo 22 Dec 05, 2022
Bezlik Year Calendar Planner

Bezlik Year Calendar Planner Scribus script for creating year planners on one page A1 paper format. Script is based on Year-Calendar-Script-for-Scribu

Bohdan Bobrowski 2 May 24, 2022
Linky bot, A open-source discord bot that allows you to add links to ur website, youtube url, etc for the people all around discord to see!

LinkyBot Linky bot, An open-source discord bot that allows you to add links to ur website, youtube url, etc for the people all around discord to see!

AlexyDaCoder 1 Sep 20, 2022
TikTok 4L and 4C checker that doesn't count banned usernames as available

TikTok 4L and 4C checker that doesn't count banned usernames as available. Once a username is available, it will send it to your Discord Webhook.

cliphd 26 May 01, 2022
A Python package that can be used to download post and comment data from Reddit.

Reddit Data Collector Reddit Data Collector is a Python package that allows a user to collect post and comment data from Reddit. It is built on top of

Nico Van den Hooff 3 Jul 26, 2022
CRUD database for python discord bot developers that stores data on discord text channels

Discord Database A CRUD (Create Read Update Delete) database for python Discord bot developers. All data is stored in key-value pairs directly on disc

Ankush Singh 7 Oct 22, 2022
Template to create a telegram bot in python

Template for Telegram Bot Template to create a telegram bot in python. How to Run First add src to PYTHONPATH: export PYTHONPATH=${PWD} Then run: pyt

Ali Hejazizo 12 Dec 24, 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
Another Autoscaler is a Kubernetes controller that automatically starts, stops, or restarts pods from a deployment at a specified time using a cron annotation.

Another Autoscaler Another Autoscaler is a Kubernetes controller that automatically starts, stops, or restarts pods from a deployment at a specified t

Diego Najar 66 Nov 19, 2022
Telegram Vc Video Player Bot

Telegram Video Player Bot Telegram bot project for streaming video on telegram video chat, powered by tgcalls and pyrogram Deploy to Heroku ๐Ÿ‘จโ€๐Ÿ”ง The

Dihan Official 11 Dec 25, 2022
Example of a discord bot in Python

discordbot.py Example of a discord bot in Python Requirements Python 3.8 or higher Discord Bot Setting Up Clone this repo or download the files Rename

Debert Jamie 1 Oct 23, 2021
An unofficial client library for Google Music.

gmusicapi: an unofficial API for Google Play Music gmusicapi allows control of Google Music with Python. from gmusicapi import Mobileclient api = Mob

Simon Weber 2.5k Dec 15, 2022