最近的工作是给微信做一个消息类的后台类的应用。

消息类的后台类的应用的意思就是,这个应用不需要界面,不需要美工,也不需要客户端。它只是微信的一个普通账号。你可以加这个账号为好友。然后你可以和这个账号聊天获取你想要的内容。这个账号也会自动发消息给你。其实有点像聊天机器人。

我写的这个后台类的应用是为泰国用户写的。会根据用户发过来的日期发送这个用户当天的运气好坏。包括财运、霉运、桃花运和幸运数字这些。世界上真的有人信这些? 我谨慎的表示怀疑。

我是在linux平台上用Python写的。第一个需要解决的问题就是如何保持在后台运行不退出。幸好Python保持了很好的和C语言libc库函数的兼容性,用几行代码可以搞定。

import os

if os.fork():

os.setsid()

....

else:

os.exit()

和libc的函数原型几乎一模一样。这段代码的意思是先fork出一个子进程。然后在让子进程脱离原进程组创建一个新的后台进程组,从而与终端脱离,成为后台运行的不死进程。关于这方面的知识可以看《UNIX环境高级编程》9.6控制终端。

我用了3个后台进程来实现产品的需求。 首先用户发送生日的日期,我需要返回该日期对应的星期几的今日的运程。比如用户发送1/11/1985, 这代表1985年11月1日。 我需要计算这一天是星期五,然后给他返回星期五这一天出生的人今天的运气怎么样。运气怎么样不是我说的,据说是泰国合作方聘请了一个真正的算命的人每天去编辑的。所以我需要从一个url来拉取每一天,出生于一周的每一天的人的当天运气情况。于是第一个后台进程的功能就是需要去定时去拉取这个url的最新内容,并存放在本地。比较糟糕的一点是,我不知道这个算命的人每天会在什么时候去更新。他可能是头一天晚上8点钟更新,也可能是当天的4点。这比较烦,我需要每隔一段时间去拉取。然后还需要从内容中分析这是哪一天的内容。这是第一个进程。

解决了内容的来源问题之后我所要面临的第二个问题是我从哪里获取用户的消息。从微信那里拿来了一份MessageAPI文档。这份文档现在我还不能公开因为没有对外发布。微信可以通过HTTP长连接不断的向你PUSH用户发送的消息过来,而你所需要做的就是拿到消息做处理。就跟用电饭煲做米饭那么简单。那么这里所需要解决的问题就只有一个,Python如何保持HTTP长连接,并能不断的收取数据包?

嗯,我知道你会想到的urllib2。 这也是我的第一反应。不过可惜的是urllib2并不提供保持长连接的办法。直接用recv、read这些系统调用监听fd? 我知道你是一个不怕麻烦不惧艰险的人。可我并不像你。经过一番google和stackoverflow的查询之后我得到了一个好东西——urlgrabber。不过在这篇文章里我不打算舍本逐末的去介绍urlgrabber的使用细节。而且我也没有详细的研究过它。不过经过我的测试,urlgrabber确实能很好的处理长连接HTTP的消息接收。所以我强烈的推荐这种方式而不是去用更底层的TCP连接API。

使用方法也很简单:

import urllib2

from urlgrabber.keepalive import HTTPHandler

keepalive_handler = HTTPHandler()

opener = urllib2.build_opener(keepalive_handler)

urllib2.install_opener(opener)

f = urllib2.urlopen('http://www.python.org')

然后你就能像读一个文件一样从HTTP连接中源源不断的读出数据来了。不过值得注意的一点是,这个文件打开的是阻塞式的IO。阻塞式IO在python中的处理和libc中不太一样。假如一个连接没有关闭且是阻塞式的,在python中你无法一次读到当前已收到所有数据。解决的方法有: 1 改成非阻塞。 2 每次读一个字节,直到读到一个完整数据包的结束。

很遗憾的告诉大家,在时间不充裕的情况下,方法1我没能成功。而keepalive的HTTP发送来的数据,每一段数据都是有规律的。比如标准的HTTP trunked的数据的开始总是会告诉你这一次会发送多少个字节,然后你读相应的字节数就可以了。而微信的message API在每一个数据包的最后都会出现\r\n。凭这个规律,我们足以判断出是否收完一个数据包了。

大概的代码如下,仅用来说明我的思路:

while True:

sPkg += f.read(1)

if sPkg.endswith('\r\n'):

#package over

sPkg = ''

嗯,这是第二个进程。收取微信的消息。

然后剩下的工作就是需要把消息发给微信用户了。当然你不能保证每次发送的消息都是成功的。因此我利用数据库做了一个消息队列。实现起来非常简单,就是每次从数据库中获取10条待发的消息发送。发送成功的消息在数据库中标记发送成功,以保证不会重复发送。发送不成功消息,在数据库中将发送次数增加1,这样这条消息会在下一次出队列时继续发送,直到发送的次数达到一个阈值。这是第三个进程。

不过现在微信的open message api还没有对外公开发布,不好更多的透露更多技术细节了。有兴趣的可以和我联系。我的邮箱是xxb.sklse@gmail.com。 在此处留言也可以。只是觉得有了这个API大家可以做出一些更多有意思的东西,比如电子商务网站可以通过这个来做到免费的订单到达的提醒。 甚至餐饮店可以利用微信免费点餐。呵呵。这个微信API早晚会发布,算我做了一点广告吧。

