This very basic script can be used to automate COVID-19 vaccination slot booking on India's Co-WIN Platform.

Overview

COVID-19 Vaccination Slot Booking Script

This very basic CLI based script can be used to automate covid vaccination slot booking on Co-WIN Platform.

Important:

  • POC project. Use at your own risk.
  • Do NOT use unless all beneficiaries selected are supposed to get the same vaccine and dose.
  • No option to register new user or add beneficiaries. This can be used only after beneficiary has been added through the official app/site
  • If you accidentally book a slot, don't worry. You can always login to the official portal and cancel that.
  • API Details: https://apisetu.gov.in/public/marketplace/api/cowin/cowinapi-v2
  • And finally, I know code quality probably isn't great. Suggestions are welcome.

Usage:

For the anyone not familiar with Python and using Windows, using the covid-vaccine-slot-booking.exe executable file would be the easiest way. It might trigger an anti-virus alert. That's because I used pyinstaller to package the python code and it needs a bit more effort to avoid such alerts.

OR

Run the script file as show below:

python src\covid-vaccine-slot-booking.py

If you're on Linux, install the beep package before running the Python script. To install beep, run:

sudo apt-get install beep

If you already have a bearer token, you can also use:

python src\covid-vaccine-slot-booking.py --token=YOUR-TOKEN-HERE

Third-Party Package Dependency:

  • tabulate : For displaying data in tabular format.
  • requests : For making GET and POST requests to the API.
  • inputimeout : For creating an input with timeout.

Install all dependencies by running:

pip install -r requirements.txt

Steps:

  1. Run script: python src\covid-vaccine-slot-booking.py

  2. Select Beneficiaries. Read the important notes. You can select multiple beneficiaries by providing comma-separated index values such as 1,2:

    Enter the registered mobile number: ██████████
    Requesting OTP with mobile number ██████████..  
    Enter OTP: 999999  
    Validating OTP..  
    Token Generated: █████████████████████████████████████████████████████████████  
    Fetching registered beneficiaries..  
    +-------+----------------------------+---------------------------+------------+  
    | idx   | beneficiary_reference_id   | name                      | vaccine    |  
    +=======+============================+===========================+============+  
    | 1     | ██████████████             | █████████████████████████ | COVISHIELD |  
    +-------+----------------------------+---------------------------+------------+  
    | 2     | ██████████████             | █████████████████         |            |  
    +-------+----------------------------+---------------------------+------------+  
      
    ################# IMPORTANT NOTES #################  
    # 1. While selecting beneficiaries, make sure that selected beneficiaries are all taking the same dose: either first OR second.  
    # Please do no try to club together booking for first dose for one beneficiary and second dose for another beneficiary.  
    #  
    # 2. While selecting beneficiaries, also make sure that beneficiaries selected for second dose are all taking the same vaccine: COVISHIELD OR COVAXIN.  
    # Please do no try to club together booking for beneficiary taking COVISHIELD with beneficiary taking COVAXIN.  
    ###################################################  
      
    Enter comma separated index numbers of beneficiaries to book for : 2
    
  3. Ensure correct beneficiaries are getting selected:

    Selected beneficiaries:  
    +-------+----------------------------+-----------+  
    | idx   | beneficiary_reference_id   | vaccine   |  
    +=======+============================+===========+  
    | 1     | ██████████████             |           |  
    +-------+----------------------------+-----------+
    
  4. Select a state

    +-------+-----------------------------+  
    | idx   | state                       |  
    +=======+=============================+  
    | 1     | Andaman and Nicobar Islands |  
    +-------+-----------------------------+  
    | 2     | Andhra Pradesh              |  
    +-------+-----------------------------+
    +-------+-----------------------------+
    +-------+-----------------------------+  
    | 35    | Uttar Pradesh               |  
    +-------+-----------------------------+  
    | 36    | Uttarakhand                 |  
    +-------+-----------------------------+  
    | 37    | West Bengal                 |  
    +-------+-----------------------------+
    
    Enter State index: 18
    
  5. Select districts you are interested in. Multiple districts can be selected by providing comma-separated index values

    +-------+--------------------+  
    | idx   | district           |  
    +=======+====================+  
    | 1     | Alappuzha          |  
    +-------+--------------------+  
    | 2     | Ernakulam          |  
    +-------+--------------------+  
    | 3     | Idukki             |  
    +-------+--------------------+
    +-------+--------------------+
    +-------+--------------------+  
    | 13    | Thrissur           |  
    +-------+--------------------+  
    | 14    | Wayanad            |  
    +-------+--------------------+
    
    Enter comma separated index numbers of districts to monitor : 2,13
    
  6. Ensure correct districts are getting selected.

    Selected districts:  
    +-------+---------------+-----------------+-----------------------+  
    | idx   | district_id   | district_name   | district_alert_freq   |  
    +=======+===============+=================+=======================+  
    | 1     | 307           | Ernakulam       | 660                   |  
    +-------+---------------+-----------------+-----------------------+  
    | 2     | 303           | Thrissur        | 3080                  |  
    +-------+---------------+-----------------+-----------------------+
    
  7. Enter the minimum number of slots to be available at the center:

    Filter out centers with availability less than: 5
    
  8. Script will now start to monitor slots in these districts every 15 seconds.

    ===================================================================================  
    Centers available in Ernakulam from 01-05-2021 as of 2021-04-30 15:13:44: 0  
    Centers available in Thrissur from 01-05-2021 as of 2021-04-30 15:13:44: 0  
    No viable options. Waiting for next update in 15s.
    ===================================================================================  
    Centers available in Ernakulam from 01-05-2021 as of 2021-04-30 15:13:59: 0  
    Centers available in Thrissur from 01-05-2021 as of 2021-04-30 15:13:59: 0  
    No viable options. Waiting for next update in 15s.
    
  9. If at any stage your token becomes invalid, the script will make a beep and prompt for y or n. If you'd like to continue, provide y and proceed to allow using same mobile number

    Token is INVALID.  
    Try for a new Token? (y/n): y
    Try for OTP with mobile number ███████████? (y/n) : y
    Enter OTP: 888888
    
  10. When a center with more than minimum number of slots is available, the script will make a beep sound - different frequency for different district. It will then display the available options as table:

    ===================================================================================  
    Centers available in Ernakulam from 01-05-2021 as of 2021-04-30 15:34:19: 1  
    Centers available in Thrissur from 01-05-2021 as of 2021-04-30 15:34:19: 0  
    +-------+----------------+------------+-------------+------------+------------------------------------------------------------------------------+  
    | idx   | name           | district   | available   | date       | slots                                                                        |  
    +=======+================+============+=============+============+==============================================================================+  
    | 1     | Ayyampilly PHC | Ernakulam  | 30          | 01-05-2021 | ['09:00AM-10:00AM', '10:00AM-11:00AM', '11:00AM-12:00PM', '12:00PM-02:00PM'] |  
    +-------+----------------+------------+-------------+------------+------------------------------------------------------------------------------+  
    ---------->  Wait 10 seconds for updated options OR  
    ---------->  Enter a choice e.g: 1.4 for (1st center 4th slot): 1.3
    
  11. Before the next update, you'll have 10 seconds to provide a choice in the format centerIndex.slotIndex eg: The input1.4 will select the vaccination center in second row and its fourth slot.

Comments
  • My attempt at automating the entire operation ;)

    My attempt at automating the entire operation ;)

    My main painpoint was that

    1. I had to enter the OTP whenever the token expired
    2. I had to manually choose the slot
    3. The frequency of polling was not enough to book slots

    **Hence I automated the entire thing end-to-end ;) **

    Please share your thoughts on it.

    Code and steps to install are here. https://github.com/bombardier-gif/covid-vaccine-booking Its hacky and dirty. Pull requests are welcome ;)

    opened by bombardier-gif 54
  • Captcha implemented?

    Captcha implemented?

    Getting the below response - did they implement a CAPTCHA?

    Booking Response Code: 400
    Booking Response : {"errorCode":"APPOIN0044", "error":"Please enter valid security code"}
    Response: 400 : {"errorCode":"APPOIN0044", "error":"Please enter valid security code"}
    
    
    enhancement 
    opened by mrms123 45
  • Token JWT Decode

    Token JWT Decode

    Suggestion: The token contains the time stamp for start and end ('iat': 1621506724, 'exp': 1621507624) of token validation, this can help in invalid token check without calling the beneficiary api everytime

    use pyjwt Also this will allow to regenerate the otp automatically just before expiration (if auto is selected)

    read-up-later 
    opened by aascagarwal 13
  • Thanks for being good citizens!

    Thanks for being good citizens!

    I understand many people looked down upon such bots. I personally prefer this current Human Vs Human situation with captcha than the Human Vs Bot situation before.

    But overall the booking system has been flawed in the first place. I was able to get a slot myself manually by quick response, and with time it got more and more difficult for my friends and family. Online booking itself is exclusionary (my dad would have never been able to book by himself).

    What I liked about this project was that it was shared with the community to be used, many people built on top of it, fixed bugs and made it better (someone could have kept the tool for themselves and this would have never been addressed).

    Cheers for the mindset to serve the community. I have seen people get a slot with this tool who never would have gotten one manually.

    Stay safe!

    Note: I would request the owner of this repo to pin this so that people could read the positive intentions behind this project.

    enhancement 
    opened by bombardier-gif 13
  • New issue: Porgram taps out after trying one round , please check!

    New issue: Porgram taps out after trying one round , please check!

    Getting this msg after one round of 15mins or probably lesser time. +++++++++++++++++ Try for a new Token? (y/n Default y): y Requesting OTP with mobile number xxxxxxx.. Unable to Create OTP

    ERROR: The request could not be satisfied

    403 ERROR

    The request could not be satisfied.


    Request blocked. We can't connect to the server for this app or website at this time. There might be too much traffic or a configuration error. Try again later, or contact the app or website owner.
    If you provide content to customers through CloudFront, you can find steps to troubleshoot and help prevent this error by reviewing the CloudFront documentation.

    Generated by cloudfront (CloudFront)
    Request ID: KNZjNfiAxHnDP6lR_NLhpRdjtEPLkjI2p0tKapzdOVWn2yNvZg26rA==
    
    Press any key to continue . . . Enter OTP:
    opened by sixfooter 12
  • look for slots from today

    look for slots from today

    Few of the hospitals offer their slots early in the morning for the same day. The current script starts looking for slots from tomorrow, so we will need to change "check_calendar_by_district" and "check_calendar_by_pincode" to "today" instead of "tomorrow".

    enhancement 
    opened by bitshiftr 12
  • Kerala specific!

    Kerala specific!

    Great job - however, the slot booking mechanism looking at just next 7 days, is quite Kerala specific. In other states, they are opening up slots for 10 days or more at once. We need to give users an option on how many days they want to look for

    Edit: I see the 7 days is coming from the API limitations - perhaps a begin date argument?

    enhancement 
    opened by mrms123 12
  • Script gets exited when there is no response from fetch slot API

    Script gets exited when there is no response from fetch slot API

    Due to heavy load sometimes the API used for fetching the slots availability returns no response. As a result the exe program gets exited with beep saying NoneType cannot be iterated.

    User have to start whole script again.

    not-an-issue 
    opened by agabhane 10
  • Captcha decode done by @ayushchd

    Captcha decode done by @ayushchd

    Most of us here might have seen his work on Cowin captcha decoding in JS. I am not JS dev so can any JS dev explain what he is doing I am pasting below the code he used in the extension. I have Opened this issue here as its an active communityand also in his repo no one is answering anything.

    
    
    function sleep(ms) {
        return new Promise(resolve => setTimeout(resolve, ms));
    }
    
    var STOP_BOT = false
    var COWIN_BOT_RUNNING = false
    var COWIN_BOT_ITER = 0
    
    var model = "eyJNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExMUUxMTFFMTFFaIjoiMiIsIk1MTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMTFFMTFFMTFFMTFFMTFFMTFFMTExMUUxMUUxMUUxMUUxMUUxMUUxMTExMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiMyIsIk1MTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFaTUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFaIjoiNCIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMTExMUUxMTFFMTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTExRTExRTExRTExRTExRWiI6IjUiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExRWiI6IjYiLCJNTExRTExRTExMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTExRTExRTExRTExMUUxMUUxMUUxMUUxMUVpNTExMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExMTFFMTFFMTFFMTFFMTFFMTExRTExMUUxMUUxMUUxMTFFaIjoiNyIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExMUUxMUUxMUUxMUUxMTExMUUxMUUxMUUxMUUxMTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExMUUxMUUxMUUxMUUxMUUxMUVoiOiI4IiwiTUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExMUVpNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWiI6IjkiLCJNTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMTFFMTExRWiI6InYiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMTFFMTFFMTFFMTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRWiI6IloiLCJNTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJkIiwiTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExMUVoiOiJ4IiwiTUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUVoiOiJNIiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMTFFMTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTExMTFFMTExRTExRTExMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMWk1MTFFMTFFMTFFMTFFMTExRTExMUUxMTFFMTFFaIjoicCIsIk1MTFFMTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFaTUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRTExMUUxMTExRTExRTExMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiZiIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWiI6IkUiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWiI6Im4iLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJxIiwiTUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExMUVpNTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMTFFMTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFoiOiJ3IiwiTUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJXIiwiTUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJKIiwiTUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJUIiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTExRTExRTExRTExRWk1MTExRTExMTExRTExMUUxMUUxMUUxMUUxMUUxMUVoiOiJCIiwiTUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiSCIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTExMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFpNTExMWiI6InIiLCJNTExRTExRTExRTExRTExRTExRTExRTExMUUxMUVpNTExRTExMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRWiI6InkiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTExMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRWiI6InUiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTExRTExRTExRTExRTExRTExMUUxMTExRTExRWk1MTExRTExRTExRTExRTExRTExRTExRWiI6ImoiLCJNTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExMUUxMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWiI6IlMiLCJNTExMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMTExRTExRTExRTExMUUxMUVoiOiJzIiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJDIiwiTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUVpNTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFoiOiJHIiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRWiI6ImIiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMTFFMTFFaIjoiaCIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMWk1MTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJOIiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRWiI6InoiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTExRTExRWk1MTExaIjoibSIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUVoiOiJYIiwiTUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTExRTExRTExRTExRTExRWk1MTFFMTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExMUUxMUUxMUVoiOiJ0IiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTExRTExMUUxMUUxMUUxMUUxMUVpNTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTExMTFFMTFFMTFFaIjoiUSIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTExRTExMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTExMUUxMUUxMUUxMUUxMUUxMTFFMTExRTExRTExMUUxMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJnIiwiTUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiViIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExRTExRWk1MTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiYSIsIk1MTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFaTUxMTFFMTFFMTFFMTFFMTFFMTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExMUVoiOiJBIiwiTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUVoiOiJGIiwiTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJVIiwiTUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMTFFMTFFMTFFaTUxMTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFaTUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiUiIsIk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVpNTExRTExRTExRTExMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJEIiwiTUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUVpNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTExRTExRTExRWiI6ImMiLCJNTExRTExRTExRTExRTExRTExRTExRTExRTExRTExMUUxMUUxMUUxMUVpNTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUVoiOiJrIiwiTUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExMTExRWk1MTFFMTFFMTFFMTExRTExRTExMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaIjoiSyIsIk1MTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExMUUxMUUxMUUxMUUxMUUxMUUxMTFFaTUxMUUxMUUxMUUxMUUxMUVpNTExRTExMTFFMTFFMTFFaIjoiZSIsIk1MTExRTExRTExRTExRTExRTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTExRTExRTExRTExRTExaIjoiWSIsIk1MTFFMTFFMTExRTExRTExRTExRWk1MTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFMTFFMTFFMTFFMTFFaTUxMUUxMUUxMUUxMUUxMUUxMUUxMUUxMTFFaIjoiUCJ9"
    
    var parsed_model = JSON.parse(atob(model))
    var parser = new DOMParser();
    async function go({state, age, vaccine, type, n, mode, searchIntervalInSeconds, appointmentSlot, searchType='districts', pincodes=[], districts=[], runs=1, skipDays=1, weeks=1}) {
        try {
            console.log({runs})
            var foundSlot = false
            for (var iter=0; iter < runs; iter++) {
                COWIN_BOT_ITER = iter
                console.log({STOP_BOT})
                if (STOP_BOT) {
                  STOP_BOT = false
                  COWIN_BOT_RUNNING = false
                  break
                }
                chrome.runtime.sendMessage({iter});
                if (!state) return
                // var script = document.createElement('script');script.src = "https://code.jquery.com/jquery-3.4.1.min.js";document.getElementsByTagName('head')[0].appendChild(script);
                await sleep(300)
                if (searchType === "districts") {
                    if ($("mat-label:contains('Select State')").length === 0) {
                        $(".status-switch")[0].click()    
                    }
                    if (iter === 0) {
                        console.log("Selecting State", state)
                        await sleep(500)
                        $("mat-select")[0].click()
                        await sleep(1000)
                        $(".mat-option-text").each( (i, e) => { if ($(e).text().trim() === state) $(e).click() })
                        await sleep(500)
                        console.log("Waiting for districts to load")
    
                        do {
                            $("mat-select")[1].click()
                            await sleep(100)
                            district_options = $(".mat-option-text")
                            if (districts.length == 0) {
                                districts = $(".mat-option-text").map((x, e) => $(e).text())
                            }
                        } while (district_options.length === 0)
                    }
                    console.log(district_options.length, " Districts loaded")
                    console.log("Search across districts: ", districts)
                } else {
                    if ($("mat-label:contains('Enter your PIN')").length === 0) {
                        $(".status-switch")[0].click()    
                    }
                }
                
                const search_queries = searchType === "districts" ? districts : pincodes;
                for (i = 0; i < search_queries.length; i++) {
                    if (STOP_BOT) {
                      STOP_BOT = false
                      COWIN_BOT_RUNNING = false
                      return
                    }
                    if (searchType === "districts") {
                        if (iter === 0 || search_queries.length > 1) {
                            $("mat-select")[1].click()
                            await sleep(100)
                            $(".mat-option-text").each( (_, dEle) => { 
                                if ($(dEle).text().trim().toLowerCase() === districts[i].trim().toLowerCase()) {
                                    $(dEle).click() 
                                }
                            })
                        }
                        $(".district-search")[0].click()
                    } else {
                        $($("input[formcontrolname='pincode']")[0]).val(pincodes[i])
                        $("input[formcontrolname='pincode']")[0].dispatchEvent(new Event("input", { bubbles: true }));
                        await sleep(100)
                        $(".pin-search-btn")[0].click()
                    }
                    var week = 0
                    do {
                        if (week > 0) {
                            console.log("NEXT WEEK")
                            $(".carousel-control-next-icon")[0].click()
                        }
                        await sleep(100)
                        var j = 0
                        while (true) {
                            list = $("mat-selection-list mat-list-option")
                            not_available = $(".available-para")
                            if (list.length > 0 || not_available.length > 0) {
                                console.log("Response received")
                                break
                            }
                            j += 1
                            if (j >= 10) {
                                break
                            }
                            await sleep(500)
                        }
                        console.log({list, not_available})
                        if ((age || vaccine || type) && (week == 0)) {
                            console.log("Setting filters", {week})
                            $("div.agefilterblock label").each( (i, e) => { if ([age, vaccine, type].indexOf($(e).text().trim()) >= 0) $(e).click() })
                            await sleep(100);
                        }
                        foundSlot = false
                        var slotRows = $("ul.slot-available-wrap") || []
                        for (var ii = 0; ii < slotRows.length; ii++) {
                            var e = $(slotRows[ii]);
                            var isSlotBooked = true
                            var slots = $(e).find("li a")
                            for (var g = 0; g < slots.length; g++) {
                                if (week == 0 && g < skipDays) {
                                    continue
                                }
                                var slot = $(slots[g])
                                if ((parseInt($(slot).text().trim()) || 0) >= n) {
                                    isSlotBooked = false
                                    if (mode === 1) {
                                        $(slot).parents('.slots-box')[0].click()
                                        k = 0;
                                        while (k<=5) {
                                            if ($("ion-button.time-slot").length > 0) {
                                                break
                                            }
                                            k++;
                                            await sleep(300)
                                        }
                                        if ($("ion-button.time-slot").length > 0) {
                                            foundSlot = true
                                            chrome.runtime.sendMessage({"status": "slot_found"})
                                            console.log("HERE")
                                            break
                                        }
                                        
                                    }
                                }
                            }
                            if (isSlotBooked) {
                                // $(e).parents('.mat-list-text')[0].remove()
                            }
                            if (foundSlot) {
                                break
                            }
                        }
                        if (foundSlot) {
                            break
                        } else {
                            // console.log("Waiting to go to next week")
                            week++
                        }
                    } while (week <= weeks)
                    if (!foundSlot) {
                        // go back X weeks
                        for (var w = 0; w < weeks; w++) {
                            console.log("Going back 1 week")
                            $(".carousel-control-prev-icon")[0].click()
                            j = 0
                            while (true) {
                                list = $("mat-selection-list mat-list-option")
                                not_available = $(".available-para")
                                if (list.length > 0 || not_available.length > 0) {
                                    console.log("Response received")
                                    break
                                }
                                j += 1
                                if (j >= 15) {
                                    break
                                }
                                await sleep(500)
                            }
                        }
                    }
                    if (foundSlot) {
                        try {
                            $("ion-button.time-slot")[appointmentSlot-1].click()
                        } catch (e) {
                            $("ion-button.time-slot")[0].click()
                        }
                        
                        var svg;
                        j = 0
                        while (j <= 15) {
                            try {
                                await sleep(350)
                                svg = parser.parseFromString(atob($("img#captchaImage").attr("src").split("base64,")[1]), "image/svg+xml");
                                break;
                            } catch (e) {
                                console.log(e)
                            }
                            j += 1;
                        }
                        
                        $(svg).find('path').each((_, p) => { if($(p).attr('stroke') != undefined) $(p).remove()})
                        vals = []
                        $(svg).find('path').each(
                            (_, p) => { 
                                idx = parseInt($(p).attr("d").split(".")[0].replace("M", ""))
                                vals.push(idx)
                            }
                        )
                        var sorted = [...vals].sort(function(a,b) { return a - b; })
                        var solution = ['', '', '', '', '']
                        
    
                        $(svg).find('path').each(
                            (idx, p) => { 
                                var pattern = $(p).attr('d').replace(/[\d\.\s]/g, "")
    
                                solution[sorted.indexOf(vals[idx])] = parsed_model[pattern]
                            })
                        await sleep(100)
                        $($(".captcha-style input")[0]).focus();
                        chrome.runtime.sendMessage({"status": "entering_captcha"});
                        for (var ii=0; ii<5; ii++) {
                            $($(".captcha-style input")[0]).val(solution.join("").substr(0, ii+1));
                            await sleep(100)
                            $(".captcha-style input")[0].dispatchEvent(new Event("keyup", { bubbles: true }));
                            await sleep(100)
                        }
                        await sleep(500)
                        $("ion-button.confirm-btn")[0].click()
                        chrome.runtime.sendMessage({"status": "loading"});
                        while(1) {
                            if (document.getElementsByClassName("thank-you-header").length > 0) {
                                chrome.runtime.sendMessage({"status": "appointment_successful"});
                                break
                            }
                            await sleep(500)
                        }
                    }
    
                    if (mode === 1 && foundSlot)
                        break
                    console.log("Waiting", searchIntervalInSeconds*1000)
                    await sleep(searchIntervalInSeconds*1000)
              }
              if (foundSlot && mode === 1) {
                  break
              } 
            }
        } catch (e) {
            console.error(e)
        }
        COWIN_BOT_RUNNING = false
        chrome.runtime.sendMessage({"status": "complete"});
    }
    
    
    chrome.runtime.onMessage.addListener(({args, stop, query}) => {
        console.log({args, stop, query})
        if (query) {
            chrome.runtime.sendMessage({iter: COWIN_BOT_ITER, running: COWIN_BOT_RUNNING});
        }
        if (args) {
          STOP_BOT = false
          if (!COWIN_BOT_RUNNING) {
              COWIN_BOT_RUNNING = true
              go(args)
          }
          
        }
        if (stop) {
          STOP_BOT = true
        }
    });
    
    
    
         
    
    
    
    
    }
    
    opened by Vishvajeet590 8
  • Vaccine name included in beneficiary even on cancellation - influences vaccine preference input

    Vaccine name included in beneficiary even on cancellation - influences vaccine preference input

    A condition arises where "preferred vaccine choice" is not offered anymore. When a appointment was cancelled (in this case it was auto cancelled by the system - appears to be some internal error), the beneficiary details list the vaccine name even though status indicates "Not Vaccinated". (snipped below) This leads to a condition where the program does not offer the choice of vaccination anymore and the vaccine (COVISHIELD in below snip) is chosen by default.

    Simple workaround was to save as json and edit out the vaccine and preference details from the json and rerun.

    An enhancement could be considered in automatically choosing the vaccine only if status is "Partially Vaccinated"

    beneficiary_dtls : +-------+----------------+---------------------------------+-----------+-------+----------------+ | idx | bref_id | name | vaccine | age | status | +=======+================+=================================+===========+=======+================+ | 1 | xxxxxxx | John | COVISHIELD | nn | Not Vaccinated | +-------+----------------+---------------------------------+-----------+-------+----------------+ | 2 | xxxxxxx | Snow .. | COVISHIELD | nn | Not Vaccinated | +-------+----------------+---------------------------------+-----------+-------+----------------+

    bug 
    opened by vinayd2 8
  • Re-scheduling of appointment

    Re-scheduling of appointment

    Hey buddy! Thanks a lot for your code, it's very helpful. I'm trying to understand if the code works for people who have already booked an appointment, but couldn't get vaccinated (technical issues in cowin sent me to non-functional vaccination centres, TWICE!). Would the code be able to re-schedule for people who already have a back-dated appointment?

    If not, could you give me a hint as to what part of the code I could modify to make it work?

    opened by aswinjayan94 8
  • Token is invalid issue

    Token is invalid issue

    After about 19 minutes when the code is running and giving me list of centers - it throws an issue Token is INVALID.. Next update in 1 seconds. OR press 'Ctrl + C' to refresh now.. Try for a new Token? (y/n Default y): Traceback (most recent call last): File "C:\Users\ZT258SH\Downloads\Python vaccine simulation\covid-vaccine-booking-main\src\covid-vaccine-slot-booking.py", line 114, in main() File "C:\Users\ZT258SH\Downloads\Python vaccine simulation\covid-vaccine-booking-main\src\covid-vaccine-slot-booking.py", line 97, in main tryOTP = input('Try for a new Token? (y/n Default y): ')

    Kindly help

    opened by HSJ161994 0
  • Script no longer works

    Script no longer works

    Looks like there are so many changes on cowin website on daily basis.

    1. You can only book slot for one person irrespective of how many members are added.
    2. No need of captcha.
    3. New centre does not show on website.

    Not sure if anyone will making any changes accordingly.

    opened by vivek076 0
  • update logic from 18+ to 18-44 - Issue #218

    update logic from 18+ to 18-44 - Issue #218

    Check if session['min_age_limit'] is 18. If 18, append to options only if min_age_booking is 44 or lower. if not 18, append to options since its filtered already

    Not the most efficient way to do it, but it should work

    opened by TanmayChhatbar 0
  • issue while opening the cdm

    issue while opening the cdm

    C:\Temp\covid-vaccine-booking-main>python src\covid-vaccine-slot-booking.py Traceback (most recent call last): File "C:\Temp\covid-vaccine-booking-main\src\covid-vaccine-slot-booking.py", line 5, in import requests, sys, argparse, os, datetime ModuleNotFoundError: No module named 'requests'

    opened by thanneruakhil 3
  • Added Appointment Slip Download Functionality and Code Re-structured

    Added Appointment Slip Download Functionality and Code Re-structured

    • Will Download Appointment Slip directly if appointment booked.
    • Code re-structured for better visibility and understanding.
    • Original PR #258 but changing due to conflict reasons.
    opened by dhhruv 0
