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)
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, 'w') as f: if not overWrite: cookieDict = dict(oldCookie, **currentCookie) else: cookieDict = requests.utils.dict_from_cookiejar(cookies) pickle.dump(cookieDict, f) print 'Saved cookie' print cookieDict f.close() except: print 'Save cookies failed', sys.exc_info()[0] sys.exit(99) def load_cookies(): try: with open(config.COOKIE_FILE, 'r') as f: cookies = requests.utils.cookiejar_from_dict(pickle.load(f)) f.close() except: cookies = [] return cookies
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='GET'): try: cookies = load_cookies() if 'POST' == 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 'save cookie:' + str(response.cookies) save_cookies(response.cookies) return result except Exception, e: print e return False
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!