同步消息到开心网状态

6 条评论

用废话开头,这个开心网是指的 kaixin001 而非那个已经和人人合并的山寨 kaixin。另外标题也是和前面的同步消息到人人网状态同步消息到人民微博一脉相承,又相辅相成的……(可以预见,前面这句话以后咱们还会相见的)

本着折腾东西但是不能折腾自己的精神,果断地选择了通过开心手机版本的页面来模拟发布状态,而模拟发布的过程,应该怎么知道呢?总不可能每次找方法的时候都去 别人已有的代码吧?这可不一定能保证能找到,况且就算别人已有代码,人家也不一定有心情来个详细地介绍说明,就像那篇同步消息到人人网状态一样。因此,掌握方法和工具才更重要一些,知道方法了,随它一时又冒出个天涯鸭脖什么,也能就地解决掉,等到别人代码都出来了,那自己再重复一遍还要外加借鉴别人的工作有什么意思!所以,玩这些同步的时候,主要还是阅读官方的API文档,自己利用工具比如 SmartSniff 来抓包研究,实在无法,当然还是要求教他人去学习,但是这不同于前面讲的被动地等待他人的成果。( 我也不知道这厮当时是受了什么刺激,有意见就轰他电话好了,号码是 15…)

手机开心网的模拟登录发布过程和人人网是类似的,向 http://wml.kaixin001.com/login/login.php 这个地址 POST 邮箱和密码之后返回一个页面,从这个页面里可以解析出一个 verify,使用正则可以轻易地做到,用 \u0022 来代替双引号可能能够带来一些方便。获取到 verify 之后向 http://wml.kaixin001.com/home/state_submit.php 提交要发送的状态消息,记得带上 verify 参数便可。没了,简单几步,如果需要将消息同步为开心网的记录,过程也是类似的,记得最初就有朋友建议 要能同步到开心网记录,只是我想如果一个用户同时同步开心网状态和记录是不大可能的,而两者只选其一,那还是留下状态好了。(都给出了,让用户选?我自己不喜欢…所以他就没了。)

  1.         /// <summary>
  2.         /// 模拟网页登录开心网并发布消息
  3.         /// </summary>
  4.         /// <param name="user">用户名</param>
  5.         /// <param name="password">密码</param>
  6.         /// <param name="message">发布的信息</param>
  7.         private void update_kaixin(string user, string password, string message)
  8.         {
  9.             string service = "开心网";
  10.             this.BeginInvoke(new UpdateStatusDelegate(StateInfo), new object[] { "正在将消息发布到 " + service });
  11.             CookieContainer cc = new CookieContainer();
  12.             string login_url = “http://wml.kaixin001.com/login/login.php”;
  13.             string postData = "email=" + Utility.UrlEncode(user) + "&password=" + Utility.UrlEncode(password);
  14.             byte[] bs = Encoding.UTF8.GetBytes(postData);
  15.             HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(login_url);
  16.             request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
  17.             request.ContentType = "application/x-www-form-urlencoded";
  18.             request.Method = "POST";
  19.             request.ContentLength = bs.Length;
  20.             request.CookieContainer = cc;
  21.             try
  22.             {
  23.                 using (Stream requestStream = request.GetRequestStream())
  24.                 {
  25.                     requestStream.Write(bs, 0, bs.Length);
  26.                     requestStream.Close();
  27.                 }
  28.             }
  29.             catch (Exception e)
  30.             {
  31.                 ErrorMessage("模拟网页登陆到 " + service + " 时出现意外,建议暂时取消这一服务的同步:\r\n" + e.Message, 2);
  32.                 return;
  33.             }
  34.             string verify = "";
  35.             try
  36.             {
  37.                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  38.                 Stream responseStream = response.GetResponseStream();
  39.                 StreamReader reader = new StreamReader(responseStream, Encoding.GetEncoding("UTF-8"));
  40.                 string result = reader.ReadToEnd();
  41.                 Match re = Regex.Match(result, @"verify=([^\u0022]*)\u0022");
  42.                 verify = re.Groups[1].ToString();
  43.                 foreach (Cookie cookie in response.Cookies)
  44.                 {
  45.                     cc.Add(cookie);
  46.                 }
  47.             }
  48.             catch (Exception e)
  49.             {
  50.                 ErrorMessage("模拟网页跳转 " + service + " Cookie 时出现意外,建议暂时取消这一服务的同步:\r\n" + e.Message, 3);
  51.                 return;
  52.             }
  53.             string post_url = “http://wml.kaixin001.com/home/state_submit.php”;
  54.             postData = "state=" + Utility.UrlEncode(message) + "&verify=" + Utility.UrlEncode(verify);
  55.             bs = Encoding.UTF8.GetBytes(postData);
  56.             request = (HttpWebRequest)HttpWebRequest.Create(post_url);
  57.             request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)";
  58.             request.ContentType = "application/x-www-form-urlencoded";
  59.             request.Method = "POST";
  60.             request.ContentLength = bs.Length;
  61.             request.CookieContainer = cc;
  62.             try
  63.             {
  64.                 using (Stream reqStream = request.GetRequestStream())
  65.                 {
  66.                     reqStream.Write(bs, 0, bs.Length);
  67.                     reqStream.Close();
  68.                 }
  69.             }
  70.             catch (Exception e)
  71.             {
  72.                 ErrorMessage("将消息发布到 " + service + " 时出现意外,建议暂时取消这一服务的同步:\r\n" + e.Message, 1);
  73.                 return;
  74.             }
  75.         }

最后,诚恳地希望围观者有代码改进建议等可以留言,谢谢。祝大家在明天的光棍节来临之前能尽早脱光。大家今晚加油!

相关日志 Relate Posts

“同步消息到开心网状态”6条留言

  1. 貌似是哪一个服务的代码整理完,我就会注销哪个服务的帐号或者删除自己在哪个服务上的记录…

  2. 下次写同步到百度空间吧


  3. 这个值得收藏

    • @大智若鲁 额,http://pdfmyurl.com/?url=http%3A%2F%2Fisouth.org%2Farchives%2F299.html 可以保存为 pdf :idea:

  4. 很喜欢你的博客,总是分享又实用的文章

发表留言(Ctrl+Enter提交)