<pre name="code" class="python"><pre name="code" class="python"> 步骤:1 获取uuid https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_=1453465626377 get参数: _ 1453465626377 appid wx782c26e4c19acffb fun new lang zh_CN redirect_uri https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage 返回: window.QRLogin.code = 200; window.QRLogin.uuid = "Qa59OV8VIQ=="; 步骤:2 获取2维码,传入uuid https://login.weixin.qq.com/qrcode/4cNObDuxNw== 3. tip=1 返回window.code=408;登录二维码已失效,重新获取二维码 tip=0 https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=Qa59OV8VIQ==&tip=1&r=-1766681075&_=1453465626378 get 参数; _ 1453465626378 loginicon true r -1766681075 tip 1 uuid Qa59OV8VIQ== https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=Qa59OV8VIQ==&tip=0&r=-1766735228&_=1453465626380 _ 1453465626380 loginicon true r -1766735228 tip 0 uuid Qa59OV8VIQ== r是随机产生的 没太大意义 响应信息: window.code=200; window.redirect_uri="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARqkZUhYgDfuVx0314feW7aE@qrticket_0&uuid=Qa59OV8VIQ==&lang=zh_CN&scan=1453465660"; 从响应信息里获取: $ticket ticket=ARqkZUhYgDfuVx0314feW7aE@qrticket_0 4.登陆url https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxnewloginpage?ticket=ARqkZUhYgDfuVx0314feW7aE@qrticket_0&uuid=Qa59OV8VIQ==&lang=zh_CN&scan=1453465660&fun=new&version=v2&lang=zh_CN fun new lang zh_CN lang zh_CN scan 1453465660 ticket ARqkZUhYgDfuVx0314feW7aE@qrticket_0 uuid Qa59OV8VIQ== version v2 响应: <error><ret>0</ret><message>OK</message><skey>@crypt_597aeefd_ce02369345ff76b204cc95197559f030</skey ><wxsid>OS0vN26ZvReX17I1</wxsid><wxuin>1284510822</wxuin><pass_ticket>aaZXuDcg6yE6bOqFMBQkc9XcnV54VCX1PkiYRkqvytvjsp9ssy6TkmOt4t2 %2BYoVR</pass_ticket><isgrayscale>1</isgrayscale></error> if ($r =~/\<error.*\<skey\>(.*?)\<\/skey\>\<wxsid\>(.*?)\<\/wxsid\>\<wxuin\>(.*?)\<\/wxuin\>\<pass_ticket\>(.*?)\<\/pass_ticket.*/) 从响应信息里获取: $pass_ticket获取 pass_ticket: 5. 获取初始信息 post 参数: lang zh_CN pass_ticket aaZXuDcg6yE6bOqFMBQkc9XcnV54VCX1PkiYRkqvytvjsp9ssy6TkmOt4t2%2BYoVR r -1766680381 https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1766680381&lang=zh_CN&pass_ticket=aaZXuDcg6yE6bOqFMBQkc9XcnV54VCX1PkiYRkqvytvjsp9ssy6TkmOt4t2%252BYoVR 返回好友和群信息: 一个@打头的是好友 两个@@ 的是群组 返回的json 响应信息: { "BaseResponse": { "Ret": 0, "ErrMsg": "" } , "Count": 11, "ContactList": [{ "Uin": 0, "UserName": "filehelper", "NickName": "文件传输助手", ,{ "Uin": 350786855, "UserName": "@475bb3101c0b2b9287279d81778825e9", "NickName": "", "AttrStatus": 0, "PYInitial": "", "PYQuanPin": "", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "MemberStatus": 0, "DisplayName": "", "KeyWord": "q75" } ,{ "Uin": 165739, "UserName": "@35d6d71ec6733b7d334027a1a7d5421d", "NickName": "", "AttrStatus": 0, "PYInitial": "", "PYQuanPin": "", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "MemberStatus": 0, "DisplayName": "", "KeyWord": "hcs" } 可以看到从https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit ,已经没有任何NickName的信息了 对应于: <error><ret>0</ret><message>OK</message><skey>@crypt_597aeefd_bc0a3d5f638c31ec286cb32b42b77a91</skey ><wxsid>VnHvwmxpAsRNpheK</wxsid><wxuin>1284510822</wxuin><pass_ticket>j7b2VdaVETGS3S2hEfR6ZSYx5xIssTZqFOLCTdomA %2BPqhR8xwYGRl%2FsOAT%2BVRaiU</pass_ticket><isgrayscale>1</isgrayscale></error> https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1771919172&lang=zh_CN&pass_ticket=j7b2VdaVETGS3S2hEfR6ZSYx5xIssTZqFOLCTdomA%252BPqhR8xwYGRl%252FsOAT%252BVRaiU lang zh_CN pass_ticket j7b2VdaVETGS3S2hEfR6ZSYx5xIssTZqFOLCTdomA%2BPqhR8xwYGRl%2FsOAT%2BVRaiU r -1771919172 JSON: BaseRequest Object { Uin="1284510822", Sid="VnHvwmxpAsRNpheK", Skey="@crypt_597aeefd_bc0a3d5f638c31ec286cb32b42b77a91", 更多...} DeviceID "e285907588157171" Sid "VnHvwmxpAsRNpheK" Skey "@crypt_597aeefd_bc0a3d5f638c31ec286cb32b42b77a91" Uin "1284510822" BaseRequest => { Uin => $self->wxuin, Sid => $self->wxsid, Skey => $self->skey, DeviceID => $self->deviceid, } my $res = $ua->post($login_url,{ 'r'=>"-$now", 'lang'=>'zh_CN', 'pass_ticket'=>"$pass_ticket" }, BaseRequest => { Uin => $self->wxuin, Sid => $self->wxsid, Skey => $self->skey, DeviceID => $self->deviceid, }); 这里deviceid是计算出来的 不是服务端返回的 <error><ret>0</ret><message>OK</message><skey>@crypt_597aeefd_85805448c197d4bba1bcbb225626c34a</skey><wxsid>3ZgR+ZS1WztjyupN</wxsid><wxuin>1284510822</wxuin><pass_ticket>K0vjTPEwcSRU73VKC659GOWxJJjFRCtD2IwUcJysY%2FxWEr6RIt7IEVmBSdxu1KvU</pass_ticket><isgrayscale>1</isgrayscale></error>$Skey is @crypt_597aeefd_85805448c197d4bba1bcbb225626c34a $wxsid is 3ZgR+ZS1WztjyupN $wxuin is 1284510822 $pass_ticket is K0vjTPEwcSRU73VKC659GOWxJJjFRCtD2IwUcJysY%2FxWEr6RIt7IEVmBSdxu1KvU '_request' => bless( { '_content' => 'pass_ticket=K0vjTPEwcSRU73VKC659GOWxJJjFRCtD2IwUcJysY%252FxWEr6RIt7IEVmBSdxu1KvU&lang=zh_CN&r=-1453472610', '_uri' => bless( do{\(my $o = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit')}, 'URI::https' ), '_headers' => bless( { 'user-agent' => 'Mozilla/8.0', 'content-type' => 'application/x-www-form-urlencoded', 'baserequest' => { 'DeviceID' => 'e285907588157171', 'Skey' => '@crypt_597aeefd_85805448c197d4bba1bcbb225626c34a', 'Uin' => '1284510822', 'Sid' => '3ZgR+ZS1WztjyupN' } my $post = { BaseRequest => { Uin => $self->wxuin, Sid => $self->wxsid, Skey => $self->skey, DeviceID => $self->deviceid, }, }; use JSON qw(encode_json); $json_string = encode_json($post); $ua->post($url, Referer=>"https://wx.qq.com/?&lang=zh_CN","Content-Type"=>"application/json; charset=UTF-8",Content=>$json_string); sub get_init { #my $response= $browser->post("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit", [ "r" => "-$now","lang" => "zh_CN","pass_ticket"=>"$pass_ticket"]); #多加了 $login_url="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=-1816029078&lang=zh_CN&pass_ticket=$pass_ticket"; my $post = { BaseRequest => { Uin => $wxuin, Sid => $wxsid, Skey => $Skey, DeviceID => $DeviceID, } }; use JSON qw(encode_json); $json_string = encode_json($post); my $req = HTTP::Request->new('POST' => $login_url,[ 'r'=>"-$now", 'lang'=>'zh_CN', 'pass_ticket'=>"$pass_ticket"]); $req->referer("https://wx.qq.com/?&lang=zh_CN"); $req->content_type('application/json; charset=UTF-8');#post请求,如果有发送参数,必须要有这句 $req->content("$json_string");#发送post的参数 my $res = $ua->request($req); print $res->status_line."\n"; print $res->as_string();#获取的是原始内容,包括响应头,响应正文 print $res->content();#获取的是响应正文 print "888888888888888888888\n"; #use Data::Dumper; }; my $res = $ua->post($login_url,{ 'r'=>"-$now", 'lang'=>'zh_CN', 'pass_ticket'=>"$pass_ticket"} , Referer=>"https://wx.qq.com/?&lang=zh_CN", "Content-Type"=>"application/json; charset=UTF-8", Content=>$json_string ); POST https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit Referer: https://wx.qq.com/?&lang=zh_CN User-Agent: Mozilla/8.0 Content-Type: application/json; charset=UTF-8 Lang: zh_CN Pass-Ticket: tr0K58lYox2T8ay49KEOBF9wdGrvf2DtqZkVxJ50ws3IT%2FRQtORRuHIt%2F59F3hke R: -1453477692 {"BaseRequest":{"DeviceID":"e211614876626179","Skey":"@crypt_597aeefd_eb05b28c345325f6ad89372af9077676","Uin":"1284510822","Sid":"n91V1KkG4LJQu0qm"}} post 和 get都一样啊 没什么区别 my $ua = LWP::UserAgent->new; 你不要没发一次http就新建一个$ua 这样的话 cookie没办法继承 你全局 my $ua = LWP::UserAgent->new; 只使用一个ua就行了 这样cookie在能够在多个请求直接自动保持 6. 获取好友接口: get 参数; lang zh_CN pass_ticket iJ4GrCog8KIWlhibOCeICcVJYlPGfCdF2ZjnLBy88Y5oG93679Pku9Wu2RNADbRU r 1453525907497 seq 0 skey @crypt_597aeefd_d84b707081d9db61e639b8aec84c1903 https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=iJ4GrCog8KIWlhibOCeICcVJYlPGfCdF2ZjnLBy88Y5oG93679Pku9Wu2RNADbRU&r=1453525907497&seq=0&skey=@crypt_597aeefd_d84b707081d9db61e639b8aec84c1903 $url="https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=$pass_ticket&seq=0&skey=$skey"; { "BaseResponse": { "Ret": 0, "ErrMsg": "" } , "MemberCount": 243, "MemberList": [{ "Uin": 0, "UserName": "@4ec3bd7d3c2753cbb49ee81da30ceb5db53771670613e888339bfca533df0df9", "NickName": "知道", "HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=0&username=@4ec3bd7d3c2753cbb49ee81da30ceb5db53771670613e888339bfca533df0df9 &skey=@crypt_597aeefd_cf3d5a55576baf6625a9bde69acfa6db", "ContactFlag": 3, "MemberCount": 0, "MemberList": [], "RemarkName": "", "HideInputBarFlag": 0, "Sex": 2, "Signature": "", "VerifyFlag": 0, "OwnerUin": 0, "PYInitial": "ZD", "PYQuanPin": "zhidao", "RemarkPYInitial": "", "RemarkPYQuanPin": "", "StarFriend": 0, "AppAccountFlag": 0, "Statues": 0, "AttrStatus": 185, "Province": "浙江", "City": "杭州", "Alias": "", "SnsFlag": 16, "UniFriend": 0, "DisplayName": "", "ChatRoomId": 0, "KeyWord": "", "EncryChatRoomId": "" } "@4ec3bd7d3c2753cbb49ee81da30ceb5db53771670613e888339bfca533df0df9" 一个@打头的是好友 两个@@ 的是群组 7.获取群信息接口: https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r=1453686440414&lang=zh_CN&pass_ticket=a4M6SjxBvR8c9I66LB3b1MHSKujJAMueHMdhJgTxoStJK4akNvbJ5eGdRFkHxDNc post 参数: pass_ticket 4UD2MBQwgZDQJlLJgn3lWG8gwCchs8yIXiGz7Tj7Bf7HQ7R3og0p0cEF4VjcMP3o r 1453685536235 type ex json: 参数头信息Post响应JSON缓存Cookies 按 key 排序 BaseResponse Object { Ret=0, ErrMsg=""} Ret 0 ErrMsg "" Count 50 ContactList [Object { Uin=0, UserName="@@ca1db30d7ba3d211185cc2...b10d9bee127cda5c9eb4f0f", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...ee127cda5c9eb4f0f&skey=", 更多...}, Object { Uin=0, UserName="@@870445cfcfb4399d19aa9d...6e3d1136b5923de0870aa27", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...36b5923de0870aa27&skey=", 更多...}, Object { Uin=0, UserName="@@1c19f60149606454aef85f...cad7001398105d202a7902f", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...1398105d202a7902f&skey=", 更多...}, 47 更多...] 0 Object { Uin=0, UserName="@@ca1db30d7ba3d211185cc2...b10d9bee127cda5c9eb4f0f", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...ee127cda5c9eb4f0f&skey=", 更多...} 1 Object { Uin=0, UserName="@@870445cfcfb4399d19aa9d...6e3d1136b5923de0870aa27", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...36b5923de0870aa27&skey=", 更多...} 2 Object { Uin=0, UserName="@@1c19f60149606454aef85f...cad7001398105d202a7902f", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...1398105d202a7902f&skey=", 更多...} 3 Object { Uin=0, UserName="@@7577e849f1787abb3ddbd7...44f9924e0616c213bd47b52", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...4e0616c213bd47b52&skey=", 更多...} 4 Object { Uin=0, UserName="@@953ecc8fa1d51da48442ab...241d82bece9e8ee807340e4", NickName="Oracle小筑", 更多...} 5 Object { Uin=0, UserName="@@c4049f3a5ee6564b5eef98...32b1910a280d5c9d1b6e463", NickName="高三(4)班", 更多...} 6 Object { Uin=0, UserName="@@547948cb25c7849450fa7a...af70400b693841797302447", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...0b693841797302447&skey=", 更多...} 7 Object { Uin=0, UserName="@@a033dd42bedf3c048f9e8f...f672697f5160701b17b720f", NickName="Perl", 更多...} 8 Object { Uin=0, UserName="@@e47a7d401fbb9508d4439a...f9000c81d3b96b9af908fb3", NickName="中均一周年庆", 更多...} 9 Object { Uin=0, UserName="@@97ddfde491ab61a3a566b6...0f70de6a5699600bea44f0f", NickName="客服IT问题反馈", 更多...} 10 Object { Uin=0, UserName="@@05b771799b4f88ee275e97...c48dfa7754e56ea8fc6a6a3", NickName="技术改革工作办公室", 更多...} 11 Object { Uin=0, UserName="@@40d1cbea7ec715cd532ac6...c04114121f44c38f361d5e5", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...121f44c38f361d5e5&skey=", 更多...} 12 Object { Uin=0, UserName="@@42e742d1905dc127c2c90f...d3f260c4194f60c8c934728", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...c4194f60c8c934728&skey=", 更多...} 13 Object { Uin=0, UserName="@@796ab64b89195416712440...4039783fca21acb50eb8c4d", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...3fca21acb50eb8c4d&skey=", 更多...} 14 Object { Uin=0, UserName="@@0a30ed2d31b19e5efae1c8...347266cc8b5c8b1c6aa3824", NickName="浙大食堂吃饭群", 更多...} 15 Object { Uin=0, UserName="@@0e02ba2d78a110b8d3e579...ec3a761836c20f97bd24d9a", HeadImgUrl="/cgi-bin/mmwebwx-bin/web...1836c20f97bd24d9a&skey=", 更多...} 16 Object { Uin=0, UserName="@@e758444b4552205c750ebb...ed861dc83829e379a2b7cc6", NickName="龙翔-开发", 更多...} 17 Object { Uin=0, UserName="@@c27bcd9d3f7abc1daf0922...cae4241794a4f7afcbbc6cb", NickName="中均营销IT问题反馈", 更多...} 18 Object { Uin=0, UserName="@@9c44f6658975106772f1a5...8bef43a7fa2559a133299c9", NickName="中均运维", 更多...} sub _get_chatroom{ my $self = shift; my @chatroom_id = @_; my $post = { BaseRequest => { Uin => $self->wxuin, DeviceID => $self->deviceid, Sid => $self->wxsid, Skey => $self->skey, }, Count => @chatroom_id+0, List => [map { {UserName=>$_,ChatRoomId=>""} } @chatroom_id ], }; 这个@chatroom_id 怎么拿到的? 就是你之前 webwxinit webwxgetcontact 这些接口返回的 好友列表里的 这里的@chatrrom_id 是UserName 数组 Username 就是好友的id 或者 群组的id webwxinit 接口返回群信息和好友信息 ,好友信息全,群成员信息不全,部分群信息 { "BaseResponse": { "Ret": 0, "ErrMsg": "" } , "Count": 11, "ContactList": [{ "Uin": 0, "UserName": "filehelper", "NickName": "文件传输助手", "HeadImgUrl": "/cgi-bin/mmwebwx-bin/webwxgeticon?seq=638861246&username=filehelper&skey=@crypt_597aeefd_0b7d529e6a34c4119a682b00981b721d" , init 接口返回全部群ID: "ChatSet": "filehelper,@@e348759078474d582072759ebb4fbbc4a007699c01e59325602fb80846a9b368,@70ceba75137c3b4ec4ab2a856331a1b7,weixin,@@7e8f3573afa6366575359f4db885d07cc55d45dc48a977a09d1c680656176cc3,@21bc87416cbf1531dbdbb7a0bda2fd0a37f7784f4de6a9fc8981dd87198d5343,@@742f906c9926486a4a34a13f1625239b0dfe073801fa08f198330b6a892c42d1,@@97ed98b4bc8f8d44efbcea4ddedfa799e7fff2eb716c2ef838232b73f9cba316,@aa49d31f8c7225ad4c72d954f8ddd4cb,@65e0955491336752ebd7ea9cd200a063,@@f07c66eca4ccd07c28ea7a879941c731bba9b727953d113183a0d47adb5dfe4b,@@693ca144e087271af4bc5041222a6f60566c795f572b9fc511c058f1f62e0342,@54c6c42123cc5d63bba273a0359bed6a,@d1b437d47db62a60853b7132238a4f7c283e5e1334cc1a17d16b8e596ac4ac20,@@cc100ea82521c904a72301fdbeda4fc8b83c6111a34563a7ca3cb75a4a7b7de7,@@85b5788b13925552572b8457e1e004ed0832e462e383f1a3770ee681f89bb9f6,@@d5a86d631aafdd7d70d8a18ecfffd432c71474831ce31dfb8f891c7df4bb1041,@@18fd96f7d7f93975df36c1eeb6418cbc777148eb302455674d66ec2f851f13aa,@@d59cfe358679f0c2147d3a06ae256267df3e72ea672867a125e2710c33165702,", "SKey": "@crypt_597aeefd_e3bb36d8ac68ba0f1cc6057c29923826", webwxgetcontact 返回好友信息,没有群信息 { "BaseResponse": { "Ret": 0, "ErrMsg": "" } , "MemberCount": 243, webwxbatchgetcontact 返回全部群信息 { "BaseResponse": { "Ret": 0, "ErrMsg": "" } , "Count": 13, "ContactList": [{ jrhmpt01:/root/wx# cat a3 | grep '@@' | grep UserName "UserName": "@@d59cfe358679f0c2147d3a06ae256267df3e72ea672867a125e2710c33165702", "UserName": "@@18fd96f7d7f93975df36c1eeb6418cbc777148eb302455674d66ec2f851f13aa", "UserName": "@@d5a86d631aafdd7d70d8a18ecfffd432c71474831ce31dfb8f891c7df4bb1041", "UserName": "@@85b5788b13925552572b8457e1e004ed0832e462e383f1a3770ee681f89bb9f6", "UserName": "@@cc100ea82521c904a72301fdbeda4fc8b83c6111a34563a7ca3cb75a4a7b7de7", "UserName": "@@693ca144e087271af4bc5041222a6f60566c795f572b9fc511c058f1f62e0342", "UserName": "@@f07c66eca4ccd07c28ea7a879941c731bba9b727953d113183a0d47adb5dfe4b", "UserName": "@@97ed98b4bc8f8d44efbcea4ddedfa799e7fff2eb716c2ef838232b73f9cba316", "UserName": "@@742f906c9926486a4a34a13f1625239b0dfe073801fa08f198330b6a892c42d1", "UserName": "@@7e8f3573afa6366575359f4db885d07cc55d45dc48a977a09d1c680656176cc3", "UserName": "@@e348759078474d582072759ebb4fbbc4a007699c01e59325602fb80846a9b368", jrhmpt01:/root/wx# cat a3 | grep '@@' | grep UserName | wc -l 11