码迷,mamicode.com
首页 > 编程语言 > 详细

WeChat with Python

时间:2016-08-05 00:30:07      阅读:1089      评论:0      收藏:0      [点我收藏+]

标签:

  1. Installation

?

  1. 云引擎
    ????

    阿里:ACE

    navicester@163.com

    majia######@1

    139****3496

    谷歌:GAE

    ???

    盛大:CAE

    navicester@163.com

    majia######

    139****3496

    腾讯:CEE

    ???

    新浪:

    SAE
    
    													

    navicester@sina.com

    hebinn@######

    139****3496
    

    svn 
    

    [hebinn@163.com
    

    /majia######]
    

    百度:

    BAE

    ???

    网易云信:im

    ???

    ?

?

  1. Hello World (Python)

    1. 新建app

技术分享

?

  1. 网站接入接口

微信公众平台验证接口,会发送GET请求到指定的URL,并带上四个参数,分别是signature微信加密签名timestamp时间戳nonce随机数echostr随机字符串,通过检验signature来判断该请求是否来自微信服务器,这里会用到一个自己设参数token,相 当与一个加密密钥,通过这个可以防止第三方伪造请求,如果判断成功就原样返回echostr那么就接入成功。

加密方式不复杂,文档里这样介绍的

加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

根据这个流程我们实现这样一个验证函数,通过python强大的标准库

技术分享

  1. 编写view

打开zakkabag中的views.py编写如下代码正确响应微信接入信号

技术分享

  1. 配置url

zakkabag目录下新建一个urls.py代码如下:

技术分享

然后在总urls里面添加

技术分享

  1. 最后启用app并验证

再setting中启用wechat,尝试下在公众平台中验证下,地址就是你自己配置的URL,token填写自己设的token,应该很快可以验证通过,这样你就拥有了微信公众平台的开发权限了

微信测试账号

?

http://zakkabag.sinaapp.com/

?

技术分享

Token 可任意值,跟app里一致即可

?

  1. Hello World (PHP)

    1. Edit main entrance

技术分享

  1. check

技术分享

  1. Handle Message

技术分享

Handle WeChat request with XML format. simplexml_load_string load data to object

?

技术分享

技术分享

技术分享

  1. Transmit

技术分享

技术分享

  1. PHP vs Python

Python:

signature = request.GET.get("signature", None)

PHP:

$signature = $_GET["signature"];

?

Python:

rawStr = smart_str(request.raw_post_data)

PHP:

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
					

?

?

$postObj = simplexml_load_string($postStr, ‘SimpleXMLElement‘, LIBXML_NOCDATA);

$RX_TYPE = trim($postObj->MsgType);

?

msg = paraseMsgXml(ET.fromstring(rawStr))

queryStr = msg.get(‘Content‘,‘You have input nothing~‘)

?

  1. 调试

进入地址 https://mp.weixin.qq.com/debug/

?

  1. 接口类型:消息接口调试
  2. 接口列表:文本消息
  3. 参数列表:

* URL : 开发者填写URL,调试时将把消息推送到该URL上http://zakkabag.sinaapp.com/

* ToUserName : 开发者微信号 gh_d8544573f4b1

* FromUserName : 发送方帐号(一个OpenID)

* CreateTime : 消息创建时间 (整型)

* MsgType : 消息类型(文本消息为 text )

* Content : 消息类型(文本消息内容)

* MsgId : 消息类型(消息id,64位整型)

?

<xml>

<ToUserName><![CDATA[gh_d8544573f4b1]]></ToUserName>

<FromUserName><![CDATA[ojpX_jig-gyi3_Q9fHXQ4rdHniQs]]></FromUserName>

<CreateTime>1412079737</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[方倍工作室]]></Content>

<MsgId>6064836289959967853</MsgId>

</xml>

?

  1. Create Menu

?

  1. access_token

技术分享

技术分享

  1. define menu

技术分享

?

  1. Create menu

技术分享

技术分享

?

  1. 有道翻译助手

?

有道API

  然后,去有道API申 请一个key,申请的时候网站地址随便填就行。有道API非常简单,直接以GET的形式把要翻译的文本发送到指定的url,然后它会给我们回复翻译结果, 我们可以选择xml、json等返回格式,下例是xml,接着,在浏览器里面按着指定的格式输入url,就可以看到返回结果啦:

技术分享

注意,如果是对词进行翻译的话有的词还会返回一些啥网络释义,基本释义啥的,具体对这个xml解析的方法请看下面的代码。

?

有道翻译API http://fanyi.youdao.com/openapi?path=data-mode

API key:1228130126

keyfrom:zakkabag

?

  1. Python

服务端代码

大致思想就是:用户A向公众帐号发送一条消息,微信平台会按着公众帐号预先的设置,把用户A的消息内容和一些其他信息(如创建时间等)以xml的形式post到我们预先设置好的url上(这个url的服务端就是我们要写的在SAE上 的应用),我们要做的就是每当接受到微信post请求,我们解析微信平台post过来的xml,得到用户A的消息内容,把消息内容以get的形式发送到有道API,获取有道API返回的xml(或json等),解析,之后按微信平台规定的格式构造成一个xml,作为微信平台post请求的结果给其返回,微 信平台收到结果后,会把消息自动回复给用户,用户就能收到翻译结果了。

  用一个图表示上述过程如下:

技术分享

技术分享

?

技术分享

技术分享

代码解释

  • smart_str

Django 为字符编码的转换提供了非常简洁的方法:

django.utils.encoding.smart_unicode
				

django.utils.encoding.smart_str
				

我们在需要将用户提交的数据转换为 Unicode 的时候,可以使用 smart_unicode,而在需要将程序中字符输出到非 Unicode 环境(比如 HTTP 协议数据)时可以使用 smart_str 方法。拿 DDlog 来说,也有不少地方用到了这两个方法。

1、smart_unicode 在 DDlog 中的使用

Blog 的标签(Tag)一般多少会有中文,对于服务器环境来说,不会安装系统级的 UTF-8 环境,那么浏览器请求的 URL 中包含的中文会作为经过 urllib.quote 编码转换后的 UTF-8 字符串(注意,这种情况下,Django 不会自动转换为 Unicode),这里,我们在使用这个数据之前,需要进行一定的转换。

比较原始的方法类似如下:

def post_via_tag(request, tag):

    from urllib import unquote

    key = unquote(unicode(tag).encode(‘UTF-8‘))

    tag_as = Tag.objects.select_related().get(tag__iexact = key)

而如果使用 Django 的 smart_unicode,明显简洁得多(也更符合 DRY 原则):

def post_via_tag(request, tag):

    from django.utils.encoding import smart_unicode

    tag_as = Tag.objects.select_related().get(tag__iexact = smart_unicode(tag))

    # ... other code

2、smart_str 在 DDlog 中的使用

DDlog 在接受评论的时候,会将评论者的姓名和邮件地址保存到 Cookie 中,以便该用户下次发表评论的时候自动显示相关信息。而评论者的姓名有可能是中文的,如果直接把中文字符串放到 Cookie 中,会引发 UnicodeEncodeError 异常。

这里需要进行去 Unicode 编码:

def post_comment(request, slug):

    # ... other prepare code

    response.set_cookie(‘COMMENT_AS_NAME‘, smart_str(comment_user.name), expired_at)

就这么简单便捷!

?

  • urllib
    • urllib2.quote

Python的url编码函数是在类urllib库中,使用方法是:

编码:urllib.quote(string[, safe]),除了三个符号"_.-"外,将所有符号编码,后面的参数safe是不编码的字符,

使用的时候如果不设置的话,会将斜杠,冒号,等号,问号都给编码了。

>>> import urllib

>>> print urllib.quote("http://neeao.com/index.php?id=1")

http%3A//neeao.com/index.php%3Fid%3D1

这样在使用urllib.urlopen打开编码后的网址的时候,就会报错了。

设置不编码的符号:

>>> print urllib.quote("http://neeao.com/index.php?id=1",":?=/")

http://neeao.com/index.php?id=1 这下就好了。

?

?

?

技术分享

技术分享

技术分享

?

?

  1. PHP

技术分享

技术分享

技术分享

技术分享

?

技术分享

?

?

  1. Debug

Copy http://debug.fangbei.org/ source code

Notepad++ : Encoding->Convert to UTF-8

?

技术分享

?

技术分享

Python 实现……….

?

  1. Reference

方培微信公众平台开发在线调试

微信测试账号

微信公众平台接口调试工具

?

?

?

[X] django连接微信公众平台

[原]微信公众号开发之使用eclipse创建微信web工程并发布到BAE测试

在SAE开发微信公众平台(java)

使用SAE进行微信公众号开发 入门教程

【申精】SAE与微信公众平台对接JAVA语言版本

Python/Django 微信接口

微信机器人:小蜗牛有道翻译小助手——Django + SAE + 微信公众帐号自动回复开放接口

wechat_sdk

方培工作室

?

?

微信公众平台开发调试方法

微信公众帐号自定义菜单创建的python脚本

简单使用Git和Github来管理自己的代码和读书笔记

Django搭建微信公众平台详解 一

Django搭建微信公众平台详解 二

Django搭建微信公众平台详解 三

?

使用python一步一步搭建微信公众平台(一)----基本的验证与鹦鹉学舌功能

使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具

使用python一步一步搭建微信公众平台(三)----添加用户关注后的欢迎信息与听音乐功能

使用python一步一步搭建微信公众平台(四)----将小黄鸡引入微信自动回复

使用python一步一步搭建微信公众平台(五)----使用mysql服务来记录用户的反馈

?

django-rest-framework

让Python在Android系统上飞一会儿

?

  1. History

    1. ?
      1. ?
        1. ?

?

如何向word中粘贴代码并保留关键字颜色

我们知道,在一些编程开发的环境下,代码中的关键字是用不同的颜色标识的。但有时会需要把代码粘贴到word中,而如果直接粘贴,往往是没有颜色的。

如果你也遇到这个问题,我爱搜集网博主向你介绍的这个方法也许可以帮助你。

  1. 将代码粘贴到notepad++中,并保存到文件。在指定文件名时,注意要根据代码类型指定文件后缀,比如php代码就要使用.php,C++代码就要使用.cpp。保存后,就能够看到相应的关键字被着色了。
  2. 选择菜单"插件"–"NppExport"–"Copy RTF to clipboard",将文件内容以RTF的格式复制到粘贴板中。
  3. 直接Ctrl+v将内容粘贴到word的指定地方就可以了。

搞定。

如果在IDE下的话,以VS和Eclipse为例。直接复制过去就是了。

?

?

inputStr = "当前文件时UTF-8,所以你所看到的这段字符串,也是UTF-8编码的";

SyntaxError: Non-ASCII character ‘\xb5‘ in file D:\eclipse-workspace\co_python_spreading\1\zakkabag\zakkabag\encodings.py on line 7, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

原因:Python默认是以ASCII作为编码方式的,如果在自己的Python源码中包含了中文(或者其他的语言,比如小日本的日语……),此时即使你把自己编写的Python源文件以UTF-8格式保存了;但实际上,这依然是不行的。

解决方法:在源码的第一行添加以下语句:

# -*- coding: UTF-8 -*-????
或者
#coding=utf-8

注:此语句一定要添加在源代码的第一行

技术分享

http://www.evernote.com/l/ADNtV3K5kMNOoby8sGOea0HdtYAiMHDUIec/

?

?

?

content.decode("gbk")

UnicodeDecodeError: ‘gbk‘ codec can‘t decode bytes in position 224-225: illegal multibyte sequence

http://www.tuicool.com/articles/nEjiEv

要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码

http://www.evernote.com/l/ADNtV3K5kMNOoby8sGOea0HdtYAiMHDUIec/

WeChat with Python

标签:

原文地址:http://www.cnblogs.com/2dogslife/p/5738689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!