html image标签的问题 如何获得image标签提交的x,y值

wulaiwangyi 2010-06-24 03:18:50
我在做网页表单自动提交的时候遇到的,image是html的一个标签,点击它可以提交表单的数据。但是有两个隐藏的数据,就是当鼠标点击image标签时产生的鼠标的相对坐标。

问题如何封装鼠标点击的相对坐标,然后提交??

有点说不清楚了,请直接看网站
https://member.pchome.com.tw/login.html?ref=http%3A%2F%2Fmail.pchome.com.tw%2F
是台湾的一个邮箱。。。

它的提交按钮时一个image的标签。。。。然而每次刷新提交按钮的位置都在变。。这个就很恼火了。

我试过把标签下载下来然后分析,通过获取登陆两个字的颜色来获取相对坐标的值。。。但是失败了。
现在还没找到原因。。。

请各位大侠给点思路啊???
...全文
486 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
皮皮虾向前冲 2010-06-26
  • 打赏
  • 举报
回复
点击图片提交??
jshi123 2010-06-26
  • 打赏
  • 举报
回复
这个颜色就是“登录”两个字的颜色
wulaiwangyi 2010-06-26
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jshi123 的回复:]

你的想法是对的,把图片抓下来,分析登录按钮的位置,再提交
C# code

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

WebBrowser wb = new WebBrowser();
wb.Size = this.C……
[/Quote]
非常感谢 jshi123 做的分析。这个问题的关键还是分析图片,获取“登录”二字的相对坐标。
然后再封装要提交的数据包。

但是还有个问题想要问 jshi123 为什么是 这个颜色Color.FromArgb(0,1,5)。。。
如何得出的这个值的呢? 还望 jshi123 可以赐教?????



jshi123 2010-06-26
  • 打赏
  • 举报
回复
你的想法是对的,把图片抓下来,分析登录按钮的位置,再提交

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

WebBrowser wb = new WebBrowser();
wb.Size = this.ClientSize;
Controls.Add(wb);
wb.Navigate("https://member.pchome.com.tw/login.html?ref=http%3A%2F%2Fmail.pchome.com.tw%2F");
wb.DocumentCompleted += AutoLogin;
}

void AutoLogin(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WebBrowser wb = sender as WebBrowser;
var doc = wb.Document;

PictureBox pic = new PictureBox();
pic.Size = new System.Drawing.Size(276, 60);
string imgUrl = doc.All["submitLogin"].GetAttribute("src");
pic.Load(imgUrl);

Bitmap bmp = new Bitmap(pic.Image.Width, pic.Image.Height);
pic.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));

Point pt = new Point();
for (int x = 0; x < bmp.Width; x++)
for (int y = 0; y < bmp.Height; y++)
if (bmp.GetPixel(x, y) == Color.FromArgb(0,1,5))
pt = new Point(x, y);

doc.GetElementById("userId").SetAttribute("value", "用户名"); //填用户名
doc.GetElementById("passwd").SetAttribute("value", "XXX"); //填密码
var idcheck = doc.GetElementById("idcheck");
idcheck.SetAttribute("action", "loginCheck.html?btnLoginX=" + pt.X + "&btnLoginY=" + pt.Y);
wb.DocumentCompleted -= AutoLogin;
idcheck.InvokeMember("submit");
}
}
醒子宇 2010-06-25
  • 打赏
  • 举报
回复
不懂````
wulaiwangyi 2010-06-25
  • 打赏
  • 举报
回复
非常感谢各位的关注。。。

但是我做的这个自动登录是无界面的。所有数据都需要手动封装,所以很难去获得鼠标点击的相对左边。

还有不知道各位大侠,有没有 在winform 中解析JavaScript的方面的思路啊??

谢谢!
捷哥1999 2010-06-25
  • 打赏
  • 举报
回复
hhao12 2010-06-25
  • 打赏
  • 举报
回复
用js做可以

var img = document.getElementById("imgid");获取图片对象
在表单里面添加一个或者两个也可以(一个保存x值,一个保存y值),onclick()事件——当用户点击图片时,再给以藏文本域赋值,然后提交。ok了
sxldfang 2010-06-25
  • 打赏
  • 举报
回复
我注册个账号,用楼主给的网址登录时,总是出现下面的提示:



只有点击“是”之后才能继续进行。点“否”不会有变化。

软件在运行是若将x,y随便写个值,获取的html信息中会出现要求正确点击按钮的提示。但用上面计算的xy值,却不会出现这样的信息,不能获取登录后的html信息,不知是否和上图的信息由关系?
qingYun1029 2010-06-24
  • 打赏
  • 举报
回复
用js做可以

var img = document.getElementById("imgid");获取图片对象
在表单里面添加一个或者两个也可以(一个保存x值,一个保存y值),onclick()事件——当用户点击图片时,再给以藏文本域赋值,然后提交。ok了、
sxldfang 2010-06-24
  • 打赏
  • 举报
回复
测试不出来,下面是我的测试代码,等待其他高手吧


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.IO;
using System.IO.Compression;
using System.Web;
using System.Collections;

