亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

python利用微信公眾號實現報警功能

2020-02-15 21:44:22
字體:
來源:轉載
供稿:網友

微信公眾號共有三種,服務號、訂閱號、企業號。它們在獲取AccessToken上各有不同。

其中訂閱號比較坑,它的AccessToken是需定時刷新,重復獲取將導致上次獲取的AccessToken失效。

而企業號就比較好,AccessToken有效期同樣為7200秒,但有效期內重復獲取返回相同結果。

為兼容這兩種方式,因此按照訂閱號的方式處理。

 處理辦法與接口文檔中的要求相同:

為了保密appsecrect,第三方需要一個access_token獲取和刷新的中控服務器。

而其他業務邏輯服務器所使用的access_token均來自于該中控服務器,不應該各自去刷新,否則會造成access_token覆蓋而影響業務。

 下面的代碼以企業號為例,將access_token儲存在sqlite3數據庫中,相比儲存在文本中,放在數

據庫里,可以為后期存放其他數據提供向后兼容。如果放在文本中,則不如放在數據庫中靈活。

設計思路和使用方法:

自動創建sqlite3數據庫,包括表結構和數據,并能在數據庫表結構不存在或者數據不存在或遭刪除的情況下,創建新的可用的數據

盡可能的保證Class中每一個可執行的函數單獨調用都能成功。

Class中只將真正能被用到的方法和變量設置為public的。

使用時只需要修改此文件中的weixin_qy_CorpID和weixin_qy_Secret改成自己的,并import此文件,使

用WeiXinTokenClass().get()方法即可得到access_token。

