飞信2010分析 – 给离线好友发送消息

2010年4月21日  | 分类: 飞信哪些事儿  | 标签:

今天发这篇文章刚好是全国哀悼玉树地震的中遇难的日子,整个互联网都很悲伤。的确,我也是亲身经历过汶川的地震,经历过那种面对死亡的恐惧和重生过后的喜悦。
汶川地震,我们活着,我们是幸运儿。我们每一个在这场大劫中余生的人,都应该有一种获得重生的净化。在自然面前,人的生命是那么的脆弱。活着,比一切都好。这是地震给我最大的感触。
而在地震中不幸遇难的人们,我们应该为他们祈福,愿他们在天堂活得快乐……阿门····
谨以此文纪念在玉树地震以及汶川地震中死去的同胞们!

飞信发送消息用的是SIP协议里面的标准的M请求。飞信给客户端在线的好友和短信在线的好友发送消息的方式是不同的。我们来先看给状态为短信在线或离线的好友发送消息。

注意我这里说的是消息。飞信由于有短信就有点复杂。解释一下:飞信用户可以给飞信好友发送消息(只要是在用户好友列表里面的用户都视为飞信好友,无论是否开通飞信),
1.如果用户在线,消息直接通过聊天服务器中转后直接发送给客户端。
2.如果好友不在线,
a.好友设置为飞信客户端离线时使用手机短信接收飞信消息,给该好友发送的消息就通过飞信的短信服务器直接通过手机短信的方式把消息发送到好友的手机上,
b.用户设置为客户端不在线不用手机接收飞信消息,飞信服务器就保存用户发送的消息,不发送到好友的手机,然后等待好友再次登录客户端后才发送给好友。

现在来说明好友URI为sip:111111111@fetion.com.cn;p=1111,状态为短信在线或者离线或者隐身,发送和接收飞信消息的交互过程。(如何判断好友是客户端在线,还是短信在线,还是离线,请参见我上一篇文章。)

下面是飞信客户端“主动”向好友发送消息(不是短信),请求和回复如下

展开源代码 查看源代码

打印 关于

01. M fetion.com.cn SIP-C/4.0
02. F: 123456789
03. I: 16
04. Q: 2 M
05. T: sip:111111111@fetion.com.cn;p=1111
06. C: text/plain
07. K: SaveHistory
08. N: CatMsg
09. L: 5
10.
11. hello
12. -----------------------------------------------------
13. SIP-C/4.0 200 OK
14. T: sip:1111111@fetion.com.cn;p=1111
15. I: 16
16. Q: 2 M
17. D: Wed, 21 Apr 2010 02:34:09 GMT

F就是飞信号,前几篇文章已经说明了,注意请求中的T,就是To,写明了短消息接收方的URI地址,这个URI可以在登录成功后返回的好友列表中获取到。 前面说过,开通飞信的URI和未开通飞信的URI是不同的,未开通飞信的URI的格式是tel:159xxxxxxxx,倘若知道好友的电话号码,却不知道好友的URI,发送消息时用tel:159xxxxxxxx这样的URI发送消息是不能成功的。但可以通过其他的方式获取到URI,后面会详细说明。
C = Content-Type,消息的格式。有两种:
text/plain,这种是文本格式,就是说消息内容不含有任何格式信息;
text/html-fragment:带有格式信息的消息,字体,大小,颜色,就这三种。如hello。
一般说来,发送手机短信的时候就用text/plain无格式的消息,给用客户端登录的好友就用text/html-fragment格式的消息,客户端可以解析并显示这样的格式的信息。
K(Supported): SaveHistory 不清楚啥含义。
N(Event) : CatMsg,这里说明了消息类型,CatMsg就是飞信消息。这里为SendCatSMS就是发送短信,也就是无论好友客户端是否在线,都会直接发送到好友的手机上。
后面的就是SIP信令里面定义的消息体了,即为消息内容。

来看下回复。发送成功后一般来说有两种状态
200 OK:发送消息成功,如果对方离线就保存到服务器等待好友下次客户端登陆时候发送给好友。如果对方隐身,将直接发送到客户端。因为隐身和离线状态码都是0,无法判断。
280 Send SMS OK:发送消息成功,对方客户端不在线,但设置了手机接收消息,消息通过短信方式的发送到对方手机上。这个和200的状态消息内容不一样。如下:

展开源代码 查看源代码

打印 关于

1. SIP-C/4.0 280 Send SMS OK
2. T: sip:11111111@fetion.com.cn;p=1111
3. I: 17
4. Q: 1 M
5. L: 115

可以看出,当发送短信成功的时候,返回了一个配额使用统计。

飞信每天发送到手机的短信都是有一定的限制的,以前测试过,飞信最多每天可以发送750条消息到手机上,每月好像是1000条,没有测试。官方没说,只能猜想。所以用飞信做点小的应用是可以的,想做大的短信应用还是使用短信猫或者其他的短信平台才行。虽然发送到手机短信的信息有限制,但给客户端发送的消息没有限额任何限制。

当然,如果超过了这个限制发送就会失败,返回如下

展开源代码 查看源代码

打印 关于

1. SIP-C/4.0 486 sy Here
2. T: sip:1111111@fetion.com.cn;p=1111
3. I: 4
4. Q: 10 M
5. L: 52

OK,说完了客户端主动向好友发送信息,那好友主动的向用户发信息呢?

因为好友不在线,这种情况只能是好友通过手机回复收到的飞信短信发送信息。手机消息发送方的号码为12520159xxxxxxx这都是飞信网关发送给好友手机的短信。

好友主动给用户发信息是通过一条通知(这里把服务器主动发送给客户端的消息称为一个通知),这是服务器主动发送过来的SIP信令:

展开源代码 查看源代码

打印 关于

01. M 123456789 SIP-C/4.0
02. F: sip:11111111@fetion.com.cn;p=1111
03. I: -110
04. Q: 111 M
05. C: text/plain
06. L: 6
07. D: Wed, 21 Apr 2010 03:49:43 GMT
08.
09. 你好
10. -----------------------------------------------------
11. SIP-C/4.0 200 OK
12. F: sip:11111111@fetion.com.cn;p=1111
13. I: -110
14. Q: 111 M

很简单吧,F就是From, 说明了这条消息是谁发送的,C和上面一样。注意这里在接受完这个消息之后,一定要发送一个确认回复,向服务器表明我收到了这条消息,如果在一段时间内服务器没有收到这个回复就会像客户端发送消息发送失败回复。I和Q的值就是服务器发回的消息通知里面的I和Q。

上面使用CatMsg发送的消息可能发送到客户端,也可能发送到手机上,如果需要强制把消息发送到手机只需需要把CatMsg改成SendCatSMS就OK了。

展开源代码 查看源代码

打印 关于

01. M fetion.com.cn SIP-C/4.0
02. F: 685592830
03. I: 17
04. Q: 1 M
05. T: sip:683209086@fetion.com.cn;p=4710
06. N: SendCatSMS
07. L: 5
08.
09. hello

注意这里没有了C和K字段,因为都不支持了。消息正文只能是无格式的文本,如果发送成功返回的结果就是280 Send SMS OK,内容和上面一样,不罗嗦了。

倘若需要给手机号为159xxxxxxxx的好友发送消息或者短信,因为发送消息或者短信需要用到uri,但这里只知道好友的手机号,如何才能通过手机号查到好友的Uri呢??

来看看SIPC验证成功返回的结果中没有手机号码,通过BN返回的状态信息中有的含有手机号,有的没有(主要是飞信权限设置的原因),通过遍历好友查找显然是不行的。

某一天我无意中发现了这样的方法。

发起一个获取好友信息的请求:

展开源代码 查看源代码

打印 关于

01. S fetion.com.cn SIP-C/4.0
02. F: 685592830
03. I: 4
04. Q: 1 S
05. N: GetContactInfoV4
06. L: 46
07.
08. <args><contact uri="tel:159xxxxxxxx" /></args>
09. ----
10. SIP-C/4.0 200 OK
11. I: 4
12. Q: 1 S
13. L: 547
14.
15. <results><contact uri="tel:159xxxxxxxx" version="0" user-id="123456789" sid="683209086" .../></results>

呵呵,看出来了吗,服务器返回了一个user-id,还记得前面SIPC验证成功之后服务器返回的好友列表中的i吗?i就是user-id,现在得到了手机号为159xxxxxxxx的user-id,就可以去遍历用户的所有好友,如果手机号为159xxxxxxxx的用户是你的好友,就一定会找到这个好友,然后自然就找到了uri(URI就是验证成功之后的好友列表中的u的值),现在就可以拿这个uri去建立会话发消息或者短信吧。。

好了,上面说的都是和状态为短信在线或离线的好友发送或者接受消息。如果你用这个方法去给在线的好友发送消息你会发现对方可以接受到你发的消息,却不能收到对方发送的消息,这是因为飞信和在线好友发消息使用的方式是不同的,如何给在线好友发消息,下篇文章详细说明。

飞信2010分析 – 给离线好友发送消息相关推荐

  1. 飞信2010分析 – 成功登录之后

    飞信2010分析 – 成功登录之后 2010年4月12日  | 分类: 飞信哪些事儿  | 标签: 文章更新晚了,请大家见谅,上周的事情比较多,呵呵~ 标题里面的成功登录之后指的是SIPC验证成功之后 ...

  2. 飞信2010分析 – SSI登录

    飞信2010分析 – SSI登录 2010年4月1日 | 分类: 飞信哪些事儿 | 标签: 一个月前,移动飞信发布了飞信2010版,也就是V3.6版(飞信2008版为V3.5),并升级了飞信的通信协议 ...

  3. python3通过itchat登录微信给好友发送消息

    环境:windows7,python3.7 安装itchat,requests 金山词霸开放平台API:http://open.iciba.com/dsapi 如果遇到登录微信时出现错误告警,请参照: ...

  4. Python实现QQ PC端给好友发送消息

    上一篇说了发现有交易机会时可以发邮件,如果不想下载邮箱app的话,也可以通过qq来提醒自己. 具体的方法就是先查找qq的句柄,然后用SendMessage给qq窗口发送消息.这样的前提就是跟好友的聊天 ...

  5. php实现个人微信给自己好友发送消息

    <?php $wx = new wx(); if (!empty($_GET['cmd']) && $_GET['cmd'] == 'index') { //重新扫描登陆时,清空 ...

  6. 使用python 自动给微信好友发送消息 pyautogui库下载

    使用Python-pyautogui,实现全自动微信发消息,带交互功能 直接输入好友的备注.想发送的次数以及发送的内容,即可实现自动查找该好友并对该好友发送指定的消息 先直接上代码,后文会给出代码的具 ...

  7. c++实现定时向qq好友发送消息

    今天闲来无事突然想qq只能即时发送消息,能不能够使用其他的程序来控制qq发送指定的程序呢,后来参考了部分资料才发现,可以先通过获得qq的聊天窗口的句柄,然后通过模拟按键来实现qq消息的模拟发送.话不多 ...

  8. 初学Python第三天写的一个PC版模拟微信自动给好友发送消息

    本程序能做什么: 在PC版的微信界面,模拟鼠标键盘动作,随机对好友列表里的某些好友发送文本消息和图片 (因为本人以前没有WINDOW UI的编程经验,所以这几天对WIN32UI接口基本是边学边搜边用, ...

  9. 关于 使用python向qq好友发送消息(对爬虫的作用----当程序执行完毕或者报错无限给自己qq发送消息,直到关闭)...

    以前看到网上一些小程序,在处理完事物后会自动发送qq消息,但是一直搞不懂是说明原理.也在网上找过一些python登陆qq发送消息的文字,但是都太复杂了.今天偶然看到一篇文章,是用python调用win ...

最新文章

  1. 网易是世界最好的公司
  2. 原来... C++ explicit的作用
  3. C# 导出EXCEL文件
  4. 初中生问题:求任意凸多边形的交叉面积
  5. Windows Server 2012活动目录基础配置与应用(新手教程)之3---将客户机加入到指定域...
  6. 制作jffs2根文件系统
  7. Dubbo 面试题汇总(附答案)
  8. python返回菜单_返回上一菜单
  9. 用计算机视频,如何用计算机做视频
  10. servletconfigservletcontext
  11. 使用php建立评论系统
  12. 抖音视频批量下载,一个软件就够了,手把手教你下载抖音无水印视频。
  13. app登录策略实现(短信+一键登录+微信+微信小程序+抖音+抖音小程序)
  14. 卷积神经网络 —— 图像识别与深度学习
  15. 计算机专业的男生喜欢你,男生真心喜欢你的五个表现
  16. 生产者消费者3.0 阻塞队列版本
  17. 坎坎坷坷的深度学习之路(三)-Hello world(2)-------MNIST数据集1-MNIST格式
  18. python生产环境部署
  19. 新手GPU详细配置步骤
  20. 4G摄像头如何在定时抓拍下实现超低功耗-技术贴

热门文章

  1. 查找字符串中最长的单词
  2. 海豚浏览器推iOS V3.0,新增微博墙功能
  3. 越吃越美的的食物推荐
  4. 房产继承过程及问题记录
  5. mysql spool_用MySQL实现类似Oracle SPOOL的功能
  6. Java全栈(二)JavaSE:22.泛型
  7. XCTF BUG( 越权 修改forwarded头 文件上传) UNFINSH(二次注入 python脚本) 学习过程
  8. 413. 等差数列划分
  9. 微信小程序文件下载两种方式
  10. 成都盛铭轩:如何提升店铺权重