Flickr API: Lỗi access token bị quá hạn

Access token do Flickr API cấp luôn luôn giống nhau, vì vậy có thể lưu và dùng lại bất cứ lúc nào.

Lỗi access token quá hạn xãy ra khi file CSDL oauth-tokens.sqlite vì một lý do nào đó bị xóa hay bị khởi tạo lại.

Sau khi lấy được access token, để tránh file CSDL bị thay đổi có thế gán thuộc tính 644 cho nó. Tuy nhiên, có thể CSDL bị thay đổi chính từ user lấy access token.

Ta có các cách sửa lỗi access token như sau::

flickr.token_valid(perms=u'delete') - False -> | 1. chép lại CSDL từ file backup
   |                                           | 2. cập nhật lại flickr từ object backup
  True                                         | 3. cập nhật CSDL từ câu lệnh INSERT
  1. Tạo file backup oauth-tokens.bak và sửa lại đoạn mã kiểm tra access token như sau:
flickr = flickrapi.FlickrAPI(user.API_KEY, user.API_SECRET, token_cache_location=TOKEN_DIR)
if not flickr.token_valid (perms=u'delete'):
  if os.path.exists (TOKEN_DIR + '/oauth-tokens.bak'):
    from shutil import copyfile
    copyfile (TOKEN_DIR + '/oauth-tokens.bak', TOKEN_DIR + '/oauth-tokens.sqlite')
  else:
    print ("Chạy địa chỉ sau với trình duyệt để lấy mã chứng thực")
    flickr.get_request_token (oauth_callback='oob')
    authorize_url = flickr.auth_url(perms=u'delete')
    print (authorize_url)
    verifier = input("Mã kiểm tra: ")
    if flickr.get_access_token(verifier) is None:
      print('Bakup database ...')
      from shutil import copyfile
      copyfile(TOKEN_DIR + '/oauth-tokens.sqlite', TOKEN_DIR + '/oauth-tokens.bak')
    else: sys.exit(4)
  flickr = flickrapi.FlickrAPI(user.API_KEY, user.API_SECRET, token_cache_location=TOKEN_DIR)

2. Cập nhật lại flickr từ object backup, bao gồm flickr.flickr_oauth.oauth và flickr.flickr_oauth.oauth_token

  OAUTH_FILE = flickr.token_cache.path + '/oauth.pickle'
  import pickle
  if os.path.isfile(OAUTH_FILE):
    print ('Load backup info ...')
    with open(OAUTH_FILE, "rb") as f:
      flickr.flickr_oauth.oauth = pickle.load(f)
      flickr.flickr_oauth.oauth_token = pickle.load(f)
  else:
    print ("Chạy địa chỉ sau với trình duyệt để lấy mã chứng thực")
    flickr.get_request_token(oauth_callback='oob')
    authorize_url = flickr.flickr_oauth.auth_url(perms=u'delete')
    print (authorize_url)
    verifier = str(input("Mã kiểm tra: "))
    flickr.get_access_token(verifier)
    with open(OAUTH_FILE, "wb") as f:
      pickle.dump(flickr.flickr_oauth.oauth, f, pickle.HIGHEST_PROTOCOL)
      pickle.dump(flickr.flickr_oauth.oauth_token, f, pickle.HIGHEST_PROTOCOL)

3. Cập nhật CSDL từ câu lệnh INSERT

CSDL có thể bị reset, không có record nào. Chạy dòng lệnh INSERT với các thông số đã nhận được từ access token đã có.

 import sqlite3
 conn = sqlite3.connect(flickr.token_cache.filename)
 conn.cursor().execute("INSERT INTO 'oauth_tokens' VALUES(your_api_key, '', your_oauth_token, your_oauth_token_secret, your_access_level, your_fullname, your_username, your_user_nsid)");
 conn.commit()
 conn.close()

Chú thích:

flickr.com có cơ chế riêng để reset lại CSDL tokens. Nếu chúng ta sau khi lấy token rồi thì không đọc CSDL nữa (thí dụ như chỉ dùng oauth.pickle) thì sẽ không bao giờ bị lỗi token.

Comments Off on Flickr API: Lỗi access token bị quá hạn

Filed under Software

Comments are closed.