title: Sending an sms via way2sms using Python 3
body: <p>I've been trying to send free sms using way2sms. I found this link where it seemed to work on python 3: <a href="https://github.com/shubhamc183/way2sms" rel="nofollow noreferrer">https://github.com/shubhamc183/way2sms</a></p>
  
  <p>I've saved this file as way2sms.py:</p>
  
  <pre><code>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" -&gt; 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)&gt;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)&gt;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])&lt;1 or int(dateparts[0])&gt;32 or int(dateparts[1])&gt;12 or int(dateparts[1])&lt;1 or int(dateparts[2])&lt;2017 or int(timeparts[0])&lt;0 or int(timeparts[0])&gt;23 or int(timeparts[1])&gt;59 or int(timeparts[1])&lt;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&amp;id=dwks')
  
      self.s.close()                              # close the Session
  
      self.loggedIn=False
  </code></pre>
  
  <p>And saved another file as smsing.py:</p>
  
  <pre><code>import way2sms
  q=way2sms.sms(1234567890,'password') #username = 1234567890
  q.send('0987654321','hello') #receiver ph no.:0987654321, message=hello
  n=q.msgSentToday()
  q.logout()
  </code></pre>
  
  <p>-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:</p>
  
  <pre><code>&gt;&gt;&gt;Can't login, once check credential..!
  Can't perform since NOT logged in..!
  Can't perform since NOT logged in..!
  </code></pre>
  
  <p>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.?</p>