Sending an sms via way2sms using Python 3

YSR picture YSR · May 3, 2018 · Viewed 7.6k times · Source

I've been trying to send free sms using way2sms. I found this link where it seemed to work on python 3: https://github.com/shubhamc183/way2sms

I've saved this file as way2sms.py:

import requests
from bs4 import BeautifulSoup

class sms:

def __init__(self,username,password):

    '''
    Takes username and password as parameters for constructors
    and try to log in
    '''

    self.url='http://site24.way2sms.com/Login1.action?'

    self.cred={'username': username, 'password': password}

    self.s=requests.Session()           # Session because we want to maintain the cookies

    '''
    changing s.headers['User-Agent'] to spoof that python is requesting
    '''

    self.s.headers['User-Agent']="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) Gecko/20100101 Firefox/50.0"

    self.q=self.s.post(self.url,data=self.cred)

    self.loggedIn=False             # a variable of knowing whether logged in or not

    if "http://site24.way2sms.com/main.action" in self.q.url:           # http status 200 == OK

        print("Successfully logged in..!")

        self.loggedIn=True

    else:

        print("Can't login, once check credential..!")

        self.loggedIn=False

    self.jsid=self.s.cookies.get_dict()['JSESSIONID'][4:]       # JSID is the main KEY as JSID are produced every time a session satrts

def msgSentToday(self):

    '''
    Returns number of SMS sent today as there is a limit of 100 messages everyday..!
    '''

    if self.loggedIn == False:
        print("Can't perform since NOT logged in..!")
        return -1

    self.msg_left_url='http://site24.way2sms.com/sentSMS?Token='+self.jsid

    self.q=self.s.get(self.msg_left_url)

    self.soup=BeautifulSoup(self.q.text,'html.parser')      #we want the number of messages sent which is present in the

    self.t=self.soup.find("div",{"class":"hed"}).h2.text        # div element with class "hed" -> h2

    self.sent=0

    for self.i in self.t:

        if self.i.isdecimal():

            self.sent=10*self.sent+int(self.i)

    return self.sent

def send(self,mobile_no,msg):

    '''
    Sends the message to the given mobile number
    '''

    if self.loggedIn == False:
        print("Can't perform since NOT logged in..!")
        return False

    if len(msg)>139 or len(mobile_no)!=10 or not mobile_no.isdecimal(): #checks whether the given message is of length more than 139

        return False                            #or the mobile_no is valid

    self.payload={'ssaction':'ss',
            'Token':self.jsid,                  #inorder to visualize how I came to these payload,
                'mobile':mobile_no,                 #must see the NETWORK section in Inspect Element
                 'message':msg,                     #while messagin someone from your browser
                'msgLen':'129'
                 }

    self.msg_url='http://site24.way2sms.com/smstoss.action'

    self.q=self.s.post(self.msg_url,data=self.payload)

    if self.q.status_code==200:

        return True

    else:
        return False

def sendLater(self, mobile_no, msg, date, time):                #Function for future SMS feature.
                                        #date must be in dd/mm/yyyy format
                                        #time must be in 24hr format. For ex: 18:05

    if self.loggedIn == False:
        print("Can't perform since NOT logged in..!")
        return False

    if len(msg)>139 or len(mobile_no)!=10 or not mobile_no.isdecimal():
        return False

    dateparts = date.split('/')         #These steps to check for valid date and time and formatting
    timeparts = time.split(':')
    if int(dateparts[0])<1 or int(dateparts[0])>32 or int(dateparts[1])>12 or int(dateparts[1])<1 or int(dateparts[2])<2017 or int(timeparts[0])<0 or int(timeparts[0])>23 or int(timeparts[1])>59 or int(timeparts[1])<0:
        return False
    date = dateparts[0].zfill(2) + "/" + dateparts[1].zfill(2) + "/" + dateparts[2]
    time = timeparts[0].zfill(2) + ":" + timeparts[1].zfill(2)

    self.payload={'Token':self.jsid,
            'mobile':mobile_no,
            'sdate':date,
            'stime':time,
            'message':msg,
            'msgLen':'129'
            }

    self.msg_url='http://site24.way2sms.com/schedulesms.action'
    self.q=self.s.post(self.msg_url, data=self.payload)

    if self.q.status_code==200:
        return True
    else:
        return False

def logout(self):

    self.s.get('http://site24.way2sms.com/entry?ec=0080&id=dwks')

    self.s.close()                              # close the Session

    self.loggedIn=False

And saved another file as smsing.py:

import way2sms
q=way2sms.sms(1234567890,'password') #username = 1234567890
q.send('0987654321','hello') #receiver ph no.:0987654321, message=hello
n=q.msgSentToday()
q.logout()

-I've tried to pass username as string and otherwise. Password if not given as string shows error. My username and password both are correct. When I execute smsing.py... displays:

>>>Can't login, once check credential..!
Can't perform since NOT logged in..!
Can't perform since NOT logged in..!

With such simple code I thought it would be easy. But I am not able to find where I am going wrong. Is it because I am using Windows 7?? Can anybody please help me.?

Answer

AB Abhi picture AB Abhi · Nov 12, 2018

To send sms using way2sms account, you may use below code snippet.

Before that you would be required to create an API Key from here

import requests
url = "https://smsapi.engineeringtgr.com/send/"
params = dict(
    Mobile='login username',
    Password='login password',
    Key='generated from above sms api',
    Message='Your message Here',
    To='recipient')

resp = requests.get(url, params)
print(resp, resp.text)

N.B: There is a limit of approx 20 sms per day