python制作别人能使用的类_最近的工作,用python做一个微信的消息类的后台类的应用...相关推荐

  1. python制作辅助和易语言的区别_为什么多数外挂都用易语言?

    写一个答非所问的答案吧,刚看到有人说想举报答非所问的人,额额额,确实,,,,,我这样做算是为易语言正名吧,讲下我的编程经历好了 我也算是个是个易语言忠实用户了,除了写过偷老师插在教室里的U盘的内容外, ...

  2. python制作的游戏要怎么运行_练习项目19:使用python制作游戏(上) 魔力Python

    你的位置:魔力Python > Python教程 > 练习项目19:使用python制作游戏(上) 练习项目19:使用python制作游戏(上) Python教程小楼一夜听春语 2年前 ( ...

  3. python 去掉list元素的双引号_一天快速入门 Python

    Python 是由Guido Van Rossum在 90 年代早期设计,现在是最常用的编程语言之一.特别是人工智能的火热,再加之它的语法简洁且优美,实乃初学者入门AI必备的编程语言. Python基 ...

  4. python装饰器函数执行后日志_一篇文章搞懂Python装饰器所有用法

    如果你接触 Python 有一段时间了的话,想必你对 @ 符号一定不陌生了,没错 @ 符号就是装饰器的语法糖. 它放在一个函数开始定义的地方,它就像一顶帽子一样戴在这个函数的头上.和这个函数绑定在一起 ...

  5. python零基础入门五小时教学_五小时轻松入门Python

    Python 是由Guido Van Rossum在 90 年代早期设计,现在是最常用的编程语言之一.特别是人工智能的火热,再加之它的语法简洁且优美,实乃初学者入门AI必备的编程语言. Python基 ...

  6. python的开发者太负责任了_人生苦短,我用 Python

    我接触 Python 并不算早,第一次使用 Python 写生产系统的程序是2004年,那时候我已经有了几年的编程经验.当然了,现在这年头说早晚都不合适,昨天我说2000年就开始使用 Vim 编程了, ...

  7. python怎么另起一行阅读答案_【小菜鸡学python】

    零零散散知道些python的语法,但是没有系统的学习.今天开个系列好好学一下python~里面的知识点大多数是根据B站视频python编程基础入门[廖雪峰]_哔哩哔哩 (゜-゜)つロ 干杯~-bili ...

  8. python打开交互界面设计_老司机必备——用PyQt做一个有交互界面的妹子图爬虫...

    内容简介:老司机必备--用PyQt做一个有交互界面的妹子图爬虫 代码飙车,指日可待.今天的课程教大家结合PyQt和 Python 爬虫技术,做一个带有交互界面的妹子图网站爬虫程序. 一.实验简介 1. ...

  9. python两数相加有进退位_仁裁者、Python之父Guido“退位”,python何去何从?

    10月30日,Python之父Guido大牛宣布退休,离开Dropbox.他发推文说,"这件事感觉既苦涩又甜蜜:苦涩的是,我马上要离开Dropbox,现在已经退休:甜蜜的是,在Dropbox ...

最新文章

  1. 延迟开学会影响毕业?这些高校有答案了!
  2. nodejs之async异步编程
  3. 华为鸿蒙系统有什么特色,【图片】华为鸿蒙系统的厉害之处在于 你可能非用不可 !【手机吧】_百度贴吧...
  4. 类与类之间关系,用C#和JavaScript体现
  5. java 字节码增强原理_深入浅出Java探针技术1--基于java agent的字节码增强案例
  6. python层级抓取_python实现提取str字符串/json中多级目录下的某个值
  7. .NET开发者提高编程技能的5种方法
  8. java 6 基础教程_Java小白入门教程(6)——循环语句
  9. 无监督学习之稀疏编码,自编码
  10. 第一天mysq踩坑--ERROR 1820 (HY000): You must reset your password using ALTER USER statement before execut
  11. C语言 条件运算符的用法
  12. 期刊投稿时,word文档分栏问题
  13. 【Servlet入门】一篇文章让你从没听过到了熟于心
  14. iOS常用第三方库大全
  15. [转载]1986年吴图南 马岳梁 吴英华 孙剑云等名家大師
  16. 南卫理公会大学 计算机排名,2019-2020南卫理公会大学世界排名多少【QS最新第701-750名】...
  17. 如何fine tuning
  18. IDEA自定义注释模板实现方法。
  19. -- 40、查询选修“张三“老师所授课程的学生中,成绩最高的学生信息及其成绩
  20. TAAL新任CEO Jerry Chan访谈:我们将如何从当前危机中引领新经济体制

热门文章

  1. 罕见水星凌日直播,QQ物联携手腾讯云带你连接宇宙
  2. 百度朱光:将技术基因注入百度金融,是我们未来三五年要做的事
  3. A Typical Homework (a.k.a Shi Xiong Bang Bang Mang) UVA - 12412
  4. Centos7系统下使用Docker部署SpringBoot项目及安装Mysql
  5. 2022 支付宝五福 |“联机版”打年兽背后的网络技术 RTMS
  6. 机器学习 第三节 第十三课
  7. 网页服务器版本,华为网页版本进云服务器
  8. 各省、自治区、直辖市分行业新三板上市公司数统计(不含香港、澳门、台湾)
  9. java计算机毕业设计慧学IT精品课程网站MyBatis+系统+LW文档+源码+调试部署
  10. static变量可以被修改吗