Releases(v1.2)
UniHub API is my solution to bringing students and their universities closer

🎓 UniHub API UniHub API is my solution to bringing students and their universities closer... By joining UniHub, students will be able to join their r

Abdelbaki Boukerche 5 Nov 21, 2021
Python based Algo trading bot for Nifty / Banknifty futures and options

Fully automated Alice Blue Algo Trading with Python on NSE and MCX for Nifty / Crude / Banknifty futures and options , absolutely FREE ! This algo tra

Rajesh Sivadasan 49 Dec 31, 2022
This project is based on discord.py and is meant to be a 'Quick Start Bot' to cut down on the time it takes to write complex discord bots.

This project is based on discord.py and is meant to be a 'Quick Start Bot' to cut down on the time it takes to write complex discord bots.

Alec Ibarra 1 Mar 03, 2022
A Discord Self bot written in python

WitheredBot A Discord Self bot written in python Requirement Python = 3.9 How to Configure git clone https://github.com/a-a-a-aa/WitheredBot.git cd W

......... 0 Jan 05, 2023
A superb Telegram VoiceChat Player. Powered by FalconRoBo.

𝕱𝖆𝖑𝖈𝖔𝖓𝕸𝖚𝖘𝖎𝖈 A sᴜᴘᴇʀʙ Tᴇʟᴇɢʀᴀᴍ VᴏɪᴄᴇCʜᴀᴛ Pʟᴀʏᴇʀ, ᴍᴀᴅᴇ ᴜsɪɴɢ Lᴀᴛᴇsᴛ Pʏᴛʜᴏɴ ᴀɴᴅ Pʏʀᴏɢʀᴀᴍ. 𝑷𝒐𝒘𝒆𝒓𝒆𝒅 𝒃𝒚 𝑭𝒂𝒍𝒄𝒐𝒏𝑹𝒐𝑩𝒐 FalconMusic

FalconRoBo 2 Oct 21, 2022
Software com interface gráfica para criar postagens anônimas no Telegra.ph do Telegram e compartilhar onde quiser...

Software com interface gráfica para criar postagens anônimas no Telegra.ph do Telegram e compartilhar onde quiser...

Elizeu Barbosa Abreu 4 Feb 05, 2022
This repository is used to simplify the process of cloning the SSM documents across the AWS regions.

SSM Cloner Introduction This module is created in order to simplify the process of copying the SSM documents from one region to another regions. As an

6 Jun 04, 2022
Texting service to receive current air quality conditions and maps, powered by AirNow, Twilio, and AWS

The Air Quality Bot is generally available by texting a zip code (and optionally the word "map") to (415) 212-4229. The bot will respond with the late

Alex Laird 8 Oct 16, 2022
Simple Craigslist wrapper

python-craigslist A simple Craigslist wrapper. License: MIT-Zero. Disclaimer I don't work for or have any affiliation with Craigslist. This module was

Julio M. Alegria 370 Dec 22, 2022
A telegram bot that messages you available vaccine appointments in the Veneto region

Serenissimo, domande frequenti Chi sei? Sono Alberto Granzotto, libero professionista a Berlino. Mi occupo di servizi software, privacy, decentralizza

vrde 31 Sep 30, 2022
GroupMenter : New Telegram Group Manager Bot🔸Fast 🔸Python🔸Pyrogram 🔸

