闲来无事,写了一个对discuss论坛登录的案例,初次上场按照以前的惯例没成功,见过抓包分析discuss论坛成功完成,废话不多说 直接上代码。

1:winform 做客户端,添加HttpClient的引用

初始化对象:

private const string BaseUrl = "替换为论坛地址";
private const string useAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36";
private readonly HttpClient httpClient;
private readonly HttpClientHandler handler;
private readonly string userName = "superadmin";
private readonly string passWord = "";
private readonly HtmlDocument htmlDoc;
private BaiDuToken baiDuToken;
public Form1()
{
InitializeComponent();
handler = new HttpClientHandler() { UseCookies = true, AllowAutoRedirect = true };
httpClient = new HttpClient(handler) { BaseAddress = new Uri(BaseUrl) };
httpClient.DefaultRequestHeaders.Add("user-agent", useAgent);
httpClient.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
httpClient.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600");
httpClient.DefaultRequestHeaders.Add("Referer", $"{BaseUrl}member.php?mod=logging&action=login");
htmlDoc = new HtmlDocument();
}

2:具体方法

   /// <summary>
/// 获取导航
/// </summary>
/// <param name="fid"></param>
/// <returns></returns>
private string GetNav(int fid = 72)
{
return $"forum.php?mod=forumdisplay&fid={fid}";
}
/// <summary>
/// 百度ai token
/// </summary>
/// <returns></returns>
private async Task<BaiDuToken> BaiDuTokenAsync() =>
await httpClient.GetAccessTokenAsync(); //百度ai 代码 自我实现 /// <summary>
/// 搜索字符
/// </summary>
/// <param name="allStr"></param>
/// <param name="firstStr"></param>
/// <param name="lastStr"></param>
/// <returns></returns>
public string GetStringMid(string allStr, string firstStr, string lastStr)
{
int num = allStr.IndexOf(firstStr);
int num2 = allStr.IndexOf(lastStr, num + firstStr.Length);
if (num < 0 || num2 < 0)
{
return "";
}
num += firstStr.Length;
num2 -= num;
if (num < 0 || num2 < 0)
{
return "";
}
return allStr.Substring(num, num2);
}
/// <summary>
/// 搜索字符
/// </summary>
/// <param name="allStr"></param>
/// <param name="firstStr"></param>
/// <param name="lastStr"></param>
/// <param name="regexCode"></param>
/// <returns></returns>
public List<string> GetStringMids(string allStr, string firstStr,
string lastStr, string regexCode = "(.*?)")
{
List<string> list = new List<string>();
string pattern = $"{firstStr}{regexCode}{lastStr}";
Regex regex = new Regex(pattern);
MatchCollection matchCollection = regex.Matches(allStr);
for (int i = 0; i < matchCollection.Count; i++)
{
GroupCollection groups = matchCollection[i].Groups;
for (int j = 1; j < groups.Count; j++)
{
string value = groups[j].Value;
if (!string.IsNullOrEmpty(value))
{
list.Add(value);
}
}
}
return list;
}
/// <summary>
/// 响应html为字符串
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private async Task<string> GetResponseStrAsync(string url)
{
return await (await GetResponseAsync(url))?.ReadAsStringAsync();
}
/// <summary>
/// 响应
/// </summary>
/// <param name="url"></param>
/// <returns></returns>
private async Task<HttpContent> GetResponseAsync(string url)
{ HttpResponseMessage response = await httpClient.GetAsync(url);
if (!response.IsSuccessStatusCode)
{
return null;
}
return response.Content;//具体结果
}
private string seccode, loginhash, formhash;
/// <summary>
/// 获取登录相关参数
/// </summary>
/// <returns></returns>
private async Task GetformAsync() //获取登录相关参数
{
string url = "member.php?mod=logging&action=login";
string html = await GetResponseStrAsync(url);
seccode = GetStringMid(html, "seccode_", "\"");
loginhash = GetStringMid(html, "loginhash=", "\"");
formhash = GetStringMid(html, "<input type=\"hidden\" name=\"formhash\" value=\"", "\"");
}
/// <summary>
/// 获取验证码地址
/// </summary>
/// <returns></returns>
private async Task<string> GetupdateAsync()//获取验证码地址
{
string url = $"misc.php?mod=seccode&action=update&idhash={seccode}";//请求地址
string res = await GetResponseStrAsync(url);
return GetStringMid(res, "width=\"100\" height=\"30\" src=\"", "\"");
} private async void PictureBox1_Click(object sender, EventArgs e)
{
await GetImageAsync(); } private async void Form1_Load(object sender, EventArgs e)
{
await GetformAsync();
await GetImageAsync();
baiDuToken = await BaiDuTokenAsync();
} /// <summary>
/// 获取验证码图片
/// </summary>
/// <param name="update"></param>
/// <returns></returns>
private async Task<byte[]> GetImageAsync()
{
string update = await GetupdateAsync();
byte[] bytes = await httpClient.GetByteArrayAsync(update);
return bytes;
}
/// <summary>
/// 登录
/// </summary>
/// <returns></returns>
private async Task<bool> GetLoginAsync()
{
byte[] bytes = await GetImageAsync();
ImagToWords imagToWords = BaiDuAccessToken.RecogniseImage(bytes, baiDuToken);//利用百度 ai识别验证码
string code = string.Join("", imagToWords.Words_result.Select(s => s.Words));
string url = $"misc.php?mod=seccode&action=check&inajax=1&modid=member::logging&idhash={seccode}&secverify={code}";//请求地址
string html = await GetResponseStrAsync(url);
if (html.Contains("succeed"))
{
url = $"member.php?mod=logging&action=login&loginsubmit=yes&loginhash{loginhash}&inajax=1";//请求地址
List<KeyValuePair<string, string>> paraList = new List<KeyValuePair<string, string>>
{
new KeyValuePair<string, string>("formhash", formhash),
new KeyValuePair<string, string>("username", userName),
new KeyValuePair<string, string>("password", passWord),
new KeyValuePair<string, string>("seccodehash", seccode),
new KeyValuePair<string, string>("seccodeverify", code), };
HttpResponseMessage response = await httpClient.PostAsync(url,
new FormUrlEncodedContent(paraList));
html = await response.Content.ReadAsStringAsync();
return html.Contains("欢迎您回来");
}
return false;
}

  

