[转载]WebBrowser的Cookie操作(与CookieContainer的关系)(转载) - 蓝雪原 - 博客园

mikel阅读(922)

[转载]WebBrowser的Cookie操作(与CookieContainer的关系)(转载) – 蓝雪原 – 博客园.

//在WebBrowser中登录cookie保存在WebBrowser.Document.Cookie中
readonly CookieContainer myCookieContainer = new CookieContainer();

private void button1_Click(object sender, EventArgs e)
{
webBrowser1.Navigate("http://t.qq.com");
}

private void button2_Click(object sender, EventArgs e)
{
//String 的Cookie 要转成 Cookie型的 并放入CookieContainer中
if (webBrowser1.Document != null)
{
string cookieStr = webBrowser1.Document.Cookie;
string[] cookstr = cookieStr.Split(';');

foreach (string str in cookstr)
{
string[] cookieNameValue = str.Split('=');

string strValue = cookieNameValue[1].Trim().Replace(",", "%2C");

Cookie ck = new Cookie(cookieNameValue[0].Trim(), strValue);
ck.Domain = "t.qq.com"; //必须写对
myCookieContainer.Add(ck);
}
}

var pageDownLoadNew = new PageDownLoad { Cookies = myCookieContainer };
pageDownLoadNew.GetHtmlCode("http://t.qq.com");
webBrowser2.DocumentText = pageDownLoadNew.HtmlCode;
}

引用地址:http://blog.csdn.net/ruixue0117/article/details/8265698

[转载]C#如何通过Socket的方式获取httponly cookie - Orangutan - 博客园

mikel阅读(1109)

[转载]C#如何通过Socket的方式获取httponly cookie – Orangutan – 博客园.

正常情况下C#可以使用HttpWebRequest、HttpWebResponse和CookieContainer类来获取Cookie,但 是当Cookie设置为httponly,我们就不能用上面的方法获取。这时候可以用Socket来模拟http提交。具体如下:

1.先取得默认DNS服务器地址:

IPEndPoint endPoint;
IPAddress IpList;
IpList = Dns.GetHostAddresses("www.7fenx.com")[0];

2.模拟http请求,设置http头:

 

 

StringBuilder sendString=new StringBuilder(200);
sendString.Append("POST "+ "/" + " HTTP/1.1\r\n");
sendString.Append("Accept: */*\r\n");
sendString.Append("Host: "+host+"\r\n");
sendString.Append("User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36\r\n");
sendString.Append("Content-Type: application/x-www-form-urlencoded\r\n");
sendString.Append("Content-Length: "+sendData.Length+"\r\n");
sendString.Append("Connection: keep-alive\r\n\r\n");
sendString.Append(postData+"\r\n");

3.发送请求

byte[] sendBytes = Encoding.GetEncoding(endcoding).GetBytes(sendString.ToString());
int httpPoint = 80;
endPoint = new IPEndPoint(ip, httpPoint);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect(endPoint);
socket.Send(sendBytes,sendBytes.Length,0);

 

4.获取服务器的返回信息

 

Byte[] byteReceive = new Byte[1024];
Int32 bytes = socket.Receive(byteReceive);
string str = Encoding.Default.GetString(byteReceive, 0, bytes);

5.提取Cookie内容

Regex rgxCookie = new Regex("Set-Cookie:.*");
MatchCollection cookies = rgxCookie.Matches(cookie);

提取后需要做的就是解析Cookie就是一些字符串的处理。

附上网络编程基础知识地址:

http://www.7fenx.com/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86.html

初接触网络编程,如果哪里说错请指出。

欢迎加我QQ交流:1780242721,请注明:“博客园”

 

本文如需转载请注明出处。

[转载]《小C QQ空间转帖、分享工具》之QQ空间数据传递的g_tk算法(C#) - dapeng888 - 博客园

mikel阅读(957)

[转载]《小C QQ空间转帖、分享工具》之QQ空间数据传递的g_tk算法(C#) – dapeng888 – 博客园.
原文地址:http://user.qzone.qq.com/419067339/2

public string GET_HTTP(string url, string referer_post, string accept_post, string useragent_post, bool keepalive, CookieContainer CookieContainer_Post,int i)
{
System.Uri httpposturl = new System.Uri(url);
HttpWebRequest reqp;
reqp = WebRequest.Create(url) as HttpWebRequest;
reqp.Method = "GET";
reqp.Referer = referer_post;
reqp.Accept = accept_post;
reqp.UserAgent = useragent_post;
reqp.CookieContainer = CookieContainer_Post;
HttpWebResponse resp = reqp.GetResponse() as HttpWebResponse;
StreamReader reader = new StreamReader(resp.GetResponseStream(), System.Text.Encoding.Default);
string respHTML = reader.ReadToEnd();
if (reqp.CookieContainer != null)
{
Form1.caozuo.User_Cookies[i] = reqp.CookieContainer;
string shuju = "";
foreach (Cookie cookie in resp.Cookies)

{
shuju += cookie.Name + "-" + cookie.Value;//获取所有的Cookies值
}
string str = shuju.Substring(shuju.IndexOf("skey-") + 5, 10);//提取skey-后面的10个字符用于算出g_tk值
long hash = 5381;
for (int o = 0; o < str.Length; o++)
{
hash += (hash << 5) + str[o];
}
hash = hash & 0x7fffffff;//hash就是算出的g_tk值了.

Form1.caozuo.临时传递TK值 = hash.ToString();
}
resp.Close();
return respHTML;
}

用法:
GET_HTTP(URL, 来路, “*/*”, “Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)”, false, new CookieContainer(),Cookies编号(因为我使用到了多账号));

[转载]向腾讯服务器发送带Cookie的HTTP数据以便登录myQQ和加密相册(C#)[转] - zeroStart - 博客园

mikel阅读(699)

[转载]向腾讯服务器发送带Cookie的HTTP数据以便登录myQQ和加密相册(C#)[转] – zeroStart – 博客园.

琢磨了几天终于成功了!

方法就是利用 Fiddler 来查看登录时发送的数据,主要是查看HTTP数据的header,不过登录http://my.qq.com/ 还要发送内容。

进入加密相册稍微简单一些,只要带上验证码图片返回的Cookie值,然后GET以下地址即可得到该相册的XML数据:

http://xa.photo.qq.com/cgi-bin/common/cgi_view_album?uin=QQ号& refer=portal&albumid=相册ID&password=密码MD5值&verifycode=验证码

希望对大家有所帮助,有不明白的地方或者发现错误请留言告知。

声明:文章所讲的并不是如何破解相册密码,只是提供一种正确的登录方式,即如何向腾讯的服务器发送验证数据。如果连这都搞不定,破解更无从谈起。

下载地址见 http://lvehe.ys168.com/ “原创小软件”下的 VerifyQQ.exe。

一、登录到 http://my.qq.com/ 的加密方式

MD5加密三次,得到的32位密钥转为大写后,再与4位大写验证码连接成一个字符串,再对此字符串进行一次MD5加密,再转为大写即可。

二、显示验证码图片、获取验证码Cookie

图片地址为 http://ptlogin2.qq.com/getimage,得到其响应返回的Set-Cookie值,即“verifysession=…”,其值共80位,保存该值为一个全局变量。

三、发送登录QQ的验证数据。得到的 Set-Cookie 字符串在拆分上个人觉得不太理想,但也还凑合。谁有更好的办法请留言,谢谢。

ShowAvator(string myCookie) 方法得到头像的地址是 http://my.qq.com/qq_face.php,参数myCookie即那个全局变量,记得要传输这个Cookie才能得到正确的头像。

private void btnShowFace_Click(object sender, EventArgs e)
        {
            string loginUrl = @"http://ptlogin2.qq.com/login";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUrl);
            request.Method = WebRequestMethods.Http.Post;
            request.KeepAlive = true;
            //必须禁止自动重定向才能获得 Set-Cookie
            request.AllowAutoRedirect = false;

            //设置提交的数据
            string postData = @"fp=loginerroralert&u=" + txtQQNum.Text;
            postData += @"&p=" + Calc3MD5(txtPwd.Text, txtVCode.Text);
            postData += @"&verifycode=" + txtVCode.Text;
            postData += @"&u1=http%3A%2F%2Fmy.qq.com&aid=8000203";
            request.ContentLength = postData.Length;

            //设置 Cookie
            request.Headers.Set("Cookie", "verifysession=" + strCookie);

            Stream requestStream = request.GetRequestStream();
            StreamWriter myStreamWriter = new StreamWriter(requestStream);
            myStreamWriter.Write(postData, 0, postData.Length);
            myStreamWriter.Close();
            requestStream.Close();

            HttpWebResponse response = (HttpWebResponse)request.GetResponse();

            string redirectUrl = response.GetResponseHeader("Location");
            string[] setCookies = response.Headers["Set-Cookie"].Split(';');
            response.Close();

            string myCookie = "verifysession=" + strCookie;
            foreach (string set in setCookies)
            {
                if (set.Contains("pt2gguin=") || set.Contains("uin=") || set.Contains("skey=") || set.Contains("ptcz="))
                {
                    myCookie += "; " + set.Trim(',');
                }
            }

            ShowAvator(myCookie);
        }

四、发送加密相册的验证数据,得到该相册的XML数据

private void btnPost_Click(object sender, EventArgs e)
        {
            string hostUrl = @"http://xa.photo.qq.com";
            hostUrl += @"/cgi-bin/common/cgi_view_album?uin=" + txtQQNum.Text;
            hostUrl += @"&refer=portal&albumid=" + txtID.Text;
            hostUrl += @"&password=" + CalcMD5(txtPhotoPwd.Text);
            hostUrl += @"&verifycode=" + txtVCode.Text;

            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(hostUrl);
            request.Referer = @"http://xa.photo.qq.com/proxy.html";
            request.Method = "GET";
            request.Headers["Accept-Language"] = "zh-cn";
            request.KeepAlive = true;
            //设置 Cookie
            request.Headers.Set("Cookie", "verifysession=" + strCookie);
            
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("gb2312"));

            string dataGot = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            richTextBox1.Text = dataGot;
        }

[转载]无需登录强制修改他人QQ秀为自己的图片 - Black Elements - csdn blog - 博客频道 - CSDN.NET

mikel阅读(790)

[转载]无需登录强制修改他人QQ秀为自己的图片 – Black Elements – csdn blog – 博客频道 – CSDN.NET.

1、打开菜刀软件 点击“+”号打开浏览器 输入QQ秀官网:http://show.qq.com

 

2、进入后 右键“扩展功能”修改Cookies



3、复制以下代码 粘贴到输入框,有2处需要修改成要登录的QQ号,修改完后点击“修改Cookies”


pt2gguin=o0 这里改成你要登录的QQ号; RK=jq9mYacVWP; ptcz=6caec20a5a6eb59b4d68a0ad0f115538f824fe104e5c23ba41d5b0b8cc8dcbb1; ac=1,014,007; uin_cookie=156498721; euin_cookie=FCE056305C78890DBD4E32329F544F3126CE6F925DA12B85; pgv_pvid=4515140242; pgv_info=ssid=s1163162683; uin=o0这里改成你要登录的QQ号; skey=@m8o7siT9t; ptisp=cnc; session=1; qs_tk=44; ts_last=show.qq.com/; ts_refer=ADTAGclient.im.card.qqshow; ts_uid=5199038500

 

4、再复制以下浏览地址,有1处需要修改成要登录的QQ号,修改完回车键即可登录要修改的QQ号了:

http://show.qq.com/?ADTAG=client.im.card.qqshow&opuin=这里改成你要登录的QQ号&ptlang=2052#u%3DphotoShow/html/index.html%253Fsex%253DUM%2526rcount%253D0

5、然后你就可以任意修改别人的QQ秀了


原文地址:http://www.dakest.cc/safe/22.html

[转载]crawler_基础之_httpclient 访问网络资源 - cphmvp - 博客园

mikel阅读(815)

[转载]crawler_基础之_httpclient 访问网络资源 – cphmvp – 博客园.

先粘贴一个 简单版的,后期再修改

pom文件

  <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpasyncclient</artifactId>
      <version>4.0-alpha3</version>
      <scope>compile</scope>
    </dependency>
package com.cph.utils;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

/**
 * httpclient 帮助类<br>
 * 4.1.2测试版
 * 
 * @author cphmvp
 * 
 */
public class HttpClientUtil {
    private static String encoding = "UTF-8";

    /**
     * get方式下载
     * 
     * @param url
     */
    public static String downloadGet(String url) {
        String htmls = null;
        DefaultHttpClient client = new DefaultHttpClient();
        // 新建get请求
        HttpUriRequest request = new HttpGet(url);
        // 封装请求头
        pageRequest(request);
        // 声明响应
        HttpResponse response = null;
        // 响应实体
        HttpEntity entity = null;
        try {
            response = client.execute(request);
            System.out.println("响应码: "
                    + response.getStatusLine().getStatusCode());
            if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) {
                entity = response.getEntity();
                byte[] content = EntityUtils.toByteArray(entity);
                htmls = new String(content, encoding);
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭客户端
            client.getConnectionManager().shutdown();
        }
        return htmls;
    }

    /**
     * 封装请求头
     * 
     * @param request
     */
    private static void pageRequest(HttpUriRequest request) {
        // 设置浏览器版本
        request.setHeader(
                "User-Agent",
                "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; MyIE 2.0 Beta 2; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)");
        // 设置cookie refer等
        request.setHeader(
                "Cookie",
                "RK=hki7lw6qHP; wbilang_821910184=zh_CN; wbilang_10000=zh_CN; dm_login_weixin_rem=; dm_login_weixin_scan=; wb_regf=%3B0%3B%3Bwww.baidu.com%3B0; mb_reg_from=8; ts_last=t.qq.com/; ts_refer=search.t.qq.com/index.php; ts_uid=7492426386; wbilang_384871492=zh_CN; ts_last=1.t.qq.com/wolongxian; ts_refer=www.baidu.com/s; ts_uid=7492426386; pgv_pvid=1942759996; pgv_info=ssid=s5111200112; o_cookie=384871492; ptui_loginuin=821910184; ptisp=cnc; ptcz=9c03596fa66d550bcd5c8cd812f16ad5d6c2074604285851a218c478774eb6bb; luin=o0821910184; lskey=00010000b43bed256a14b910da63ac03a1c1a042994fea6a8a7078dcb2ea566d5dc09188883ddddd1f7feadb; pt2gguin=o0821910184; uin=o0821910184; skey=@xObtCqUUW; p_uin=o0821910184; p_skey=swqZymgXczQrTdTin9Qe44jMT5cTNoTeSzaXrxDjs3k_; pt4_token=OlMTg1UJSdPz-VzgfdEgFQ__; p_luin=o0821910184; p_lskey=000400001663db9b9783c84586b6d929044d17e291916d1cfcfb93c0f520f05e8c85adc89dffc94e52b1325e");
    }

    public static void main(String[] args) {
        String url = "http://www.baidu.com/";
        System.out.println(downloadGet(url));
    }
}

[转载]HttpWebRequest 和 Cookie 的一些记录 - zzmsl - 博客园

mikel阅读(1013)

[转载]HttpWebRequest 和 Cookie 的一些记录 – zzmsl – 博客园.
最近在写相关方面的程序,服务端是asp的,一开始用把Cookie赋值给HttpWebRequest.CookieContainer例如:

string[] cookies = cookieString.Split(";".ToCharArray());
CookieContainer cc = new CookieContainer();
foreach (string cookie in cookies) cc.SetCookies(new Uri("http://domain.com/"), cookie);
HttpWebRequest.CookieContainer = cc;

有一个网址怎么搞都测试不成功,总提示500错误,其他网址都成功(包括自己又用ASP.NET的Form生成的cookie验证来测试)。刚开始以为是编码、中文等的问题,用IE9的开发人员工具,FireFox的FireBug,分析Cookie断断续续折腾了好久,后来改了个方法,问题迎刃而解:

HttpWebRequest.Headers.Add("Cookie", "Cookie的值");

微信扫描二维码登录网页是什么原理,前后两个事件是如何联系的?

mikel阅读(1490)

恰好我之前也花过几个小时做过类似的验证登录过程,这里作为探讨,把产品同学的回答做个引用,解释一下其中『不技术』的地方。

1. 每打开一次微信网页版页面的时候会随机生成一个含有唯一uid的二维码,每次刷新页面都会不一样(这个可以保证一个uid只可以绑定一个账号和密码,如果一个uid可以绑定多个账号和密码,那么很可能你的电脑会登陆别人的微信哦);

确实返回了唯一 id,但目的是为了识别用户身份,而且实际上打开这个页面的时候浏览器已经和 Server 创建了一个长连接等待确认信息。
查看 http://wx.qq.com 的源码可以看到,这个页面在加载完毕时,也已经把很多登录后才需要的相关资源都预先加载进来了,所以长连接等待登录用户得到确认后展示用户信息的速度很快,因为无需刷页面和加载头像外的其他资源。

2. 当用户使用登陆后的微信扫描该二维码的时候,会将这个id和手机上的微信账号及密码绑定,并上传到微信网页版服务器;

先上个图:

二维码样例: http://weixin.qq.com/x/ARmFYVvUzczwBl9u6Y1I ,利用我查查之类的二维码应用可以得到类似这样的地址,但并不会自动打开该地址,微信客户端针对 http://weixin.qq.com/x/ 开头的地址做了特殊处理,会自动获取相关信息并提示确认。 在手机版微信访问这个页面进行确认时,Server已经同时获得了客户端信息,并通过之前保持的长连接告知浏览器。

3. 微信网页版页面每隔1秒或2秒会get请求该id对应的微信账号及密码,如果id绑定上了微信账号和密码,那么就可以请求到账号和密码,就可以自动登陆了。

浏览器展示完长连接里包含的用户信息(头像等)后,会新开一个长连接等待客户端的确认操作,其 URL 类似 https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid=794ecedd804f47&tip=1&_=1395748413642 。从安全的角度来说,无论如何都不会让客户端获得微信帐号和密码的。要知道,密码这玩意腾讯自己都不敢保存(有兴趣的同学可以自行了解下 CSDN 明文密码泄露事件),肯定是不可能返回给浏览器的。
而且从体感来看,怎么着都不可能是页面1-2秒轮询发起GET请求的,实际是通过堵塞等待的长连接,近乎实时的获得信息。 对于验证过程,Open API 一般是通过授权令牌(Token)来解决的,原理是当用户通过授权后,分配一个限定条件下的令牌(如限制本机访问、限制授权有效时间、限制同时登录设备数等),使获得授权的用户仅在有限的前提下能访问相关服务。 像计算机休眠后曾做的授权就自动收回了,这样就有效的避免了在别人电脑上(尤其是网吧)打开,但忘记关闭或退出这类安全问题了。
同时,整个授权过程的验证部分在手机端进行,有效杜绝了 PC 上泛滥的各类木马、『安全工具』的监听,大大降低了帐号被盗的风险。

所以说,核心过程应该是:浏览器获得一个临时 id,通过长连接等待客户端扫描带有此 id 的二维码后,从长连接中获得客户端上报给 server 的帐号信息进行展示。 并在客户端点击确认后,获得服务器授信的令牌,进行随后的信息交互过程。 在超时、网络断开、其他设备上登录后,此前获得的令牌或丢失、或失效,对授权过程形成有效的安全防护。

[转载]网页版微信解析实践 - 推酷

mikel阅读(1018)

[转载]网页版微信解析实践 – 推酷.

网页版微信解析实践

前段时间,刚好遇到朋友拜托我做一个功能。大致的功能需求中,有一个重要部分,是需要监听微信的消息,并收集起来,之后再根据一些需要对数据进行处理。(我会在文章的后面附上相应的源码, 如果有说错的地方,还请看官勿喷。 )

于是,很正常的上网搜索,发现网上关于微信接口方面的资料,主要集中在公众平台和安卓方面的sdk,明显不符合需求,剩下的唯一方式,就只能通过官方的微信网页版了。

为此在网上经过多次搜索,目前只发现有如下两篇文章讲到网页版微信的解析:

http://www.woyaofeng.com/1421.html

http://www.tanhao.me/talk/1466.html

可惜的是,根据实际观察分析,发现与目前官方的情况已经有很明显的出入了,不过,还是很有参考的价值。

但最终,这活还是得自己去研究。

现根据自己研究的情况,写出大致步骤,希望对一些有兴趣的同学,能有所帮助。

先做一些铺垫。由于官方的登陆实现要求,是必须先用手机扫描过二维码之后,由手机在终端授权登陆后,网页版才会进行一些相应的动作,比如收集交互时的认证信息。

也就是说,网页版的登陆,可以大约分为这么一个过程:

1.登陆主页后,会生成一个UUID,你懂的,这是个唯一性标识。

GET “https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-in%2Fwebwxnewloginpage&fun=new&lang=zh_CN”

2.根据该UUID去请求相应的二维码信息。

GET  “https://login.weixin.qq.com/qrcode/{uuid}?t=webwx”;

3.通过浏览器端不断的轮询,以确定手机是否已经完成授权,并允许用户在浏览器端的登陆。

4.   GET “https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?uuid={uuid}&tip=1&_={time}”; –这里的time其实就是一个System.currentTimeMillis().

5.  如果手机端已经授权通过,则会在第3步中,返回一个响应的内容,返回的响应中会有window.redirect_uri=https://wx.qq.com/xxxxxxxxxx(URL地址)类似的信息。

6   通过再访问第4步中的URL,得到真正的、最后的登陆URL地址。如 https://wx2.qq.com/xxxxxxx 。之后通过查看,发现第 4 步和第 5 步其实主要是域名不同,估计是官方由于某种原因(升级之类的吧)。所以实际操作中,可以直接替换掉第4步中的域为wx2.qq.com即可,第5步就可以省略了。

7.  一旦在第5步中,正确的登陆成功后,必须保存服务器端返回的cookie信息,之后cookie信息都会用于后续的交互。

至此,就完成了基本的登陆认证过程,看着比较麻烦,其实想通了,自然也就觉得没啥了。如果让你去这一块的登陆授权验证,估计也会大致这么一个思考的方向。

既然登陆了,自然就要涉及二个字:交互。交互的话,自然免不了要考虑如下几个内容:

a. 登陆后,需要一些初始化的数据信息内容,数据的请求格式,相互校验数据信息。

b. 获取用户列表信息。

c.    怎么保持浏览器端与服务器端的心跳,需要传递什么样的数据信息,这些数据信息是每次心跳之后,都会改变,还是说,一直不变,或者是一定心跳次数后,就会更新?

d. 由于网页版的登陆,需要手机同时登陆在线,那么是不是有可能需要浏览器端定时向服务器发送与手机端的状态同步心跳?

慢慢来,毕竟,这玩意并不复杂,就是有点繁琐。

1. 在之前已经成功登陆的基础上,需要做一些初始化工作,POST https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r={time}&skey= ,该请求返回的数据中需要关注的内容有:SKey,SyncKey,这二个会在之后的交互中,经常用到,当然也包括此前登陆得到的cookie信息。

2. POST  “https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid={sid}&r={time}&skey={skey}”;

从URL的命名来看,应该是向服务器端提供的一次验证,而且这次验证在返回的json中的syncKey将会做为此后心跳机制中的交互码。在上一步中也 会返回此码,二次得到的syncKey并不一样。而且本步骤得到的syncKey中的数据总是比上一步骤的数据要多一个。

3.对浏览器端与手机终端做一次状态同步心跳。

POST “https://wx2.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?r=1397443950116&skey=%40crypt_cfbfba84_e5913dbec2b764d086b7d1d1aab946ca”;

4.浏览器端与服务器端的定时心跳。

GET “https://webpush2.weixin.qq.com/cgi-bin/mmwebwx-bin/synccheck?skey={skey}&callback=JQuery183008612365838727565_1397377003545&r={r}&sid={sid}&uin={uin}&deviceid={deviceid}&synckey={synckey}&_={time}”;

该请求有二个作用,一个是用于保证心跳,一个是用于暗示是否有相应的微信消息。返回值的内容大致如下:{retcode: ” 0 ″ ,selector: ” 0 ″ } 。通过观察发现,当 selector 不等于 0 的时候,意味着需要客户端发起请求去获取消息,这时,需要重新请求第 2 步骤即可。

大致的情况如上所述,建议有兴趣的同学,请结合文章开头引用的两篇文章,毕竟,本文主要是对其做一些补充说明。

(备注:自从去年去了一家港资公司之后,基本上也没怎么写过代码了,感觉生疏了许多。刚好这次借着机会,练练手,同时把gson和httpclient4的东西学习一下。)

[转载]微信公众账号查看历史消息 - 方倍工作室 - 博客园

mikel阅读(984)

转载微信公众账号查看历史消息 – 方倍工作室 – 博客园.

我们在关注微信公众号的时候会看到该公众号相关信息:微信公众号的logo、名称、微信号、功能介绍、微信认证情况、认证详情,通过这些信息我们可以大概了解这个公众号的运营主题内容,如果还想了解更多可以点击“查看历史消息”查看最近的群发消息。

公众号如何查看历史消息

还没关注公众号前可以快速查看历史消息,关注完以后我们可不可以设置一个微信自定义菜单来显示这些历史消息呢?更直白的说是查看历史消息这个页面的URL。

公众号查看历史消息复制链接

点击“查看历史消息”页面右上角的“┇”即上图中的1标示,在弹出的下来菜单中选“复制链接”,即图中2标示,复制出来的链接地址如下

1
http://mp.weixin.qq.com/mp/getmasssendmsg?__biz=MjM5NjQ4MDg2MA==#wechat_webview_type=1&wechat_redirect

一长串的网址,其中红色参数部分MjM5NjQ4MDg2MA是xmyanke这个公众号的转码标示,每个公众号的转码都不同。

我们把这个链接地址放到图文消息的“阅读原文”,或者在直接添加到微信自定义菜单那边

注意:此通用的网址无法在电脑浏览器上直接打开,如果直接打开的话就会显示:您的版本不支持此功能,请升级。 必须在微信上打开才能有效。如果你想在电脑上查看那些历史消息,可以尝试在pc端安装一个ios模拟器或Android模拟器