[python]微信开发access_token数据库存储 和 socket存取

来源:互联网 发布:服务器地址和端口号 编辑:程序博客网 时间:2024/06/07 02:43

微信接口基本都需要access_token 因为它的生命周期有限和它的每天的调用次数有限 所以你懂的 要把它给存储起来,最开始我写的是存储到数据库 一段时间后更新 然后boss说可以用socket来做不给数据库压力而且更快些 于是又写了个socket的获取access_token

由于jsapiTicket 和cardApiTicket 使用也非常多而且也是和accessToken一样的特性 所以这三个都全局存了

MySQLdb

(存数据库update比insert要好 由于要换socket 就没优化了。。。。)

#coding=utf8'''Created on Oct 22, 2015@author: yyf获取 accessToken接口  获取 jsapiTicket接口获取 cardApiTicket接口传入参数:无返回参数:accessToken/jsapiTicket调用方式:AccessToken.selectAccessToken()        AccessToken.selectJsapiTicket()        AccessToken.selectCardApiTicket()'''import HttpUtilimport jsonimport timeimport MySQLdbimport loadProperties# def accessToken():class AccessToken(object):#定义一个类    @staticmethod    def __getAccessToken():#通过接口获得accessToken        accessToken=''        url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+loadProperties.appid+"&secret="+loadProperties.appSecret        while accessToken=='':            jsonData=HttpUtil.httpRequest(url)            if jsonData!=None:                jsonData=json.loads(jsonData)                if jsonData.has_key('access_token'):                    accessToken=jsonData['access_token']                else:                    print 'accessToken获取错误'                    time.sleep(5)            else:                print '没有收到'                time.sleep(5)        print 'accessToken:',accessToken        return accessToken    @staticmethod    def selectAccessToken():#从数据库拿到accessToken 如果超时则重新获取并插入数据库        time2=int(round(time.time()*1000))        conn= MySQLdb.connect(host=loadProperties.host,user='root',passwd='123456',db=loadProperties.db)        cursor =conn.cursor()        cursor.execute('select * from  ACCESS_TOKEN where 1<2 order by time desc limit 0,1')        values=cursor.fetchall()        cursor.close()        if len(values)>0:            accessToken=values[0][0]            time1=values[0][2]        if time2-int(time1)>180000:            accessToken=AccessToken.__getAccessToken()            jsapiTicket=AccessToken.__getJsapiTicket(accessToken)            AccessToken.__insertAccessToken(accessToken, jsapiTicket)               conn.close()        #print 'accessToken 查找成功',accessToken        return accessToken    @staticmethod    def __getJsapiTicket(accessToken):#通过接口获得jsapiTicket 如果由于accessToken过期导致jsapiTicket获取失败则重新获取accessToken和jsapiTicket 并插入数据库        jsapiTicket=''        url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi"        while jsapiTicket=='':            jsonData=HttpUtil.httpRequest(url)            if jsonData!=None:                jsonData=json.loads(jsonData)                if jsonData['errcode']=='41001':                    accessToken=AccessToken.__getAccessToken()                    jsapiTicket=AccessToken.__getJsapiTicket(accessToken)                    AccessToken.__insertAccessToken(accessToken, jsapiTicket)                    #print 'jsapiTicket:',jsapiTicket                    return jsapiTicket                if jsonData.has_key('ticket'):                    jsapiTicket=jsonData['ticket']                else:                    print 'jsapiTicket获取错误'                    time.sleep(5)            else:                print 'jsapiTicket获取失败'                time.sleep(5)        #print 'jsapiTicket:',jsapiTicket        return jsapiTicket    @staticmethod    def selectJsapiTicket():#从数据库拿到accessToken 如果超时则重新获取并插入数据库        time2=int(round(time.time()*1000))        conn= MySQLdb.connect(host=loadProperties.host,user='root',passwd='123456',db=loadProperties.db)        cursor =conn.cursor()        cursor.execute('select * from  ACCESS_TOKEN where 1<2 order by time desc limit 0,1')        values=cursor.fetchall()        cursor.close()        if len(values)>0:            jsapiTicket=values[0][1]            time1=values[0][2]        if time2-int(time1)>180000:            accessToken=AccessToken.__getAccessToken()            jsapiTicket=AccessToken.__getJsapiTicket(accessToken)            AccessToken.__insertAccessToken(accessToken, jsapiTicket)               conn.close()        #print 'jsapiTicket查找成功:',jsapiTicket        return jsapiTicket    @staticmethod    def __insertAccessToken(accessToken,jsapiTicket):#每次插入数据库都是accessToken和jsapiTicket一起插入        #print '开始插入数据库'        time1=str(int(round(time.time()*1000)))        conn= MySQLdb.connect(host=loadProperties.host,user='root',passwd='123456',db=loadProperties.db)        cursor =conn.cursor()        cursor.execute('insert into ACCESS_TOKEN(access_token,jsapi_ticket,time) values (%s,%s,%s)',(accessToken,jsapiTicket,time1))        conn.commit()        cursor.close()        conn.close()        #print '插入数据库成功'    @staticmethod    def selectCardApiTicket():#获取卡券专用apiTicket 由于之前数据库设置没添加这个字段和这个字段当前用的不多就没存数据库        cardApiTicket=''        while cardApiTicket=='':            accessToken=AccessToken.selectAccessToken()            url ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=wx_card";            jsonData=HttpUtil.httpRequest(url)            if jsonData!=None:                jsonData=json.loads(jsonData)                if jsonData.has_key('ticket'):                    cardApiTicket=jsonData['ticket']                else:                    print 'cardApiTicket获取错误'                    time.sleep(5)            else:                print 'cardApiTicket获取失败'                time.sleep(5)        print 'cardApiTicket:',cardApiTicket        return cardApiTicket#测试if __name__=='__main__':    print AccessToken.selectAccessToken()   

2.

socket

(就是Tcp Server 和 Client 咯)

SERVER

#coding=utf8'''Created on Nov 12, 2015@author: yyfToken  服务器端脚本程序基本原理:thread1 每3min更改一次全局变量Token        thread2 一直监听client链接         client发送1返回accessToken        client发送2返回jsApiTicket        client发送3返回cardApiTicket'''from socket import *import threadingimport loadPropertiesimport HttpUtilimport jsonimport time accessToken='thisIsAccessToken' #全局变量jsapiTicket='thisIsJaApiRicket'cardTicket='ThisIsCardTicket'def server():#server端    HOST=loadProperties.HOST#设置地址 从配置py拿到    PORT=loadProperties.PORT#设置端口    BUFSIZE=128#设置传输量大小    ADDR=(HOST,PORT)#格式化    sock=socket(AF_INET,SOCK_STREAM)#创建TCPsocket    sock.bind(ADDR)#绑定端口    sock.listen(10)#监听数量    while True:        print '等待接入...'        tcpClientSock,addr=sock.accept()#监听并返回链接客户端的socket        data=tcpClientSock.recv(BUFSIZE)#接收客户端发送的消息        if cmp(int(data),1)==0:#如果接收的是1则返回accessToken给客户端            tcpClientSock.send(accessToken)#发送消息回客户端            tcpClientSock.close()#关闭socket        elif cmp(int(data),2)==0:#如果接收的是2则返回jsapiTicket给客户端            tcpClientSock.send(jsapiTicket)            tcpClientSock.close()        elif cmp(int(data),3)==0:#如果接收的是3则返回cardTicket给客户端            tcpClientSock.send(cardTicket)            tcpClientSock.close()    sock.close()def getToken():#获取三种token    global accessToken,jsapiTicket,cardTicket#申明全局变量    accessTokenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+loadProperties.appid+"&secret="+loadProperties.appSecret    while True:#while True(0.0)        jsonData=HttpUtil.httpRequest(accessTokenUrl)#请求微信accessToken接口        if jsonData!=None:            jsonData=json.loads(jsonData)#格式话json            if jsonData.has_key('access_token'):                accessToken=jsonData['access_token']#得到accessToken            else:                print 'accessToken获取错误'                time.sleep(5)                getToken()#如果获取失败 重新获取Token        jsApiTicketUrl="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=jsapi"        jsonData=HttpUtil.httpRequest(jsApiTicketUrl)        if jsonData!=None:            jsonData=json.loads(jsonData)            if jsonData.has_key('ticket'):                jsapiTicket=jsonData['ticket']            else:                print 'jsapiTicket获取错误'                time.sleep(5)                getToken()        cardApiTicketUrl ="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+accessToken+"&type=wx_card";        jsonData=HttpUtil.httpRequest(cardApiTicketUrl)        if jsonData!=None:            jsonData=json.loads(jsonData)            if jsonData.has_key('ticket'):                cardTicket=jsonData['ticket']            else:                print 'cardApiTicket获取错误'                time.sleep(5)                getToken()        time.sleep(180)#睡3minthreads=[]#多线程...t1=threading.Thread(target=getToken)threads.append(t1)t2=threading.Thread(target=server)threads.append(t2)if __name__=='__main__':    for t in threads:        t.setDaemon(True)        t.start()    t.join()    print 'over' 

CLIENT

#coding=utf8'''Created on Nov 12, 2015@author: yyf获取 accessToken接口  获取 jsapiTicket接口获取 cardApiTicket接口传入参数:无返回参数:accessToken/jsapiTicket/cardApiTicket  (String)调用方式:GetToken.accessToken()        GetToken.jsApiTicket()        GetToken.cardApiTicket()'''from socket import *import loadPropertiesdef accessToken():#从服务端拿到accessToken    ADDR=(loadProperties.HOST,loadProperties.PORT)#格式化地址和端口    sock=socket(AF_INET,SOCK_STREAM)#创建socket    sock.connect(ADDR)#绑定端口    sock.send('1')#发送指定的口令给server    accessToken=sock.recv(128)#接收server返回的信息    sock.close()#关闭socket    return accessTokendef jsApiTicket():    ADDR=(loadProperties.HOST,loadProperties.PORT)    sock=socket(AF_INET,SOCK_STREAM)    sock.connect(ADDR)    sock.send('2')    jsApiTicket=sock.recv(128)    sock.close()    return jsApiTicketdef cardApiTicket():    ADDR=(loadProperties.HOST,loadProperties.PORT)    sock=socket(AF_INET,SOCK_STREAM)    sock.connect(ADDR)    sock.send('3')    cardApiTicket=sock.recv(128)    sock.close()    return cardApiTicket# print accessToken()#测

有不对的地方(貌似没有 毕竟用了好久)或者可以优化的地方可以告诉我 万分感激 :D

2 0
原创粉丝点击