using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using ServiceStack.Common;
using ServiceStack.Text;
using System.IO;
using System.Net;
namespace Sina
{
class Program
{
static void Main(string[] args)
{
//step1 获取登录参数
var stepUrl = @"http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=tang_guoan@163.com&rsakt=mod&client=ssologin.js(v1.4.4)";
var stepData = stepUrl.GetJsonFromUrl();
//stepData=sinaSSOController.preloginCallBack({"retcode":0,"servertime":1382160006,"pcid":"gz-4c4f8847a4eb74232e0dd998388f6354b59e","nonce":"I6QPVA","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","exectime":1})
var s = Convert.ToInt32("10001",16);
//step2解析参数
var startIndex = stepData.IndexOf("(");
stepData = stepData.Substring(startIndex + 1, stepData.Length - startIndex - 1);
JsonSerializer<SinaPara> jsonSerializer = new JsonSerializer<SinaPara>();
var sinaPara = jsonSerializer.DeserializeFromString(stepData);
//step3 构建登录参数
var userName = ""; //Base64.Base64Code("=");
var encryptContent =sinaPara.servertime+ "\t"+sinaPara.nonce+"\n"+"";
var length = sinaPara.pubkey.Length;
var strEncrypt = RSAEncrypt(sinaPara.pubkey, "010001", encryptContent);
var passWord = StringToHex(strEncrypt);
var para = new Dictionary<string, string>
{
{"entry","weibo"},
{"gateway","1"},
{"from",""},
{"savestate","7"},
{"userticket","1"},
{"ssosimplelogin","1"},
{"pagerefer","http://login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D%252F"},
{"vsnf","1"},
{"su",userName},
{"service","miniblog"},
{"servertime",sinaPara.servertime},
{"nonce",sinaPara.nonce},
{"pwencode","rsa2"},
{"sp",passWord},
{"encoding","utf-8"},{"prelt","158"},{"rsakv",sinaPara.rsakv},{"url",@"http://weibo.com/ajaxlogin.php?framelogin=1\&callback=parent.sinaSSOController.feedBackUrlCallBack"},
{"returntype","META"}
};
var paraJson = new JsonSerializer<Dictionary<string, string>>().SerializeToString(para);
StringBuilder sb = new StringBuilder();
foreach (var item in para)
{
sb.Append("&" + item.Key + "=" + System.Web.HttpUtility.UrlEncode(item.Value));
}
var strp = sb.ToString();
strp = strp.Substring(1, strp.Length - 1);
byte[] postbyte = System.Text.Encoding.Default.GetBytes(paraJson);
var loginUrl = @"http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.4)";
var re = requestPost(strp, loginUrl);
Console.WriteLine( re);
var str = "http://weibo.com/u/2510062424/home?wvr=5&lf=reg".GetStringFromUrl();
Console.WriteLine(str);
Console.Read();
Console.Read();
}
public static string requestPost(string postData, string uriStr)
{
HttpWebRequest requestScore = (HttpWebRequest)WebRequest.Create(uriStr);
//postData =
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(postData);
requestScore.Method = "Post";
requestScore.ContentType = "application/x-www-form-urlencoded";
requestScore.ContentLength = data.Length;
requestScore.KeepAlive = true;
requestScore.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36";
requestScore.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
requestScore.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
requestScore.Headers.Add("Accept-Language", "zh-CN,zh;q=0.8");
//使用cookies
//requestScore.CookieContainer = ...;
Stream stream = requestScore.GetRequestStream();
stream.Write(data, 0, data.Length);
stream.Close();
HttpWebResponse responseSorce = (HttpWebResponse)requestScore.GetResponse();
StreamReader reader = new StreamReader(responseSorce.GetResponseStream(), Encoding.UTF8);
string content = reader.ReadToEnd();
requestScore = null;
responseSorce.Close();
responseSorce = null;
reader = null;
stream = null;
return content;
}
public static string StringToHex(string str)
{
//str = str.Trim();
byte[] ByteFoo = System.Text.Encoding.Default.GetBytes(str);
string TempStr = "";
foreach (byte b in ByteFoo)
{
TempStr += b.ToString("x"); //X表示十六进制显示
}
return TempStr;
}
public static string RSAEncrypt(string publickey, string rsakv, string content)
{
// publickey = @"<RSAKeyValue><Modulus>" + publickey + "</Modulus><Exponent>" + rsakv + "</Exponent></RSAKeyValue>";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
RSAParameters rsaParameters = new RSAParameters()
{
Exponent = FromHex(rsakv), // new byte[] {01, 00, 01}
Modulus = FromHex(publickey), // new byte[] {A3, A6, ...}
};
rsa.ImportParameters(rsaParameters);
//rsa.FromXmlString(publickey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content),false);
return Convert.ToBase64String(cipherbytes);
}
static byte[] FromHex(string hex)
{
if (string.IsNullOrEmpty(hex) || hex.Length % 2 != 0) throw new ArgumentException("not a hexidecimal string");
List<byte> bytes = new List<byte>();
for (int i = 0; i < hex.Length; i += 2)
{
bytes.Add(Convert.ToByte(hex.Substring(i, 2), 16));
}
return bytes.ToArray();
}
}
public class SinaPara
{
public int retcode { get; set; }
public string servertime { get; set; }
public string pcid { get; set; }
public string nonce { get; set; }
public string pubkey { get; set; }
public string rsakv { get; set; }
public int exectime { get; set; }
}
}
aaaaaaaaaaaaa
最新推荐文章于 2023-09-28 13:24:29 发布