微信公众平台开发(免费云BAE+高效优雅的Python+网站开放的API)

news/2024/5/12 4:31:24/文章来源:https://blog.csdn.net/weixin_33841503/article/details/93367347

虽然校园App是个我认为的绝对的好主意,但最近有个也不错的营销+开发的模式出现:微信平台+固定域名服务器。

微信公众平台的运行模式不外两个:

一、机器人模式或称转发模式,将说话内容转发到服务器上完成,拿服务器的回复再一次转发,就完成一次问答谈话。

二、人控模式,一个自然人登陆公众平台上,能直接接触到所有关注者,与之交互,这一定也是最累的。

 

微信公众平台若是服务号,用来做微网站,省去了登录认证过程。但说白了就是微信定制版的微网站。这我一学期后才搞懂,如果早些弄懂就不会做那么多无用功。

 

微信公众平台须有正面头像+身份证的照片来实名认证,非常严格。顺便一说,微信公众平台官方说法是偏支持大企而非个人。

服务器(准确的说只是一个引擎)有新浪云SAE,百度云BAE,阿里云AAE。

SAE最早,但使用云豆消费,注册只送500个。到现在,BAE允许创建10个应用而不用实名认证,SAE是需实名认证的。还有BAE比SAE强的就是支持git,虽然两者都支持svn,非常合时,刚好我学习git中,我果断选择BAE。云上建的每个应用可有20个版本,但任一个版都可以并且唯一上线。AAE(阿里云)一直不支持python,很让人失望。

第一阶段:入门——轻轻走过飘过。

下面是用数天时间借鉴前人成果Kingson的《一个用Python和Bottle实现基于微信公众平台API和SAE查询豆瓣电影的简单应用》开发的。

这个例子非常适合在用Python的开发人员。经过一番狠狠的折腾,我还弄懂了其它问题:云的概念、OAuth、token、微信API调用,网站API调用、python等,百度谷歌都会有答案。

还有很多像微信API通信认证(话说竞然用xml而不用json通信,不过这是取舍问题,无可厚非),python web框架,git对接云服务器……用了我许多时间。过程曲折复杂,看起来只是转移一下云平台,但实名认证,开发者域名的认证等浪费了我很多时间,因为没经验,很多各种问题都撞上了,尤其是我这种粗心大意,心眼碗粗的人,整个过程实在不算顺利,但我相信别人都会比我顺利,因为我连最低级的错都犯了。不多说,贴上关键代码代码。

