免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: sx98083714
打印 上一主题 下一主题

求用WWW::Mechanize模块提交表单,字段为中文提交后乱码的解决办法? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2010-09-05 18:00 |只看该作者
Perl有部分模块对中文支持不到位,比如GD,楼主的问题也可能是因为WWW::Mechanize对中文支持不好。用LWP实现了一下,代码有点啰嗦,将就一下吧:
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use LWP;
  5. use HTTP::Cookies;
  6. use HTTP::Response;
  7. use LWP::ConnCache;
  8. use Encode;

  9. my $username = "abcdef";
  10. my $password = "123456";
  11. my $recipient = "美女";
  12. my $topic = "测试 by 立虻 20100905";
  13. my $content = "明月几时有,把酒问清天,不知天上宫阙,今夕是何年!";

  14. my $lwp = LWP::UserAgent->new;
  15. my $conncache = new LWP::ConnCache;
  16. $lwp->conn_cache($conncache);

  17. ######################## LOGIN #########################
  18. my $login_url = "http://passport.libaclub.com/login.php?act=submit";
  19. my %login_form = (
  20.         "username" => $username,
  21.         "password" => $password,
  22. );
  23. my $login_response = $lwp->post($login_url,\%login_form);
  24. my $login_cookie;
  25. my $sessionhash;
  26. if ($login_response->is_success) {
  27.         my $cookie_jar = HTTP::Cookies->new;
  28.         $cookie_jar->extract_cookies($login_response);
  29.          my $cookie_temp = $cookie_jar->as_string();
  30.          ($sessionhash) = ($cookie_temp =~ /.*?sessionhash=(.*?)\;.*/i);
  31.          ($login_cookie) = ($cookie_temp =~ /Set-Cookie3: (.*)/i);
  32.          chomp($login_cookie);
  33. }
  34. else {
  35.         print "Login Error: ".$login_response->status_line;
  36. }
  37. #print "sessionhash: $sessionhash\n";

  38. ######################## GET FORM URL #########################
  39. my $form_url = "http://bbs.sh.libaclub.com/message.php?action=write";
  40. $lwp->default_header('Cookie'=>$login_cookie);
  41. my $form_response = $lwp->get($form_url);
  42. my $passid;
  43. if ($form_response->is_success) {
  44.         my $cookie_jar = HTTP::Cookies->new;
  45.         $cookie_jar->extract_cookies($form_response);
  46.          my $cookie_temp = $cookie_jar->as_string();
  47.         ($passid) = ($cookie_temp =~ /.*?PHPSESSID=(.*?)\;.*/i);
  48. }
  49. else {
  50.         print "Form url request error: ".$form_response->status_line;
  51. }
  52. #print "passid $passid\n";

  53. ######################## SEND MESSAGE #########################
  54. my $send_url = "http://bbs.sh.libaclub.com/message.php?action=doSend";
  55. my %send_form = (
  56.          "name" => "form1",
  57.          "receiverName" => $recipient,
  58.          "topic" => $topic,
  59.          "content" => $content,
  60. );
  61. my $send_cookie = qq~ sessionhash=$sessionhash; PHPSESSID=$passid~;
  62. #print "Send_Cookie $send_cookie\n";
  63. $lwp->default_header('Cookie'=>$send_cookie);
  64. my $send_response = $lwp->post($send_url,\%send_form);
  65. if ($send_response->is_success) {
  66.         my $html = $send_response->decoded_content;
  67.         if (encode('gbk',$html) =~ /发送成功/) {
  68.                  print "Data send sucessful!";
  69.          }
  70.          else { print "Data send failed!"; }
  71. }
  72. else {
  73.         print "Data send error: ".$send_response->status_line;
  74. }
  75. print "\7";

  76. <STDIN>;
复制代码

论坛徽章:
0
12 [报告]
发表于 2010-09-05 22:17 |只看该作者
本帖最后由 lanparky 于 2010-09-05 22:27 编辑

这是由于提交时HTML::Form自动编码的问题,如果没有指定编码格式,默认是utf-8,如果指定了gbk,接收的地址必须有对应的解码程序才可以正常显示中文.所以修改下模块HTML::Form (先把文件的只读取消),在HTML::Form里找到
  1. eval { require Encode };
  2. $Encode_available = !$@;
复制代码
在后面加上
  1. $Encode_available=0;
复制代码
把HTML:Form自动编码的功能关闭.提交程序代码改为

  1. use WWW::Mechanize;
  2. use Encode;
  3. use LWP::ConnCache;


  4. $url="http://bbs.sh.libaclub.com/message.php?action=write";

  5. my $mech=WWW::Mechanize->new();
  6. $mech->conn_cache(LWP::ConnCache->new);
  7. $mech->agent_alias('Windows IE 6');
  8. $mech->add_header(Referer=>' http://bbs.sh.libaclub.com/message.php');
  9. $mech->add_header("Accept-Charset" =>'GBK;q=0.7,*;q=0.7');
  10. $mech->add_header("Accept-Language"=>'zh-cn;q=0.5');

  11. $mech->add_header(Cookie=>'sessionhash=fa55180844a4152e93b64fc17482b53f; __utma=87665927.1972509085.1283527516.1283616492.1283653233.7; __utmz=87665927.1283527516.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=87665927; mytopictabs=0; navtoptabs=0; PHPSESSID=1c4aafe2bad88da7cb26b89cd514dd42; __utmb=87665927.6.10.1283653233');
  12. $mech->get($url);
  13. my $res = $mech->res;
  14. ##关闭decoded_content会自动解码,把返回的内容按页面原样输出
  15. $html= $res->decoded_content(charset => 'none');
  16. $mech->update_html( $html );
  17. $form=$mech->form_name("form1");  
  18. $mech->field("receiverName","sx98083714");
  19. my $subject="测试题目";
  20. $mech->field("topic",$subject);
  21. my $content="明月几时有,把酒问清天,不知天上宫阙,今夕是何年!";
  22. $mech->field("content",$content);
  23. $mech->submit();
  24. $res = $mech->res;
  25. $html= $res->decoded_content(charset => 'none');
  26. $mech->update_html( $html );
  27. print $mech->dump_all();  
复制代码

论坛徽章:
0
13 [报告]
发表于 2010-09-05 22:29 |只看该作者
特感谢 iamlimeng  、lanparky 两位兄弟的热心相助!!!

感谢之情不知如何言表,刚好快中秋了,祝二位兄弟中秋节:全家团圆,工作顺利!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP