2014-09-06 38 views
0

我想通過Python登錄到Twitch.tv網站。儘管給予所有參數它仍然沒有讓我登錄下面是代碼:無法通過腳本登錄Twitch電視

import requests 
from bs4 import BeautifulSoup 
from time import sleep 

# #user[login]:volatil3_ 
# user[password]:thisispassword 
#https://secure.twitch.tv/user/login 
# <a href="#" class="header_nick button drop" id="user_display_name"> volatil3_ </a> 


def connect(): 
    user = {'Username':'volatil3_','Password':'thisispassword'} 
    headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36','Referer':'http://www.twitch.tv/user/login'} 

    with requests.Session() as s: 
     html = s.get("http://www.twitch.tv/user/login", headers=headers, verify=False, timeout=5) 
     soup = BeautifulSoup(html.text) 
     tokenTag = soup.find("input", {"name" : "authenticity_token"}) 
     token = tokenTag["value"].strip() 
     #print(html.text) 
     print("-----------------------------------------------") 
     credentials = {"user[login]":'volatil3_', "user[password]":'thisispassword',"authenticity_token":token,'redirect_on_login':'https://secure.twitch.tv/user/login','embed_form':'false','utf8':'&#x2713;','mp_source_action':'','follow':''} 
     print(credentials) 
     s.post("https://secure.twitch.tv/user/login", data = credentials, headers=headers, verify=False, timeout=10,allow_redirects=True) 
     #html = s.get("http://www.twitch.tv", headers=headers, verify=False, timeout=5) 
     soup = BeautifulSoup(html.text) 
     logginTag = soup.find("a", {"id" : "user_display_name"}) 
     print(logginTag) 
     if "Log In" in html.text: 
      print("cound not log in") 
connect() 

理想的情況下登錄之後應該回到主頁,顯示登錄的用戶名。對我來說這顯示HTML,表示它沒有登錄。請幫助我

這裏給出的用戶名/密碼是真實的,可用於測試

+0

首先是..看起來像變量'html'只包含舊的HTML ..我不認爲你登錄後,新的HTML將存儲在那裏。即使你的文章有效,並且你登錄了,你也可以通過調用'result = s.post(..)''newhtml = request._content'來訪問新的html。 – 2014-09-07 20:12:43

回答

1

我剛剛看了一下,在你想要的網站,發現它真的很重javascript。在登錄後請求後,它將遵循重定向,並且在新頁面中,大部分內容由Javascript生成,這對於使用請求,urllib2,..etc等工作來說確實是一件麻煩事。似乎你是隻有在階段1:登錄,之後,如果不使用像PhantomJS,Selenium這樣的Javascript引擎,很可能無法保證大量工作。這是我在Python中使用Selenium編寫的POC。希望會有幫助。

要安裝硒:

pip install -U selenium 

下面是使用Selenium一個Python的解決方案。

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
import time 
from bs4 import BeautifulSoup 

my_username = "volatil3_" 
my_password = "thisispassword" 

driver = webdriver.Firefox() 
driver.get("http://www.twitch.tv/user/login") 
elem_user = driver.find_element_by_id("login_user_login") 
elem_passwd = driver.find_element_by_id("user[password]") 
elem_user.send_keys(my_username) 
elem_passwd.send_keys(my_password + Keys.RETURN) 
# In case it need some time to populate the content. 
#time.sleep(5) 

html = driver.page_source 
soup = BeautifulSoup(html) 
logginTag = soup.find("a", {"id" : "user_display_name"}) 
print(logginTag) 
driver.close() 

這裏是輸出:

<a class="header_nick button drop" href="#" id="user_display_name">volatil3_</a> 
+0

有趣。雖然它確實解決了最初的問題。我如何獲得會話,因爲我想使用同一會話來瀏覽其他頁面 – Volatil3 2014-09-17 06:16:58

+0

@ Volatil3 Selenium使用功能齊全的瀏覽器,您可以導航到其他頁面,它將存儲cookie,保持會話...默認爲默認。像大多數瀏覽器一樣 – 2014-09-17 14:35:12

+0

對於遲到的回覆很抱歉。我正忙着測試它。它也啓動了FireFox瀏覽器!我沒有這個能力嗎? – Volatil3 2014-10-13 07:49:25

0

PhantomJS爲抽搐登錄,see my question here

var page = require('webpage').create(); 

page.open('http://www.twitch.tv/login', function() { 
    page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js", function() { 
     page.evaluate(function() { 
      $("#login_user_login").val("username"); 
      $("[id='user[password]']").val("password"); 
      $(".button.primary:first").click(); // click login button 
     }); 
     setTimeout(function(){ 
      page.render("e.png"); // see if anything happens 
      phantom.exit(); 
     }, 5000); // 5 seconds 
    }); 
});