2013-05-08 47 views
6

Tôi đang cố gắng đăng nhập vào twitter với php + curl, nhưng tôi nghĩ rằng có điều gì đó sai trái với yêu cầu của tôi bởi vì tôi có được điều này là phản ứng:cách đăng nhập vào twitter với curl

Cái gì là sai về mặt kỹ thuật.

Cảm ơn bạn đã thông báo — chúng tôi sẽ sửa chữa nó và có mọi thứ quay lại sớm bình thường.

Mã php Tôi đang sử dụng là:

<?php 
      $ch = curl_init($sTarget); 
      curl_setopt($ch, CURLOPT_HEADER, false); 
      curl_setopt($ch, CURLOPT_POST, true); 
      curl_setopt($ch, CURLOPT_POSTFIELDS, $sPost); 
      curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
      curl_setopt($ch, CURLOPT_COOKIESESSION, true); 
      curl_setopt($ch, CURLOPT_COOKIEJAR, $_CKS); 
      curl_setopt($ch, CURLOPT_COOKIEFILE, $_CKS); 
      curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
      curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data")); 
      curl_setopt($ch, CURLOPT_REFERER, "https://twitter.com"); 

?> 

$ Spost trông như thế này:

phiên [username_or_email] = user & phiên [mật khẩu] = mật khẩu & remember_me = 1 & scribe_log = & redirect_after_login = & authenticity_token = 6e706165609354bd7a92a99cf94e09140ea86c6f

Mã đầu tiên tìm nạp các trường biểu mẫu đăng nhập để các biến bài đăng có giá trị thích hợp (mã thông báo xác thực). Tôi chỉ cố gắng về mọi thứ và có tôi biết có một api cho điều này nhưng tôi muốn tìm hiểu làm thế nào để làm nó hướng dẫn sử dụng vì lợi ích của học tập.

Xin cảm ơn trước.

Trả lời

9

CURLOPT_COOKIESESSION được sử dụng để cho biết phiên mới. Đó không phải là những gì bạn muốn, vì bạn cần gửi cookie phiên trong bài đăng thứ hai.

tôi đã đăng nhập twitter để làm việc với mã này:

<?php 

# First call gets hidden form field authenticity_token 
# and session cookie 
$ch = curl_init(); 
$sTarget = "https://twitter.com/"; 
curl_setopt($ch, CURLOPT_URL, $sTarget); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); 
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookie.txt"); 
curl_setopt($ch, CURLOPT_REFERER, "https://twitter.com/"); 
$html = curl_exec($ch); 

# parse authenticity_token out of html response 
preg_match('/<input type="hidden" value="([a-zA-Z0-9]*)" name="authenticity_token"\/>/', $html, $match); 
$authenticity_token = $match[1]; 

$username = "[email protected]"; 
$password = "password"; 

# set post data 
$sPost = "session[username_or_email]=$username&session[password]=$password&return_to_ssl=true&scribe_log=&redirect_after_login=%2F&authenticity_token=$authenticity_token"; 

# second call is a post and performs login 
$sTarget = "https://twitter.com/sessions"; 
curl_setopt($ch, CURLOPT_URL, $sTarget); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $sPost); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: application/x-www-form-urlencoded")); 

# display server response 
curl_exec($ch); 
curl_close($ch); 

?> 

PS: Xin lỗi vì không đọc bài viết của bạn đúng cách lần đầu tiên.

+0

Tôi làm cách nào để giữ người dùng đăng nhập bằng cách sử dụng tính năng này? Tập lệnh hoạt động để đăng nhập người dùng nhưng phiên không ở lại. – Zy0n

+0

Bạn sẽ sử dụng CURLOPT_COOKIEJAR để lấy cookie được lưu trữ trong một tệp để sử dụng lại chúng trong các yêu cầu tiếp theo. –

2

tôi nhận thấy hai điều:

1) Cố gắng URL mã hóa dữ liệu POST của bạn

như: phiên% 5Busername_or_email% 5D = user & phiên% 5Bpassword% 5D = mật khẩu ...

thay vì: phiên [username_or_email] = user & phiên [mật khẩu] = mật khẩu ...

2) twitter có một trường ẩn tên authenticity_token trong biểu mẫu đăng nhập. Nó bị ràng buộc trong phiên. Vì vậy, bạn không thể sử dụng một authenticity_token tĩnh, trước tiên bạn phải đọc biểu mẫu đăng nhập và sử dụng trường authenticity_token từ đó.

Hy vọng điều đó sẽ hữu ích.

+0

Tôi đã có mã nhận mã thông báo xác thực động như tôi đã nói. Cũng cố gắng mã hóa url các biến nhưng điều đó vẫn không có hiệu lực, nhờ sự giúp đỡ của bạn mặc dù. – JustaN00b

Các vấn đề liên quan