namespace loginCSDN
{
public partial class Form1 : Form
{
CookieContainer cc = new CookieContainer();
string enc;
int x = 70, y = 20;

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
// 读取登录页面
byte[] bs = getBytes("https://member.pchome.com.tw/login.html?ref=http%3A%2F%2Fmail.pchome.com.tw%2F", cc, null);
string html = Encoding.UTF8.GetString(bs);

// 读取图片并确定x,y的值
string flagPic = "/loginButton.html?r=";
int begin = html.IndexOf(flagPic) + flagPic.Length;
int end = html.IndexOf("\"", begin);
enc = html.Substring(begin, end - begin); // 获取enc的值
bs = getBytes("https://member.pchome.com.tw/loginButton.html?r=" + enc, cc, null); // 获取图片
MemoryStream ms = new MemoryStream(bs);
Bitmap bmp = new Bitmap(ms);
for (int i = 0; i < 6; ++i)
{
if (bmp.GetPixel(x, y).ToArgb() != 0) break;
x += 70;
if (x > 210)
{
x = 70;
y += 20;
if (y > 40) break;
}
}
ms.Close();
}


// 用户登录
private void btnLogin_Click(object sender, EventArgs e)
{
try
{
string postData = "ref=http%3A%2F%2Fmail.pchome.com.tw%2F&fnn=&mredirect=&userId=sxldfang&passwd=943237&enc=" + HttpUtility.UrlEncode(enc) + "&x=" + x + "&y=" + y;
richTextBox1.Text = postData;
byte[] buffer = Encoding.Default.GetBytes(postData); // 要发送的数据
buffer = getBytes("https://member.pchome.com.tw/loginCheck.html", cc, buffer);
richTextBox1.Text = Encoding.UTF8.GetString(buffer); // 获取返回的页面内容

//buffer = getBytes("http://member.pchome.com.tw/login_ok.html?ref=http%3A%2F%2Fmail.pchome.com.tw%2F", cc, null);
//richTextBox1.Text = Encoding.UTF8.GetString(buffer);

//buffer = getBytes("http://mail.pchome.com.tw/mainpage", cc, null);
//richTextBox1.Text = Encoding.UTF8.GetString(buffer);

}
catch (Exception Err)
{
MessageBox.Show(Err.Message);
}
}

// 读取网络资源,返回字节数组
private static byte[] getBytes(string url, CookieContainer cookie, byte[] postData)
{
int c = url.IndexOf("/", 10);
byte[] data = null;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.AllowAutoRedirect = true;
if(cookie!=null)request.CookieContainer = cookie;
request.Referer = (c > 0 ? url.Substring(0, c) : url);
request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";

if (postData != null) // 需要 Post 数据
{
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postData.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(postData, 0, postData.Length);
requestStream.Close();
}

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
string ce = response.Headers[HttpResponseHeader.ContentEncoding];
int ContentLength = (int)response.ContentLength;
Stream s = response.GetResponseStream();
c = 1024 * 10;
if (ContentLength < 0) // 不能获取数据的长度
{
data = new byte[c];
MemoryStream ms = new MemoryStream();
int l = s.Read(data, 0, c);
while (l > 0)
{
ms.Write(data, 0, l);
l = s.Read(data, 0, c);
}
data = ms.ToArray();
ms.Close();
}
else // 数据长度已知
{
data = new byte[ContentLength];
int pos = 0;
while (ContentLength > 0)
{
int l = s.Read(data, pos, ContentLength);
pos += l;
ContentLength -= l;
}
}
s.Close();
response.Close();

if (ce == "gzip") // 若数据是压缩格式,则要进行解压
{
MemoryStream js = new MemoryStream(); // 解压后的流
MemoryStream ms = new MemoryStream(data); // 用于解压的流
GZipStream g = new GZipStream(ms, CompressionMode.Decompress);
byte[] buffer = new byte[c]; // 读数据缓冲区
int l = g.Read(buffer, 0, c); // 一次读 10K
while (l > 0)
{
js.Write(buffer, 0, l);
l = g.Read(buffer, 0, c);
}
g.Close();
ms.Close();
data = js.ToArray();
js.Close();
}
return data; // 返回字节数组
}
}
}
捷哥1999 2010-06-24
  • 打赏
  • 举报
回复
你可否用API实现模拟点击那个图片?
我的理解是只要有去点击那个图片,就是可以通过的,对吧。
wulaiwangyi 2010-06-24
  • 打赏
  • 举报
回复
都做了的。。就是他的图片的登录两个字的位置每次都不一样啊。。
登录图片是动态生成的,点击登录时鼠标的位置就相当于验证码的功能。。
sxldfang 2010-06-24
  • 打赏
  • 举报
回复
完成操做了吗?
wulaiwangyi 2010-06-24
  • 打赏
  • 举报
回复
经过分析,Pchome的登录图片每次是不一样的。。。登录两个字的相对整个图片的位置是变化的。。它好像就是通过这个来防止自动登录的啊。。 还请大虾帮忙分析分析啊
sxldfang 2010-06-24
  • 打赏
  • 举报
回复
这个没做测试,其他的我测试(如CSDN等),x,y的值可以随意的吧。

登录CSDNhttp://blog.csdn.net/sxldfang/archive/2010/06/06/5651353.aspx
BaoShiqiang 2010-06-24
  • 打赏
  • 举报
回复
帮顶 友情up
wulaiwangyi 2010-06-24
  • 打赏
  • 举报
回复
我顶 自己

110,561

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