PI异常情况的实时上报--短信发送


#1

原谅我文化低,最开始接触的编程语言就是易语言,虽然大家都说易语言烂,但是当时我并不这么想,全中文的编程方式

新手超级好入门的(安利过了),作为启蒙语言,易语言确实让我学到了很多

不说这个伤心的玩意了

以前楼主用易语言写过聊天机器人(功能比较强的那种),基本能和当时的酷Q的聊天功能一拼上下了

但是当时比较坑,机器人不知道为什么总是掉线,当时就在想,能不能写一个能随时通知我的功能

当时就两个方式,要么发送短信,要么发送邮件,但是问题就来了,不知道各位看官主注意过没有,邮件在发送到你的邮箱之后(qq邮箱)

QQ反应过来要很长的时间,,要么干脆都没反应,我总不能一直盯着邮箱看吧,。。

短信的话就尴尬了,,没钱用平台,虽然当时想过用飞信,,可是当时不会写飞信怎么发短信。。

昨天晚上突然想起来了,决定今天写了,顺便还能水经验

先是访问http://f.10086.cn/mb/ 这个手机版飞信
然后开始抓网页包,楼主用的firefox+httpfox插件

点击进入3G飞信


打开之后是这个界面

然后点击登录,,,在跳转到下一个页面的时候,把你的抓浏览器包的东西打开,ie也有个插件,叫httpwatch,挺不错的,用着还好


在这里输入手机号,然后获取验证码

登录之后


会返回一个这样的包,比较重要一点的信息就是nickname(昵称,给别人发送的时候显示的),idUser(这个是每个人的标识符,就是发送给你就是发送到这个id)

值得说一下的就是这里面并没有直接发送到手机号,都是通过这样的一个id来发送消息的,t后面的东西是时间,long的时间


在登陆的时候实际上是发送了一个这样得包,其中M是你的手机号,pass是验证码,剩下两个不知道干什么的

通过这个包,写了个简单的登陆
**import **json
**import **urllib
**import **urllib2
**import **cookielib
**import **time
**def **getT():
**return **str(time.time()).replace(’.’,’’)+‘0’

