0

I'm currently creating a text based console program in python and I want to add a command to display the current weather using a zip code. I have tried googling it extensively and can't seem to find anything good. The solutions that would work for what I'm trying to do are all using technology I'm not familiar with that are used to make actual apps with python. There is currently no UI and I'm a beginner in python so the more readable and easily understandable the solution the better.

#import statements
import math#import math
import os#access the operating system
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
import os.path
import time

#end import statement

# welcome user
print("welcome to geeko an all in one desktop helper!")
#end welcome

#variables
username = input("Please enter your username: " )#gets username
sudo = False # sets sudo to false indicating normal privledges
if (username == "Caelin"): # if the user enters the sudo username prompt them for a password
         sudoPassword = input("enter sudo password: ")# prompt for passcode
sudoLn = False #sets sudo line mode to false. this line mode is used for sudo commands
pi = math.pi
loc_id = 'USAL0504'
def wrongLineError():
    if(sudoLn):
        print("You are on the sudo line this is purely for special commands normal commands don't work here type \"switch\" to switch to cmd.ln")
    elif(sudoLn == False and sudo == False):
        print("You do not have sudo priviledges")
    elif(sudoLn == False and sudo == True):
        print("to use sudo commands you must be on the sudo line mode type \'switch\' to switch to the sudo line")

def sendEmailMessageOnly(message, password, recipient):
    send_to_email = recipient # Who you are sending the message to

    server = smtplib.SMTP('smtp.gmail.com', 587) # Connect to the server
    server.starttls() # Use TLS
    server.login(email, password) # Login to the email server
    server.sendmail(email, send_to_email , message) # Send the email
    server.quit() # Logout of the email server

def sendFormattedEmail(password, recipient, subject, message):
    msg = MIMEMultipart()
    msg['From'] = email
    msg['To'] = recipient
    msg['Subject'] = subject

    msg.attach(MIMEText(message, 'plain'))

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login(email, password)
    text = msg.as_string()
    server.sendmail(email, recipient, text)
    server.quit()

def sendMultipleFormattedEmails(password, recipients, subject, message):
    for recipientEmail in recipients:
        msg = MIMEMultipart()
        msg['From'] = email
        msg['To'] = recipientEmail
        msg['Subject'] = subject

        msg.attach(MIMEText(message, 'plain'))

        server = smtplib.SMTP('smtp.gmail.com', 587)
        server.starttls()
        server.login(email, password)
        text = msg.as_string()
        server.sendmail(email, recipientEmail, text)
        server.quit()     

#end variables

print ("Hello " + username + "!")# say special welcome

#check if user is root if so alert them and give them sudo status else alert them and leave sudo at a default of false
if(username == "Caelin" and sudoPassword == "bigGlassRemote"):
    print("Welcome! you are the root user and therefore have elevated priviledges")
    email = input('please enter your email: ')
    password = input("please enter your email password: ")
    print('logging into email...')
    time.sleep(1)
    print("logged into email!")
    sudo = True
else:
    print("You are not the root user and have normal priviledges")

