您的位置:首页 > 编程语言 > Python开发

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

2015-11-27 16:53 671 查看
微信接口基本都需要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 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: