C# 模拟登入微博,实现分享

最近自己想模拟微博登入(无验证码的情况),想分享一些歌曲。很多代码都是网上找到,现在整理一下。

1、加载我需要分享页面的数据。

                var httpReq =
                    (HttpWebRequest)WebRequest.Create("http://pop.weibo.com/ajax_getdata?type=trend&date=" +
                                                       DateTime.Now.ToShortDateString());

                httpReq.Referer = "http://pop.weibo.com/"; //指定跳转之前的地址 Referer
                Message.Text += Environment.NewLine + @"加载数据开始" + Environment.NewLine;
                var httpResp = (HttpWebResponse)httpReq.GetResponse();
                var respStream = httpResp.GetResponseStream();
                if (respStream != null)
                {
                    var respStreamReader = new StreamReader(respStream, Encoding.UTF8);
                    var result = respStreamReader.ReadToEnd();

                    var json1 = (JObject)JsonConvert.DeserializeObject(result);

                    var mulist = new List<Mulist>();
                    foreach (var item in json1["list"]["data"])
                    {
                        var mu = new Mulist
                        {
                            songid = item["songid"].ToString(),
                            songname = item["songname"].ToString(),
                            score = int.Parse(item["score"].ToString())
                        };
                        mulist.Add(mu);
                    }
                    dataGridView1.DataSource = mulist;
                    Message.Text += Environment.NewLine + @"加载数据成功!" + Environment.NewLine;
                }

2、分享,分享之前需要进行模拟登入,但是登入之前需要去请求一个地址,获取登入时需要的参数。

            HttpWebRequest request = null;
            var tim = ConvertDateTimeInt(DateTime.Now);
            var baseun = Convert.ToBase64String(Encoding.Default.GetBytes(username));//请求登入之前账号为base64格式

            var slGhttpurl =
                "https://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.18)&_=" +
                tim + "&su=" + baseun;//登入之前会去请求这个链接获取登入需要参数

            Message.Text += Environment.NewLine + @"请求登入需要参数地址开始:" + slGhttpurl + Environment.NewLine;

            request = (HttpWebRequest)WebRequest.Create(slGhttpurl);
            request.ContentType = "application/x-www-form-urlencoded";

            request.KeepAlive = true;
            request.Method = "GET";
            var response = (HttpWebResponse)request.GetResponse();
            var respStream = response.GetResponseStream();
            var respStreamReader = new StreamReader(respStream, Encoding.UTF8);
            var slGresult = respStreamReader.ReadToEnd().Substring(34).Replace(")", "").Replace("(", "");
            request.GetResponse().Close();

            var loginData = JsonConvert.DeserializeObject<LoginData>(slGresult);//密码加密需要用到的参数

3、请求登入地址,登入关键参数还是密码加密,我在网上找了一段js代码,结果调用可以成功登入。。js在demo里面就不放在这里了

            //调用JS加密密码   这个需要添加一个dll  Interop.MSScriptControl.dll
            var scriptControl = new ScriptControl
            {
                UseSafeSubset = true,
                Language = "javascript"
            };
            scriptControl.AddCode(GetJs());
            object obj = scriptControl.Run("getpass", password, loginData.servertime, loginData.nonce, loginData.pubkey);
            var pdata = obj.ToString().Trim();

            Message.Text += Environment.NewLine + @"调用js密码加密成功:" + pdata + Environment.NewLine;

            Message.Text += Environment.NewLine + @"登入开始:"  + Environment.NewLine;
            //开始登入
            var lGhttpurl = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)&_=" +
                            tim;
            request = (HttpWebRequest)WebRequest.Create(lGhttpurl);
            var result1 = "entry=weibo&gateway=1&from=&savestate=0&useticket=1" +
                          "&pagerefer=http://pop.weibo.com/" +
                          "&vsnf=1&su=" + baseun + "&service=miniblog&servertime=" + loginData.servertime +
                          "&nonce=" +
                          loginData.nonce + "&pwencode=rsa2" +
                          "&rsakv=" + loginData.rsakv + "&sp= " + pdata +
                          "&sr=1536*864&encoding=UTF-8&cdult=2&domain=weibo.com&prelt=53&returntype=TEXT";
            var bytes = Encoding.UTF8.GetBytes(result1);
            request.Method = "POST";
            request.KeepAlive = true;
            request.CookieContainer = new CookieContainer();
            request.ContentLength = bytes.Length;
            request.ContentType = "application/x-www-form-urlencoded";
            var reqStream1 = request.GetRequestStream();
            reqStream1.Write(bytes, 0, bytes.Length);
            reqStream1.Close();

            request.GetResponse().Close();
            Message.Text += Environment.NewLine + @"登入成功,cookie:"+ request.CookieContainer.GetCookieHeader(request.RequestUri) + Environment.NewLine;
            return request.CookieContainer.GetCookieHeader(request.RequestUri);//获取登入cookie,后面分享需要用到

4、获取分享的地址

        public string Fxurl(string songId)
        {
            HttpWebRequest request2 = null;
            var fXhttpurl = "http://pop.weibo.com/share?songid=" + songId;
            request2 = (HttpWebRequest)WebRequest.Create(fXhttpurl);
            request2.Referer = "http://pop.weibo.com/";
            request2.KeepAlive = true;
            request2.Host = "pop.weibo.com";
            request2.CookieContainer = new CookieContainer();
            var response2 = (HttpWebResponse)request2.GetResponse();
            var sharereferurl = response2.ResponseUri.OriginalString;
            request2.GetResponse().Close();
            return sharereferurl;
        }

5、开始分享,我用抓包的发现会分享的时候回去请求两个地址,如下。

        /// <summary>
        /// 开始分享
        /// </summary>
        /// <param name="sharereferurl">Referer参数</param>
        /// <param name="sLGcookies">登入的cookie</param>
        /// <returns></returns>
        public string Fx(string sharereferurl, string sLGcookies)
        {
            HttpWebRequest request = null;
            var tim = ConvertDateTimeInt(DateTime.Now);
            var relist = sharereferurl.Split(‘&‘);
            //获取分享内容拼接参数
            var result4 = "content=" + relist[2].Split(‘=‘)[1] +
                          "&styleid=1&from=share&appkey=846367063&visible=0";
            var bytes1 = Encoding.UTF8.GetBytes(result4);
            //请求分享
            request = (HttpWebRequest)WebRequest.Create("http://service.weibo.com/share/aj_share.php");
            request.Method = "POST";
            request.Referer = sharereferurl;//指定是哪个地址到的分享地址
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = bytes1.Length;
            request.Headers.Add("Cookie", sLGcookies);//添加之前获取的登入cookie
            var reqStream3 = request.GetRequestStream();
            reqStream3.Write(bytes1, 0, bytes1.Length);
            reqStream3.Close();
            request.GetResponse().Close();

            request =
                (HttpWebRequest)WebRequest.Create(
                    "http://service.weibo.com/widget/like/aj_like.php?url=&from=thirdparty&app_src=cUcI1A&_t=0&__rnd=" +
                    tim);
            request.Method = "GET";
            request.Headers.Add("Cookie", sLGcookies);
            request.Referer = sharereferurl;//指定是哪个地址到的分享地址
            var response4 = (HttpWebResponse)request.GetResponse();
            var respStream4 = response4.GetResponseStream();
            var respStreamReader4 = new StreamReader(respStream4, Encoding.UTF8);
            var result6 = respStreamReader4.ReadToEnd();
            var json3 = (JObject)JsonConvert.DeserializeObject(result6);//分享结果

            return json3["code"].ToString();
        }

这样就可以分享成功了,在此记录一下。

Demo 密码: cv4q

原文地址:https://www.cnblogs.com/yxhkami/p/9121310.html

时间: 2024-08-05 17:26:48

C# 模拟登入微博,实现分享的相关文章

Python模拟登入豆瓣网,并爬取小组信息

import requests from bs4 import BeautifulSoup from PIL import Image headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36', 'Referer':'https://accounts.douban.com/logi

selenium 模拟登入知乎和微博

pip install selenium __author__ = 'admin' __date__ = 2017 / 11 / 3 from selenium import webdriver import time browser=webdriver.Chrome(executable_path="G:\ChromePortable_61.0.3141.7\chromedriver.exe") browser.get('https://www.zhihu.com/#signin')

用angular实时获取本地localStorage数据,实现一个模拟后台数据登入的效果

研究了一上午,终于做出了,实时获取本地localStorage来模拟注册登入~~~ <!DOCTYPE html><html><head lang="en"><meta charset="UTF-8"><title>我们虽然很穷,但是我们有梦想</title><script src="angular.js"></script></head>

模拟操作银行登入页面。。。未连接数据库

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <

[会员登入] 透过 E-Mail进行身份认证、启用会员权利

[會員登入] 透過 E-Mail進行身份認證.啟用會員權利 这个问题是在论坛上看见的 其实,遇见问题的时候,我会建议初学者先想一下「流程」 您想怎么作?需要哪些步骤? 一旦「流程」清楚了 您是哪一步骤不会?.....大家可以给您帮助. 哪一段程序写不出来?找不到?.....也比较好解决. 直接拆解人家写好的范例,未必有帮助. 就跟 "写作文"一样, 拿到题目以后,你不去「想」,只参考人家的范例.现成的作品..... 最后写出来的东西,也就是人家的东西了(因为你被制约了,脑子被刚刚看的文

iOS开发——实用篇Swift篇&amp;QQ登入界面实现

我们知道在App Store中几乎所有软件都设计到账户的登入,而我们最常见的就是QQ,微信,在没有踏入程序员这条不归路之前,看到一个个的界面都感觉好高大上的样子. 在学习的过程中,自己就照着手机上面APP自己比较好奇的界面实现了一下,今天分享一下关于QQ登入界面,完全纯代码,实用StoryBoar太麻烦,个人比较喜欢用代码实现,而几乎所有登入界面几乎都是一样的,只是图标不同,或者还会有其他的拓展功能,不过这里都会了其他的纳豆不是事儿. 废话不多说,直接上代码 import UIKit class

linux下查看用户登入系统相关命令及编写脚本(七)

查看用户登入系统日志 1.w 显示谁登入并正在做什么事 2.who 显示谁登入 -r:显示系统运行级别 3.sleep 睡眠命令(sleep 5 睡眠5秒后醒来) 4.whoami 显示用户名或UID 5.last:显示/var/log/wtmp文件,显示用户登录历史及系统重启历史 -n 3: 显示最近3次的相关信息 6.lastb:显示/var/log/btmp文件,显示用户错误的登录尝试 -n 3: 显示最近3次的错误的登录尝试 7.lastlog: 显示每一个用户最近一次的成功登录信息:

Citrix Receiver登入的时候报找不到ICAWebWrapper插件

其实这个问题我在一开始做Citrix项目的时候就遇到很多客户端PC安装Receiver的时候登入云桌面的时就提示"Citrix Receiver提示找不到ICAWebWrapper.msi插件"有时候连卸载都无法卸载掉Citrix Receiver,用clear工具也不行,最后只能从新安装操作系统,这样导致客户和实施方带来了很多不便,特别是财务和一些特殊的办公电脑是不给重新安装操作系统. 最近我在上海实施的时候用户方就提出全院大概30%用户都报这个错误,要求必须解决这个问题,刚开始我们

连接数据库:登入与处理

登入就是提取数据库中的信息 先建立一个登入页面: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta