Giter VIP home page Giter VIP logo

southwestcheckin's Introduction

SW Checkin

Build Status Maintainability Test Coverage Docker Build Status Docker Image Size

This python script checks your flight reservation with Southwest and then checks you in at exactly 24 hours before your flight. Queue up the script and it will sleep until the earliest possible check-in time.

Contributors

Requirements

This script can either be ran directly on your host or within Docker.

Host

  • Python (should work with 2.x or 3.x thanks to @ratabora)
  • pip

Docker

  • Docker (tested with 1.12.6)

Setup

Host

Install Base Package Requirements

$ pip install -r requirements.txt

Usage

$ python ./checkin.py CONFIRMATION_NUMBER FIRST_NAME LAST_NAME

Docker

Usage

$ sudo docker run -it pyro2927/southwestcheckin:latest CONFIRMATION_NUMBER FIRST_NAME LAST_NAME

southwestcheckin's People

Contributors

bllfr0g avatar janina213 avatar nickethier avatar pyro2927 avatar raikia avatar ratabora avatar rgkimball avatar tashey33 avatar the001 avatar unusedaccount avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

southwestcheckin's Issues

Docker image creates other docker containers

I have this docker image running on my unraid NAS system.

One thing I have noticed that is weird while running this script through the docker image I see other docker containers spawn from this using the standard docker random naming convention (i.e. adoring_wright, compassionate_poitras, etc.)

Is this something that can be explained by how this docker file is set up or something else?

waiting too long

Hello,
My trip has 2 legs, and it looks like it is checking in for the first leg and not the second leg.

fails to checkin

Hi - tried to use this today but seemed to fail on checkin with

Attempting check-in...
{'Content-Type': 'text/plain; charset=UTF-8', 'Content-Length': '163', 'X-Ion-Hop': '1', 'Expires': 'Fri, 29 Oct 2021 18:10:07 GMT', 'Cache-Control': 'max-age=0, no-cache, no-store', 'Pragma': 'no-cache', 'Date': 'Fri, 29 Oct 2021 18:10:07 GMT', 'Connection': 'close', 'Set-Cookie': 'sRpK8nqm_sc=A0ykPs18AQAASUktv0QKsifXwOqWrldyLXqwWA5wJjp2mkShDEH-WR5YN4-HARiD-4XURuIX6ZsAAAAAAAAAAA|1|0|8ab7547910bf16db0355a53d23aed8ca9fd2d15f; Path=/; Max-Age=31556952; Domain=southwest.com; Secure', 'Server-Timing': 'cdn-cache; desc=MISS, edge; dur=30, origin; dur=142', 'X-Frame-Options': 'SAMEORIGIN', 'Strict-Transport-Security': 'max-age=2628000'}
{
"code": 429999999,
"message": "Error.",
"messageKey": "ERROR",
"httpStatusCode": "BAD_REQUEST",
"requestId": "",
"infoList": []
}

Docker logs

Because you are using print as the method to show output, in docker you will not get an appropriate log response.

I recommend

python ./checkin.py $@

Changing that to

  python -u ./checkin.py $@

Too many redirects for openflights.org

I'm getting "too many redirects" error from the call to openflights.org to get the timezone for the airport.

The workaround I'm using for now is hardcoding the timezone for the airports. Seems like the openflights site is down: any alternatives?

Doesn't seem to work any more?

Script worked fine for me on Sunday April 7. Today, April 8, I just get a bunch of blank lines and then an error message. Tried on multiple machines.

Anyone else getting the same thing? Did SouthWest change the API?

404 Response up until 24 hours

So the script now crashes when you try to run it more than 24 hours in advance of your checkin. This is because southwest is returning a "<Response [404 ]>" prior to 24 hours in advance. This means the script can't get the take off time and sleep right up to check in time.

The crash happens in auto_checkin and is tied to "for leg in body['bounds']" but the real issue is in southwest/southwest.py, where the value for "r" below is "<Response [404]>" up until 24 hours in advance of checkin.

    def safe_request(self, url, body=None):
        try:
            attempts = 0
            headers = Reservation.generate_headers()
            while True:
                if body is not None:
                    r = requests.post(url, headers=headers, json=body)
                else:
                    r = requests.get(url, headers=headers)
                data = r.json()

first name has two character

Hi pyro2927,

My first name has two words in it. Should I put a space in it like the usage below?

