[python]微信开发access_token数据库存储 和 socket存取
2015-11-27 16:53
671 查看
微信接口基本都需要access_token 因为它的生命周期有限和它的每天的调用次数有限 所以你懂的 要把它给存储起来,最开始我写的是存储到数据库 一段时间后更新 然后boss说可以用socket来做不给数据库压力而且更快些 于是又写了个socket的获取access_token
由于jsapiTicket 和cardApiTicket 使用也非常多而且也是和accessToken一样的特性 所以这三个都全局存了
2.
SERVER
CLIENT
有不对的地方(貌似没有 毕竟用了好久)或者可以优化的地方可以告诉我 万分感激 :D
由于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 HttpUtil import json import time import MySQLdb import 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 4000 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: yyf Token 服务器端脚本程序 基本原理:thread1 每3min更改一次全局变量Token thread2 一直监听client链接 client发送1返回accessToken client发送2返回jsApiTicket client发送3返回cardApiTicket ''' from socket import * import threading import loadProperties import HttpUtil import json import 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)#睡3min threads=[]#多线程... 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 loadProperties def 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 accessToken def jsApiTicket(): ADDR=(loadProperties.HOST,loadProperties.PORT) sock=socket(AF_INET,SOCK_STREAM) sock.connect(ADDR) sock.send('2') jsApiTicket=sock.recv(128) 8fc7 sock.close() return jsApiTicket def 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
相关文章推荐
- python脚本的两种调用方式
- 史上最直白的pca教程 之 二
- 史上最直白的pca教程 之 一
- python学习系列之python装饰器基础(1)
- python的多线程简单实例理解
- Python练习程序(一)用户认证后,联系人信息查询
- wxPython界面设计器——wxformbuilde的简单教程
- python之self
- python元组传参的理解
- Python支持tab键补全
- [基础] - Python中 is 和 == 的区别
- python 扫描目录下所有文件并读取文件
- python实现简单的音乐播放功能
- 2.python学习笔记:python操作mysql数据库
- python的参数
- python request
- [基础] - Python中 @staticmethod 和 @classmethod
- windows 64bit selenium+python环境搭建
- Python 文件操作
- pygame for python3.5