首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

Flask+SAE高速打造微信公众帐号(有码)

2013-04-02 
Flask+SAE快速打造微信公众帐号(有码)微信公众平台是个很牛的东西。大大节约了我们这些玩客的开发成本。Djan

Flask+SAE快速打造微信公众帐号(有码)

微信公众平台是个很牛逼的东西。大大节约了我们这些玩客的开发成本。Django也不错,但是开发这种东西,太笨重了,大材小用。还是推荐Flask。

本文以我自己的作品为例,介绍一种简单方法,可以快速地从零开始开发一个微信公众帐号,提供简单的搜索歌词的功能,输入“歌曲名 歌手名”,返回歌词。

作品已开源,欢迎围观。


使用技术:Python, Flask框架, SAE

成本:两罐汽水,一个下午一个晚上(或更快)

产出:一个微信公众账号,信息如下

账号名:查理歌词

微信号: chaligeci

项目地址: https://github.com/handalin/CharlieLrc


环境:linux系统

需要先安装的东西: svn ( ubuntu里 apt-get install subversion ) 这是新浪用来管理代码的工具

Flask (文档在此 https://flask-cn.readthedocs.org/en/latest/ ) 这是一个Python写的Web开发框架,轻巧灵活,很适合开发这种小应用。


一、去微信那里申请公号  ( http://mp.weixin.qq.com/ )

注册完,想好账号的名字(不可更改),填完资料来到一个页面,要求你填入你自己服务器的 url , 还有 token。

token就是令牌,微信平台通过token来验证彼此的身份(就别吐槽这个了。。。)

那么url,填入你的服务器地址。

服务器就采用新浪的Sina App Engine了。


二、到SAE新建一个项目

由于本文的主角是 微信平台, 新浪这边的事儿, 看这里吧 http://sae.sina.com.cn/?m=devcenter&catId=289  ,简洁明了。


三、微信公号和SAE应用的对接-验证

做法就是, 在SAE应用(下面简称应用)里写一个函数来处理Http请求, 微信平台这边会给我们的应用发送一个GET请求,带上4个参数。

我们要做的就是在应用里面处理这个请求,验证(其实可以不用)之后返回echostr参数即可。

上代码:


# -*- coding:utf8 -*-import urllib2, urllibimport sysimport reclass SharkSearcher():  def __init__(self):    self.error_msg = "查理没用...查不到...\nbtw,您听歌的品味真独特.\n您确认格式正确?(歌名 歌手名)"    def process_lrc(self, lrc):    return ''.join( lrc.split('<br />') )    def feed(self, song, artist=None):    if not artist: artist = ''    else: artist = '+' + artist    myurl = 'http://www.xiami.com/search?key=' + song + artist    # pretent to be IE. ^O^    user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'    values = {'name':'67',        'location':'Northampton',        'language':'Python'}    headers = { 'User-Agent':user_agent}    data = urllib.urlencode(values)    req = urllib2.Request(myurl, data, headers)    try:      html = urllib2.urlopen(req).read()    except BaseException:      return self.error_msg    pattern = r'<td class="song_name"><a target="_blank" href="(.+?)" title="'    try:      song_url = re.findall(pattern, html)[0]    except BaseException:      return self.error_msg        pattern = r'<div class="lrc_main">([\s\S]+?)</div>'    req = urllib2.Request('http://www.xiami.com'+song_url, data, headers)    try:      html = urllib2.urlopen(req).read()    except BaseException:      return self.error_msg    lrc = re.findall(pattern, html)[0]        return self.process_lrc(lrc)

下面解释下代码:

我的做法很dirty,就是将用户给我的参数拆开,附到 HTTP 的GET请求里发给虾米。

去虾米 (xiami.com) 搜一下, 会发现  它的搜索结果 url 是这样的 http://www.xiami.com/search?key=xxx+yyy(xxx,yyy是搜索的关键词) , 那么直接用python的urllib2包可以读到整个搜索结果, 然后看它源码, 这里用正则表达式直接抠出了我想要的部分( 第一个链接), 当然你可以用更碉堡的办法,但正则表达式无疑是最好写的。

接着拿到歌曲详情页,依然,用正则表达式抠出歌词,返回即可。

注意,虾米会判断你的身份,限制机器人的访问。 中间那段 # pretent to be IE  就是用来伪装的, 装成是浏览器, 然后虾米就乖乖地交出数据了。


所有代码已放上github。  

https://github.com/handalin/CharlieLrc

1楼rex3574516518小时前
膜拜瀚叔

热点排行