GroupMenter An PowerFull Group Manager Bot. Written In Pytelethon. Info • A modular Telegram Python bot running on python3. • Can be found on telegram

Group Menter 24 Jun 28, 2022
Awslogs - AWS CloudWatch logs for Humans™

awslogs awslogs is a simple command line tool for querying groups, streams and events from Amazon CloudWatch logs. One of the most powerful features i

Jorge Bastida 4.5k Dec 30, 2022
CDBEC: Catware DataBase Encryption Client

CDBEC: Catware DataBase Encryption Client Описание CDBEC - клиент для создания, просмотра и редактирования .db-catencrypted списков, шифруемых при пом

Catware-Foundation 2 Nov 03, 2022
Building and deploying AWS Lambda Shared Layers

AWS Lambda Shared Layers This repository is hosting the code from the following blog post: AWS Lambda & Shared layers for Python. The goal of this rep

Flaneer 7 Dec 02, 2021
Savecontentbot - Telegram Save Content Bot With Same more Features

Save Restricted Content Bot A simple telegram bot to save restricted content wit

Group Dc Bots 3 Jan 26, 2022
An advanced telegram country information finder bot.

Country-Info-Bot-V2 An advanced telegram country information finder bot Made with Python3 (C) @FayasNoushad Copyright permission under MIT License Lic

Fayas Noushad 16 Nov 12, 2022
A modern Python client for controlling Wyze devices.

Python Wyze SDK A modern Python client for controlling Wyze devices. Whether you're building a custom app, or integrating into a third-party service l

Shaun Tarves 205 Jan 02, 2023
We have made you a wrapper you can't refuse

We have made you a wrapper you can't refuse We have a vibrant community of developers helping each other in our Telegram group. Join us! Stay tuned fo

20.6k Jan 04, 2023
The Python SDK for the BattleshAPI game

BattleshAPy The Python SDK for the BattleshAPI game Installation This library will be eventually going on PyPI, but until then, simply clone or downlo

Christopher 0 Apr 18, 2022
An powerfull telegram group management anime themed bot.

ErzaScarlet Erza Scarlet is the female deuteragonist of the anime/manga series Fairy Tail. She is an S-class Mage from the Guild Fairy Tail. Like most

ꜱōʜᴇʀᴜ ᴋāɴ (AKA) ꜱᴏʜᴀɪʟ ᴋʜᴀɴ 2 May 19, 2022