作者:miaoo

1.应用场景

由于自己做的一个系统需要用到发送短信到自己手机的功能,于是搜索了一下,发现了一个通过移动飞信通道发送短信开源库:PyFetion

PyFetion 模拟实现了飞信的通信协议,所以能够实现的功能非常多:短信收发、好友管理、修改状态等等等。

但是,由于我只需要发送短信,所以其它功能都很多余;再加上使用PyFetion 登录飞信时可能需要输入验证码,所以不太适合自动化系统的调用。

继续搜索发现了飞信为手机用户提供了一个wap站点:http://f.10086.cn

PS:由于是这一个wap站点,您可能需要在FireFox中安装扩展(Extension):wmlbrowser ,以便正常的浏览.

通过它能够进行在线信息收发。由于wap站点代码结构比较简单,所以很适合用程序模拟用户登录、发送信息的整个流程,以达到发送短信的目的。

2.代码分析

代码主要用到了下面几个lib

cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

登陆时,首先要处理Cookie信息

cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

其次,我们在登录界面填写手机号及密码后,点击登录按钮,浏览器会通过POST方法向服务器提交登录信息以便验证身份。用Firefox的Httpfox插件可以抓包查看浏览器提交的数据内容:

可以看到,在点击登录后浏览器发送POST 请求提交登录数据,其中:pass 为密码,loginstatus为登录状态(4表示隐身),m为手机号码。我们在python中定义一个字典类型变量记录要模拟提交的数据:

 parameter = {
'pass':‘你的密码’,
'm':'你的手机号',
'loginstatus':4 }

然后,生成POST请求,并发送:

url_login = 'http://f.10086.cn/im/login/inputpasssubmit1.action'
req = urllib2.Request( #生存POST请求
url =url_login ,
urllib.urlencode(parameter)
)
jump = urllib2.urlopen(req) #发送请求

在提交登录请求后,服务器回返回一个跳转页面,其中包含一个跳转连接(URL),如果登录成功,则返回:

/im/index/indexcenter.action?t=xxxxxxxxxxxxxxxxx

其中xxx代表一串数字。如果登录失败,则返回先前的登录页:

/im/login/login.action

我们用正则表达式在页面中提取出这个链接,判断登录是否成功(关于正则表达式的内容,推荐:正则表达式30分钟入门教程):

page = jump.read();
#获取跳转链接
url = re.compile(r'id="start".*?ontimer="(.*?);').findall(page)[0]
if url == '/im/login/login.action':
print 'Login Failed!' #登录失败
raw_input('Press any key to exit.')
return
else:
print 'Login Successfully!' #登录成功

同时,我们也将连接尾部那一串数字参数提取出来,以备待会儿使用:

arg_t = re.compile(r't=(d*)').findall(page)[0]    #获取参数

同样的方法,我们可以抓包提取到发送短信时POST的数据内容,并用程序模拟提交:

url_sendmsg = 'http://f.10086.cn/im/user/sendMsgToMyselfs.action'
sendmsg = urllib2.Request(
url =url_sendmsg,
urllib.urlencode('msg':‘你要发送的消息’.decode('gbk').encode('utf-8'))
)
res = urllib2.urlopen(sendmsg)

通过提交POST请求后返回的连接判断发送是否成功:

if res.geturl == 'http://f.10086.cn/im/user/sendMsgToMyself.action' :
print 'Send Failed!'
else:
print 'Send Successfully!'

最后注销退出:

logout = urllib2.Request(url_logout + arg_t)
response = urllib2.urlopen(logout)
print 'Logout Successfully!'

完整的代码可以看下面。整个代码共45行,在Python 2.7下编译通过。

3.改进

目前只实现了发送短信到自己手机的功能(当然,这就是我目前所需要的),其实,我们在完成登录操作后,便能够提取出好友列表,用上文类似的方法就能够给任意的飞信好友发送短信了。这个功能留到以后需要的时候再完成吧。

4.总结

本文主要使用了:

urllib2.Request(xxx)
urllib2.urlopen(xxx)

可以看到,在python中使用urllib2可以很方便的进行各种网页相关的交互操作,如页面抓取、表单提交等等,再配合正则表达式,可以构造出各种有趣的应用。

完整代码:

# -*- coding: utf-8 -*-
import cookielib
import urllib
import urllib2
import re url_login = 'http://f.10086.cn/im/login/inputpasssubmit1.action'
url_logout = 'http://f.10086.cn//im/index/logoutsubmit.action?t='
url_msg = 'http://f.10086.cn/im/user/sendMsgToMyselfs.action'
user = 'Your Phone Number'
password = 'Your Passwrdd'
loginstatus = '' #��¼״̬,4��ʾ����
arg_t = '' def fetion(msg):
cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
args = {'pass':password, 'm':user,'loginstatus':loginstatus}
print 'Logining...'
req = urllib2.Request(url_login, urllib.urlencode(args))
jump = opener.open(req)
page = jump.read();
url = re.compile(r'<card id="start".*?ontimer="(.*?);').findall(page)[0] #��ȡ��ת����
arg_t = re.compile(r't=(\d*)').findall(page)[0]
if url == '/im/login/login.action': #��¼ʧ��
print 'Login Failed!'
raw_input('Press any key to exit.')
return
else:
print 'Login Successfully!'
sendmsg = urllib2.Request(url_msg, urllib.urlencode({'msg':msg.decode('gbk').encode('utf-8')}))
finish = urllib2.urlopen(sendmsg) if finish.geturl == 'http://f.10086.cn/im/user/sendMsgToMyself.action' :
print 'Send Failed!'
else:
print 'Send Successfully'
logout = urllib2.Request(url_logout + arg_t)
response = urllib2.urlopen(logout) #ע��
print 'Logout Successfully!'
#print response.read().decode('utf-8').encode('gbk') msg = raw_input('what do you want to say:')
fetion(msg)

使用python移动飞信模块发送短信的更多相关文章

  1. Linux-C实现GPRS模块发送短信

    “GSM模块,是将GSM射频芯片.基带处理芯片.存储器.功放器件等集成在一块线路板上,具有独立的操作系统.GSM射频处理.基带处理并提供标准接口的功能模块.GSM模块根据其提供的数据传输速率又可以分为 ...

  2. python每天定时发送短信脚本

    最近业务上需要每天解析txt文本或者excel文件,读取内容发送短信,发送的时间段可控,用python实现 安装pip依赖 pip install -r requirement.txt xlrd Py ...

  3. MonkeyRunner执行Python脚本实例——发送短信增强版

    很久之前就写好的了,准备写个自动执行Monkey的脚本时才想到去找它,还是写在博客里找起来方便. 这次更新了批处理自动连接设备后执行Py脚本,结构如下图: 其中shotscreen为存放截图文件夹,s ...

  4. 使用Python往手机发送短信(基于twilio模块)

    官网是https://www.twilio.com twilio的一句话介绍——提供SDK帮你连接世界上所有人,你可以很方便的调用他们提供的接口来给指定手机发短信,打电话. 首先在twilio的官网注 ...

  5. 注册登录页面修订-Python使用redis-手机验证接口-发送短信验证

    登录页面修订 views.Login.vue <template> <div class="login box"> <img src="@/ ...

  6. Python发送短信提醒

    Python发送短信可借助腾讯云平台提供的短信服务 发送短信需要的及格参数: 1.SDK_AppID和SDK_Key 2.签名: 3.模板ID 下面贴出源码DEMO: from qcloudsms_p ...

  7. 使用 Python 发送短信?

    上回食行生鲜签到,我们说到怎么把签到结果发出来,于是就找到了 Twilio. Twilio 是一个位于加利福尼亚的云通信(PaaS)公司,致力于为开发者提供通讯模块的 API.由于 Twilio 为试 ...

  8. 利用python库twilio来免费发送短信

    大家好,我是四毛,最近开通了个人公众号“用Python来编程”,欢迎大家“关注”,这样您就可以收到优质的文章了. 今天跟大家分享的主题是利用python库twilio来免费发送短信. 先放一张成品图 ...

  9. 调用 url_launcher 模块打开外部浏 览器 打开外部应用 拨打电话 发送短信

    1.Flutter url_launcher 模块    Flutter url_launcher 模块可以让我们实现打开外部浏览器.打开外部应用.发送短信.拨打电话等功能.    https://p ...

随机推荐

  1. Python爬虫之路——简单的网页抓图

    转载自我自己的博客:http://www.mylonly.com/archives/1401.html 用Python的urllib2库和HTMLParser库写了一个简单的抓图脚本.主要抓的是htt ...

  2. Injector Job深入分析 分类: H3_NUTCH 2015-03-10 15:44 334人阅读 评论(0) 收藏

    Injector Job的主要功能是根据crawlId在hbase中创建一个表,将将文本中的seed注入表中. (一)命令执行 1.运行命令 [jediael@master local]$ bin/n ...

  3. 各种排序算法的分析及java实现 分类: B10_计算机基础 2015-02-03 20:09 186人阅读 评论(0) 收藏

    转载自:http://www.cnblogs.com/liuling/p/2013-7-24-01.html 另可参考:http://gengning938.blog.163.com/blog/sta ...

  4. Android(Java) 模拟登录知乎并抓取用户信息

    前不久.看到一篇文章我用爬虫一天时间"偷了"知乎一百万用户.仅仅为证明PHP是世界上最好的语言,该文章中使用的登录方式是直接复制cookie到代码中,这里呢,我不以爬信息为目的.仅 ...

  5. ios开发网络学习三:NSURLConnection小文件大文件下载

    一:小文件下载 #import "ViewController.h" @interface ViewController ()<NSURLConnectionDataDele ...

  6. js课程 2-6 js如何进行类型转换及js运算符有哪些

    js课程 2-6 js如何进行类型转换及js运算符有哪些 一.总结 一句话总结: 1.所有类型->布尔类型(为假的情况)有哪些(6种)? 1)字符串('')2)整型(0)3)浮点型(0.0)4) ...

  7. PatentTips - 在物联网中进行数据过滤的方法和装置

    背景技术 [0001] 本发明涉及物联网,特别涉及在物联网进行数据过滤的方法和装置. [0002] 物联网是新一代信息技术的重要组成部分,特指物物相连的网络.具体地,物联网是指通过各种信息传感设备,如 ...

  8. Android自己定义控件2-简单的写字板控件

    概述 上一篇文章我们对自己定义控件进行了一个大体的知识介绍. 今天就来学习自己定义一个简单的写字板控件. 先来看看效果图 就是简单的依据手指写下的轨迹去画出内容 实现 在上一篇文章里提到了androi ...

  9. Java编程思想第四版 *第五章 个人练习

    练习3:(1)创建一个带默认构造器(即无參构造器)的类.在构造器中打印一条消息.为这个类创建一个对象.P116 public class Test{ public Test(){ System.out ...

  10. QT代理Delegates使用实例(三种代理控件)

    效果如下,在表格的单元格中插入控件,用Delegates方式实现 源代码如下: main.cpp文件 #include <QApplication>#include <QStanda ...