我在寫一個微信牆(三)

最終篇!!!web

終於寫完了!json

失敗經歷

以前碰到一個問題:拿不到acces_tokenapi

第一次失敗: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,好方便!!!微信

兩行代碼解決你的一!生!需!求!!!app

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的問題就等着之後慢慢完善吧。

但願對你們有幫助,麼麼噠~

最後

總之,這是一個寫微信牆的經驗分享,也是如何使用微信公衆平臺網頁受權用戶信息的經驗分享。多百度,多找替代方案,確定能解決問題的。可是,這樣好像一直迴避最重要的問題,致使本身對技術的理解始終不夠深刻,但願本身可以在將來進行更多深刻的思考。

相關文章
相關標籤/搜索