ホームページ  >  記事  >  バックエンド開発  >  Python は QR コード スキャンを実装して、淘宝網に自動的にログインします

Python は QR コード スキャンを実装して、淘宝網に自動的にログインします

高洛峰
高洛峰オリジナル
2017-02-22 10:41:014243ブラウズ

淘宝同盟に自動的にログインしてデータを取得するための小さなプロジェクトです。以前、Github で Python で書かれた同様のコードを見たことがあったので、Python で正式にプログラムを書くことにしました。その「シンプルさ」に衝撃を受けました。もちろん、使用していたときも (バージョン 2.7) エンコーディングや移行環境などの問題に悩まされていましたが、幸いにもそれらはすべて解決されました。

本題に戻りますが、淘宝同盟のデータを取得する際に最初に解決すべきことは、以前は認証コードの問題に遭遇することが多かったのですが、今では QR コードをスキャンすることで簡単にログインできます。以下は、ログイン用の Python コードです。主なことは、印刷する QR コードを取得し、有効期限が切れた場合は QR コードを再度要求することです (一般的なものがあるため、これは主にロジックに依存します)。メソッドはカプセル化されているため、直接実行できるという保証はありません)

def getQRCode(enableCmdQR):
  payload = {'_ksTS': str(time.time()), 'from': 'alimama'}
  qrCodeObj = utils.fetchAPI('https://qrlogin.taobao.com/qrcodelogin/generateQRCode4Login.do', payload,
                "json", None, True, True)
 
  print(qrCodeObj)
  utils.printQRCode('http:' + qrCodeObj['url'], enableCmdQR)
  lgToken = qrCodeObj['lgToken']
  return lgToken
 
 
def login(enableCmdQR=False):
  lgToken = getQRCode(enableCmdQR)
  code = 0
  successLoginURL = ""
  while code != 10006:
    payload = {'lgToken': lgToken,
          'defaulturl': 'http%3A%2F%2Flogin.taobao.com%2Fmember%2Ftaobaoke%2Flogin.htm%3Fis_login%3D1&_ksTS=' + str(
            time.time())}
 
    rObj = utils.fetchAPI('https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do', payload, "json", True,
               False)
    code = int(rObj['code'])
    if 10000 == code:
      # print("请扫描二维码登录")
      continue
    elif 10001 == code:
      print("已扫描二维码,请在确认登录")
    elif 10004 == code:
      print("已过期请重新扫描")
      login()
    elif 10006 == code:
      successLoginURL = rObj["url"]
      print("登录成功,正在跳转")
    else:
      print("未知错误,退出执行")
      sys.exit(0)
 
    time.sleep(5)
 
  print "登录成功跳转:" + successLoginURL
  r = utils.fetchAPI(successLoginURL, None, "raw", True, False, True)
  utils.fetchAPI(r.headers['Location'], None, "raw", True, True, False)

ログインの問題を解決するための次のステップは、Python の Requests ライブラリが非常に強力です。これは簡単で、request.session を直接使用してセッション操作を実行できます。ただし、プロジェクト内の多くの操作は非同期であるため、オブジェクトのシリアル化と逆シリアル化には pickel を使用して Cookie ストレージを解決し、読み取る必要があります。保存された Cookie はデフォルトで段階的に更新されます

def save_cookies(cookies, overWrite=False):
  try:
    currentCookie = requests.utils.dict_from_cookiejar(cookies)
    if len(currentCookie) < 1:
      return
    oldCookie = requests.utils.dict_from_cookiejar(load_cookies())
    with open(config.COOKIE_FILE, &#39;w&#39;) as f:
      if not overWrite:
        cookieDict = dict(oldCookie, **currentCookie)
      else:
        cookieDict = requests.utils.dict_from_cookiejar(cookies)
      pickle.dump(cookieDict, f)
      print &#39;Saved cookie&#39;
      print cookieDict
      f.close()
  except:
    print &#39;Save cookies failed&#39;, sys.exc_info()[0]
    sys.exit(99)


def load_cookies():
  try:
    with open(config.COOKIE_FILE, &#39;r&#39;) as f:
      cookies = requests.utils.cookiejar_from_dict(pickle.load(f))
      f.close()
  except:
    cookies = []
  return cookies

カプセル化後、Cookie をロードし、リクエスト中に Cookie を保存します。セッションリクエスト

s = requests.Session()
# 统一请求API
def fetchAPI(url, params=None, resultFormat="text", isNeedCookie=True, allowRedirects=True, saveCookie=False,
       method=&#39;GET&#39;):
  try:
    cookies = load_cookies()
    if &#39;POST&#39; == method:
      response = s.post(url, data=params, headers=config.Headers, cookies=cookies)
    else:
      response = s.get(url, params=params, headers=config.Headers, cookies=cookies,
               allow_redirects=allowRedirects)

    if "json" == resultFormat:
      result = response.json()
    elif "raw" == resultFormat:
      result = response
    else:
      result = response.text

    # if saveCookie:
    # print &#39;save cookie:&#39; + str(response.cookies)
    save_cookies(response.cookies)

    return result

  except Exception, e:
    print e
    return False

これら 2 つのステップが完了すると、基本的な後続のリクエストは統合 API リクエスト メソッドを直接使用すると、効果は非常に優れています。実行中の効果のスクリーンショット:

もちろん、セッションの有効期限が切れた後に自動的に再適用する方法という未解決の問題があります (Taoding がサポートしているかどうかは不明)。 it)、タオバオは統合ログインを使用しており、独立したサービスであるため、サーバーはブラウザの自動更新やリクエストプロセス中のCookieの継続的な更新を通じて更新チケットを取得しません。このトピックについて何かアイデアはありますか。

淘宝網に自動的にログインするための QR コード スキャンの Python の実装に関連するその他の記事については、PHP 中国語 Web サイトに注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。