• 最近实名认证了新浪云,送了三百云豆,本来以为可以长期有效,但是没想到坑爹的新浪云即使没有使用,居然也每天自动扣除云豆。这也就解释了为什么我首次开通时候送的两百颗在没有使用的情况下平白无故消失的原因。
  • 言归正传,也正是新浪云的每天扣豆促使了我这种早有想法却一直懒癌发作的人花了一周来写了个微信公众号功能的开发,使用python+flask写了一个简单的传递消息的页面并部署在sae(新浪云)上来实现功能的发送与回复,用了我在公司实习的一周时间,写下这篇文章记录一下前因后果。
  • 要开发公众号,首先你得有个公众号对吧,不会的滚去面壁,很简单,去微信公众平台申请一下,然后绑定一下管理员微信号,再登录官网成为开发者设置一下基本配置,如图,url是你sae应用创建后的url,创建之后直接复制过来就可以了,token是自己设置的,目的是为了验证是不是你自己在使用,听说是出于安全考虑,然并卵,但是后面开发中对接的时候会用到,然后就可以进行微信公众号开发者了。

  • 接下来是去sae新建一个web应用,选的是创建云应用,目前只支持python2.7版本。

  • 自己填好二级域名之后和应用名称之后就创建好了,域名可以随便填,只要不和别人已创建的冲突就行。然后这个域名就是上文中微信开发中需要的url直接搬过去就可以啦。
  • 然后接下来就是代码事情了,我使用的是git,如图,选择GIt之后上传代码即可。

  • 接下来就是代码的事情了。。。

  • 代码中有一共三个文件,功能比较多的话可以自行扩展,在此仅开发了部分功能,一个文件已足够写入功能模块。两个配置文件中的信息如图所示,一个申明一下名字和版本信息,另一个引入sae,然后从代码中引入flask实例app,然后使用sae创建一下即可。
  • 本次实现的功能有天气查询、讲个笑话还有有道翻译,本来网上还有实现机器人对话的实现实例,但是我也试了一下,查到网络上有那种可以直接一键对接的,根本不需要自己开发的,所以觉得没意思,就放弃这个功能了。
  • 其实以上功能的实现也并没有多大难度,因为都有现成的api直接调用,自己只需对接然后实现一下数据的格式化就可以了。本次实验主要体验一下微信公众号开发的具体实现过程,并没有花太多时间在更多功能的实现,而且新浪云每天都在扣云豆,很快就会失效,所以仅做学习交流。
  • 首先是理解一下数据的具体传输过程,其实flask就起了个传递值的作用。

  • 然后是具体接入微信公众号,文档解释得很清楚了。

  • python具体对接实现。
@app.route('/',methods=['GET','POST'])
def wechat():
if request.method=='GET':
token='你的token'
data=request.args
signature=data.get('signature','')
timestamp=data.get('timestamp','')
nonce =data.get('nonce','')
echostr=data.get('echostr','')
s=[timestamp,nonce,token]
s.sort()
s=''.join(s)
if(hashlib.sha1(s).hexdigest()==signature):
return make_response(echostr)
else:
rec=request.stream.read()
xml_rec=ET.fromstring(rec)
tou = xml_rec.find('ToUserName').text
fromu = xml_rec.find('FromUserName').text
content = xml_rec.find('Content').text
xml_rep = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><FuncFlag>0</FuncFlag></xml>"
  • 功能函数的判断
if content.lower()=='joke':#笑话功能response = make_response(xml_rep % (fromu,tou,str(int(time.time())),joke()))response.content_type='application/xml'return responseelif 'tianqi' in content.lower():#天气功能判断,实现汉字查询天气if type(content).__name__ == "unicode":content = content.encode('UTF-8')place=content.lower().replace('+tianqi','')response = make_response(xml_rep % (fromu,tou,str(int(time.time())),weather(place)))response.content_type='application/xml'return responseelse:place=content.lower().replace('+tianqi','')response = make_response(xml_rep % (fromu,tou,str(int(time.time())),weather(place)))response.content_type='application/xml'return responseelse:if type(content).__name__ == "unicode":#实现汉译英content = content.encode('UTF-8')new_word=youdao(content)response = make_response(xml_rep % (fromu,tou,str(int(time.time())),new_word))response.content_type='application/xml'return responseelse:new_word=youdao(content)response = make_response(xml_rep % (fromu,tou,str(int(time.time())),new_word))response.content_type='application/xml'return response
  • 公众号发送和回复的消息格式都是xml格式,开发者文档中有具体的解释,发送和接收消息格式如下,然后使用python中的xml.etree.ElementTree提取数据,传递给第三方调用的API,处理后返回值,再继续转化成xml格式经web响应返回给微信。

  • 接下来就是具体功能函数的实现了,首先要有有道的API key和百度API store的账号才能调用,去有道官网申请一下就可以,百度API store只需要有个百度账号就可以了,API key在直接复制一下就可以用了。
  • 翻译和笑话因为使用json格式比较方便,直接解析后获取字典的值就可以了,然后返回格式按个人喜好设计。天气的返回值虽然也是json格式,但是因为他里面套了多层字典,一层一层找比较麻烦,所以就使用了正则表达式简单粗暴一点提取数据,然后自己写一下返回格式,再套入xml格式中返回给微信用户。
  • 代码:
