华为Hilink(E3372)Web API Delete-SMS返回错误125003

时间:2018-09-27 01:42:22

标签: bash api curl

这是我的第一个问题,而且我不是母语人士,请不要对我施加压力:)

我正在尝试使用api读取/发送sms消息,但可以删除部分,但总是返回错误125005,我认为这与会话和令牌有关。

关于互联网的信息非常有限  关于如何使用api的示例。

这是scrpt:

#!/bin/bash 

MODEM_IP="192.168.9.1" 
curl -s -X GET "http://$MODEM_IP/api/webserver/SesTokInfo" > ses_tok.xml
COOKIE=`grep "SessionID=""ses_tok.xml | cut -b 10-147`
TOKEN=`grep "TokInfo" ses_tok.xml | cut -b 10-41` 

curl -s -X POST "http://$MODEM_IP/api/sms/sms-list" -H "Cookie: $COOKIE" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: text/xml" -d "<request><PageIndex>1</PageIndex><ReadCount>20</ReadCount><BoxType>1</BoxType><SortType>0</SortType><Ascending>0</Ascending><UnreadPreferred>1</UnreadPreferred></request>" > modem_status.xml

#cat modem_status.xml

#read index
readarray -t array_index <<< "$(xmlstarlet sel -t -m "//Index" -v . -n modem_status.xml)"

rm -f result_status.xml
touch result_status.xml

for ((i=0; i<${#array_index[@]}; i++ ))
do
     index[$i]=$(printf ${array_index[$i]} | tr -d '\n\r ')
     #printf "${index[$i]} "
     printf "\n${index[$i]}\n" >> result_status.xml
     curl -s -X POST "http://$MODEM_IP/api/sms/delete-sms" -H "Cookie: $COOKIE" -H "__RequestVerificationToken: $TOKEN" -H "Content-Type: text/xml" -d "<?xml version="1.0" encoding="UTF-8"?><request><Index>${index[$i]}</Index></request>" >> result_status.xml
done

cat result_status.xml

错误:

<?xml version="1.0" encoding="UTF-8"?>
<error>
<code>125003</code>
<message></message>
</error>

也许,我错过了以前没有注意到的东西。

TIA

3 个答案:

答案 0 :(得分:0)

也许为时已晚,但我遇到了同样的问题,也许这也有助于其他用户寻找它。

在我的情况下,令牌/ cookie已在delete命令之前过期。 我认为这不涉及时间因素,但更像是该组合仅对一个API调用有效。

我在delete命令之前获得了一个新的令牌/ cookie,现在它对我有用。希望这会有所帮助。

欢呼 克里斯

答案 1 :(得分:0)

我遇到了同样的错误,在您要求删除短信的情况下,我要求重新启动。调制解调器应该已经基于令牌验证了连接,并保存在cookie中以执行任何操作。

我已经使用了3个步骤。

1)首先是与e3372的连接。

<?xml version="1.0" encoding="UTF-8"?><request><dataswitch>1</dataswitch></request>

通过 / api / dialup / mobile-dataswitch 路径。

2)其次是通过 / api / webserver / SesTokInfo 路径获取令牌,并将其保存在cookie中。 附有python示例。

 def _getTokens(self):
    """Get access tokens"""
    try:
        xml = self._getXml("/api/webserver/SesTokInfo")
    except (URLError, socket.timeout):
        return ("", "")
    else:
        return (xml.findtext("SesInfo", ""), xml.findtext("TokInfo", ""))

def _updateTokens(self):
    session, postToken = self._getTokens()
    self._opener.addheaders = [("__RequestVerificationToken", postToken),
                               ("Cookie", session)]

3)重新启动调制解调器。

<?xml version="1.0" encoding="UTF-8"?><request><Control>1</Control></request>

通过 / api / device / control 路径。

答案 2 :(得分:0)

由于这是Huawei 125003的最高结果,因此我会在遇到此错误时添加发现。 在我拥有__RequestVerificationToken的B315上,只能使用一次。 每个POST请求都应具有__RequestVerificationToken的响应标头,您可以仅使用此值并将其用于下一个请求。请注意,对 / api / user / login 的响应将返回您可以使用的许多令牌,这些令牌之间用井号#符号分隔。

同样要保留您的cookie,一旦成功登录,从 / api / webserver / SesTokInfo 保存的SesInfo就会更改。