下载地址:http://pan.baidu.com/s/1d1g3l

 

  1 #! /usr/bin/env python
  2 # coding=utf-8
  3 __author__ = 'jszhou'
  4 from bottle import *
  5 import hashlib
  6 import xml.etree.ElementTree as ET
  7 import urllib2
  8 # import requests
  9 import json
 10 
 11 app = Bottle()
 12 
 13 """
 14 Change Log:
 15 03-04--03-08 完成微信API+Python自动回复代码雏形,可以通过电影ID查询电影信息,以Text形式返回给用户电影
 16 Title和电影summary
 17 # 03-11 完成通过电影名称查询并返回图文格式的数据
 18 # 03-13 1.增加给新关注的用户自动返回“欢迎关注豆瓣电影,输入电影名称即可快速查询电影讯息哦!”信息的功能
 19         2.完善注释信息
 20  
 21 关于本地调试问题:
 22 微信没有提供本地调试功能,给用户造成不小的麻烦。
 23 打开Bottle的Debug功能,在本地运行自己的代码(启动Server),使用Chrome或Firefox上的Advanced Rest Client插件来模拟微信服务器向自己的应用发送请求,
 24 这样就可以看到详细的报错信息,方便开发者定位修复问题,其相当于,自己的应用是SAE,而Advanced Rest Client模拟的是新微信客户端和微信服务器。
 25 也有同学自己写脚本,模拟微信服务器发送数据,这也是同样的道理。
 26  
 27 遗留问题:
 28 1.从豆瓣拿到的海报图片都是竖向的,而微信中显示的是横向的,所以在微信看图片就被裁了一节,不过还好能看,
 29   如何能完整显示海报图片,有待进一步research;
 30 2.现在的通过电影名称返回的结果,实际上是拿的豆瓣返回的第一条数据,这样就有可能不准确,如何精确匹配用户的
 31   查询条件,也还需要进一步研究。
 32 """
 33  
 34 @app.get("/")
 35 def checkSignature():
 36     """
 37     这里是用来做接口验证的,从微信Server请求的URL中拿到“signature”,“timestamp”,"nonce"和“echostr”,
 38     然后再将token, timestamp, nonce三个排序并进行Sha1计算,并将计算结果和拿到的signature进行比较,
 39     如果相等,就说明验证通过。
 40     话说微信的这个验证做的很渣,因为只要把echostr返回去,就能通过验证,这也就造成我看到一个Blog中,
 41     验证那儿只返回了一个echostr,而纳闷了半天。
 42     附微信Server请求的Url示例:http://yoursaeappid.sinaapp.com//?signature=730e3111ed7303fef52513c8733b431a0f933c7c
 43 &echostr=5853059253416844429&timestamp=1362713741&nonce=1362771581
 44     """
 45     token = ""  # 你在微信公众平台上设置的TOKEN
 46     signature = request.GET.get('signature', None)  # 拼写不对害死人那,把signature写成singnature,直接导致怎么也认证不成功
 47     timestamp = request.GET.get('timestamp', None)
 48     nonce = request.GET.get('nonce', None)
 49     echostr = request.GET.get('echostr', None)
 50     tmpList = [token, timestamp, nonce]
 51     tmpList.sort()
 52     tmpstr = "%s%s%s" % tuple(tmpList)
 53     hashstr = hashlib.sha1(tmpstr).hexdigest()
 54     if hashstr == signature:
 55         return echostr
 56     else:
 57         return "wws:indentify error"
 58  
 59 def parse_msg():
 60     """
 61     这里是用来解析微信Server Post过来的XML数据的,取出各字段对应的值,以备后面的代码调用,也可用lxml等模块。
 62     """
 63     recvmsg = request.body.read()  # 严重卡壳的地方,最后还是在Stack OverFlow上找到了答案
 64     root = ET.fromstring(recvmsg)
 65     msg = {}
 66     for child in root:
 67         msg[child.tag] = child.text
 68     return msg
 69  
 70 def query_movie_info():
 71     """
 72     这里使用豆瓣的电影search API,通过关键字查询电影信息,这里的关键点是,一是关键字取XML中的Content值,
 73     二是如果Content中存在汉字,就需要先转码,才能进行请求
 74     """
 75     movieurlbase = "http://api.douban.com/v2/movie/search"
 76     DOUBAN_APIKEY = ""  # 这里需要填写你自己在豆瓣上申请的应用的APIKEY
 77     movieinfo = parse_msg()
 78     searchkeys = urllib2.quote(movieinfo["Content"].encode("utf-8"))  # 如果Content中存在汉字,就需要先转码,才能进行请求
 79     url = '%s?q=%s&apikey=%s' % (movieurlbase, searchkeys, DOUBAN_APIKEY)
 80     # return "<p>{'url': %s}</p>" % url
 81     # url = '%s%s?apikey=%s' % (movieurlbase, id["Content"], DOUBAN_APIKEY)
 82     # resp = requests.get(url=url, headers=header)
 83     resp = urllib2.urlopen(url)
 84     movie = json.loads(resp.read())
 85     # return "<p>{'movie': %s}</p>" % movie
 86     # info = movie["subjects"][0]["title"] + movie["subjects"][0]["alt"]
 87     # info = movie['title'] + ': ' + ''.join(movie['summary'])
 88     return movie
 89     # return info
 90  
 91 def query_movie_details():
 92     """
 93     这里使用豆瓣的电影subject API,通过在query_movie_info()中拿到的电影ID,来获取电影的summary。
 94     """
 95     movieurlbase = "http://api.douban.com/v2/movie/subject/"
 96     DOUBAN_APIKEY = ""  # 这里需要填写你自己在豆瓣上申请的应用的APIKEY
 97     id = query_movie_info()
 98     url = '%s%s?apikey=%s' % (movieurlbase, id["subjects"][0]["id"], DOUBAN_APIKEY)
 99     resp = urllib2.urlopen(url)