#-*- coding: UTF-8 -*-
import time
import urllib2
from flask import Flask,g,request,make_response
import hashlib
import xml.etree.ElementTree as ET
import json
import random
import re
import urllibapp=Flask(__name__)
app.debug=Truedef youdao(word):
quary=urllib2.quote(word)
baseurl=r'http://fanyi.youdao.com/openapi.do?keyfrom=自己的&key=自己的&type=data&doctype=json&version=1.1&q='
url=baseurl+quary
resp=urllib2.urlopen(url)
data=json.loads(resp.read())
if data['errorCode'] == 0:
if 'basic' in data.keys():
trans=u'%s:\\n%s\\n%s\\n网络释意:\\n%s'%(data['query'],''.join(data['translation']),' '.join(data['basic']['explains']),''.join(data['web'][0]['value']))
return trans
else:
trans =u'%s:\\n基本翻译:%s\\n'%(data['query'],''.join(data['translation']))
return trans
elif data['errorCode'] == 20:
return u'对不起,要翻译的文本过长'
elif data['errorCode'] == 30:
return u'对不起,无法进行有效的翻译'
elif data['errorCode'] == 40:
return u'对不起,不支持的语言类型'
else:
return u'对不起,你输入的单词%s无法翻译,请检查拼写'% worddef joke():
try:
for i in random.sample(range(335),1):
page='page='+str(i)
full_url='http://apis.baidu.com/showapi_open_bus/showapi_joke/joke_text?'+page
req = urllib2.Request(full_url)
req.add_header("apikey", "自己的key")
resp = urllib2.urlopen(req,timeout=5)
data= json.loads(resp.read())
for i in random.sample(range(len(data['showapi_res_body']['contentlist'])),1):
return data['showapi_res_body']['contentlist'][i]['title']+'\\n'+data['showapi_res_body']['contentlist'][i]['text']+'\\n'
except Exception:
return u'抱歉,你运气不好,没有人愿意给你讲笑话,请重试。'def weather(city_name):
str_city='city='+str(city_name)
url='http://apis.baidu.com/heweather/weather/free?'+str_city
req = urllib2.Request(url)
req.add_header("apikey", "自己的key")
resp = urllib2.urlopen(req)
content= resp.read().decode('utf-8')
city=re.findall(r'"city":"(.*?)"',content,re.S)
update=re.findall(r'"loc":"(.*?)"',content,re.S)
txt=re.findall(r'"txt_d":"(.*?)"',content,re.S)
max_t=re.findall(r'"max":"(.*?)"',content,re.S)
min_t=re.findall(r'"min":"(.*?)"',content,re.S)
hum=re.findall(r'"hum":"(.*?)"',content,re.S)
pcpn=re.findall(r'"pcpn":"(.*?)"',content,re.S)
vis=re.findall(r'"vis":"(.*?)"',content,re.S)
wind_dir=re.findall(r'"dir":"(.*?)"',content,re.S)
wind_sc=re.findall(r'"sc":"(.*?)"',content,re.S)
wind_spd=re.findall(r'"spd":"(.*?)"',content,re.S)
return u'城市:'+city[0]+'\\n'+u'更新时间:'+update[0]+'\\n'+u'天气情况:'+txt[0]+'\\n'+u'最高温度:'+max_t[0]+u'度'+'\\n'+u'最低温度:'+min_t[0]+u'度'+'\\n'+u'相对湿度:'+hum[0]+'%'+'\\n'+u'降水量:'+pcpn[0]+'mm'+'\\n'+u'能见度:'+vis[0]+'km'+'\\n'+u'风向:'+wind_dir[0]+'\\n'+u'风力:'+wind_sc[0]+'\\n'+u'风速:'+wind_spd[0]+'km/h'+'\\n'
  • 至此,功能已全部实现,使用git上传代码到新浪云之后就可以使用啦。下面是使用演示,公众号应该过不了多久功能就会失效,可恶的sae,就不贴出啦。对于回复图片功能和语音功能没有继续深入,有兴趣的小伙伴可以自行研究。回复语音消息基本原理与文本消息类似,但是还需要调用一下微信另外的接口先返回一个media_id,然后再传递。