#!/usr/bin/python# encoding: utf-8# -*- coding: utf8 -*-#Python學習群125240963每天更新資料,包括2018最新企業級項目案例,同千人一起交流。import osimport sqlite3import sysimport urllibimport urllib2import jsonimport datetime# import timeenable_debug = Truedef debug(msg, code=None):  if enable_debug:    if code is None:      print "message: %s" % msg    else:      print "message: %s, code: %s " % (msg, code)AUTHOR_MAIL = "uberurey_ups@163.com"weixin_qy_CorpID = "your_corpid"weixin_qy_Secret = "your_secret"# Build paths inside the project like this: os.path.join(BASE_DIR, ...)BASE_DIR = os.path.dirname(os.path.abspath(__file__))# Database# https://docs.djangoproject.com/en/1.9/ref/settings/#databasesDATABASES = {  'default': {    'ENGINE': 'db.backends.sqlite3',    'NAME': os.path.join(BASE_DIR, '.odbp_db.sqlite3'),  }}sqlite3_db_file = str(DATABASES['default']['NAME'])def sqlite3_conn(database):  try:    conn = sqlite3.connect(database)  except sqlite3.Error:    print >> sys.stderr, """/  There was a problem connecting to Database:    %s  The error leading to this problem was:    %s  It's possible that this database is broken or permission denied.  If you cannot solve this problem yourself, please mail to:    %s  """ % (database, sys.exc_value, AUTHOR_MAIL)    sys.exit(1)  else:    return conndef sqlite3_commit(conn):  return conn.commit()def sqlite3_close(conn):  return conn.close()def sqlite3_execute(database, sql):  try:    sql_conn = sqlite3_conn(database)    sql_cursor = sql_conn.cursor()    sql_cursor.execute(sql)    sql_conn.commit()    sql_conn.close()  except sqlite3.Error as e:    print e    sys.exit(1)def sqlite3_create_table_token():  sql_conn = sqlite3_conn(sqlite3_db_file)  sql_cursor = sql_conn.cursor()  sql_cursor.execute('''CREATE TABLE "main"."weixin_token" (        "id" INTEGER ,        "access_token" TEXT,        "expires_in" TEXT,        "expires_on" TEXT,        "is_expired" INTEGER        )        ;  ''')  sqlite3_commit(sql_conn)  sqlite3_close(sql_conn)def sqlite3_create_table_account():  sql_conn = sqlite3_conn(sqlite3_db_file)  sql_cursor = sql_conn.cursor()  sql_cursor.execute('''CREATE TABLE "main"."weixin_account" (        "id" INTEGER,        "name" TEXT,        "corpid" TEXT,        "secret" TEXT,        "current" INTEGER        )        ;  ''')  sqlite3_commit(sql_conn)  sqlite3_close(sql_conn)def sqlite3_create_tables():  print "sqlite3_create_tables"  sql_conn = sqlite3_conn(sqlite3_db_file)  sql_cursor = sql_conn.cursor()  sql_cursor.execute('''CREATE TABLE "main"."weixin_token" (        "id" INTEGER ,        "access_token" TEXT,        "expires_in" TEXT,        "expires_on" TEXT,        "is_expired" INTEGER        )        ;  ''')  sql_cursor.execute('''CREATE TABLE "main"."weixin_account" (        "id" INTEGER,        "name" TEXT,        "corpid" TEXT,        "secret" TEXT,        "current" INTEGER        )        ;  ''')  sqlite3_commit(sql_conn)  sqlite3_close(sql_conn)def sqlite3_set_credential(corpid, secret):  try:    sql_conn = sqlite3_conn(sqlite3_db_file)    sql_cursor = sql_conn.cursor()    sql_cursor.execute('''INSERT INTO "weixin_account" ("id", "name", "corpid", "secret", "current") VALUES                (1,                'odbp',                ?,                ?,                1)''', (corpid, secret))    sqlite3_commit(sql_conn)    sqlite3_close(sql_conn)  except sqlite3.Error:    sqlite3_create_table_account()    sqlite3_set_credential(corpid, secret)def sqlite3_set_token(access_token, expires_in, expires_on, is_expired):  try:    sql_conn = sqlite3_conn(sqlite3_db_file)    sql_cursor = sql_conn.cursor()    sql_cursor.execute('''INSERT INTO "weixin_token"               ("id", "access_token", "expires_in", "expires_on", "is_expired") VALUES               (               1,               ?,               ?,               ?,               ?               )''', (access_token, expires_in, expires_on, is_expired))    sqlite3_commit(sql_conn)    sqlite3_close(sql_conn)  except sqlite3.Error:    sqlite3_create_table_token()    sqlite3_set_token(access_token, expires_in, expires_on, is_expired)def sqlite3_get_credential():  try:    sql_conn = sqlite3_conn(sqlite3_db_file)    sql_cursor = sql_conn.cursor()    credential = sql_cursor.execute('''SELECT "corpid", "secret" FROM weixin_account WHERE current == 1;''')    result = credential.fetchall()    sqlite3_close(sql_conn)  except sqlite3.Error:    sqlite3_set_credential(weixin_qy_CorpID, weixin_qy_Secret)    return sqlite3_get_credential()  else:    if result is not None and len(result) != 0:      return result    else:      print "unrecoverable problem, please alter to %s" % AUTHOR_MAIL      sys.exit(1)def sqlite3_get_token():  try:    sql_conn = sqlite3_conn(sqlite3_db_file)    sql_cursor = sql_conn.cursor()    credential = sql_cursor.execute(      '''SELECT "access_token", "expires_on" FROM weixin_token WHERE "is_expired" == 1 ;''')    result = credential.fetchall()    sqlite3_close(sql_conn)  except sqlite3.Error:    info = sys.exc_info()    print info[0], ":", info[1]  else:    if result is not None and len(result) != 0:      return result    else:      # print "unrecoverable problem, please alter to %s" % AUTHOR_MAIL      # sys.exit(1)      return Nonedef sqlite3_update_token(access_token, expires_on):  sql_conn = sqlite3_conn(sqlite3_db_file)  sql_cursor = sql_conn.cursor()  sql_cursor.execute('''UPDATE "weixin_token" SET             access_token=?,             expires_on=?             WHERE _ROWID_ = 1;''', (access_token, expires_on)            )  sqlite3_commit(sql_conn)  sqlite3_close(sql_conn)class WeiXinTokenClass(object):  def __init__(self):    self.__corpid = None    self.__corpsecret = None    self.__use_persistence = True    self.__access_token = None    self.__expires_in = None    self.__expires_on = None    self.__is_expired = None    if self.__use_persistence:      self.__corpid = sqlite3_get_credential()[0][0]      self.__corpsecret = sqlite3_get_credential()[0][1]    else:      self.__corpid = weixin_qy_CorpID      self.__corpsecret = weixin_qy_Secret  def __get_token_from_weixin_qy_api(self):    parameters = {      "corpid": self.__corpid,      "corpsecret": self.__corpsecret    }    url_parameters = urllib.urlencode(parameters)    token_url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?"    url = token_url + url_parameters    response = urllib2.urlopen(url)    result = response.read()    token_json = json.loads(result)    if token_json['access_token'] is not None:      get_time_now = datetime.datetime.now()      # TODO(Guodong Ding) token will expired ahead of time or not expired after the time      expire_time = get_time_now + datetime.timedelta(seconds=token_json['expires_in'])      token_json['expires_on'] = str(expire_time)      self.__access_token = token_json['access_token']      self.__expires_in = token_json['expires_in']      self.__expires_on = token_json['expires_on']      self.__is_expired = 1      try:        token_result_set = sqlite3_get_token()      except sqlite3.Error:        token_result_set = None      if token_result_set is None and len(token_result_set) == 0:        sqlite3_set_token(self.__access_token, self.__expires_in, self.__expires_on, self.__is_expired)      else:        if self.__is_token_expired() is True:          sqlite3_update_token(self.__access_token, self.__expires_on)        else:          debug("pass")          return    else:      if token_json['errcode'] is not None:        print "errcode is: %s" % token_json['errcode']        print "errmsg is: %s" % token_json['errmsg']      else:        print result  def __get_token_from_persistence_storage(self):    try:      token_result_set = sqlite3_get_token()    except sqlite3.Error:      self.__get_token_from_weixin_qy_api()    finally:      if token_result_set is None:        self.__get_token_from_weixin_qy_api()        token_result_set = sqlite3_get_token()        access_token = token_result_set[0][0]        expire_time = token_result_set[0][1]      else:        access_token = token_result_set[0][0]        expire_time = token_result_set[0][1]    expire_time = datetime.datetime.strptime(expire_time, '%Y-%m-%d %H:%M:%S.%f')    now_time = datetime.datetime.now()    if now_time < expire_time:      # print "The token is %s" % access_token      # print "The token will expire on %s" % expire_time      return access_token    else:      self.__get_token_from_weixin_qy_api()      return self.__get_token_from_persistence_storage()  @staticmethod  def __is_token_expired():    try:      token_result_set = sqlite3_get_token()    except sqlite3.Error as e:      print e      sys.exit(1)    expire_time = token_result_set[0][1]    expire_time = datetime.datetime.strptime(expire_time, '%Y-%m-%d %H:%M:%S.%f')    now_time = datetime.datetime.now()    if now_time < expire_time:      return False    else:      return True  def get(self):    return self.__get_token_from_persistence_storage()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一乱一性一交一视频| 91在线观看免费高清完整版在线观看| 美女啪啪无遮挡免费久久网站| 国产aⅴ夜夜欢一区二区三区| 美女av一区二区三区| 国产欧美久久一区二区| 最近2019年日本中文免费字幕| 久久精品夜夜夜夜夜久久| 国产成人亚洲综合| 亚洲aaa激情| 亚洲欧美综合精品久久成人| 国产精品视频导航| 亚洲三级免费看| 亚洲二区在线播放视频| 欧美精品福利在线| 激情久久av一区av二区av三区| 久久精品在线视频| 国产精品九九久久久久久久| 欧美福利视频在线| 青草青草久热精品视频在线网站| 992tv在线成人免费观看| 91亚洲va在线va天堂va国| 中文字幕av一区二区| 亚洲精品456在线播放狼人| 一本大道久久加勒比香蕉| 国产精品亚发布| 国产欧美一区二区三区四区| 有码中文亚洲精品| 国产精品激情自拍| 91精品久久久久久久久青青| 日韩av网址在线| 日韩在线www| 日韩av第一页| 亚洲午夜精品久久久久久性色| 2019中文字幕在线| 国产网站欧美日韩免费精品在线观看| 欧美丰满少妇xxxxx| 精品国产91久久久| 国产在线98福利播放视频| 亚洲视频999| 97色在线观看免费视频| 91高清免费在线观看| 欧洲永久精品大片ww免费漫画| 国内外成人免费激情在线视频| 亚洲一品av免费观看| 精品欧美激情精品一区| 国产成人精品亚洲精品| 青草热久免费精品视频| 亚洲最大成人网色| 97人洗澡人人免费公开视频碰碰碰| 亚洲白拍色综合图区| 国产视频久久久| 亚洲国产精品久久久久秋霞不卡| 国产精品男女猛烈高潮激情| 91精品国产自产在线观看永久| 中文国产成人精品| 国产精品久久久999| 精品久久久久久久久中文字幕| 国产一区二区黑人欧美xxxx| 久久精品视频播放| 精品久久中文字幕| 91久久在线观看| 欧美亚洲成人xxx| 蜜臀久久99精品久久久无需会员| 91久久久久久久久久久| 91精品国产免费久久久久久| 亚洲精品国产欧美| 蜜臀久久99精品久久久无需会员| 夜夜嗨av色综合久久久综合网| 国产精品99久久久久久白浆小说| 久久视频中文字幕| 久久亚洲春色中文字幕| 视频在线观看99| 8x拔播拔播x8国产精品| 欧美在线观看网址综合| 97人人爽人人喊人人模波多| 日韩av在线影视| 国产精品av网站| 992tv成人免费影院| 国产精品久久激情| 国产人妖伪娘一区91| 亚洲欧美日韩在线高清直播| 久久91精品国产91久久跳| 久久伊人91精品综合网站| 日韩最新中文字幕电影免费看| 国产日韩av高清| 亚洲精品动漫100p| 久久大大胆人体| 国产亚洲精品久久久久久牛牛| 在线看国产精品| 青青在线视频一区二区三区| 欧美成人一二三| 中文字幕亚洲一区在线观看| 欧美性猛交xxxx久久久| 欧美xxxwww| 日韩免费不卡av| 亚洲精品视频免费| 久久99精品久久久久久青青91| 国产精品成人v| 国产亚洲成av人片在线观看桃| 日韩国产高清污视频在线观看| 久久精品人人爽| 色婷婷综合久久久久中文字幕1| 国产啪精品视频网站| 久久影院模特热| 国产精品电影网站| 日本久久久久久久久| 亚洲天堂成人在线视频| 亚洲成年人影院在线| 国产精品视频一区国模私拍| 九九热最新视频//这里只有精品| 欧美贵妇videos办公室| 国产精品夜色7777狼人| 中文字幕亚洲一区二区三区五十路| 91精品美女在线| 欧美色欧美亚洲高清在线视频| 亚洲成人精品av| 国产欧美一区二区三区四区| 国产精品偷伦视频免费观看国产| 国产福利精品在线| 国产精品久在线观看| 国产精品电影久久久久电影网| 亚洲性av在线| 久久久久久久av| 日韩成人激情视频| 最近中文字幕2019免费| 国产精品亚洲视频在线观看| 欧美在线视频免费播放| 欧美精品免费在线| 成人激情在线播放| 亚洲精品日韩av| 国产91网红主播在线观看| 国产精品com| 国产视频久久网| 亚洲美女免费精品视频在线观看| 亚洲一区av在线播放| 57pao成人永久免费视频| 欧美黄色片视频| 91中文精品字幕在线视频| 国产精品99久久久久久白浆小说| 亚洲人成啪啪网站| 欧美日韩国产丝袜另类| 亚洲欧美成人精品| 日韩av在线影院| 国产在线精品一区免费香蕉| 久久精品久久久久久国产 免费| 另类天堂视频在线观看| 久久天堂av综合合色| 国产成人精品最新| 日本一本a高清免费不卡| 欧美激情视频网| 91成人精品网站| 亚洲男人天堂手机在线| 国产一区二区三区视频免费| 国产一区二区三区三区在线观看| 国产精品com| 国产欧美一区二区三区久久| 国产91精品久久久久久久| 影音先锋欧美在线资源| 欧美裸体男粗大视频在线观看| 国产精品va在线| 国产精品久久久久久久电影| 久久久亚洲国产天美传媒修理工| 亚洲国产中文字幕在线观看|