QQ 支援以命令列方式自動登入:
QQ路徑 /start QQUIN:帳號 PWDHASH:加密密碼 /stat:登入模式
PWDHASH = Base64(MD5(密碼, UTF-8))/stat:41 正常登入,40 隱身登入。| 檔案 | 職責 |
|---|---|
QQLoginForm.cs | 主視窗:輸入帳密、選模式、讀寫設定、啟動登入 |
ConfigForm.cs | 設定視窗:指定 QQ 安裝路徑 |
EncodeHash.cs | MD5+Base64 加密、Base64 編解碼 |
SerializeHelper.cs | BinaryFormatter 序列化 UserInfo 到 UserInfo.bin |
UserInfo.cs | 資料實體:帳號、密碼、模式、路徑,標記 [Serializable] |
private void LoginQQ(string user, string pwd, string type, string path)
{
var psi = new ProcessStartInfo("cmd.exe")
{
UseShellExecute = false,
RedirectStandardInput = true,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
var proc = Process.Start(psi);
proc.StandardInput.WriteLine($"{path} /start QQUIN:{user} PWDHASH:{EncodeHash.pwdHash(pwd)} /stat:{type}");
proc.StandardInput.WriteLine("exit");
}
public static string pwdHash(string pwd)
{
using (var md5 = MD5.Create())
{
byte[] hash = md5.ComputeHash(Encoding.UTF8.GetBytes(pwd));
return Convert.ToBase64String(hash);
}
}
public static void SerializeUserInfo(UserInfo ui)
{
using (var fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "UserInfo.bin", FileMode.Create))
new BinaryFormatter().Serialize(fs, ui);
}
public static UserInfo DeserializeUserInfo()
{
string path = AppDomain.CurrentDomain.BaseDirectory + "UserInfo.bin";
if (!File.Exists(path)) return null;
using (var fs = new FileStream(path, FileMode.Open))
return (UserInfo)new BinaryFormatter().Deserialize(fs);
}
// 另提供 List 版本 SerializeList/DeserializeList 供未來多帳號擴充
private void txtUser_KeyPress(object sender, KeyPressEventArgs e)
{
if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != 8)
e.Handled = true;
}
ProtectedData (DPAPI) 或 AES 加密後再序列化。