我在写一个微信墙(三)

最终篇!!!

终于写完了!

失败经历

之前碰到一个问题:拿不到acces_token

第一次失败:Tornadohttp fetch需要什么什么hostname match,而微信网页授权需要经过open.weixin.qq.comapi.weixin.qq.com,所以并不match,导致没办法使用 Tornado 内置的异步请求 HTTP 客户端去调用微信API

第二次失败:然后我尝试用JS来调用API,但是构造的请求总是有问题233。肯定还是因为我不会写JS,233。然后我就想用iframe好了【emoji笑哭表情x3】,但是跨域是问题233。

昨晚逛Python社区的时候突然发现了urllib2,好方便!!!

两行代码解决你的一!生!需!求!!!

import urllib
urllib.urlopen(URL).read()
#抓取URL网页所有内容,然后Do whatever you want!!!

第三次失败:233,因为担心黑客入侵,学校禁止内部服务器访问外网,所以没办法在服务器里的调用微信API

于是,我想到了用SAE,好聪明哈哈。

最终方案

如下:

自己服务器上的auth处理器:

class AuthHandler(tornado.web.RequestHandler):
    def get(self):
        CODE = self.get_argument('code', None)
        if CODE:
            self.redirect('http://1.ckwxyy.sinaapp.com/?code='+CODE)

SAE上的处理函数:

import tornado.wsgi
import sae

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        import json
        import urllib
        CODE = self.get_argument('code', None)
        if CODE:
            APPID = APPID
            SECRET = SECRET
            URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+APPID+"&secret="+SECRET+"&code="+CODE+"&grant_type=authorization_code"
            result = json.loads(urllib.urlopen(URL).read())
            ACCESS_TOKEN = result["access_token"]
            OPENDID = result["openid"]

            URL = "https://api.weixin.qq.com/sns/userinfo?access_token="+ACCESS_TOKEN+"&openid="+OPENDID
            result = json.loads(urllib.urlopen(URL).read())
            nickname = result["nickname"]
            avatar = result["headimgurl"]
            openid = result["openid"]

            self.redirect("服务器相应处理器地址")
        else:
            self.write("Hello, world! - Tornado")

app = tornado.wsgi.WSGIApplication([
 (r"/", MainHandler),
])

application = sae.create_wsgi_app(app)

到此,我的微信墙基本就写完了,剩下一些UI的问题就等着以后慢慢完善吧。

希望对大家有帮助,么么哒~

最后

总之,这是一个写微信墙的经验分享,也是如何使用微信公众平台网页授权用户信息的经验分享。多百度,多找替代方案,肯定能解决问题的。但是,这样好像一直回避最重要的问题,导致自己对技术的理解始终不够深入,希望自己能够在未来进行更多深入的思考。

你可能感兴趣的:(urllib2,微信墙,tornado)