python ./checkin.py CONFIRMATION_NUMBER FIRST_NAME_1 FIRST_NAME_2 LAST_NAME

Thanks!

docopt import error

The script hasn't been working on my system. It throws an error:

Traceback (most recent call last):
  File "./checkin.py", line 18, in <module>
    from docopt import docopt
ImportError: No module named docopt

I tried installing docopt multiple times using pip/pip3 commands. None work.

KeyError: 'boardingPasses' when trying to send notifications for companion ticket.

Sorry! This reservation is not eligible for check in.
Sorry! This reservation is not eligible for check in.
Sorry! This reservation is not eligible for check in.
Sorry! This reservation is not eligible for check in.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Attempting check-in...
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "./checkin.py", line 43, in schedule_checkin
    data = reservation.checkin()
  File "/home/pi/Desktop/SouthwestCheckin/southwest/southwest.py", line 83, in checkin
    self.send_notification(confirmation)
  File "/home/pi/Desktop/SouthwestCheckin/southwest/southwest.py", line 90, in send_notification
    info_needed = checkindata['_links']['boardingPasses']
KeyError: 'boardingPasses'

Not sure if this is related to #23
Attempted to check in for two tickets. One for the original ticket holder and one for the companion. They had different confirmation numbers. The check-in worked just not the notification.

TypeError: request() got an unexpected keyword argument 'json'

Run from python 2.7 (not docker, which failed see other ticket) on amazon ec2 errors on recent trip.

Attempting check-in...
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 804, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 757, in run
    self.__target(*self.__args, **self.__kwargs)
  File "./checkin.py", line 43, in schedule_checkin
    data = reservation.checkin()
  File "/home/ec2-user/swc/SouthwestCheckin/southwest/southwest.py", line 81, in checkin
    confirmation = self.load_json_page(url, info_needed['body'])
  File "/home/ec2-user/swc/SouthwestCheckin/southwest/southwest.py", line 59, in load_json_page
    data = self.safe_request(url, body)
  File "/home/ec2-user/swc/SouthwestCheckin/southwest/southwest.py", line 42, in safe_request
    r = requests.post(url, headers=headers, json=body)
  File "/usr/lib/python2.7/dist-packages/requests/api.py", line 88, in post
    return request('post', url, data=data, **kwargs)
  File "/usr/lib/python2.7/dist-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
TypeError: request() got an unexpected keyword argument 'json'

TypeError: 'NoneType' object is not subscriptable -- for leg in body['bounds']:

Hitting the following error while trying to set up a checkin

Traceback (most recent call last):
File "./checkin.py", line 103, in
auto_checkin(reservation_number, first_name, last_name, notifications)
File "./checkin.py", line 60, in auto_checkin
for leg in body['bounds']:
TypeError: 'NoneType' object is not subscriptable

No Tests :(

This project has almost zero tests ๐Ÿ˜ข. I would love it if it had some, but I'm still relatively new to python testing and have no idea the best way to do it.

I can happily supply Southwest API end-point data (grabbed using Charles) if needed.

open

It seams like openflights does not allow api calls anymore, there is a timestamp in shareDetails entry when loading reservation that contains timestamp

Traceback (most recent call last):
  File "./checkin.py", line 101, in <module>
    auto_checkin(reservation_number, first_name, last_name, verbose)
  File "./checkin.py", line 66, in auto_checkin
    airport_tz = openflights.timezone_for_airport(leg['departureAirport']['code'])
  File "/usr/src/app/southwest/openflights.py", line 14, in timezone_for_airport
    airport_tz = pytz.timezone(json.loads(tzresult.text)['airports'][0]['tz_id'])
  File "/usr/local/lib/python3.7/json/__init__.py", line 348, in loads
    return _default_decoder.decode(s)
  File "/usr/local/lib/python3.7/json/decoder.py", line 337, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "/usr/local/lib/python3.7/json/decoder.py", line 355, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

Check-in has failed a lot recently

I have been getting error messages like this and not getting checked in.

Sorry! This reservation is not eligible for check in.
Sorry! This reservation is not eligible for check in.
Sorry! This reservation is not eligible for check in.
This flight is currently not ready for check-in. Please try again momentarily.
This flight is currently not ready for check-in. Please try again momentarily.
This flight is currently not ready for check-in. Please try again momentarily.
This flight is currently not ready for check-in. Please try again momentarily.
This flight is currently not ready for check-in. Please try again momentarily.
Attempting check-in...
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.

I will run in verbose mode on upcoming check ins to get more useful output.

Fails to checkin

Returns a 429 response with this body
{ "code": 429999999, "message": "Error.", "messageKey": "ERROR", "httpStatusCode": "BAD_REQUEST", "requestId": "", "infoList": [] }
and response headers:
{'Content-Type': 'text/plain; charset=UTF-8', 'Content-Length': '163', 'X-Ion-Hop': '1', 'Expires': 'Wed, 13 Apr 2022 09:35:39 GMT', 'Cache-Control': 'max-age=0, no-cache, no-store', 'Pragma': 'no-cache', 'Date': 'Wed, 13 Apr 2022 09:35:39 GMT', 'Connection': 'close', 'Set-Cookie': 'sRpK8nqm_sc=A21LRyKAAQAAT0AFOnsQkl1ODo8qf8IwHSsdb-GiWlvMxxYtZWfIer_tienRAS1X1nTURuIXFooAAAAAAAAAAA|1|0|bfbddfacd00dffc14ffd69663365d3a90b463ae0; Path=/; Max-Age=1577847600; Domain=southwest.com; Secure', 'X-Frame-Options': 'SAMEORIGIN', 'Strict-Transport-Security': 'max-age=31536000', 'terms-of-service': "Unauthorized access, display, or use of Southwest's Company Information, including fare data, is prohibited by the Terms & Conditions on Southwest.com and Swabiz.com."}

sleep length is too large

Too early to check in. Waiting 1485 hours, 16 minutes, 20.724372999742627 seconds
Exception in thread Thread-1:
Traceback (most recent call last):
File "H:\Users\Mark\AppData\Local\Programs\Python\Python36\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "H:\Users\Mark\AppData\Local\Programs\Python\Python36\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "checkin.py", line 42, in schedule_checkin
time.sleep(delta)
OverflowError: sleep length is too large

Reverse Engineer Mobile API

@hoopsbwc34 and I have been digging into other API requests the mobile app has been making, and it appears that you can get to a lot more functionality when you're authenticated. There is this really weird init type stuff happening though, and it processes a ton of Javasctipt to build out headers for all future API requests to use.

The general flow seems to be:

Call Init Script

There are both iOS and Android "init" scripts. These are called with a GET request and return some json.

Process Kernel

Within the returned json, there is a kernel key that appears to contain a ton of Javascript. Both iOS and Android have Javascript runtimes, and at this point I'm assuming these chunks of JS are executed against the local runtime, and have a dictionary returned to them of key/value pairs.

Attach to All Requests

I'm going to pseudo-code this, but it appears it attaches the JS result to all future headers:

prefix = result.json()['nativeSignalHeaderPrefix']
js_results = #some JS eval here returning a dict
for k, v in js_results.items():
  headers.append(prefix + k, v)

The removal of any of these headers results in an invalid request response from the server:

{
    "code": 429999999,
    "message": "Your request could not be completed at this time. Please try again later.",
    "messageKey": "ERROR__ACCESS",
    "httpStatusCode": "BAD_REQUEST",
    "requestId": "",
    "infoList": []
}

Companion Reservations are not able to be pulled

Getting the following error with a companion reservation:

Traceback (most recent call last):
  File "checkin.py", line 125, in <module>
    auto_checkin(reservation_number, first_name, last_name)
  File "checkin.py", line 94, in auto_checkin
    body = lookup_existing_reservation(reservation_number, first_name, last_name)
  File "checkin.py", line 62, in lookup_existing_reservation
    return data['viewReservationViewPage']
KeyError: 'viewReservationViewPage'

The parent reservation is working

Return flight not properly checked in.

The return flight for my last trip was not properly checked in. The script tried to check in at the proper time, but somehow didn't actually check in the return flight. Instead, it captured the boarding information from the outbound flight. This return flight was on the same day as the outbound flight. There were also two people traveling on the same reservation. I'm not sure if these are factors in the problem.

Here is the log:

swchkin-error.log

Add ARM images to docker builds

Right now only x86 images are build, making the tool unusable on ARM devices. It should be fairly easy to add multi-architecture support to the docker builds.

#63 has additional context.

No module named 'openflights'

Thank you so much for this tool! However, for some reason I am receiving this error:

Traceback (most recent call last):
  File "./checkin.py", line 26, in <module>
    import openflights
ModuleNotFoundError: No module named 'openflights'

Any help would be greatly appreciated!

Error: geopy.exc.GeocoderQuotaExceeded

I got this error with the geopy lib, it seems like Google is unhappy? I'm not particularly familiar with this lib, but maybe we need to get a Google API key.

Traceback (most recent call last):
  File "checkin.py", line 124, in <module>
    auto_checkin(reservation_number, first_name, last_name)
  File "checkin.py", line 108, in auto_checkin
    point = g.geocode(airport).point
  File "/usr/local/lib/python2.7/dist-packages/geopy/geocoders/googlev3.py", line 217, in geocode
    self._call_geocoder(url, timeout=timeout), exactly_one
  File "/usr/local/lib/python2.7/dist-packages/geopy/geocoders/googlev3.py", line 338, in _parse_json
    self._check_status(page.get('status'))
  File "/usr/local/lib/python2.7/dist-packages/geopy/geocoders/googlev3.py", line 363, in _check_status
    'The given key has gone over the requests limit in the 24'
geopy.exc.GeocoderQuotaExceeded: The given key has gone over the requests limit in the 24 hour period or has submitted too many requests in too short a period of time.

name 'time' is not defined

Downloaded this yesterday and encountered this error today when checking in:
southwest.py", line 39, in safe_request time.sleep(CHECKIN_INTERVAL_SECONDS) NameError: name 'time' is not defined
Seems like when the moment came for 'safe_request' to run it couldn't find the time module - looks like the import statement for that is missing?

Docker Run errors

Running
$sudo docker run -it pyro2927/southwestcheckin:latest MyRes First Last [email protected]

Provides the following error

Traceback (most recent call last):
  File "./checkin.py", line 103, in <module>
    auto_checkin(reservation_number, first_name, last_name, notifications)
  File "./checkin.py", line 60, in auto_checkin
    for leg in body['bounds']:
TypeError: 'NoneType' object is not subscriptable

But takes the commands if I instead run
$ python ./checkin.py MyRes First Last [email protected]

Lint

Per the recommendation of @tpcstld, we should lint this repo w/ pep8 or pylint (hooked in via Travis CI).

Return flights?

When I run this script on a round-trip reservation it only seems to be able to check in to the first outgoing flight, is there something I'm missing?

Can't use the docker image with spaces in name

When trying to use the docker image, it will not accept spaces in the name as arguments. Quotes or no quotes, it doesn't work. It works fine when running directly using python.

Works:

python ./checkin.py ABCDEF FIRST 'LAST NAME' 

Doesn't work:

docker run -it pyro2927/southwestcheckin:latest ABCDEF FIRST 'LAST NAME'
Usage:
  checkin.py CONFIRMATION_NUMBER FIRST_NAME LAST_NAME [--email=<email_addr> | --mobile=<phone_num>] [-v | --verbose]
  checkin.py (-h | --help)
  checkin.py --version

Multiple attempts with safe_requests not always necessary

Great script! Love the use of the iOS app to simplify the interactions.

Currently safe_request() makes multiple attempts up to MAX_ATTEMPTS any time it is called. This is only needed when checking in with checkin(). Currently, if a user supplies a bad record or name, the script makes multiple requests even with bad inputs.

In the interest of keeping requests low impact, you could have something like <safe_request(url, body=None, retry=False)>, and supply retry = True only when needed, like when it's time to attempt a checkin. This way avoids hitting the server with lots of bad requests in the event bad inputs are provided.

Script doesn't wake up to check in

On my last two attempts to use the script, it did not wake up to check in. I'm running with Docker, both in Linux and Win10.

Each time I get:

Flight information found, departing City, State at Nov 22 04:55PM
Too early to check in.  Waiting 7 hours, 54 minutes, 32.77192600000126 seconds

And then nothing. It doesn't attempt the check in at all. I do not see anything in the logs, other than the message above.

Any ideas why it's not waking up and running again?

Doesn't work on international flights

International flights appear to require passport information to be entered before they are booked. No known API endpoints to submit this information at this time (mobile devices force you to go to web for checkin)

Script throws an error in the checkin request

.
.
.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Sorry! We can't check you into this flight. Please see a gate agent.
Attempting check-in...
Exception in thread Thread-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "checkin.py", line 109, in schedule_checkin
    data = checkin(number, first, last)
  File "checkin.py", line 80, in checkin
    return safe_request(url, info_needed['body'])['checkInConfirmationPage']
  File "checkin.py", line 48, in safe_request
    r = requests.post(url, headers=headers, json=body)
  File "/home/zxl/.local/lib/python2.7/site-packages/requests/api.py", line 88, in post
    return request('post', url, data=data, **kwargs)
  File "/home/zxl/.local/lib/python2.7/site-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
TypeError: request() got an unexpected keyword argument 'json'

Should we supply our own API keys?

I see there are hard coded API_KEY and USER_EXPERIENCE_KEY in the checkin script.

Should we be using these hard coded keys or should individuals obtain their own keys to avoid SWA rejecting these hardcoded API keys? If the latter is true, can we provide a brief description on how to obtain these keys from SWA?

Thanks for the work on this repo!

Error - Unable to check in

C:\Users\me\Dev\SouthwestCheckin>python` checkin.py ID FIRST LAST
Attempting to check in FIRST LAST at 15:45:30. Confirmation: ID

Flight information found, departing City, STATE at Jun 29 07:05 PM
Too early to check-in.  Waiting 3 hours, 19 minutes, 22.230052000000796 seconds
It is too early to check in for this trip. You can check in 24 hours before departure. Come back on Jun 28, 2023, when it is 7:05 PM in CITY
It is too early to check in for this trip. You can check in 24 hours before departure. Come back on Jun 28, 2023, when it is 7:05 PM in CITY
It is too early to check in for this trip. You can check in 24 hours before departure. Come back on Jun 28, 2023, when it is 7:05 PM in CITY
Attempting check-in...
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.
Error.

Not handling 429's gracefully

This may not be directly applicable since I only ran into the error condition after I changed the code in a fork (lowered retry sleep), but it still may make sense to add exception handling for the situation where Southwest rate limits requests and returns a 429. Thinking that adding an additional sleep (i.e. 5 seconds) may make sense.

Response

HTTP/1.1 429 Too Many Requests

Body

{
  "code": 429999999,
  "message": "Error.",
  "messageKey": "ERROR",
  "httpStatusCode": "BAD_REQUEST",
  "requestId": "",
  "infoList": []
}

For reference: https://datatracker.ietf.org/doc/html/rfc6585#section-4

Not Working Anymore

It seems as though the script is broken, it errors now when trying to pull in reservation info.

Issues building docker image

Running into package installation issues during docker build
unable to execute 'gcc': No such file or directory

Had to switch base image python version to non-alpine to get it to build successfully.

"Couldn't Check in : Boarding Pass can be obtained..."

Has there been a fix for this issue? This code worked great prior to their reservation system change in May and ever since it spits out a different number of these errors each time. I wonder if there is an API for the desktop version of the site that can be used?

Can not find any timezone configuration

I cloned the repo than run the sudo docker run -it pyro2927/southwestcheckin:latest CONFIRMATION_NUMBER FIRST_NAME LAST_NAME command but I'm getting the following error.

Unable to find image 'pyro2927/southwestcheckin:latest' locally
latest: Pulling from pyro2927/southwestcheckin
8e402f1a9c57: Pull complete 
cda9ba2397ef: Pull complete 
d7153c29df0e: Pull complete 
cbbf0d0a5ee3: Pull complete 
c142a4eca653: Pull complete 
e329b51c01e5: Pull complete 
b43049af01c5: Pull complete 
b65c5ad0a9ae: Pull complete 
1c813d1d44c4: Pull complete 
Digest: sha256:f79e3db08e9993bbe95963e6314a8a49c50ae9512b2fe0a944afc21380e24020
Status: Downloaded newer image for pyro2927/southwestcheckin:latest
Traceback (most recent call last):
  File "./checkin.py", line 104, in <module>
    auto_checkin(reservation_number, first_name, last_name, notifications)
  File "./checkin.py", line 55, in auto_checkin
    now = datetime.now(utc).astimezone(get_localzone())
  File "/usr/local/lib/python3.7/site-packages/tzlocal/unix.py", line 131, in get_localzone
    _cache_tz = _get_localzone()
  File "/usr/local/lib/python3.7/site-packages/tzlocal/unix.py", line 125, in _get_localzone
    raise pytz.UnknownTimeZoneError('Can not find any timezone configuration')
pytz.exceptions.UnknownTimeZoneError: 'Can not find any timezone configuration'

Handle being run early

It's possible this script will get run before the 24-hour allowed checkin window. If that is the case, calculate when the correct checkin time is, and sleep until then

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.