[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
- [python]微信开发access_token数据库存储 和 socket存取
- 微信公众号开发:access_token和jsapi_ticket的缓存和数据库存储方案
- 微信公众平台开发—access_token的获取存储与更新(Python开发)
- 微信access_token存储方案
- 微信开发--如何存储并定时更新access_token
- 微信开发--如何存储并定时更新access_token
- 微信开发-获取access_token
- 微信公众号开发获取access_token和jsapiticket
- 微信access_token存储与更新
- 微信access_token存储与更新
- 微信access_token定期获取并存储
- 定时任务存储 微信access_token
- 微信access_token全局存储与缓存
- 微信开发笔记之缓存access_token
- 微信开发的access_token的获取
- 微信开发-access_token 过期解决方法
- 微信access_token的获取开发示例
- 微信&java 开发4 access_token获取
- 超轻量级缓存技术——EhCache
- Android开发进阶系列(十) 玩转AChartEngine专题(下)
- struts2常用标签之property&debug
- robotframework学习
- 用Photoshop制作自己喜欢的桌面
- [python]微信开发access_token数据库存储 和 socket存取
- 单链表的头结点和头指针
- iOS 有关界面设计规范的一些总结
- struts2常用result类型详解
- java、synchronized、wait()、notify()、notifyAll()
- 关于Python脚本开头两行的:#!/usr/bin/python和# -*- coding: utf-8 -*-的作用 – 指定文件编码类型
- 用C的数据类型宽度扩展来解释char c=128;printf("%d",c);问题
- zend studio 打开在同目录下的项目文件
- 告警exc_bad_access copy assign 重写setter方法时