Maison  >  Article  >  développement back-end  >  Python implémente la numérisation de code QR pour se connecter automatiquement à Taobao

Python implémente la numérisation de code QR pour se connecter automatiquement à Taobao

高洛峰
高洛峰original
2017-02-22 10:41:014310parcourir

Un petit projet pour se connecter automatiquement à Taobao Alliance pour capturer des données. J'ai déjà vu du code similaire écrit en Python sur Github, j'ai donc choisi de l'écrire en Python la première fois que j'ai utilisé Python pour écrire formellement. un programme, j'étais toujours impressionné par sa "simpleté" "J'étais choqué. Bien sûr, lorsque je l'utilisais, j'étais toujours troublé par son encodage (version 2.7), son environnement de migration et d'autres problèmes. Heureusement, ils ont tous été résolus plus tard .

Pour en revenir au sujet, la première chose à résoudre lors de la capture des données de Taobao Alliance est le problème de connexion Dans le passé, nous rencontrions généralement le problème du code de vérification, mais maintenant. il prend en charge la numérisation du code QR pour se connecter, ce qui simplifie les choses. Voici le code Python pour la connexion, principalement pour imprimer le code QR, puis vérifier constamment l'état de la numérisation. S'il expire, demandez à nouveau le code QR. Code QR (dépend principalement de la logique, car certaines méthodes courantes sont encapsulées, il n'y a donc aucune garantie qu'elles puissent être exécutées directement)

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)

À Pour résoudre le problème de connexion, l'étape suivante consiste à résoudre le problème de la sauvegarde de l'état. La bibliothèque Requests de Python est très puissante, si elle est simple, vous pouvez utiliser request directement pour effectuer des opérations de session, mais comme de nombreuses opérations dans le projet le sont. asynchrone, il faut résoudre le stockage et la lecture des cookies, et utiliser pickel pour sérialiser et désérialiser les objets. Le cookie enregistré est mis à jour progressivement par défaut

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

Après l'encapsulation, chargez le cookie et enregistrez-le lorsque vous le demandez. La session est demandée

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

Une fois ces deux étapes terminées, les requêtes ultérieures de base peuvent être effectuées directement à l'aide de la méthode de requête API unifiée, et l'effet est également très bon. Capture d'écran de l'effet en cours d'exécution. :

Bien sûr, il reste encore un problème non résolu : comment réappliquer automatiquement après l'expiration de la session (je ne sais pas si Tading le prend en charge), puisque Taobao utilise une connexion unifiée et est un service indépendant Par conséquent, grâce à l'actualisation automatique du navigateur ou à la mise à jour continue des cookies pendant le processus de demande, le ticket de mise à jour côté serveur n'a pas été obtenu. Je me demande si quelqu'un a des idées sur ce problème.

Pour plus d'implémentation Python de la numérisation de code QR pour vous connecter automatiquement aux articles liés à Taobao, veuillez faire attention au site Web PHP chinois !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn