同步消息到开心网状态
用废话开头,这个开心网是指的 kaixin001 而非那个已经和人人合并的山寨 kaixin。另外标题也是和前面的同步消息到人人网状态、同步消息到人民微博一脉相承,又相辅相成的……(可以预见,前面这句话以后咱们还会相见的)
本着折腾东西但是不能折腾自己的精神,果断地选择了通过开心手机版本的页面来模拟发布状态,而模拟发布的过程,应该怎么知道呢?总不可能每次找方法的时候都去 Google 别人已有的代码吧?这可不一定能保证能找到,况且就算别人已有代码,人家也不一定有心情来个详细地介绍说明,就像那篇同步消息到人人网状态一样。因此,掌握方法和工具才更重要一些,知道方法了,随它一时又冒出个天涯鸭脖什么,也能就地解决掉,等到别人代码都出来了,那自己再重复一遍还要外加借鉴别人的工作有什么意思!所以,玩这些同步的时候,主要还是阅读官方的API文档,自己利用工具比如 SmartSniff 来抓包研究,实在无法,当然还是要求教他人去学习,但是这不同于前面讲的被动地等待他人的成果。( 我也不知道这厮当时是受了什么刺激,有意见就轰他电话好了,号码是 15…)
手机开心网的模拟登录发布过程和人人网是类似的,向 http://wml.kaixin001.com/login/login.php 这个地址 POST 邮箱和密码之后返回一个页面,从这个页面里可以解析出一个 verify,使用正则可以轻易地做到,用 \u0022 来代替双引号可能能够带来一些方便。获取到 verify 之后向 http://wml.kaixin001.com/home/state_submit.php 提交要发送的状态消息,记得带上 verify 参数便可。没了,简单几步,如果需要将消息同步为开心网的记录,过程也是类似的,记得最初就有朋友建议 一堆微博客 要能同步到开心网记录,只是我想如果一个用户同时同步开心网状态和记录是不大可能的,而两者只选其一,那还是留下状态好了。(都给出了,让用户选?我自己不喜欢…所以他就没了。)
- /// <summary>
- /// 模拟网页登录开心网并发布消息
- /// </summary>
- /// <param name="user">用户名</param>
- /// <param name="password">密码</param>
- /// <param name="message">发布的信息</param>
- private void update_kaixin(string user, string password, string message)
- {
- string service = "开心网";
- this.BeginInvoke(new UpdateStatusDelegate(StateInfo), new object[] { "正在将消息发布到 " + service });
- CookieContainer cc = new CookieContainer();
- string login_url = “http://wml.kaixin001.com/login/login.php”;
- string postData = "email=" + Utility.UrlEncode(user) + "&password=" + Utility.UrlEncode(password);
- byte[] bs = Encoding.UTF8.GetBytes(postData);
- HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(login_url);
- request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
- request.ContentType = "application/x-www-form-urlencoded";
- request.Method = "POST";
- request.ContentLength = bs.Length;
- request.CookieContainer = cc;
- try
- {
- using (Stream requestStream = request.GetRequestStream())
- {
- requestStream.Write(bs, 0, bs.Length);
- requestStream.Close();
- }
- }
- catch (Exception e)
- {
- ErrorMessage("模拟网页登陆到 " + service + " 时出现意外,建议暂时取消这一服务的同步:\r\n" + e.Message, 2);
- return;
- }
- string verify = "";
- try
- {
- HttpWebResponse response = (HttpWebResponse)request.GetResponse();
- Stream responseStream = response.GetResponseStream();
- StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8"));
- string result = reader.ReadToEnd();
- Match re = Regex.Match(result, @"verify=([^\u0022]*)\u0022");
- verify = re.Groups[1].ToString();
- foreach (Cookie cookie in response.Cookies)
- {
- cc.Add(cookie);
- }
- }
- catch (Exception e)
- {
- ErrorMessage("模拟网页跳转 " + service + " Cookie 时出现意外,建议暂时取消这一服务的同步:\r\n" + e.Message, 3);
- return;
- }
- string post_url = “http://wml.kaixin001.com/home/state_submit.php”;
- postData = "state=" + Utility.UrlEncode(message) + "&verify=" + Utility.UrlEncode(verify);
- bs = Encoding.UTF8.GetBytes(postData);
- request = (HttpWebRequest)HttpWebRequest.Create(post_url);
- request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
- request.ContentType = "application/x-www-form-urlencoded";
- request.Method = "POST";
- request.ContentLength = bs.Length;
- request.CookieContainer = cc;
- try
- {
- using (Stream reqStream = request.GetRequestStream())
- {
- reqStream.Write(bs, 0, bs.Length);
- reqStream.Close();
- }
- }
- catch (Exception e)
- {
- ErrorMessage("将消息发布到 " + service + " 时出现意外,建议暂时取消这一服务的同步:\r\n" + e.Message, 1);
- return;
- }
- }
最后,诚恳地希望围观者有代码改进建议等可以留言,谢谢。祝大家在明天的光棍节来临之前能尽早脱光。大家今晚加油!
本文链接: http://isouth.org/archives/299.html , 转载请注明出处,此外还可以订阅我。
貌似是哪一个服务的代码整理完,我就会注销哪个服务的帐号或者删除自己在哪个服务上的记录…
下次写同步到百度空间吧
@软件盒子 都是同步到微博、SNS额
这个值得收藏
@大智若鲁 额,http://pdfmyurl.com/?url=http%3A%2F%2Fisouth.org%2Farchives%2F299.html 可以保存为 pdf
很喜欢你的博客,总是分享又实用的文章