微信企業號


企業號出來了。姑且不論大家是接受還是抵觸。

作為一個技術人員,我們要抱着發現新大陸的態度。

不過這個新大陸有點讓我蛋疼,尤其在中文的處理上莫名其妙。好吧,如果你要推海外市場,可能它是一個很好的選擇,用於替換手機上的app,野心有點大,估計安卓和蘋果都不干了。

 

閑話少講,直奔主題。

模式:

主動模式

這個就是說,主動去騷擾用戶,你可以調用騰信的企業號的api,用於給關注你的企業號的人,push各種東西(消息、新聞、視頻,聲音等),以及修改企業號里面的相關信息(通訊錄,組織架構之類的)

回調模式

這個比上面的有好點,用戶通過微信找我們,讓我們提供服務。這時服務可以以主動模式提供過去,這就不叫做騷擾了。

webjs模式

做些裝飾性的工作。略。

 

體驗一把

開發語言:python

服務器: ubuntu 12

 

接下來上代碼,我們大致的體驗下主動模式和回調模式。

主動模式

首先,騰訊要求,你要騷擾用戶,必須有憑證token。好吧,token這樣獲取:

def getTokenIntime(CorpId,Secret):
    res = urllib2.urlopen('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s'%(CorpId,Secret))
    res_dict = simplejson.loads(res.read())
    token = res_dict.get('access_token',False)
    if not token:
        with open(r'./wx_log.txt','ab') as f:
            f.write(u'異常: 無法取得token')
    return token

token有超時時間,目前是2個小時。也就是說,獲取一次token,兩個小時以內就不用再次獲取了。

好了,拿到憑證了,接着可以騷擾別人了,以發短信為例:

def sendTxtMsg(token,content,to_user="@all",to_party="",to_tag="",application_id=0,safe=0):
    try:
        data = {
           "touser": to_user,
           "toparty": to_party,
           "totag": to_tag,
           "msgtype": "text",
           "agentid": application_id,
           "text": {
               "content": content,
           },
           "safe":safe
        }

        data = simplejson.dumps(data,ensure_ascii=False)
        if Debug:
            with open(r'./wx_data.txt','ab') as f:
                f.write(data+'\r\n')
        req = urllib2.Request('https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s'%(token,))        
        resp = urllib2.urlopen(req,data)
        msg = u'返回值:' + resp.read()
    except Exception,ex:
        msg = u'異常:' + str(ex)
    finally:
        with open(r'./wx_log.txt','ab') as f:
            f.write(msg+'\r\n')

之后發送新聞神馬的,略了。

目前發現,聲音/圖片/視頻,所謂的media_id,根本找不到,我確定我找過了企業號平台的每一個角落。所以這三個目前發不了。

 

好吧,主動模式玩了一段之后,發現似乎太無趣了。中文超過一定字數,直接報錯{"errcode":41011,"errmsg":"missing agentid"}。在企業號的開發者論壇上問了,無人應答。

 

好吧,自我安慰下,瑕不掩瑜,雖然我們都是中國人,雖然基本等於宣判不能大肆用中文。試試回調模式,看看中文問題能否得到解決。

回調模式

首先,要開啟回調模式, 也就是告訴企業號你的服務器url,你想要的token和密鑰。

直接設了,點擊,報錯,各種錯。受不了了。好吧,看看文檔。

文檔說,開啟回調模式,需要進行“兩次握手”,也許是三次。而不是設置了就好了。

第一次,企業號想你的服務器發送一段信息,post方式,內容放在xml里面。(暗號)

第二次,你的服務器將內容解密,返回給企業號。(明文)

第三次,企業號,將你發過來的明文進行比對什么的,然后反饋給在web后台操作的你。(核對)

嚴格來講,第三次,不算握手。

 

接下來,動手:

首先,你需要一個公網的服務器(沒有的話自行解決)。

其次,你需要在服務器上部署一個web應用,接受企業號的暗號並解密回傳之用。

簡而言之,其實只需要一個在公網的應用即可(比如 GAE 應用)。

 

由於只是測試,因此簡單新建了一個django項目。

路由映射

url(r'^$','wx_handler.views.veryfi_callback'),

視圖:

# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from .WXBizMsgCrypt import WXBizMsgCrypt
import xml.etree.cElementTree as ET

def veryfi_callback(req):
    msg_signature = req.GET.get('msg_signature',False)
    timestamp = req.GET.get('timestamp',False)
    nonce = req.GET.get('nonce',False)
    wxcpt = WXBizMsgCrypt('MJyh7es2bn1R','8j1F3fXp3eGn6RMeC17RtYiHiEUxUpgCrXassD3vHVE','wxd33505f2be01d541')
    if req.method =='GET':
        echostr = req.GET.get('echostr',False)
        ret,sEchoStr=wxcpt.VerifyURL(msg_signature, timestamp,nonce,echostr)
        if(ret!=0):
            ret_val = "ERR: VerifyURL ret: " + str(ret)
            return ret_val

        return HttpResponse(sEchoStr)
    else:
        if req.method=='POST':
            data = req.body #not POST
            ret,sMsg=wxcpt.DecryptMsg(data, msg_signature, timestamp, nonce)
            if( ret!=0 ):
                ret_val =  "ERR: DecryptMsg ret: " + str(ret)
                return HttpResponse(ret_val)

            xml_tree = ET.fromstring(sMsg)
            from_uid = xml_tree.find('FromUserName').text
            content = xml_tree.find("Content").text

            sRespData = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[wxd33505f9be01d541]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><MsgId>1</MsgId><AgentID>1</AgentID></xml>"%(from_uid,'you saied:' + content,)
            ret,sEncryptMsg=wxcpt.EncryptMsg(sRespData, nonce, timestamp)
            return HttpResponse(sEncryptMsg)
        else:
            return HttpResponse("http method not suppoted")

 

其中,有幾個地方小小的掉進坑里了。

由於企業號拋過來的數據類型是 text/xml, 因此用 request.POST是抓不到數據的。

然后,不能有csrf_token保護,因為企業號肯定不會考慮傳入一個form,然后加上csrf_token。因此需要把對應的middleware給取消掉。(反正我是把所有middleware全部屏蔽了)

 

最后,這個只是針對消息的回復。(不會處理event)

轉載請注明本文來自:http://www.cnblogs.com/Tommy-Yu/p/4014442.html,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM