搜索
查看: 4415|回复: 12

[win] PC微信收发消息 雏版^_^

  [复制链接]

11

主题

31

帖子

190

积分

一级会员

Rank: 2

积分
190
发表于 2018-4-7 00:28:25 | 显示全部楼层 |阅读模式
本帖最后由 261041951 于 2018-4-7 00:35 编辑

微信收发消息主程序源码
调用别人的dll实现的hook,本人小白,
只做了arr端收发信息代码,plus界面还搞不懂,估计这软件要放段时间的!
有兴趣的朋友拿去二次开发吧~


  1. import win.ui;
  2. /*注册类名{{*/
  3. win.registerClassEx("WeChatBdForm",{        //设置类名为 WeChatBdForm
  4.     hIcon = _HAPPICON;
  5.     hIconSm = _HAPPICON;
  6.     hCursor = ::LoadCursor(null, topointer(0x7F00/*_IDC_ARROW*/) );
  7.     hbrBackground =  topointer(0xF/*_COLOR_3DFACE*/ + 1);
  8. } );/*}}*/
  9. /*DSG{{*/
  10. mainForm = win.form(text="微信助手";right=999;bottom=699;image=$"\include\images\bg.gif";bkBottom=2;bkLeft=83;bkRight=255;bkTop=110;border="none";className="WeChatBdForm")
  11. mainForm.add(
  12. btnNav1={cls="plus";text="会话";left=318;top=15;right=410;bottom=89;background="\res\images\icon_bg.jpg";bkBottom=3;bkLeft=7;bkRight=8;bkTop=2;color=16777215;dl=1;dt=1;foreground="\res\images\m-hh.png";notify=1;paddingBottom=7;paddingLeft=5;paddingRight=5;paddingTop=5;valign="bottom";x=0.5;y=0.20000000298023;z=2};
  13. btnNav2={cls="plus";text="好友";left=412;top=15;right=504;bottom=89;background="\res\images\icon_bg.jpg";bkBottom=3;bkLeft=7;bkRight=8;bkTop=2;color=16777215;dl=1;dt=1;foreground="\res\images\m-hy.png";notify=1;paddingBottom=7;paddingLeft=5;paddingRight=5;paddingTop=5;valign="bottom";x=0.5;y=0.20000000298023;z=1};
  14. custom={cls="custom";left=5;top=93;right=991;bottom=693;bgcolor=16777215;db=1;dl=1;dr=1;dt=1;z=3};
  15. exitLg={cls="static";left=70;top=61;right=127;bottom=80;color=14342874;notify=1;transparent=1;z=5};
  16. name_UI={cls="static";left=70;top=40;right=298;bottom=59;color=16777215;font=LOGFONT(h=-13);transparent=1;z=6};
  17. plus={cls="plus";left=12;top=9;right=32;bottom=29;background="\res\images\logo.png";z=7};
  18. static2={cls="static";text="微信助手v1.0";left=41;top=9;right=132;bottom=28;color=16777215;transparent=1;z=4}
  19. )
  20. /*}}*/

  21. //添加自定义的标题栏、窗口边框、阴影等
  22. import win.ui.simpleWindow;
  23. win.ui.simpleWindow( mainForm );

  24. //创建高级选项卡
  25. import win.ui.tabs;


  26. //至少要添加2个创建好的选项卡作为设计模板
  27. var tabs = win.ui.tabs(
  28.         mainForm.btnNav1,
  29.         mainForm.btnNav2
  30. );

  31. //指定选项卡的外观样式
  32. tabs.skin( {
  33.         background = {
  34.                 hover = "/res/images/m-bg.png";
  35.                 active = "/res/images/m-bg.png";
  36.                 default = "/res/images/main-nav-bg.png";
  37.         }
  38.         checked = { //指定选中状态的样式
  39.                 background = {
  40.                         hover = "/res/images/m-bg.png";
  41.                         active = "/res/images/m-bg.png";
  42.                         default = "/res/images/m-bg.png";  
  43.                 }
  44.         }
  45. } )  

  46. //加载窗口,绑定选项卡
  47. tabs.loadForm(2,"\forms\好友列表.aardio" );
  48. tabs.loadForm(1,"\forms\会话.aardio");
  49. //动态添加更多选项卡,可以直接用第2个参数同时加载并绑定一个窗体

  50. tabs.add({
  51.         text="群发";
  52.         foreground="\res\images\m-qf.png";
  53. })

  54. tabs.add({
  55.         text="设置";
  56.         foreground="\res\images\m-sz.png";
  57. } )

  58. tabs.add({
  59.         text="插件";
  60.         foreground="\res\images\m-cj.png";
  61.         hasCloseButton = true;//允许关闭
  62. },"\forms\插件.aardio")


  63. mainForm.add(/*头像显示控件*/Head_UI={cls="plus";left=16;top=30;right=66;bottom=80;background="res\images\head.png";color=16777215;dl=1;dt=1;foreRepeat="scale";foreground="\res\images\head-bg.png";notify=1;paddingBottom=-3;paddingLeft=-3;paddingRight=-3;paddingTop=-3;valign="bottom";x=0.5;y=0.20000000298023;z=3};)

  64. //默认选中选项卡一
  65. tabs.selIndex = 2;

  66. mainForm.exitLg.oncommand = function(id,event){
  67.         if(wechatHwnd==null){
  68.                 process(fsys.getCurDir()++"\res\WeChat\WeChat.exe")
  69.         }else {
  70.                 process.kill("WeChat.exe")
  71.                 销毁()
  72.         }
  73. }




  74. //动态添加控件
  75. function 会话页面(strName,strMsg){
  76.         tabs.selForm.richedit.text=strMsg //会话窗口显示
  77.         //动态添加更多选项卡
  78.         tbs_hh.add({
  79.                 text=strName;
  80.                 hasCloseButton = true;//允许显示关闭按钮
  81.         })       
  82. }




  83. //////////////////////////////////////////////程序开始//////////////////////////////////////////////

  84. import console;
  85. import process;
  86. import web.json
  87. import gdip.image;
  88. import access;
  89. import inet.whttp;

  90. http=inet.whttp();
  91. //获取WeChat.exe的进程pid
  92. //for processEntry in process.each( "WeChat.exe" )  pid = processEntry.th32ProcessID; //获得WeChat进程的pid



  93. /*操作类函数{{*/
  94. wxHwnd=win.find("WeChatMainWndForPC", )
  95. function sendText(wxid,msg){                                //发送文本
  96.     msg=string.fromto(msg,0,936)       
  97.     sStr=wxid + "||" + msg
  98.         sendCopyData(wxHwnd,sStr,25220)
  99. }

  100. function sendTiRen(gWxid,wxid){                                //发送踢人
  101.         msg=string.fromto(msg,0,936)
  102.     sStr=gWxid + "||" + wxid
  103.         sendCopyData(wxHwnd,sStr,25260)
  104. }

  105. function sendDele(wxid){                                        //删除好友
  106.         msg=string.fromto(msg,0,936)
  107.         sendCopyData(wxHwnd,wxid,25280)
  108. }

  109. //发送函数sendCopyData
  110. sendCopyData = function(hwnd,data,cbData){
  111.         if( type(data) == "table"){
  112.                 data = ..table.tostring(data);
  113.         };
  114.     return ::SendMessageByStruct(hwnd,0x4A/*_WM_COPYDATA*/,cbData, {
  115.         ADDR number = 0;
  116.         INT cbData = #data;
  117.         pointer lpData = data;
  118.     }  )
  119. }
  120. /*}}*/

  121. /*消息处理函数{{*/
  122. function AddLog(MsgType,LogStrOld){
  123.         LogStr=string.fromto(LogStrOld,0,65001)
  124.            nickName,wxType, bzName,wxid,wxNum="","","","",""
  125.     //console.dump("【MsgType】", MsgType)
  126.     //console.dump(LogStr)
  127.         select(MsgType) {
  128.                 case 1 {
  129.                         console.log(LogStr)               
  130.                         strMsg= string.match(LogStr,"消息=(.*?)|")                 //消息内容
  131.                         sendWxid = string.match(LogStr, "发信人wxid=(.*?)|")
  132.                         toWxid = string.match(LogStr,"聊天对象=(.*?)|")
  133.                         sendName = string.match(LogStr,"发信人昵称=(.*)")
  134.                         ltStr=string.left(strMsg,5)
  135.                         if(ltStr!="<msg>" && ltStr!="<?xml"){                        //文本消息
  136.                                 if(string.indexOf(toWxid,"@chatroom")){                //群组
  137.                                         toWxid="群组:"++toWxid
  138.                                 }else {                                                                                //个人
  139.                                         toWxid="个人:"++toWxid
  140.                                 }
  141.                                 会话页面(sendName,strMsg)
  142.                                 console.dump(sendName++",文本消息:",sendWxid,toWxid, strMsg)
  143.                         }else {
  144.                                 if(string.indexOf(LogStr,"<img aeskey=")){        //图片消息
  145.                                         console.dump("图片消息:", strMsg)
  146.                                 }
  147.                         }
  148.                 }
  149.                 case 5 {        //登录二维码
  150.                         if(string.right(LogStr,4)==".png"){
  151.                                 /*
  152.                                 img=gdip.image(LogStr);
  153.                                 mainForm.picturebox.image=img.saveToBuffer()
  154.                                 */
  155.                                 console.dump(LogStr)
  156.                         }
  157.                 }
  158.                 case 7 {                //获取好友列表更新
  159.                         //console.dump(LogStr)
  160.                         for m1,m2,m3,m4 in string.gmatch(LogStr,`auser"\:"(.*?)","name"\:"(.*?)","wxid"\:"(.*?)","bz"\:"(.*?)"\}`) {
  161.                                 wxNum=m1;                        //微信号
  162.                                 nickName=m2;                //昵称
  163.                                 wxid=m3;                        //wxid
  164.                                 bzName=m4                        //备注
  165.                         }
  166.                         if(string.indexOf(wxid,"gh_")){
  167.                                 wxType="公众号"                        //公众号wxid
  168.                         }else {
  169.                                 wxType="好友"                        //好友wxid
  170.                         }
  171.                         LisToMdb(nickName,wxType, bzName,wxid,wxNum)
  172. /*
  173.                         jsStr7=web.json.tryParse(LogStr)        //json解析会有个别昵称导致出错
  174.                         if(jsStr7!=null){
  175.                                 nickName=jsStr7.name                 //昵称
  176.                                 bzName=jsStr7.bz                        //备注
  177.                                 wxid=jsStr7.wxid                        //wxid
  178.                                 wxNum=jsStr7.auser                        //微信号
  179.                                 if(string.indexOf(wxid,"gh_")){
  180.                                         wxType="公众号"                        //公众号wxid
  181.                                 }else {
  182.                                         wxType="好友"                        //好友wxid
  183.                                 }
  184.                                 LisToMdb(nickName,wxType, bzName,wxid,wxNum)       
  185.                         }elseif(jsStr7==null){
  186.                                 win.msgbox(LogStr,7)
  187.                         }
  188. */
  189.                 //console.dump("【MsgType】", MsgType,nickName,wxType, bzName,wxid,wxNum)       
  190.                 }
  191.                 case 9 {                //获取群列表更新
  192.                         for m1,m2,m3,m4 in string.gmatch(LogStr,`wxid"\:"(.*?)","auser"\:"(.*?)".*?bz"\:"(.*?)","name"\:"(.*?)",`) {
  193.                                 wxid=m1;                        //wxid
  194.                                 wxNum=m2;                        //微信号
  195.                                 bzName=m3                        //备注
  196.                                 nickName=m4;                //昵称
  197.                         }
  198.                         if(string.indexOf(wxid,"gh_")){
  199.                                 wxType="公众号"                        //公众号wxid
  200.                         }elseif(string.indexOf(wxid,"@chatroom")){
  201.                                 wxType="群组"                        //好友wxid
  202.                         }else {
  203.                                 wxType="好友"                        //好友wxid
  204.                         }
  205.                         LisToMdb(nickName,wxType, bzName,wxid,wxNum)
  206.                 }
  207.                 case 11 {//获取群成员返回
  208.                         try{
  209.                                 jsStr11=web.json.parse(LogStr)
  210.                                 wxid=jsStr11.wxid
  211.                                 name=jsStr11.name       
  212.                         }
  213.                         console.dump(wxid,name)
  214.                 }
  215.                 case 111 {        //当前登录微信昵称
  216.                         myName=LogStr
  217.                         console.dump(myName)
  218.                         mainForm.name_UI.text=myName
  219.                 }
  220.                 case 222 {        //当前登录微信wxid
  221.                         myWxid=LogStr
  222.                         console.dump(myWxid)
  223.                 }
  224.                 case 333 {        //当前登录微信头像
  225.                         myHead=LogStr
  226.                         console.dump(myHead)
  227.                         mainForm.Head_UI.background=http.get(myHead)
  228.                 }
  229.                 case 444 {        //当前登录微信微信号
  230.                         myWxNum=string.trim(LogStr)
  231.                         if(myWxNum!=null){ //已登录微信,调试时
  232.                                 mainForm.exitLg.text="退出微信"       
  233.                                 if(!wxdb.existsTable(myWxNum) ){
  234.                                         wxdb.exec("CREATE TABLE ["+myWxNum+"] (nickName char(40),wxType char(5), bzName char(40),wxid char(40),wxNum char(40))")
  235.                                 }       
  236.                         }
  237.                         console.dump(myWxNum)
  238.                 }
  239.                 case 555 {
  240.                         console.dump("555:",LogStr)
  241.                 }
  242.                 case 222222 { //微信启动句柄
  243.                         wechatHwnd = tonumber(LogStr)
  244.                         console.dump("微信启动句柄",LogStr)
  245.                 }
  246.                 case 333333  {        //微信二维码
  247.                         console.dump(LogStr)       
  248.                 }
  249.                 else {
  250.                 }
  251.         }
  252. }

  253. function getMsg(){        //获取消息
  254.         import win.subclass;//子类化窗口
  255.         winClass=win.subclass(winHwnd,function (hwnd,message,wParam,lParam) {
  256.                 if(message==0x4A/*WM_COPYDATA*/){
  257.                         LogStr=win.getCopyData(lParam)
  258.                         AddLog(wParam,LogStr)
  259.                 }
  260.         })
  261. }

  262. function LisToMdb(nickName,wxType, bzName,wxid,wxNum){        //好友列表更新到数据库
  263.         if(myWxNum!=null){
  264.                 oldWxid=null        //初始化
  265.                 for(rs in wxdb.each("select * from ["+myWxNum+"] where wxid = '"+wxid+"'"))oldWxid=rs("wxid").value
  266.                 if(oldWxid==null){
  267.                         wxdb.exec( "insert into ["+myWxNum+"] (wxid) values('"+wxid+"')")
  268.                         wxdb.exec("update ["+myWxNum+"] set nickName='"+nickName+"' where wxid='"+wxid+"' ")
  269.                         wxdb.exec("update ["+myWxNum+"] set wxType='"+wxType+"' where wxid='"+wxid+"' ")
  270.                         wxdb.exec("update ["+myWxNum+"] set bzName='"+bzName+"' where wxid='"+wxid+"' ")
  271.                         wxdb.exec("update ["+myWxNum+"] set wxid='"+wxid+"' where wxid='"+wxid+"' ")
  272.                         wxdb.exec("update ["+myWxNum+"] set wxNum='"+wxNum+"' where wxid='"+wxid+"' ")
  273.                 }
  274.         }       
  275. }
  276. /*}}*/



  277. function 初始化(){
  278.     wechatHwnd=null;
  279.         wxdb = access("res/user.mdb")
  280.         mainForm.name_UI.text="请登录微信"
  281.         mainForm.exitLg.text="登录微信"       
  282.         mainForm.show()
  283.         winHwnd=mainForm.hwnd
  284. }
  285. function 销毁(){
  286.     mainForm.name_UI.text="请登录微信"
  287.     mainForm.exitLg.text="登录微信"       
  288.     mainForm.Head_UI.background="res\images\head.png"
  289.         wxdb.close();        //关闭数据库
  290.         winClass.free()        //取消同类化
  291.         wechatHwnd=null
  292. }
  293. mainForm.wndproc = function(hwnd,message,wParam,lParam){
  294.         if(message==0x10/*_WM_CLOSE窗口关闭消息*/){
  295.                 try{ //避免没有初始化,销毁出错
  296.                         销毁()       
  297.                 }
  298.         }
  299. }


  300. 初始化()
  301. getMsg()


  302. //读取数据库好友列表
  303. if(myWxNum!=null){
  304.         for(rs in wxdb.each("select * from ["+myWxNum+"]")){
  305.                 tbWxid=string.trim(rs("wxid").value);
  306.                 for(rs in wxdb.each("select * from ["+myWxNum+"] where wxid = '"+tbWxid+"'"))tbnickName=string.trim(rs("nickName").value);
  307.                 for(rs in wxdb.each("select * from ["+myWxNum+"] where wxid = '"+tbWxid+"'"))tbbzName=string.trim(rs("bzName").value);
  308.                 for(rs in wxdb.each("select * from ["+myWxNum+"] where wxid = '"+tbWxid+"'"))tbwxType=string.trim(rs("wxType").value);
  309.                 select(tbwxType) {
  310.                         case "好友" {
  311.                                 if(tbbzName==null || tbbzName==""){
  312.                                         tabs.selForm.treeview.insertItem( {text="【"+tbnickName+"】                                                                        ["+tbWxid+"]"},hyList );               
  313.                                 }else {
  314.                                         tabs.selForm.treeview.insertItem( {text="【"+tbnickName+"】   "+tbbzName+"                                                                            ["+tbWxid+"]"},hyList );       
  315.                                 }
  316.                         }
  317.                         case "群组" {
  318.                                 tabs.selForm.treeview.insertItem( {text="【"+tbnickName+"】                                                                        ["+tbWxid+"]"},qzList );               
  319.                         }
  320.                         case "公众号" {
  321.                                 tabs.selForm.treeview.insertItem( {text="【"+tbnickName+"】                                                                        ["+tbWxid+"]"},gzhList);               
  322.                         }
  323.                 }
  324.         }
  325. }else {
  326.         win.msgbox("请先登录微信!")
  327. }




  328. mainForm.show()
  329. win.loopMessage();
复制代码


网盘下载:链接: https://pan.baidu.com/s/1D54l2VWnnwnOrNWWdUhNBQ 密码: mfsf
回复

使用道具 举报

0

主题

5

帖子

245

积分

二级会员

Rank: 3Rank: 3

积分
245
发表于 2018-4-7 12:03:06 | 显示全部楼层
非常感谢你的分享!先保存到网盘中,再来慢慢学习!!
边用边学
回复

使用道具 举报

15

主题

39

帖子

253

积分

二级会员

Rank: 3Rank: 3

积分
253
发表于 2018-4-7 18:11:23 来自手机 | 显示全部楼层
牛逼................................................
回复

使用道具 举报

6

主题

100

帖子

716

积分

三级会员

Rank: 4

积分
716
发表于 2018-4-7 19:59:30 | 显示全部楼层
网盘下载的文件,main里面的中文都是乱码。
是什么情况。

                 。
回复

使用道具 举报

12

主题

679

帖子

4008

积分

荣誉会员

子非魚、安知魚之樂

Rank: 8Rank: 8

积分
4008
发表于 2018-4-7 20:33:48 | 显示全部楼层
lvhoo 发表于 2018-4-7 19:59
网盘下载的文件,main里面的中文都是乱码。
是什么情况。

他保存成ANSI了 另存为utf8就行了
回复

使用道具 举报

6

主题

100

帖子

716

积分

三级会员

Rank: 4

积分
716
发表于 2018-4-7 22:06:42 | 显示全部楼层
悄悄的说一下,文件包里有个mdb。
                           。
建议删除。
回复

使用道具 举报

6

主题

100

帖子

716

积分

三级会员

Rank: 4

积分
716
发表于 2018-4-7 22:07:54 | 显示全部楼层
悄悄说一下,文件包里有个mdb。
。。。。建议删除。
。。。。。
回复

使用道具 举报

185

主题

2541

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
13973
发表于 2018-4-8 00:32:53 | 显示全部楼层
改进了一下 aardio,
代码中的那段 win.registerClassEx 可以省略掉了, aardio会自动注册这个类名。
详细说明参考新增范例:aardio范例->Windows窗口应用->创建窗口的隐藏参数
回复

使用道具 举报

15

主题

57

帖子

347

积分

二级会员

Rank: 3Rank: 3

积分
347
发表于 2018-4-17 22:35:11 | 显示全部楼层
你好,我什么我的导入不了好友了 其他可以  发送功能可以
!!
回复

使用道具 举报

4

主题

24

帖子

164

积分

培训班

积分
164
发表于 2018-7-3 17:12:29 | 显示全部楼层
网盘过期了,可否方便私发一下?谢谢
回复

使用道具 举报

9

主题

17

帖子

103

积分

一级会员

Rank: 2

积分
103
发表于 2018-7-5 02:36:48 | 显示全部楼层
获取列表失败:
好友列表
群组列表
公众号

错误行号:#314

RAW CALLBACK ERROR:
错误行号:#314
文件:[string "import win; //必须首先导入w..."]:
不支持此操作: _set table
定义类型:field(table)
名字:'richedit'
类型:null
---------------------------------------------------
调用栈:
        [string "import win; //必须首先导入w..."]:314: in function '会话页面'
        [string "import win; //必须首先导入w..."]:144: in function 'AddLog'
        [string "import win; //必须首先导入w..."]:263: in function 'wndproc'
        D:\aardio\lib\win\subclass.aardio:15: in function <D:\aardio\lib\win\subclass.aardio:11>
        [kernel]: in function 'getMessage'
        D:\aardio\lib\win\_.aardio:778: in function 'loopMessage'
        [string "import win; //必须首先导入w..."]:412: in main chunk


怎么处理。
回复

使用道具 举报

1

主题

11

帖子

86

积分

培训班

积分
86
发表于 2018-9-11 10:46:10 | 显示全部楼层
楼主分享的文件,网盘失效了,哪位朋友可以再重新分享一次吗?谢谢!
回复

使用道具 举报

1

主题

9

帖子

59

积分

一级会员

Rank: 2

积分
59
发表于 2018-9-22 01:26:48 | 显示全部楼层
有朋友可以分享一下吗,网盘失效了
cdall@qq.com
感谢了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

手机版|未经许可严禁引用或转载本站文章|站长邮箱|aardio.com|aardio官方社区 ( 皖ICP备09012014号 )

GMT+8, 2018-10-22 04:36 , Processed in 0.078125 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表