作者:HalShaw
链接:https://www.jianshu.com/p/264d55f8d652
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

python-flask-SAE微信公众号相关推荐

  1. python flask 微信_使用Flask创建微信公众号

    基于Python3的Flask微信公众号后台这次先用Flask为微信公众号做个后台.微信公众号后台一般对性能各方面要求并不高,这里我们以新浪SAE为例,其他已解析域名的服务器同理.整个过程比较简单,算 ...

  2. 腾讯云+CentOS 7.2+python:搭建微信公众号后台入门教程

    因为想自己编写微信公众号后台的程序,实现一些小功能,为以后的开发做准备,所以就从零开始,摸索着注册微信公众号,租用服务器,搭建环境进行开发. 简单的搭建过程中也经历了一些波折,踩了不少坑,仅留此文给跟 ...

  3. html如何获取请求头变量的值。_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  4. python 微信公众号发文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  5. Php一键转存微信文章,python如何导出微信公众号文章

    [相关学习推荐:python教程] 1.安装wkhtmltopdf 下载地址:https://wkhtmltopdf.org/downloads.html 我测试用的是windows的,下载安装后结果 ...

  6. 如何用python爬取公众号文章_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  7. 通过python实现企业微信公众号链接+图文推送

    背景:通过python实现企业微信公众号链接+图文推送 目的:实现点击即看到内容,用更符合用户查看公众号消息的习惯推送消息 步骤: 1.创建企业微信公众号(应用) 2.确定推送内容(BI报表链接)+标 ...

  8. python爬虫爬取微信_如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  9. 如何使用 Python 爬取微信公众号文章

    我比较喜欢看公众号,有时遇到一个感兴趣的公众号时,都会感觉相逢恨晚,想一口气看完所有历史文章.但是微信的阅读体验挺不好的,看历史文章得一页页的往后翻,下一次再看时还得重复操作,很是麻烦. 于是便想着能 ...

  10. Python 爬虫之微信公众号

    Python 爬虫之微信公众号 源代码放在文末. 本次爬虫需要的工具如下: selenium 驱动器 对应浏览器的 webdriver 一个微信订阅号 在 2017 年 6 月左右,微信官方发布一篇文 ...

最新文章

  1. 判断请求是否为Ajax请求的小妙招
  2. 设计模式 — 行为型模式 — 状态模式
  3. iOS FMDB官方使用文档 G-C-D的使用 提高性能(翻译)(转)
  4. 从程序架构提升安全性
  5. Yarn管理界面中各个参数和yarn-site.xml中参数的对应关系
  6. jssdk更新日志_关于jssdk版本的阿里云网站内容、产品介绍、帮助文档、论坛交流和云市场相关问题...
  7. (转)SpringMVC学习(七)——Controller类的方法返回值
  8. WEB消息提醒实现之二 实现方式-基于Iframe的流方式
  9. bzoj 1624: [Usaco2008 Open] Clear And Present Danger 寻宝之路(floyd)
  10. 关于Eclipse无法导入包的问题???
  11. python装饰器打印函数执行时间_使用python装饰器计算函数运行时间的实例
  12. Django 优秀资源大全
  13. WPF学习第十二集-绘图和动画
  14. OpenAI又放大招:连接文本与图像的CLIP,在ImageNet上效果媲美ResNet50
  15. 微信转发软件后缀_微信发送不了100M的视频?其实只需要改个后缀,长知识了...
  16. Qt 编程 keySight 34401A 万用表(串口232编程)
  17. 嵌入式Linux 系统的优化策略和方法
  18. 企业使用混合云,主要有哪些好处?
  19. mat 释放_cv :: Mat内存即使在调用release()后也不会释放?
  20. 一般UI设计要学习的内容都有哪些

热门文章

  1. 关于支付宝合作者身份id与与卖家支付宝账号
  2. mysql point 修改_[mysql]修改
  3. CSDN博客如何自动生成文章目录?
  4. 基于Shadow Map的阴影实现
  5. nginx 验证配置文件
  6. CDR-x86-docker镜像使用及测试教程
  7. 人生不会亏待你,越努力,越幸运
  8. springboot整合mybatis出现Invalid bound statement (not found): com.mapper.UserMapper.selectByPrimaryKey
  9. uni-app蓝牙操作
  10. 小程序生成长图(预览,不限高度)+小程序码+小程序码中间logo换成自定义logo