国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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()            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 民县| 田林县| 汉源县| 宁明县| 天气| 洪洞县| 克什克腾旗| 林州市| 石家庄市| 彭水| 南郑县| 即墨市| 普格县| 罗城| 塔城市| 东丽区| 陵川县| 泗阳县| 鹤峰县| 加查县| 墨竹工卡县| 商都县| 吴桥县| 铜川市| 梓潼县| 成武县| 大宁县| 万载县| 镇安县| 曲沃县| 炎陵县| 武功县| 永胜县| 沿河| 观塘区| 墨竹工卡县| 体育| 安多县| 华坪县| 勃利县| 炉霍县|