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)

Kyura-Userbot: a modular Telegram userbot that runs in Python3 with a sqlalchemy database

Kyura-Userbot Telegram Kyura-Userbot adalah userbot Telegram modular yang berjal

Kyura 17 Oct 29, 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
HTTP API for TON (The Open Network)

HTTP API for The Open Network Since TON nodes uses its own ADNL binary transport protocol, a intermediate service is needed for an HTTP connection. TO

66 Dec 28, 2022
A high level library for building Discord bots.

Qord A high level library for building Discord bots. 🚧 This library is currently in development. Questions that you are having What is this? This is

Izhar Ahmad 16 May 14, 2022
A modular telegram Python bot running on python3 with an sqlalchemy database.

Saber A modular telegram Python bot running on python3 with an sqlalchemy database. Originally a marie fork - Saber has evolved further and was built

ZERO • アクバル . 4 Nov 09, 2021
Live Weather Updates using Flask and OpenWeather

AuraX Live Weather Updates using Flask and OpenWeather Installation To setup this project on your local machine, first clone this repository and insta

Ayush Gupta 3 Nov 02, 2021
A file-based quote bot written in Python

Let's Write a Python Quote Bot! This repository will get you started with building a quote bot in Python. It's meant to be used along with the Learnin

1 Jan 19, 2022
An async python wrapper to interact with the Steam API and its CMs

steam.py A modern, easy to use, and async ready package to interact with the Steam API. Heavily inspired by discord.py and borrowing functionality fro

James Hilton-Balfe 90 Dec 15, 2022
This is a story bot, that will scrape stories from r/stories subreddit and convert it into an Audio File.

Introduction This is a story bot, that will scrape stories from r/stories subreddit and convert it into an Audio File. Installation pip install -r req

Yasho 11 Jun 30, 2022
CSUL Discord Bot

Cruzeiro This is the same old bot running on the Discord Server of CSUL, but i've changed the code. It's better now. Discord.py Heroku How i did The b

Operaho 6 Jan 31, 2022
Tools convert cookies facebook menjadi token facebook.

Tools convert cookies facebook menjadi token facebook.

Muhammad Latif Harkat 2 Jul 17, 2022
use python script to fix vmp dump api in ida

FixVmpDump use python script to fix vmp dump api in ida. support x86 and x64. details in my blog: https://blog.csdn.net/yan_star/article/details/11279

97 Nov 02, 2022
A simple notebook to stream torrent files directly to Google Drive using Google Colab.

Colab-Torrent-to-Drive Originally by FKLC, this is a simple notebook to stream torrent files directly to Google Drive using Google Colab. You can eith

1 Jan 11, 2022
Rio Userbot Adalah Bot Untuk Membantu Mempermudahkan Sesuatu Di Telegram, Last Repository With Pytgcalls v0.8.3

RIO - USERBOT Disclaimer Saya tidak bertanggung jawab atas penyalahgunaan bot ini. Bot ini dimaksudkan untuk bersenang-senang sekaligus membantu Anda

RioProjectX 4 Oct 18, 2022
BiliBili-live-barrage-transceiver - A simple python program for sending and receiving barrage in bilibili live room

BiliBili-live-barrage-transceiver - A simple python program for sending and receiving barrage in bilibili live room

zeroy 2 Jan 18, 2022
Market calendar RESTful API with holiday, late open, and early close. Over 50+ unique exchange calendars for global equity and futures markets.

Trading Calendar Market calendar RESTful API with holiday, late open, and early close. Over 50+ unique exchange calendars for global equity and future

Apptastic Software 1 Feb 03, 2022
WhatsAppCrashingToolv1.1 - WhatsApp Crashing Tool v1.1

WhatsAppCrashingTool v1.1 This is just for Educational Purpose WhatsApp Crashing

E4crypt3d 3 Dec 20, 2022
Wrapper for shh/rsync for use with OpenFOAM and blue bear

bbsync wrapper for shh/rsync for use with OpenFOAM and blue bear About The Project bbsync is a wrapper for shh/rsync for use with OpenFOAM and blue be

1 Dec 10, 2021
Graviti TensorBay Python SDK

TensorBay Python SDK is a python library to access TensorBay and manage your datasets. It provides: A pythonic way to access your

Graviti 72 Aug 22, 2022
52pojie 吾爱破解论坛 签到 支持云函数/服务器等Py3环境运行

52pojie-Checkin 52pojie 吾爱破解论坛 签到 Py3单程序 支持云函数/服务器等Py3环境运行 只需要Cookie即可运行 新版说明 依赖包请用项目 https://github.com/BlueSkyXN/requirements-serverless 需要填写的参数有 co

BlueSkyXN 22 Sep 15, 2022