**class **Fetion:
**def **init(self):
self.loginAddr=‘http://f.10086.cn/im5/login/getMessageCodeToPhone.action?t=
self.cookie=cookielib.CookieJar()
self.opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
self.phone=’‘
self.info={}
**def **getVerify(self,phoneNo):
self.phone = phoneNo
postdata = urllib.urlencode({
‘mobileNo’: phoneNo
})
result=self.opener.open(self.loginAddr+getT(),postdata).read()
**if **json.loads(result).get(‘sendMessageCodeToPhone’,’’) == ‘200’:
**return **True
else:
**return **False
**def **login(self,check):
postdata = urllib.urlencode({
‘m’: self.phone,
‘pass’:check,
‘captchaCode’:’’,
‘checkCodeKey’:‘null’
})
result=self.opener.open('http://f.10086.cn/im5/login/loginHtml5.action?t=’+getT(),postdata).read()
self.info=json.loads(result)

这一段代码就可以实现简单的登陆了

在飞信里面随便找个人,发送一条飞信(自己也可以的)


发送一条飞信的包就是这样子了,msg后面的是发送的信息,touserid就是发送到的用户的id,,
这个id格式奇怪的很,一个逗号加上id号,可能是因为可以发送给多个用户的关系

其实这个是发送给我自己的,touserid就是我自己的

**def **send2me(self, message):
postdata = urllib.urlencode({
‘msg’: message,
‘touserid’: ‘,’ + self.info.get(‘idUser’, ‘’)
})
result = self.opener.open(‘http://f.10086.cn/im5/chat/sendNewGroupShortMsg.action?t=’ + getT(), postdata).read()
result = json.loads(result)
**if **result.get(‘sendCode’, ‘’) == ‘200’:
**return **result.get(‘info’, ‘’)
**return **‘Send Error’

所以我在上面的类里面加了一个函数,发送到自己,直接写信息就行了

翻了半天,发现在查找的界面能获取到其他人的id

**def **getUid(self, phone):
postdata = urllib.urlencode({
‘number’: phone
})
result = self.opener.open(‘http://f.10086.cn/im5/user/searchFriendByPhone.action?t=’ + getT(), postdata).read()
result = json.loads(result)
**return **str(result.get(‘userinfo’, {}).get(‘idUser’, ‘’))

这个是获取其他人id的函数

有了其他人的id,还要有一个发送给其他人的函数(本来想写一个发送函数的,结果上面这个函数不能获取自己的id)

直接发一个完整版本的代码算了

coding:utf-8

import json
import urllib
import urllib2
import cookielib
import threading
import time
import random
def getT():
return str(time.time()).replace(’.’,’’)+‘0’

class Fetion:
def init(self):
self.loginAddr=‘http://f.10086.cn/im5/login/getMessageCodeToPhone.action?t=
self.cookie=cookielib.CookieJar()
self.opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookie))
self.phone=’‘
self.info={}
def heartbeat(self):
while True:
time.sleep(random.randint(1,15))
self.opener.open(‘http://f.10086.cn/im5/box/alllist.action?t=’+getT())
def getVerify(self,phoneNo):
self.phone = phoneNo
postdata = urllib.urlencode({
‘mobileNo’: phoneNo
})
result=self.opener.open(self.loginAddr+getT(),postdata).read()
if json.loads(result).get(‘sendMessageCodeToPhone’,’’) == ‘200’:
return True
else:
return False
def login(self,check):
postdata = urllib.urlencode({
‘m’: self.phone,
‘pass’:check,
‘captchaCode’:’’,
‘checkCodeKey’:‘null’
})
result=self.opener.open(‘http://f.10086.cn/im5/login/loginHtml5.action?t=’+getT(),postdata).read()
self.info=json.loads(result)
threading.Thread(target=self.heartbeat).start()
def send2me(self,message):
postdata = urllib.urlencode({
‘msg’:message,
‘touserid’:’,’+self.info.get(‘idUser’,’’)
})
result=self.opener.open(‘http://f.10086.cn/im5/chat/sendNewGroupShortMsg.action?t=’+getT(),postdata).read()
result=json.loads(result)
if result.get(‘sendCode’,’’) == ‘200’:
return result.get(‘info’,’’)
return ‘Send Error’
def getUid(self,phone):
postdata = urllib.urlencode({
‘number’:phone
})
result=self.opener.open(‘http://f.10086.cn/im5/user/searchFriendByPhone.action?t=’+getT(),postdata).read()
result=json.loads(result)
return str(result.get(‘userinfo’,{}).get(‘idUser’,’’))
def sendbyPhone(self,phone,message):
postdata = urllib.urlencode({
‘msg’:message,
‘touserid’:’,’+self.getUid(phone)
})
result=self.opener.open(‘http://f.10086.cn/im5/chat/sendNewGroupShortMsg.action?t=’+getT(),postdata).read()
result=json.loads(result)
print result,postdata
if result.get(‘sendCode’,’’) == ‘200’:
return result.get(‘info’,’’)
return ‘Send Error’

fetion=Fetion()
print fetion.getVerify(‘手机号’) #获取登陆验证码
vc=raw_input(‘VerifyCode:’) 输入验证码
fetion.login(vc)
print fetion.getUid(‘手机号’) #获取该手机号的id,不能获取自己的
print fetion.sendbyPhone(‘手机号’,‘发送测试’) #给好友发送测试信息

print fetion.send2me(‘测试信息’) # 给自己发送测试信息

注意:不知道为毛,这个代码连着发送二十几条就挂掉了,报服务器500
还有个比较重要的事,只有好友才能发送飞信信息,非好友不行!!!

飞信是免费的!!飞信是免费的!!飞信是免费的!!

有了这个代码,想监控pi的运行状态,定时发运行状态之类的也不是难事了

上面的heartbeat函数是因为我看web飞信挂着的时候总是在访问这个网址,估计是心跳获取别人发送给你的飞信消息的,搞了半天没测试成,基本就是这样了


#2

好像说了半天,问题被我搞复杂了,本篇帖子主要说的是,分析了一个简单的飞信登陆,做了个飞信的模块,源码已经发了,大家可以直接用来做pi的异常情况上报


#3

厉害了,我的哥:lol