while(True): #run an infinite loop prompting the user for command line inputs
    if(sudoLn == False):
        command = input(username + "-cmd.ln: ") # if sudo line mode if off use the cmd.ln prompt
    else:
        command = input(username + "-cmd.sudo: ") # otherwise prompt with cmd.sudo to indicate you are using sudo line mode

    if(command == 'welcome'): 
        if(sudoLn == False): # checks if you are on cmd line

            print("Hello " + username) # if the welcome command is used say hello *username*

        else: # if you are the sudo line
            wrongLineError()
    elif(command == "switch"): # if the command is switch
        if(sudo): # then check for sudo priviledges

            # togles sudoLn
            if(sudoLn):
                sudoLn = False 
            else:
                sudoLn = True

        else:
            wrongLineError()

    elif(command == 'add'):
        if(sudoLn == False):
            num1 = input("type the first number to add here: ")
            num2 = input("type the second number to add here: ")
            ans = float(num1) + float(num2)
            if(ans == round(ans)):
                print(int(ans))
            else:
                print(ans)
        else:
            wrongLineError()

    elif(command == 'subtract'):
        if(sudoLn == False):
            num1 = input("type the first number to subtract here: ")
            num2 = input("type the second number to subtract here: ")
            ans = float(num1) - float(num2)
            if(ans == round(ans)):
                print(int(ans))
            else:
                print(ans)
        else:
            wrongLineError()

    elif(command == "multiply"):
        if(sudoLn == False):
            num1 = input("type the first number to multiply here: ")
            num2 = input("type the second number to multiply here: ")
            ans = float(num1) * float(num2)
            if(ans == round(ans)):
                print(int(ans))
            else:
                print(ans)
        else:
            wrongLineError()

    elif(command == "divide"):
        if(sudoLn == False):
            num1 = input("type the first number to divide here: ")
            num2 = input("type the second number to divide here: ")
            ans = float(num1)/float(num2)
            if(ans == round(ans)):
                print(int(ans))
            else:
                print(ans)
        else:
            wrongLineError()

    elif(command == "area of circle"):
        if(sudoLn == False):
            r = input("type the radius here: ")
            ans = pi*(float(r)**2)
            if(ans == round(ans)):
                print(int(ans))
            else:
                print(ans)
        else:
            wrongLineError()

    elif(command == "area of rectangle"):
        if(sudoLn == False):
            l = input("type the length here: ")
            h = input("type the width here: ")
            ans = float(l)*float(h)
            if(ans == round(ans)):
                print(int(ans))
            else:
                print(ans)
        else:
            wrongLineError()

    elif(command == "area of triangle"):
        l = input("type the length here: ")
        h = input ("type the height here: ")
        ans = (float(l) * float(h))/2
        if(ans == round(ans)):
            print(int(ans))
        else :
            print(ans)

    elif(command == 'pi'):
        if(sudoln):
            print(pi)
        else:
            wrongLineError()

    elif(command == "edit file anywhere"):
        if(sudoLn):
            path = input("enter the path to the file (if the file doesen't exist it will be created): ")
            file = open(path, "w+")
            Exit = False
            while(not Exit):
                write = input("type what you would like to be written on the document. type !@exit to return to the the command line: ")
                if(write == "!@exit"):
                    file.close()
                    Exit = True
                else:
                    file.write(write)
        else:
            wrongLineError()


    elif(command == "delete file anywhere"):
        if(sudoLn):
            path = input("enter the path to the file you wish to delete: ")
            os.remove(path)
            print(path + "has been removed")
        else:
            wrongLineError()

    elif(command == 'send unformatted email'):
        if(sudoLn):
            recipient = input('enter the recipient\'s email address: ')
            msg = input("enter the content of the email: ")
            print('Sending email...')
            sendEmailMessageOnly(msg, password, recipient)
            print('Email sent!')
        else:
            wrongLineError()

    elif(command == "send formatted email"):
        if(sudoLn):
            subject = input('enter the subject line: ')
            recipient = input('enter the recipient\'s email address. type multiple to send an email to multiple recipients: ')
            if(recipient == 'multiple'):
                sendMultiple = True
                repeat = True
                i = 1
                recipient = []
                while(repeat):
                    newRecipient = input('recipient%s\'s email address. type !@continue to continue to select a message and send the email: ' % i)
                    if(newRecipient == '!@continue'):
                        repeat = False
                    else:
                        recipient.append(newRecipient)
                    i += 1

            message = input("enter the content of the email: ")
            print('Sending email...')
            if(not sendMultiple):
                sendFormattedEmail(password, recipient, subject, message)
            else:
                sendMultipleFormattedEmails(password, recipient, subject, message)
            print("Email sent!")
        else:
            wrongLineError()

    elif(command == "help"):
        if(sudoLn):
            print(username + """-sudo.ln command help:
    >>edit file anywhere > input(s): path > Takes a file path and edits that file.
    If the file doesn't already exist it is created.
    If you wish to edit a file in the same location as geeko simply enter the name and leave out   the path. 
    >>delete file anywhere > input(s): path > Takes a file path and deletes the file with that path.
    If you wish to delete a file in the same location as geeko simply enter the name and leave out the path.
    >>send unformatted email > input(s): recipient, message > Sends an email to the recipient containing the message you entered.
    >> send formatted email > input(s): recipient, subject line, message > Sends an email to the recipient with the entered subject line and message.
    This also enters To and From information into the email.
    >>help > no inputs > Shows this help message.
    A different message is shown for cmd.ln and sudo.ln.
    >>close > input(s): confirmation > If confirmed exits out of geeko.
    END %s-sudo.ln HELP""" % username)
        else:
            print(username + """-cmd.ln command help:
    >>add > input(s): first number, second number > Adds two numbers together.
    >>subtract > input(s): first number, second number > Subtracts the second number from the first number.
    >>multiply > input(s): first number, second number > Multiplies the two numbers together.
    >>divide > input(s): first number, second number > Divides the first number by the second number.
    >>area of rectangle > input(s): length, width > Calculates the area of a rectangle with the given length and width.
    >>area of triangle > input(s): length, height > Calculates the area of a triangle with the given length and height.
    >>area of circle > input(s): radius > Calculates the area of a triangle with the given radius.
    >>pi > no inputs > Prints the first 16 digits of pi
    >>welcome > no inputs > Gives you a special welcome.
    >>print reversed sentence > input(s): sentence > Prints the sentence backwards.
    >>help > no inputs > Shows this help message. 
    The help message is different in cmd.ln and sudo.ln.
    >>close > input(s): confirmation > If confirmed exits out of geeko.
    END %s-cmd.ln HELP""" % username )

    elif(command == 'print reversed sentence'):
        sentence = input("enter the senctence you want to reverse: ")
        sentence = sentence[::-1]
        print(sentence)

    elif(command == 'weather'):
        get_weather(loc_id)

    elif(command == "close"):
        confirmedOrDenied = False

        while(not confirmedOrDenied):
            confirmation = input("are you sure you want to close geeko [Y/N]: ")
            if(confirmation == 'y' or confirmation == 'Y'):
                exit()
            elif(confirmation == 'n' or confirmation == 'N'):
                confirmedOrDenied = True
                print("cancelled")
            else:
                print('invalid response please enter Y or N')
    else:
        print(command + ' is not a valid command make sure everything is spelled correctly') # if no registered command was entered return invalid command

  • 1
    This is a bit too much code for the current problem, but there are a couple approaches. I would probably just use a request to `http://wttr.in/?0` to get the current weather, but if you wanted to use an API with more options you could use something like OpenWeatherMap: https://stackoverflow.com/questions/1474489/python-weather-api – GammaGames Oct 22 '19 at 22:48
  • 1
    Thank you for the advice! this was my first stackoverflow question so I had no idea what I was doing lol. –  Nov 13 '19 at 21:42

1 Answers1

0

There are 2 main ways to do this.

The first one is to webscrape, using requests and beautifulsoup4. This can most easily be done from google, since if you search "weather {city-name}" it gives you a summary of the weather there.

The second is to use an api such as openweathermap, for which there is a great geeksforgeeks tutorial on:

lol cubes
  • 125
  • 7