Python implementiert das Scannen von QR-Codes, um sich automatisch bei Taobao anzumelden

高洛峰
Freigeben: 2017-02-22 10:41:01
Original
4265 Leute haben es durchsucht

Ein kleines Projekt zur automatischen Anmeldung bei der Taobao Alliance, um Daten zu erfassen. Ich habe schon einmal ähnlichen Code gesehen, der in Python auf Github geschrieben wurde, also habe ich mich entschieden, ihn in Python zu schreiben Obwohl ich ein Programm war, war ich immer noch von seiner „Einfachheit“ beeindruckt .

Um auf das Thema zurückzukommen: Das erste, was bei der Erfassung der Daten der Taobao Alliance gelöst werden muss, ist das Anmeldeproblem. In der Vergangenheit hatten wir normalerweise Probleme mit dem Bestätigungscode, aber jetzt Es unterstützt das Scannen von QR-Codes zum Anmelden, was die Anmeldung vereinfacht. Der folgende Python-Code dient hauptsächlich zum Drucken des QR-Codes und zum anschließenden Überprüfen des Scanstatus QR-Code (hängt hauptsächlich von der Logik ab, da einige gängige Methoden gekapselt sind und daher keine Garantie dafür besteht, dass sie direkt ausgeführt werden können)

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)
Nach dem Login kopieren

Zu Um das Anmeldeproblem zu lösen, besteht der nächste Schritt darin, das Problem der Statusspeicherung zu lösen. Wenn es einfach ist, können Sie die Sitzungsoperation direkt ausführen, da dies jedoch der Fall ist Asynchron ist es notwendig, das Speichern und Lesen von Cookies zu lösen und Pickel zum Serialisieren und Deserialisieren von Objekten zu verwenden. Das gespeicherte Cookie wird standardmäßig inkrementell aktualisiert

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
Nach dem Login kopieren

Laden Sie nach der Kapselung das Cookie und speichern Sie es, wenn eine Sitzung angefordert wird

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
Nach dem Login kopieren

Nach Abschluss dieser beiden Schritte können Folgeanfragen grundsätzlich direkt über die einheitliche API-Anfragemethode gestellt werden, und der Effekt ist auch sehr gut Laufeffekt:

Natürlich gibt es immer noch ein ungelöstes Problem: Wie kann man sich nach Ablauf der Sitzung automatisch erneut bewerben (nicht sicher, ob Tading dies unterstützt), da Taobao einheitliche Anmeldung und verwendet ist ein unabhängiger Dienst. Durch die automatische Aktualisierung des Browsers oder die kontinuierliche Aktualisierung von Cookies während des Anforderungsprozesses wurde das serverseitige Update-Ticket daher nicht erhalten. Ich frage mich, ob jemand eine Idee zu diesem Problem hat.

Weitere Python-Implementierungen zum Scannen von QR-Codes zur automatischen Anmeldung bei Artikeln zu Taobao finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!