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)

Sunflower-farmers-automated-bot - Sunflower Farmers NFT Game automated bot.IT IS NOT a cheat or hack bot

Sunflower-farmers-auto-bot Sunflower Farmers NFT Game automated bot.IT IS NOT a

Arthur Alves 17 Nov 9, 2022
A lightweight, dependency-free Python library (and command-line utility) for downloading YouTube Videos.

24 July 2020 Actively soliciting contributers! Ping @ronncc if you would like to help out! pytube pytube is a very serious, lightweight, dependency-fr

pytube 7.9k Jan 2, 2023
Official python API for Phish.AI public and private API to detect zero-day phishing websites

phish-ai-api Summary Official python API for Phish.AI public and private API to detect zero-day phishing websites How it Works (TLDR) Essentially we h

Phish.AI 168 May 17, 2022
A tool for exporting Telegram group chats into static websites, preserving chat history like mailing list archives.

tg-archive is a tool for exporting Telegram group chats into static websites, preserving chat history like mailing list archives. Preview The @fossuni

Kailash Nadh 400 Dec 27, 2022
Create Multiple CF entry for multiple websites

AWS-CloudFront Problem: Deploy multiple CloudFront for account with multiple domains. Functionality: Running this script in loop and deploy CloudFront

Giten Mitra 5 Nov 18, 2022
Ross Virtual Assistant is a programme which can play Music, search Wikipedia, open Websites and much more.

Ross-Virtual-Assistant Ross Virtual Assistant is a programme which can play Music, search Wikipedia, open Websites and much more. Installation Downloa

Jehan Patel 4 Nov 8, 2021
A Telegram bot that scrapes websites for available vaccination appointments to notify users. (German)

@dachau_impf_bot ???? A Telegram bot to check the contents of https://termin.dachau-med.de for available slots and inform users of the available dates

null 1 Nov 21, 2021
Filters to block and remove copycat-websites from DuckDuckGo and Google

uBlock Origin - Shitty Copy-Paste websites filter Filter for uBlock origin to remove spam-website results from DuckDuckGo and Google that just blatant

null 99 Dec 15, 2022
Support for Competitive Coding badges to add in Github readme or portfolio websites.

Support for Competitive Coding badges to add in Github readme or portfolio websites.

Akshat Aggarwal 2 Feb 14, 2022
Read manga from your favourites websites on telegram.

tg-manga-bot Read manga from your favourites websites on telegram. Current Development Bot @idkpythonbot Telegram Channel tg_manga_bot Commands start

Daniel Rivero 41 Dec 22, 2022
TuShare is a utility for crawling historical data of China stocks

TuShare Tushare Pro版已发布,请访问新的官网了解和查询数据接口! https://tushare.pro TuShare是实现对股票/期货等金融数据从数据采集、清洗加工 到 数据存储过程的工具,满足金融量化分析师和学习数据分析的人在数据获取方面的需求,它的特点是数据覆盖范围广,接口

挖地兔 11.9k Dec 30, 2022
Decryption utility for PGP Whole Disk Encryption

wdepy: Decryption and Inspection for PGP WDE Disks This is a small python tool to inspect and decrypt disk images encrypted with PGP Whole Disk Encryp

Brendan Dolan-Gavitt 17 Oct 7, 2022
Decryption utility for PGP Whole Disk Encryption

Decryption utility for PGP Whole Disk Encryption

Brendan Dolan-Gavitt 11 Mar 21, 2021
Utility for downloading fanfiction in bulk from the Archive of Our Own

What is this? This is a program intended to help you download fanfiction from the Archive of Our Own in bulk. This program is primarily intended to wo

null 73 Dec 30, 2022
A simple python discord bot with commands for moderation and utility.

Discord Bot A simple python discord bot with commands for moderation, utility and fun. Moderation $kick <user> <reason> - Kick a user from the server

syn 3 Feb 6, 2022
Migration Manager (MM) is a very small utility that can list source servers in a target account and apply mass launch template modifications.

Migration Manager Migration Manager (MM) is a very small utility that can list source servers in a target account and apply mass launch template modif

Cody 2 Nov 4, 2021
Moderation and Utility Discord bot.

Qrista An advanced Moderation and Utility Discord bot. Features Uses Hikari and Lightbulb as a command handler Advance Logging & Whole new enviroment

Blaze Camp 2 Jan 11, 2022
Utility for converting IP Fabric webhooks into a Teams format

IP Fabric Webhook Integration for Microsoft Teams and/or Slack Setup IP Fabric Setup Go to Settings > Webhooks > Add webhook Provide a name URL will b

Community Fabric 1 Jan 26, 2022
Prisma Cloud utility scripts, and a Python SDK for Prisma Cloud APIs.

pcs-toolbox Prisma Cloud utility scripts, and a Python SDK for Prisma Cloud APIs. Table of Contents Support Setup Configuration Script Usage CSPM Scri

Palo Alto Networks 34 Dec 15, 2022