I long time searched the internet for a guide how to send sms by command line with Huawei E3131 and HiLink on a debian based linux system. All of them not worked. It seems, that there was an update on the software.
HiLink shows the following versions to me:
- Device-Name: E3131
- Hardware-Version: CU1E3131IM
- Software-Version: 22.521.23.00.00
- Web-Frontend-Version: 17.100.08.00.03
Following the question: How to send / receive sms by command line on a debian based linux system with E3131?
There is a follow up question for setting up the hardware on a headless system on superuser
3 steps are necessary:
- Get session id
- Get token
- Send / receive sms
Step 1 - Get session id
For getting the session id I use the following command in an own shell script:
#!/bin/bash
curl -b session.txt -c session.txt http://192.168.8.1/html/index.html > /dev/null 2>&1
Step 2 - Get token
For getting the token I use the following commands, also in an own shell script:
#!/bin/bash
TOKEN=$(curl -s -b session.txt -c session.txt http://192.168.8.1/html/smsinbox.html)
TOKEN=$(echo $TOKEN | cut -d'"' -f 10)
echo $TOKEN > token.txt
Step 3 Part A - Send SMS
Finally a third shell script for sending the sms, which also invokes the two other scripts:
#!/bin/bash
NUMBER=$1
MESSAGE=$2
./session.sh
./token.sh
LENGTH=${#MESSAGE}
TIME=$(date +"%Y-%m-%d %T")
TOKEN=$(<token.txt)
SMS="<request><Index>-1</Index><Phones><Phone>$NUMBER</Phone></Phones><Sca/><Content>$MESSAGE</Content><Length>$LENGTH</Length><Reserved>1</Reserved><Date>$TIME</Date></request>"
echo $SMS
curl -v -b session.txt -c session.txt -H "X-Requested-With: XMLHttpRequest" --data "$SMS" http://192.168.8.1/api/sms/send-sms --header "__RequestVerificationToken: $TOKEN" --header "Content-Type:text/xml"
Usage is:
command phonenumber "text"
Step 3 Part B - Receive SMS
And for receiving the last unread sms (or, if not avaiable, the last read sms) I use the following script:
#!/bin/bash
./session.sh
./token.sh
TOKEN=$(<token.txt)
DATA="<request><PageIndex>1</PageIndex><ReadCount>1</ReadCount><BoxType>1</BoxType><SortType>0</SortType><Ascending>0</Ascending><UnreadPreferred>1</UnreadPreferred></request>"
curl -b session.txt -c session.txt -H "X-Requested-With: XMLHttpRequest" --data "$DATA" http://192.168.8.1/api/sms/sms-list --header "__RequestVerificationToken: $TOKEN" --header "Content-Type:text/xml"
This is maybe not very good coding, but it works.
Although Peter has explained it really nicely, but I like to have single script, and also I use it on OpenWrt routers instead of Debian.
So here is my version for sending SMS:
#!/bin/sh
RESPONSE=`curl -s -X GET http://192.168.8.1/api/webserver/SesTokInfo`
COOKIE=`echo "$RESPONSE"| grep SessionID=| cut -b 10-147`
TOKEN=`echo "$RESPONSE"| grep TokInfo| cut -b 10-41`
NUMBER=$1
SMS=$2
DATA="<?xml version='1.0' encoding='UTF-8'?><request><Index>-1</Index><Phones><Phone>$NUMBER</Phone></Phones><Sca></Sca><Content>$SMS</Content><Length>11</Length><Reserved>1</Reserved><Date>-1</Date></request>"
curl -v http://192.168.8.1/api/sms/send-sms \
-H "Cookie: $COOKIE" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
--data $DATA
And here is script for reading last three sms messages:
#!/bin/sh
RESPONSE=`curl -s -X GET http://192.168.8.1/api/webserver/SesTokInfo`
COOKIE=`echo "$RESPONSE"| grep SessionID=| cut -b 10-147`
TOKEN=`echo "$RESPONSE"| grep TokInfo| cut -b 10-41`
DATA="<request><PageIndex>1</PageIndex><ReadCount>3</ReadCount><BoxType>1</BoxType><SortType>0</SortType><Ascending>0</Ascending><UnreadPreferred>1</UnreadPreferred></request>"
curl -b $COOKIE -c $COOKIE -H "X-Requested-With: XMLHttpRequest" --data "$DATA" http://192.168.8.1/api/sms/sms-list --header "__RequestVerificationToken: $TOKEN" --header "Content-Type:text/xml"
I made python script for my HUAWEI E3276:
import requests, sys
import xml.etree.ElementTree as ET
msg = "From python"
phone = "PHONE_NUMBER" #To fill
ip = "192.168.1.1" #Dongle ip
#Get token
r = requests.get("http://%s/api/webserver/token" % ip)
root = ET.fromstring(r.content)
token = root[0].text
print "token", token
#Send sms
headers = { "__RequestVerificationToken": token, "Content-Type": "text/xml" }
data = "<request><Index>-1</Index><Phones><Phone>%s</Phone></Phones><Sca/><Content>%s</Content><Length>%d</Length><Reserved>1</Reserved><Date>$TIME</Date></request>" % ( phone, msg, len(msg) )
r = requests.post( "http://%s/api/sms/send-sms" % ip, data=data, headers=headers )
print "send-sms", r.headers, r.content