[VB/C#] Twitter にログイン
コードから Twitter に スクリーンネームまたはメールアドレスとパスワードで、Twitter API を使わず、直接ログインして、HTML ページをダウンロードします。
下記コードの Login でログインし、必要な Cookie を取得します。ログイン後、例としてアカウント設定の HTML を取得しています。
System.Net, System.IO, System.Text, System.Text.RegularExpressions を import してください。
Visual Basic (VB.NET)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sub Main() | |
' ログインして Cookie 取得 | |
Dim cookies = Login("スクリーンネームまたはメールアドレス", "パスワード") | |
' 取得した Cookie を付けてアカウント設定ページにアクセス | |
Dim url = "https://twitter.com/settings/account" | |
Dim req = WebRequest.CreateHttp(New Uri(url)) | |
req.CookieContainer = New CookieContainer | |
req.CookieContainer.Add(cookies) | |
Dim html As String | |
Using res = req.GetResponse | |
Using rs = res.GetResponseStream | |
Using sr = New StreamReader(rs) | |
html = sr.ReadToEnd | |
End Using | |
End Using | |
End Using | |
End Sub | |
Private Function GetAuthenticityTokenAndCookies() As Tuple(Of String, CookieCollection) | |
Dim req = WebRequest.CreateHttp("https://twitter.com/") | |
req.Method = "GET" | |
req.ServicePoint.Expect100Continue = False | |
req.CookieContainer = New CookieContainer | |
Using res = DirectCast(req.GetResponse, HttpWebResponse) | |
Dim html As String | |
Using rs = res.GetResponseStream | |
Using sr = New IO.StreamReader(rs, Encoding.UTF8) | |
html = sr.ReadToEnd | |
End Using | |
End Using | |
html = html.Substring(html.IndexOf("action=""https://twitter.com/sessions""")) | |
Dim m = Regex.Match(html, "value=""(?<token>.*?)""\s+name=""authenticity_token""") | |
Return New Tuple(Of String, CookieCollection)(m.Groups("token").Value, res.Cookies) | |
End Using | |
End Function | |
Private Function Login(name As String, password As String) As CookieCollection | |
Dim val = GetAuthenticityTokenAndCookies() | |
Dim token = val.Item1 | |
Dim cookies = val.Item2 | |
Dim param = String.Format("session%5Busername_or_email%5D={0}&session%5Bpassword%5D={1}&remember_me=0&return_to_ssl=true&scribe_log=&redirect_after_login=%2F&authenticity_token={2}", name, password, token) | |
Dim buf = Text.Encoding.ASCII.GetBytes(param) | |
Dim uri = New Uri("https://twitter.com/sessions") | |
Dim req = WebRequest.CreateHttp(uri) | |
req.Method = "POST" | |
req.ContentType = "application/x-www-form-urlencoded" | |
req.ContentLength = buf.Length | |
req.Referer = "https://twitter.com/" | |
req.ServicePoint.Expect100Continue = False | |
req.CookieContainer = New CookieContainer | |
If cookies IsNot Nothing Then | |
req.CookieContainer.Add(cookies) | |
End If | |
Using rs = req.GetRequestStream | |
rs.Write(buf, 0, buf.Length) | |
End Using | |
Dim html As String | |
Using res = req.GetResponse | |
Using rs = res.GetResponseStream | |
Using sr = New StreamReader(rs, Encoding.UTF8) | |
html = sr.ReadToEnd | |
End Using | |
End Using | |
Return req.CookieContainer.GetCookies(uri) | |
End Using | |
End Function |
C#
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
static void Main(string[] args) | |
{ | |
// ログインして Cookie 取得 | |
var cookies = Login("スクリーンネームまたはメールアドレス", "パスワード"); | |
// 取得した Cookie を付けてアカウント設定ページにアクセス | |
var url = "https://twitter.com/settings/account"; | |
var req = WebRequest.CreateHttp(new Uri(url)); | |
req.CookieContainer = new CookieContainer(); | |
req.CookieContainer.Add(cookies); | |
string html = null; | |
using (var res = req.GetResponse()) | |
{ | |
using (var rs = res.GetResponseStream()) | |
{ | |
using (var sr = new StreamReader(rs)) | |
{ | |
html = sr.ReadToEnd(); | |
} | |
} | |
} | |
} | |
private static Tuple<string, CookieCollection> GetAuthenticityTokenAndCookies() | |
{ | |
var req = WebRequest.CreateHttp("https://twitter.com/"); | |
req.Method = "GET"; | |
req.ServicePoint.Expect100Continue = false; | |
req.CookieContainer = new CookieContainer(); | |
using (var res = req.GetResponse() as HttpWebResponse) | |
{ | |
string html = null; | |
using (var rs = res.GetResponseStream()) | |
{ | |
using (var sr = new StreamReader(rs, Encoding.UTF8)) | |
{ | |
html = sr.ReadToEnd(); | |
} | |
} | |
html = html.Substring(html.IndexOf("action=\"https://twitter.com/sessions\"")); | |
var m = Regex.Match(html, "value=\"(?<token>.*?)\"\\s+name=\"authenticity_token\""); | |
return new Tuple<string, CookieCollection>(m.Groups["token"].Value, res.Cookies); | |
} | |
} | |
private static CookieCollection Login(string name, string password) | |
{ | |
var val = GetAuthenticityTokenAndCookies(); | |
var token = val.Item1; | |
var cookies = val.Item2; | |
var param = string.Format("session%5Busername_or_email%5D={0}&session%5Bpassword%5D={1}&remember_me=0&return_to_ssl=true&scribe_log=&redirect_after_login=%2F&authenticity_token={2}", name, password, token); | |
var buf = System.Text.Encoding.ASCII.GetBytes(param); | |
var uri = new Uri("https://twitter.com/sessions"); | |
var req = WebRequest.CreateHttp(uri); | |
req.Method = "POST"; | |
req.ContentType = "application/x-www-form-urlencoded"; | |
req.ContentLength = buf.Length; | |
req.Referer = "https://twitter.com/"; | |
req.ServicePoint.Expect100Continue = false; | |
req.CookieContainer = new CookieContainer(); | |
if (cookies != null) | |
{ | |
req.CookieContainer.Add(cookies); | |
} | |
using (var rs = req.GetRequestStream()) | |
{ | |
rs.Write(buf, 0, buf.Length); | |
} | |
string html = null; | |
using (var res = req.GetResponse()) | |
{ | |
using (var rs = res.GetResponseStream()) | |
{ | |
using (var sr = new StreamReader(rs, Encoding.UTF8)) | |
{ | |
html = sr.ReadToEnd(); | |
} | |
} | |
return req.CookieContainer.GetCookies(uri); | |
} | |
} |