HttpClient 应用案例揭破应用Discuss论坛登录的更多相关文章

  1. ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

    前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...

  2. Android中利用httpclient进行网络通信的方法(以用户登录为例说明)

    http://www.android100.org/html/201406/09/22915.html 1.服务器端 服务器端和android没有太大关系,对J2EE比较熟悉的话写起来应该很容易,这里 ...

  3. BBS论坛 登录功能

    四.登录功能 前端页面html代码: <!DOCTYPE html> <html lang="en"> <head> <meta char ...

  4. LR实战之Discuz开源论坛——登录场景设计

    以下是根据个人项目经验,对登录场景的设计,如下步骤: 一.打开Controller,添加登录脚本,选择“手动场景”,一般我们项目中经常使用的是“手动场景”类型设计,如图 二.在“设计”部分,设置场景的 ...

  5. HttpClient 使用案例

    package com.qifeng.config.ygx.common.utils; import com.alibaba.fastjson.JSON; import com.alibaba.fas ...

  6. bbs论坛登录相关功能(2)

    昨天把注册功能页面做出来,接下来就是登录页面 登录功能: 1,用户账号,密码后台效验,错误信息在登录按钮右边显示 2.验证码,根据图片生成,点击图片刷新产生新的验证码 修改密码 注册 先把前端页面lo ...

  7. Python案例之QQ空间自动登录程序实现

    不多说,直接上干货! 工具选择: 电脑系统:win7,32 位,下面第二部安装SetupTools时注意系统版本要求: Python: 2.7.11,  相信只要是2.7的就可以实现: Seleniu ...

  8. 接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析

    (最近学的都是很基础的接口测试,都是基于UI界面可见的接口,就是发请求,接收响应,分析返回的结果,校验,对共通模块进行封装,仅此而已,其实做自动化的思路基本都是如此,UI也是.) 现在开始用httpC ...

  9. Android HttpClient自己主动登陆discuz论坛!

    你登陆论坛的时候,我们先看看浏览器干了什么事儿: 用Firefox打开HiPda 的登陆页面,输入用户名和password,点登陆. 以下是通过firebug插件获取的数据: 能够看到浏览器这个htt ...

随机推荐

  1. AiCloud 2.0 AT开发文档【转】

    本文转载自:http://wiki.ai-thinker.com/aicloud/docs/atdevelop AT指令一览表 AiCloud AT指令   指令 描述 AT+CLDSTART 启动云 ...

  2. hihocoder #1040 矩形判断(计算几何问题 给8个点的坐标,能否成为一个矩形 【模板思路】)

    #1040 : 矩形判断 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 给出平面上4条线段,判断这4条线段是否恰好围成一个面积大于0的矩形. 输入 输入第一行是一个整数T ...

  3. 深入理解JVM - 虚拟机类加载机制 - 第七章

    类加载的时机类从被加载到虚拟机内存开始,到卸载出内存为止,它的整个生命周期包括了:加载/验证/准备/解析/初始化/使用/卸载七个阶段.其中验证/准备和解析统称为连接(Linking). 加载.验证.准 ...

  4. 利用jsp技术实现用户注册

    利用jsp技术实现用户注册,包含register.html和register_check.jsp页面代码​1. [代码]J2EE实验    <!DOCTYPE html PUBLIC " ...

  5. 关于for 循环里 线程执行顺序问题

    最近在做项目时遇到了 这样的需求 要在一个for循环里执行下载的操作, 而且要等 下载完每个 再去接着走循环.上网查了一些 觉得说的不是很明确.现在把我用到的代码 贴上 希望可以帮到有此需求的开发者  ...

  6. properties文件的解析

    此文章是从网上看到一篇实用小文章,感觉不过,摘录下来的!如有问题,可及时联系,可立刻做相应处理! Java读取.properties 配置文件的几种方法 在做java工程时, 经常会将一些配置信息放到 ...

  7. 初识Spacy

    之所以想接触Spacy,是看到其自称为工业级的应用,所以想尝试下 windows下安装Spacy:     直接安装pip install spacy是会报错的     解决方法:     到 htt ...

  8. 在VS中对WCF服务进行更新,但是配置文件没有更新解决办法

    取消下面的勾选框

  9. Runtime.getRuntime()

    1转自:https://www.aliyun.com/jiaocheng/849282.html 那就首先说点Runtime类吧,他是一个与JVM运行时环境有关的类,这个类是Singleton的.我说 ...

  10. InnoSetup自动检测并安装.Net Framework

    InnoSetup可在在脚本中插入[Code]代码段,其中的代码可以通过事件驱动,支持的主要事件如下: function InitializeSetup(): Boolean; ——安装程序初始化,返 ...