100     description = json.loads(resp.read())
101     description = ''.join(description['summary'])
102     return description
103  
104 @app.post("/")
105 def response_msg():
106     """
107     这里是响应微信Server的请求,并返回数据的主函数,判断Content内容,如果是“Hello2BizUser”,就
108     表明是一个新注册用户,调用纯文本格式返回,如果是其他的内容就组织数据以图文格式返回。
109  
110     基本思路:
111     # 拿到Post过来的数据
112     # 分析数据(拿到FromUserName、ToUserName、CreateTime、MsgType和content)
113     # 构造回复信息(将你组织好的content返回给用户)
114     """
115     #拿到并解析数据
116     msg = parse_msg()
117     #设置返回数据模板
118     #纯文本格式
119     textTpl = """<xml>
120              <ToUserName><![CDATA[%s]]></ToUserName>
121              <FromUserName><![CDATA[%s]]></FromUserName>
122              <CreateTime>%s</CreateTime>
123              <MsgType><![CDATA[%s]]></MsgType>
124              <Content><![CDATA[%s]]></Content>
125              <FuncFlag>0</FuncFlag>
126              </xml>"""
127     #图文格式
128     pictextTpl = """<xml>
129                 <ToUserName><![CDATA[%s]]></ToUserName>
130                 <FromUserName><![CDATA[%s]]></FromUserName>
131                 <CreateTime>%s</CreateTime>
132                 <MsgType><![CDATA[news]]></MsgType>
133                 <ArticleCount>1</ArticleCount>
134                 <Articles>
135                 <item>
136                 <Title><![CDATA[%s]]></Title>
137                 <Description><![CDATA[%s]]></Description>
138                 <PicUrl><![CDATA[%s]]></PicUrl>
139                 <Url><![CDATA[%s]]></Url>
140                 </item>
141                 </Articles>
142                 <FuncFlag>1</FuncFlag>
143                 </xml> """
144     #判断Content内容,如果等于"Hello2BizUser",表明是一个新关注用户,如果不是,就返回电影标题,电影简介
145     #和电影海报组成的图文信息
146     if msg["Content"] == "Hello2BizUser":
147         echostr = textTpl % (
148             msg['FromUserName'], msg['ToUserName'], str(int(time.time())), msg['MsgType'],
149             u"欢迎关注豆瓣电影,输入电影名称即可快速查询电影讯息哦!")
150         return echostr
151     else:
152         Content = query_movie_info()
153         description = query_movie_details()
154         echostr = pictextTpl % (msg['FromUserName'], msg['ToUserName'], str(int(time.time())),
155                                 Content["subjects"][0]["title"], description,
156                                 Content["subjects"][0]["images"]["large"], Content["subjects"][0]["alt"])
157         return echostr
158  
159 if __name__ == "__main__":
160     # Interactive mode
161     debug(True)
162     run(app,host='127.0.0.1', port=8080, reloader=True)
163 else:
164     # Mod WSGI launch
165 #    import sae
166 #    debug(True)
167 #    os.chdir(os.path.dirname(__file__))
168 #    app = default_app()
169 #    application = sae.create_wsgi_app(app)
170 
171 #################################################
172     #os.chdir(os.path.dirname(__file__))#Forbidden to access
173     from bae.core.wsgi import WSGIApplication
174     application = WSGIApplication(app)

 

注:代码中用json.dumps会更好。 后注:此注不对。

 

深入阶段,将http://www.cnblogs.com/mchina/tag/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97/里的功能用python实现之。

……

 本代码需要与bottle.py一并上传到服务器空间。

 

微信开发调试小工具下载:http://www.cnblogs.com/linkbiz/archive/2013/05/16/3080306.html

附上一些特别信息:

本人微信公众号pythonwoodpub,              开发项目澳洲红酒微信服务号,

转载于:https://www.cnblogs.com/weishun/p/weixin-publish-developing.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_762416.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QQ影音的网站已经关闭

近日&#xff0c;腾讯关闭了QQ影音的网站&#xff0c;用户访问该网站会提示“400 Bad Request”&#xff0c;这个视频播放器目前长期不进行更新&#xff0c;在Windows 10下无法关联视频文件&#xff0c;QQ旋风云播放功能也被关闭&#xff0c;目前看来&#xff0c;这个产品已经完…

你的网站安全吗?WEB应用安全总结

2019独角兽企业重金招聘Python工程师标准>>> 应用安全越来越重要 —— 互联网上看到的大多数安全事件基本都和应用安全&#xff0c;尤其是 WEB 应用安全有关(随便翻翻 wooyun 之类的就知道了)。最近几年的工作基本都和应用安全有关系&#xff0c;借着这个机会也总结…

Amazon AWS S3 部署静态网站 + 绑定顶级域名 + DNSPod

2019独角兽企业重金招聘Python工程师标准>>> Amazon AWS S3 部署静态网站 绑定顶级域名 DNSPod 什么是 Amazon AWS S3? Amazon AWS Amazon Web Services官方是这么解释的 (http://aws.amazon.com/cn/products/?nc2h_ql)&#xff1a; Amazon Web Services 提供一…

一个影响力大、实战、干货的SEO案例

事情的起因是这样的&#xff1a;额&#xff0c;旧的案例写着没意思&#xff0c;正在操作的案例又无法透漏更多的信息&#xff0c;思前想后&#xff0c;也许只有这个最合适了(绝对不能告诉你&#xff0c;这是领导教的只有一个案例的含蓄说法)。一、项目背景先来介绍下项目接手时…

干货满满:小团队(网站APP)没有数据方面的预算,推广运营人员如何用数据提升业务?...

先说结论&#xff1a;没有钱&#xff0c;没有预算照样可以做好数字运营&#xff0c;数字营销。想解决这个棘手的问题&#xff0c;要么花钱&#xff0c;要么花时间咯。下文中会具体讲花时间&#xff08;精力&#xff09;的方法。1.先从付费类的软件说起&#xff1a;截止2018年&a…

阿里云系列——5.网站云解析快速配置(简单+免费+详细+最新)

&#xff08;又称&#xff1a;域名&#xff0c;主机&#xff0c;备案都配置好了&#xff0c;就是不能访问网站的解决方案--1.解析问题&#xff09; 网站部署之~阿里云系列汇总 http://www.cnblogs.com/dunitian/p/4958462.html 直接访问网站发现> 进入管理页面&#xff1a;h…

提升网站用户体验—WebP 图片的高效使用

一.WebP 的由来 现代图像压缩技术对我们的生活方式影响很大。数码相机能将上千张高质量图片存储到一张内存卡里、智能手机可以与邻近设备快速分享高分辨率的图片、网站与手机等移动设备能快速展示各种富媒体。 然而&#xff0c;如果图片只能以最原始的格式进行存储的话&#xf…

八种不同类型的响应式网站建设赏析

随着网站建设发展的趋势&#xff0c;响应式的网站逐渐成为各行业建站形式的首选&#xff0c;毕竟响应式在当前的网站运用中更加方便&#xff0c;尤其在移动设备多样化对移动网站需求的形势下&#xff0c;省去了网站因不同设备而产生的琐屑烦恼。下面奇亿网络将和大家分享八种不…

ThinkPHP 框架开发 零基础开发 网站商城 步骤 (2)

1. 先写后台 Admin部分 项目目录结构如下&#xff1a; 文件 admin.php 内容如下&#xff1a; 配置ThinkPHP与mysql的链接信息&#xff1a; 转载于:https://www.cnblogs.com/zhongbin/p/5362996.html

使用IntelliJ IDEA开发SpringMVC网站(二)框架配置

原文:使用IntelliJ IDEA开发SpringMVC网站&#xff08;二&#xff09;框架配置摘要 讲解如何配置SpringMVC框架xml&#xff0c;以及如何在Tomcat中运行 目录[-] 文章已针对IDEA 15做了一定的更新&#xff0c;部分更新较为重要&#xff0c;请重新阅读文章并下载最新源码。五、Sp…

大型网站技术架构(二)架构模式

2019独角兽企业重金招聘Python工程师标准>>> 每一个模式描述了一个在我们周围不断重复发生的问题及该问题解决方案的核心。这样&#xff0c;你就能一次又一次地使用该方案而不必做重复工作。 所谓网站架构模式即为了解决大型网站面临的高并发访问、海量数据、高可靠…

大型网站技术架构(七)网站的可扩展性架构

2019独角兽企业重金招聘Python工程师标准>>> 扩展性是指对现有系统影响最小的情况下&#xff0c;系统功能可持续扩展或提升的能力。 设计网站可扩展架构的核心思想是模块化&#xff0c;并在此基础上&#xff0c;降低模块间的耦合性&#xff0c;提供模块的复用性。模…

网站页面SEO的三个标签怎么写有利【转载】

转载自&#xff1a;代明博客 在SEO界&#xff0c;自从夫唯老师提出“四处一词”的概念以来&#xff0c;不管是搜索引擎还是SEOer&#xff0c;都格外重视页面的三个标签。三个标签书写是否成功&#xff0c;在很大程度上决定了网页是否能有好的排名。今天代明博客就与大家探讨一下…

将WordPress安装在网站子目录的相关问题

不论我们打算将WordPress博客作为网站的子域名&#xff08;wordpress.example.com&#xff09;、子目录&#xff08;example.com/wordpress&#xff09;&#xff0c;还是作为网站的主域名&#xff08;yourdomain.com&#xff09;使用&#xff0c;都建议将WordPress安装在子目录…

如何把域名解析到网站空间IP上?

建立网站首要就是要有一个域名和网站空间&#xff0c;怎么把这两者联系在一起呢&#xff1f;这就要通过域名解析&#xff0c;把域名指向空间的IP&#xff0c;让我们能够通过域名访问网站空间。通过域名解析把我们容易记住的域名转化成IP地址&#xff0c;由DNS服务器把域名解析到…

大型网站架构

1.初始的网站访问量低&#xff0c; 所以一个应用服务器就够了。随着用户访问越来越多&#xff0c;数据越来越大&#xff0c;那么就需要更好的性能。所以就将一个服务器分为三个服务器&#xff1a;应用服务器&#xff0c;文件服务器&#xff0c;数据库服务器。 1.1应用服务器需…

【redux】详解react/redux的服务端渲染:页面性能与SEO

亟待解决的疑问 为什么服务端渲染首屏渲染快&#xff1f;&#xff08;对比客户端首屏渲染&#xff09; react客户端渲染的一大痛点就是首屏渲染速度慢问题&#xff0c;因为react是一个单页面应用&#xff0c;大多数的资源需要在首次渲染前就加载好&#xff0c;这较大程度地拖慢…

访问网站提示无法安全地连接到此页面

按winR键打开运行&#xff0c;输入“inetcpl.cpl”&#xff0c;点击确定&#xff0c;如下图所示&#xff1a; 一、高级选项页将TLS开头的选项勾选。 二安全页&#xff0c;将显示混合内容勾选为启用。 重启浏览器访问网站。

怎么换网站模板?

速成网站创业版和国际版可以换模板&#xff0c;方法如下&#xff1a;1、登录速成网站管理后台&#xff0c;点击左上角的&#xff1a;设计&#xff0c;再点管理&#xff0c;如下图&#xff1a; 2、再点左侧的&#xff1a;控制面板&#xff0c;然后点&#xff1a;更换模板&#x…