精华内容
下载资源
问答
  • QQ给附近的人群发消息,需要验证的自动申请为好友 按键精灵源码
    千次阅读
    2017-04-17 13:39:25

    QQ给附近的人群发消息,需要验证的自动申请为好友 按键精灵源码

    先打开QQ查找界面 -找人


    While true
        Hwnd = Plugin.Window.Find(0, "查找")
        If Hwnd = 0 Then 
            MessageBox "没有找到句柄,停止运行"	
            EndScript
        End If
        Call Plugin.Window.Move(Hwnd, 0, 0)
        Call Plugin.Window.Show(Hwnd)
        Call Plugin.Window.Restore(Hwnd)
        Call Plugin.Window.Active(Hwnd)
     //   Call Plugin.Window.Top(Hwnd, 0)
        Delay 200
        MoveTo 174, 485
        Call send()
        MoveTo 386, 483
        Call send()
        MoveTo 621, 485
        Call send()
        MoveTo 843, 480
        Call send()
        MoveTo 170, 557
        Call send()
        MoveTo 391, 563
        Call send()
        MoveTo 616, 559
        Call send()
        MoveTo 837, 561
        Call send()
        //下一个
        MoveTo 894, 499
        Delay 200
        LeftClick 1
        Delay 200
    Wend
    Sub send()
        Delay 200
        Rem CHECK
        LeftClick 1
        Delay 500  
        Hwnd2 = Plugin.Window.Foreground()
        If Hwnd = Hwnd2 Then 
            Delay 2000
            Call Plugin.Msg.Tips("正在查找聊天窗口")
            Goto CHECK
        End If
        title = Plugin.Window.GetText(Hwnd2)
        If title = "查找" Then 
        
        ElseIf Right(title, 8) = "添加好友" Then
        	
        	KeyDown 18, 1
            KeyPress 115, 1
            KeyUp 18, 1
            Delay 200
            
            KeyDown 18, 1
            KeyPress 115, 1
            KeyUp 18, 1
            Delay 200
        Else    
            //   SayString title+",在吗?"
            SayString title+",  免费源码 电影 电视剧 电子书 教程 资料 美女小视频等----文件搜http://wjsou.com/"
            Delay 200
            KeyPress "Enter", 1
            Delay 200
            KeyPress "Enter", 1
            Delay 200
            KeyPress "Enter", 1
            Delay 200
            KeyPress "Enter", 1
            Delay 200
            KeyPress "Enter", 1
            Delay 200
            
        	Hwnd4 = Plugin.Window.Foreground()       
     		title2 = Plugin.Window.GetText(Hwnd4)
     		title=Right(title2, 4)
     		If Right(title2, 4) = "添加好友" Then   	
        	KeyDown 18, 1
            KeyPress 115, 1
            KeyUp 18, 1
            Delay 200
            endif
    
            
            KeyDown 18, 1
            KeyPress 115, 1
            KeyUp 18, 1
            Delay 200
        End If
    End Sub
    



    更多相关内容
  • 一、在本地搭建自己的MQTT服务器 下载EMQTT服务器源文件到本地,下载地址:http://emqtt.com/downloads。选择合适的版本,这里选择下载windows版本。 解压文件,打开命令行,用cd命令进入文件夹,运行emqttd.cmd...

    一、在本地搭建自己的MQTT服务器

    1. 下载EMQTT服务器源文件到本地,下载地址:http://emqtt.com/downloads。选择合适的版本,这里选择下载windows版本。1.png
    2. 解压文件,打开命令行,用cd命令进入文件夹,运行emqttd.cmd文件,启动mqtt服务器。2.png
    3. 开启成功3.png
    4. 打开浏览器,在地址中输入http://localhost:18083/,进入服务器控制页面,默认用户名:admin,密码:public。4.png
    5. 服务器控制页面可以看到需要掌握的服务器地址和端口设置8.png
    6. 增加新的用户名和密码10.png
    7. 在服务器运行期间不要关闭erlang这个窗口,当关闭的时候,服务器也将关闭。11.png
    8. 当启动服务器等待cmd命令运行时觉得缓慢时,可以先按Ctrl+c---N,接着命令就继续执行下去了。12.png

    二、用python发布和订阅消息。

    1. 因为要验证发布和订阅消息,同时运行两个以上的程序,这里使用两个编辑器,一个python自带的idle,一个spyder。创建两个程序,一个命名为send.py,一个receive1.py。一个为发布消息端,一个用来接受订阅消息。
    2. send.py
    import paho.mqtt.publish as publish
    
    import time
    import paho.mqtt.client as mqtt
    HOST = "127.0.0.1"
    PORT = 11883
    
    client = mqtt.Client()
    
    client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
    client.username_pw_set("admin", "public")
    
    client.connect(HOST, PORT, keepalive=60)
    #client_id='2'#要求client_id的值都是唯一的
    
    def on_connect(client, userdata, flags, rc):
        #print("Connected with result code "+str(rc))
    
        client.subscribe("lettuce")
    
    def on_message(client, userdata, msg):
        print(msg.topic+" "+str(msg.payload))
    
    client.on_connect = on_connect
    client.on_message = on_message
    
    client.loop_start()
    
    while(1):
        a=input("输入你要说的话:")
    
        #a=time.asctime(time.localtime(time.time()))
        #a=time.time()
        client.publish("A",a)
        client.publish("B",str(a)+"sdhasjdfafjkfsjfjfjhfhsfdjhh")
    

    3.receive1.py

    import paho.mqtt.client as mqtt
    import time
    
    HOST = "127.0.0.1"
    PORT = 11883
    
    def client_loop():
        client_id = time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
        
       
        client = mqtt.Client(client_id) 
        client.username_pw_set("admin", "public") 
        # ClientId不能重复,所以使用当前时间
         # 必须设置,否则会返回「Connected with result code 4」
        client.on_connect = on_connect
        client.on_message = on_message
        client.connect(HOST, PORT, 60)
        client.loop_forever()
    
    def on_connect(client, userdata, flags, rc):
        print("Connected with result code "+str(rc))
        client.subscribe("A")
    
    def on_message(client, userdata, msg):
        print(msg.topic+" "+msg.payload.decode("utf-8"))
    
    if __name__ == '__main__':
        client_loop()
    
    

    4.只要订阅了A的用户都可以通过服务器收到发送端发送出去的消息。

    888.png

    5.同时在EMQ的服务器端,也可以设置接收订阅和发布消息

    9999999.png

    99999.png

    这是在服务器部分收到消息,同样也可以发出。

    1111.png

    在原有用户的基础上新建一个admin1的用户,在程序中修改发送端的用户和密码

    client.username_pw_set("admin1", "0217")

    重新运行程序,结果一切正常,只要在服务器中储存过的用户连接到服务器之后可以相互通信。

    6.修改程序部分代码,同时发布三个订阅的消息

       client.publish("A","AAAAAAAAAAAAAAAAA")
        client.publish("B","BBBBBBBBBBBBBBBBB")
        client.publish("C","CCCCCCCCCCCCCCCCC")
    

    这样订阅A的用户将只收到AAAAAAAAAAAAA,订阅B的用户将只收到BBBBBBBBBBB,订阅C的用户只收到CCCCCCCCCCCCC消息。

    89974.png

    订阅C的网页停止相应。

    用其接受GPS数据:

    QQ图片20180802104825.png

    展开全文
  • 想查看微信好友撤回的消息?Python帮你搞定

    万次阅读 多人点赞 2019-12-01 13:50:59
    比如你现在正和女朋友用微信聊着天,或者跟自己喜欢的女孩子聊着天,一个不留神,你没注意到对方消息就被她及时撤回了,这时你很好奇,好奇她到底了什么?于是你打算问问她了什么,结果她回一句"没什么"。这...

    要说微信最让人恶心的发明,消息撤回绝对能上榜。

    比如你现在正和女朋友用微信聊着天,或者跟自己喜欢的女孩子聊着天,一个不留神,你没注意到对方发的消息就被她及时撤回了,这时你很好奇,好奇她到底发了什么?于是你打算问问她发了什么,结果她回一句"没什么"。这一回复,让你的好奇心更加强烈了,顿时就感觉消息撤回这一功能就是用来折磨人的。

    那么有没有什么办法能够知道你心爱的她(他)到底撤回了什么呢?不要着急,Python帮你搞定。

    模块介绍

    本篇文章将用Python实现微信的防撤回功能,针对微信操作,Python有一个十分强大的库:itchat。相信没有使用过也有所耳闻吧。官方是这样描述它的:

    Project description
    itchat is a open souce wechat api project for personal account.
    
    It enables you to access your personal wechat account through command line.
    

    翻译过来就是:itchat是一个针对个人帐户的开放式微信api项目,它使您可以通过命令行访问您的个人微信帐户。

    既然是针对微信的开发,我们就离不开这个模块的协助,所以,首先下载该模块:

    pip install itchat
    

    也可以在开发工具Pycharm中直接导入该模块,Pycharm会提示你下载。

    模块初体验

    考虑到应该有些人从来没有使用过该模块,这里对该模块进行一个简单的入门。

    1、如何登陆微信

    既然要操作微信,那么摆在我们面前的问题就是如何登录微信,登录微信非常简单,直接看代码:

    import itchat
    
    itchat.login()
    

    没错,一句代码即可完成登录,运行之后就会弹出一个二维码,扫描之后在手机上授权登录,控制台就会提示是否登录成功。

    Login successfully as Y
    

    这样就说明登录成功了。

    这里需要注意一个问题,就是你会发现每次运行程序都要扫描二维码登录,这样未免太麻烦,有没有办法只扫描一次,以后就自动登录了呢?这当然是可以的。

    import itchat
    
    itchat.auto_login(hotReload=True)
    

    通过函数名也能知道该方法可以实现自动登录,运行程序,扫码登录之后会在项目路径下创建一个itchat.pkl文件,该文件用于存储登录的状态,所以千万不要动它,如果你想换一个微信账号登录,就要先把这个文件删除,因为该文件记录的是上一个微信的状态,删除之后即可登录。

    需要注意:这种方式只能保证你在短时间内无需重复登录,时间长了,还是需要重新扫码登录的。

    进行到这里,有些人可能会发现自己的微信登录不上的情况,据我所知,有些新注册的微信和长期不使用的微信是无法登录网页版微信的,所以这里也会导致登录不上。如果登录不上,那也是没有办法的,下面的内容也就没有意义了。

    2、获取好友列表

    登录上微信之后,我们来用一用itchat模块提供的一些api,比如获取好友列表。

    import itchat
    
    itchat.auto_login(hotReload=True)
    friends = itchat.get_friends()  # 好友列表
    print(friends)
    

    使用get_friends()函数即可获取到好友列表的所有好友信息,包括昵称、备注名、地址、个性签名、性别等等。

    这里我随意地复制了一个好友的个人信息,当然由于隐私问题,这里的部分信息我用"*"号代替了,我们重点是分析一下这些信息的内容。比如最开始的UserName,这是用户的唯一标识,相当于身份证号码,你的每个好友都会有这样一个标识,每个好友之间肯定都是不一样的;然后是NickName,这是好友的昵称;HeadImgUrl是好友的头像地址;RemarkName是你对好友的备注名;Province是省份等等,这里就不一一介绍了,感兴趣的话可以自己去了解一下。

    3、如何发送消息给好友

    如何发送一条消息给指定的好友呢?也非常简单:

    import itchat
    
    itchat.auto_login(hotReload=True)
    itchat.send('Hello World', toUserName='@f9e42aafa1175b38b60a0be4d651a34c77f2528d9b7784e7aaf415090eca8fa6')
    

    此时的UserName就派上用场了,也就是好友的唯一标识,这样,我们就给该标识对应的好友发送了一条消息,所以,我们可以这样改进程序:

    import itchat
    
    itchat.auto_login(hotReload=True)
    friends = itchat.get_friends()
    nickName = '诚信通授权渠道商-老曾'
    for i in friends:
        if '诚信通授权渠道商-老曾' == i['NickName']:
            itchat.send('Hello World', toUserName=i['UserName'])
            break
    
    

    这样,就可以指定发送给任意好友,通过好友的昵称在好友列表中进行检索,找到的话,就获取该好友的UserName,然后发送消息,也可以通过对好友的备注名(RemarkName)查找,大家可以自己尝试。

    4、装饰器

    关于itchat模块还有很多功能,这里就不作过多讲解了,我们只讲关于这次程序的知识点,这里是最后一个内容,装饰器。

    关于装饰器,一时半会还讲不清楚,这里只是简单介绍一下,装饰器的作用就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能。

    例如现在有一个函数fun(),你并不知晓函数的实现原理,你肯定也不能去修改这个函数的代码,而你需要给该函数添加一个输出开始运行时间和结束运行时间的功能,该如何实现呢?这个时候就可以使用装饰器。

    import time
     
    def show_time(fun):
        def inner():
            print(time.time())
            fun()
            print(time.time())
        return inner   
     
    @show_time
    def fun():
        pass
     
    fun()
    
    

    该如何理解这段程序呢?首先@show_time即是使用一个装饰器show_time,此时会将装饰的函数,也就是fun()作为参数传递给装饰器show_time(),我们知道函数作为返回值的话,执行的其实是该函数,所以程序会执行内部函数inner(),此时输出开始运行时间,然后调用fun()函数(原有的功能不能丢),最后输出结束运行时间。这样就通过装饰器实现了一个函数的功能扩展,这也是典型的面向切面编程思想。

    如何获取好友发送的消息

    准备工作做完了,接下来就进入正题了,对于上面的知识点,大家一定要掌握,如果不懂的话,接下来的代码你可能会很懵。

    首先,我们看看该如何获取到好友发送的消息。

    import itchat
    
    itchat.auto_login(hotReload=True)
    
    
    @itchat.msg_register(itchat.content.TEXT)
    def resever_info(msg):
        print(msg)
    
    
    itchat.run() #保持运行
    
    

    itchat模块提供了@itchat.msg_register装饰器来监听消息,比如这里我们自定义了一个resever_info()函数,并用装饰器对消息进行监听,装饰器中传入了itchat.content.TEXT类型,这样监听的就是文本消息,监听到输入之后,装饰器就会将文本消息传入resever_info()的参数中。所以,msg就是监听到的消息内容。

    对于@itchat.msg_register装饰器,它不仅可以监听文本,还可以监听语音、图片、地图、名片、视频等等,为了方便,这里我们导入itchat模块下的content模块中的全部内容,因为这些消息类型都是在该模块下声明的。

    TEXT       = 'Text'
    MAP        = 'Map'
    CARD       = 'Card'
    NOTE       = 'Note'
    SHARING    = 'Sharing'
    PICTURE    = 'Picture'
    RECORDING  = VOICE = 'Recording'
    ATTACHMENT = 'Attachment'
    VIDEO      = 'Video'
    FRIENDS    = 'Friends'
    SYSTEM     = 'System'
    
    INCOME_MSG = [TEXT, MAP, CARD, NOTE, SHARING, PICTURE,
        RECORDING, VOICE, ATTACHMENT, VIDEO, FRIENDS, SYSTEM]
    
    

    还有要注意的地方,最后记得调用itchat的run()函数,保持程序运行,否则程序就直接结束了。

    接下来我们就可以测试一下了,我让我的好友发了一条消息给我,控制台就输出了如下内容:
    在这里插入图片描述

    内容很多,我们只挑重要的看。例如FromUserName,这是发送者的标识;ToUserName,这是接收者的标识;Content,这当然就是文本内容了;CreateTime,这是发送时间;注意最后的两个值:Type,这是消息类型,这里是文本类型Text,然后Text也是文本内容,所以如果想取出好友发送的消息内容的话,用Content和Text都可以。分析过后,取出内容就很简单了:

    import itchat
    import time
    from itchat.content import *  # 导入itchat下的content模块
    
    itchat.auto_login(hotReload=True)
    
    
    @itchat.msg_register(TEXT)
    def resever_info(msg):
        info = msg['Text']  # 取出文本消息
        info_type = msg['Type']  # 取出消息类型
        fromUser = itchat.search_friends(userName=msg['FromUserName'])['NickName']
        ticks = msg['CreateTime']  # 获取信息发送的时间
        time_local = time.localtime(ticks)
        dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local)  # 格式化日期
        print("发送人:" + fromUser + '\n消息类型:' + info_type + '\n发送时间:' + dt + '\n消息内容:' + info)
    
    
    itchat.run()
    
    

    这里用到了time模块,用于格式化日期。

    为了测试方便,我就自己发了一条消息给别人,自己发的消息也是会被监听的,看运行结果:

    发送人:Y
    消息类型:Text
    发送时间:2019-11-28 16:19:13
    消息内容:土鳖
    
    

    再来试试语音和图片能获取到吗?我们回到刚才的代码:

    import itchat
    from itchat.content import *  # 导入itchat下的content模块
    
    itchat.auto_login(hotReload=True)
    
    
    @itchat.msg_register(TEXT)
    def resever_info(msg):
        print(msg)
    
    
    itchat.run()
    
    

    运行之后,发送语音和图片试试,不管怎么发,控制台就是没反应,这是当然的了,我们还没对语音和图片进行监听呢,修改代码:

    import itchat
    from itchat.content import *  # 导入itchat下的content模块
    
    itchat.auto_login(hotReload=True)
    
    
    @itchat.msg_register([TEXT, PICTURE, RECORDING])	#添加了对图片和语音的监听
    def resever_info(msg):
        print(msg)
    
    
    itchat.run()
    
    

    再运行试试,先发送一张图片,再发送一段语音,控制台输出了两段内容,由于篇幅过长,就不贴出来了,无非还是那些信息,发送者,接收者,日期,消息内容等等,这里只需注意图片和语音的内容:

    'Type': 'Picture', 'Text': <function get_download_fn.<locals>.download_fn at 0x0000000003574158>
    'Type': 'Recording', 'Text': <function get_download_fn.<locals>.download_fn at 0x0000000002CFED08>
    
    

    这是一段地址,通过它我们就能够将图片和语音保存起来。

    如何保存好友发送的图片和语音

    下面我们对好友发送的图片和语音进行保存。

    import itchat
    import os
    from itchat.content import *  # 导入itchat下的content模块
    
    itchat.auto_login(hotReload=True)
    temp = 'C:/Users/Administrator/Desktop/CrawlerDemo' + '/' + '撤回的消息'
    # 如果不存在该文件夹,就创建
    if not os.path.exists(temp):
        os.mkdir(temp)
    
    
    @itchat.msg_register([TEXT, PICTURE, RECORDING])
    def resever_info(msg):
        info = msg['Text']  # 取出文本消息
        info_type = msg['Type']  # 取出消息类型
        name = msg['FileName']  # 取出语音(图片)文件名
    
        if info_type == 'Recording':
            # 保存语音
            info(temp + '/' + name)
        elif info_type == 'Picture':
            # 保存图片
            info(temp + '/' + name)
    
    
    itchat.run()
    
    

    运行起来,然后发送一张图片和一条语音,就会在指定目录下生成两个文件:
    在这里插入图片描述

    如何监听好友撤回了消息

    到这里,我们其实已经完成了消息监听,只需要稍加修改即可,但是这个程序是有缺陷的,因为不是所有消息我们都需要去保存的,好友正常发送过来的消息我们直接就能看到,保存下来不是多此一举吗?我们的目的是想知道好友撤回了什么内容,这就涉及到如何监听好友是否撤回了消息这一问题了。其实也非常简单,Content模块为我们提供了NOTE类型,该类型指的是系统消息。

    所以我们可以自定义一个函数用来监听系统消息:

    import itchat
    from itchat.content import *  # 导入itchat下的content模块
    
    
    itchat.auto_login(hotReload=True)
    
    @itchat.msg_register(NOTE)
    def note_info(msg): # 监听系统消息
        print(msg)
    
    
    itchat.run()
    
    

    运行程序,我们撤回一条消息测试一下,输出结果如下:

    ......
    'DisplayName': '', 'ChatRoomId': 0, 'KeyWord': '', 'EncryChatRoomId': '', 'IsOwner': 0}>, 'Type': 'Note', 'Text': '你撤回了一条消息'}
    ......
    
    

    这里截取了部分内容,会发现,撤回消息的文本内容为"你撤回了一条消息",所以要想知道好友是否撤回了消息就非常简单了,判断msg['Text'] == '你撤回了一条消息'即可。

    实现微信防撤回程序

    关于程序每个步骤的代码到这里就分析完了,接下来是对所有代码的汇总,也是整个程序的完整代码:

    import itchat
    from itchat.content import *
    import os
    import time
    import xml.dom.minidom	# 解析xml模块
    
    # 这是保存撤回消息的文件目录(如:图片、语音等),这里已经写死了,大家可以自行修改
    temp = 'C:/Users/Administrator/Desktop/CrawlerDemo' + '/' + '撤回的消息'
    if not os.path.exists(temp):
        os.mkdir(temp)
    
    itchat.auto_login(True)	# 自动登录
    
    dict = {}	# 定义一个字典
    
    
    # 这是一个装饰器,给下面的函数添加新功能
    # 能够捕获好友发送的消息,并传递给函数参数msg
    @itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO])  # 文本,语音,图片
    def resever_info(msg):
        global dict	# 声明全局变量
    
        info = msg['Text']  # 取出消息内容
        msgId = msg['MsgId']  # 取出消息标识
        info_type = msg['Type']  # 取出消息类型
        name = msg['FileName']  # 取出消息文件名
        # 取出消息发送者标识并从好友列表中检索
        fromUser = itchat.search_friends(userName=msg['FromUserName'])['NickName']
        ticks = msg['CreateTime']  # 获取信息发送的时间
        time_local = time.localtime(ticks)
        dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local)  # 格式化日期
        # 将消息标识和消息内容添加到字典
        # 每一条消息的唯一标识作为键,消息的具体信息作为值,也是一个字典
        dict[msgId] = {"info": info, "info_type": info_type, "name": name, "fromUser": fromUser, "dt": dt}
        
    
    @itchat.msg_register(NOTE)  # 监听系统提示
    def note_info(msg):
        # 监听到好友撤回了一条消息
        if '撤回了一条消息' in msg['Text']:
            # 获取系统消息中的Content结点值
            content = msg['Content']
            # Content值为xml,解析xml
            doc = xml.dom.minidom.parseString(content)
            # 取出msgid标签的值
            result = doc.getElementsByTagName("msgid")
            # 该msgId就是撤回的消息标识,通过它可以在字典中找到撤回的消息信息
            msgId = result[0].childNodes[0].nodeValue
            # 从字典中取出对应消息标识的消息类型
            msg_type = dict[msgId]['info_type']
            if msg_type == 'Recording':	# 撤回的消息为语音
                recording_info = dict[msgId]['info']  # 取出消息标识对应的消息内容
                info_name = dict[msgId]['name'] # 取出消息文件名
                fromUser = dict[msgId]['fromUser'] # 取出发送者
                dt = dict[msgId]['dt'] # 取出发送时间
                recording_info(temp + '/' + info_name) # 保存语音
                # 拼接提示消息
                send_msg = '【发送人:】' + fromUser + '\n' + '发送时间:' + dt + '\n' + '撤回了一条语音'
                itchat.send(send_msg, 'filehelper') # 将提示消息发送给文件助手
                # 发送保存的语音
                itchat.send_file(temp + '/' + info_name, 'filehelper')
                del dict[msgId] # 删除字典中对应的消息
                print("保存语音")
            elif msg_type == 'Text':
                text_info = dict[msgId]['info'] # 取出消息标识对应的消息内容
                fromUser = dict[msgId]['fromUser'] # 取出发送者
                dt = dict[msgId]['dt'] # 取出发送时间
                # 拼接提示消息
                send_msg = '【发送人:】' + fromUser + '\n' + '发送时间:' + dt + '\n' + '撤回内容:' + text_info
                # 将提示消息发送给文件助手
                itchat.send(send_msg, 'filehelper')
                del dict[msgId] # 删除字典中对应的消息
                print("保存文本")
            elif msg_type == 'Picture':
                picture_info = dict[msgId]['info'] # 取出消息标识对应的消息内容
                fromUser = dict[msgId]['fromUser'] # 取出发送者
                dt = dict[msgId]['dt'] # 取出发送时间
                info_name = dict[msgId]['name'] # 取出文件名
                picture_info(temp + '/' + info_name) # 保存图片
                # 拼接提示消息
                send_msg = '【发送人:】' + fromUser + '\n' + '发送时间:' + dt + '\n' + '撤回了一张图片'
                itchat.send(send_msg, 'filehelper') # 将图片发送给文件助手
                # 发送保存的语音
                itchat.send_file(temp + '/' + info_name, 'filehelper')
                del dict[msgId] # 删除字典中对应的消息 
                print("保存图片")
    
    
    itchat.run()
    
    

    这样,一个完整的防撤回程序就完成了,如果你对于前面的铺垫能够掌握得很好的话,这个程序对你来说就是小菜一碟,每一句代码的注释我都有写,应该很容易看懂。

    测试程序

    到了激动人心的测试环节,我们来测试一下这个程序是否编写成功了。

    在这里插入图片描述

    我向我的好友发送了三条消息,分别是文本、图片和语音,接着我一一撤回,然后,微信程序就自动向文件传输助手发送了三条消息:
    在这里插入图片描述

    到这里,这个程序就基本完成了。你们在测试的时候也可以叫自己的好友、同学发给你几条消息,然后撤回看看是否能够成功获取到撤回的消息。

    撤回的消息发给别人肯定不行,这样不仅泄露了隐私,也会骚扰到别人,所以这里我选择将撤回的消息发送给文件传输助手,如何将消息发送给文件传输助手也很简单:

    itchat.send(send_msg, toUserName='filehelper')
    
    

    toUserName传入filehelper即可,这样,如果对方撤回了消息,你就可以前往文件传输助手查看对方究竟撤回了什么。

    说说我遇到的一些坑

    这个程序说它难,其实并不难,但我也在编写的过程中遇到了一些坑,一开始我是一条消息一条消息地进行测试,发现程序是正常的,但我连续撤回几条消息,却发现程序出现了Bug。比如我一开始发送了一张图片和一段文字,结果我撤回这两条消息后,得到的却是两段文字。后面我才醒悟过来,是后面的消息覆盖了前面的消息,导致了这个结果,所以在程序中,我定义了一个字典,用于存放好友输入的消息,当监听到消息被撤回时,就通过撤回消息产生的内容中的msgId去和字典中的匹配,匹配到的就是被撤回的消息,然后进行操作即可。

    使用教程

    想使用该程序非常简单,实现微信防撤回程序节点下有程序的完整代码,直接复制粘贴到你自己的python文件,然后运行该文件即可,运行后会产生一个二维码,用手机验证登录即可。
    当然,你也可以选择将该程序打包成可执行的exe文件,这样运行更加方便,打包方式:
    首先打开cmd窗口,下载pyinstaller模块,有的话就不用下载了,下载指令:pip insall pyinstaller,此时我们通过cmd窗口进入到python文件目录,比如我这里
    在这里插入图片描述
    那就进入到该目录下:
    在这里插入图片描述
    然后执行下面这条指令:

    pyinstaller -F wechat.py
    

    后面是需要打包的文件名,执行命令后,就会在文件同级目录下生成一个dist文件夹。
    在这里插入图片描述
    进入该文件夹,就看到我们的.exe文件了,然后双击执行即可。

    最后

    这个程序目前只实现了监听好友的文本、图片、语音类型的消息,对于其它类型的消息,还有群聊的消息都是无法监听到的,感兴趣的话大家可以自己试着实现一下。

    因为自己也是刚刚接触这个模块,文中的程序可能会出现一些意想不到的Bug,但目前我测试来看是没有问题的,如有问题,欢迎评论区留言。

    展开全文
  • 微信测试账号 (2)-消息验证sha1签名

    千次阅读 2019-01-01 16:07:23
    在第1篇中实现了收发微信消息,但是没有做验证,本篇将介绍微信如何使用sha签名,对消息进行认证。其中安全相关的概念,如sha1散列值、签名等,可参考web安全(1)。 验证参数 @GetMapping("/handler") ...

    第1篇中实现了收发微信消息,但是没有做验证,本篇将介绍微信如何使用sha签名,对消息进行认证。其中安全相关的概念,如sha1散列值、签名等,可参考web安全(1)

    验证参数

    	@GetMapping("/handler")
    	public String handler(@RequestParam Map<String,String> map)  {

    回顾 第1篇的get验证方法,在map中会收到微信发过来的4个参数,如下:

    signature:签名,是微信用timestamp、nonce、你的token三个参数进行sha1算法得出的,用于验证消息来源。

    echostr:随机字符串,第1篇演示过,如果signature签名验证成功,返回echostr给微信即可确认。

    timestamp:时间戳(秒),可用于阻止重放攻击,下面会讲。

    nonce:随机数,增加签名的不可预测性。

    验证方法 

    1)将token、timestamp、nonce三个参数进行字典序排序

    2)将三个参数字符串拼接成一个字符串进行sha1加密

    3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    token的作用

    以上3条是微信官网原文,注意:我在web安全(1)中讲过,sha散列值与signature签名是两个不同的东西。消息参数中nonce和timestamp谁都可以生成,如果只对这样的内容进行sha1加密,实际作用只能是消息摘要,无法真正起到签名的作用,黑客可以自己生成nonce和timestamp及其sha1摘要,冒名微信请求我们的服务器。

    而token是我们在微信网站中配置的,加入token以后的sha1摘要就真正起到了签名的作用,因为黑客不知道token,要伪造包含你token的假sha1摘要是相当困难的。除非你把token设的很短或很简单。

    重放攻击

    即使黑客无法自己生成签名,他只要知道了一次正常请求的get参数及签名,就可以反复使用这次传参伪装为真实用户,但他不能擅改时间时间戳,这会导致签名不一致。所以我们可以检查时间戳与当前时间的差值,超过一定时间,就判定是非法请求。

    实现代码

    添加commons-codec依赖,是apache开源的用于一些加解密之类的算法,下面会用它来实现sha1签名。

    <dependency>
        <groupId>commons-codec</groupId>
        <artifactId>commons-codec</artifactId>
    </dependency>

    	@GetMapping("/handler")
    	public String handler(@RequestParam Map<String,String> map)  {
    		//1.将三个参数存入数组
    		String[] array = {token,map.get("timestamp"),map.get("nonce")};
    		//调用数组的排序方法,进行排序
    		Arrays.sort(array);
    		//2.调用spring的转换方法,将数组中已排序过的三个参数拼接成一个字符串
    		String s = StringUtils.arrayToDelimitedString(array, "");
    		//调用commons-codec的sha1加密方法生成签名
    		String signature = DigestUtils.sha1Hex(s);
    		//3.与signature对比,确认消息是否源自微信
    		if(!map.get("signature").equals(signature)){
                            //验证不成功,随便回一个无关的内容
    			return "fail";
    		}
                    //验证成功
    		return map.get("echostr");

    回复消息和success

    以上get验证通过后,每次用post请求业务消息都要先进行以上验证,保证消息真实源自微信,再去做业务处理。但是以后不再有echostr这个参数,而且可以根据业务场景回复特定内容,如第1篇回复hello world。

    如果业务处理后不需要任何回复,可回复“success”,通知微信处理成功,否则微信会提示用户错误信息。

    消息加密

    以上消息都是明文发送的,并没有加密,这是微信默认的设置。假如要对消息进行加密,需要登录账号进行配置,而测试账号并没有相关配置,以后讲正式账号时再详细介绍。

    展开全文
  • 发送邮件时,有可能会遇到以下问题,提示"邮件发送失败:SMTP验证失败":图示:http://www.alisoft.com/cmsresource/cscenter/enet/hotquestion/April2/shanchuy10.jpg解决方法如下:分析问题原因:1、邮箱的登录密码...
  • Win7命令行局域网发消息图解

    万次阅读 2016-05-24 09:57:09
    收到后弹出消息框; 对55机器发送,出现1722错误;可能55没有开机; Win7下已经无messenger服务 二 MSG命令使用详解 突然想起忘了N久没用的命令(net send), 结果在win7 下cmd运行...
  • 企业微信回调验证 二. 企业微信消息交互(重要) 三. 审批状态回调 四. 查询审批状态 注意: 想要成功接收到企业微信回调的信息 ,解密Encrypt,得到明文的消息结构体尤为重要,当然解密后得...
  • 微信下载:1、微信里面貌似有个规则,如果添加同一个好友,连续发送请求数6-8次而堆放一直没有通过验证的时候,系统将不再接受请求,将提示发送失败;如果是被添加进了黑名单,系统直接会提示已被拉入黑名单的。2、你...
  • 阿里云企业邮箱实现邮件验证

    千次阅读 2017-11-13 15:01:59
     //设置收件人地址,并发送消息  transport.sendMessage(message,new Address[]{new InternetAddress(to)});  transport.close();  return true;  } catch (MessagingException e) {  e....
  • 数字签名的全过程签名与验证

    万次阅读 多人点赞 2019-07-31 10:01:08
    数字签名的全过程分两大部分,即... 收方验证签名,即用方公钥解密数字签名,得出数字摘要;收方将原文采用同样哈希算法又得一新的数字摘要,将两个数字摘要进行比较,如果二者匹配,说明经数字签名的电子文件传...
  • 基于Token的身份验证的原理

    万次阅读 多人点赞 2019-05-06 13:41:32
    4.1 传统方式——基于服务器的验证 4.2 基于服务器验证方式暴露的一些问题 4.3 基于Token的验证原理 4.5 Tokens的优势 参考文献 1 发展史 1、很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为...
  • 但是注册完第二天,或是偶尔那么一次登陆需要验证,然后输入自己的手机号码,更换手机号,换数据网络,移动网络。一顿操作下来也还是验证不过去。明明都注册能登陆了,今天就给大家解释解释: google为了保护您账号...
  • 一个工程师团队使用 Slack 进行团队协作比 QQ / ...本文内容创建一个新 Slack 应用创建 Webhooks 应用添加一个 Webhook Url模拟发送一个消息你可以用这个来做什么?参考资料 创建一个新 Slack 应用 如果你已经创建...
  • 将微信订阅好的用户消息发自己的服务器,这样就可以在自己的后台给出回复了,以可以在自己的后台设置客服机器人回复用户,和保存消息数据
  • 遇到这种微信发验证对方收不到的情况的朋友比较多,以及出现“微信无法收到好友添加请求消息”的原因,小刀提出来多种解决方案:解决方法一:微信官方自助查询及解决方法最新微信官方手机端解答“对方无法收到好...
  • 什么是消息队列你了解过么?
  • 我们如果通过在axios响应拦截器中拦截状态码是否为401来提示反馈给用户登录过期消息那么将会弹窗多次,因为即使token过期了也还会发送多次请求,就会有多次401,就会弹窗多次. 这时候我们可以通过过期的时候传递一个值...
  • 展开全部在注册steam帐户遇到提示必须通过人机验证才能创建62616964757a686964616fe4b893e5b19e31333433643062提示时,勾选注册页面中的进行人机验证。在人机身份验证界面中点击需要的图片并按照步骤提示就可以完成...
  • 展开全部微信目前没有查看自己发送的好友验e69da5e887aa3231313335323631343130323136353331333363396464证请求的功能。微信好友验证发送失败原因分析及解决方法汇总很多微信用户遇到了微信好友验证发送失败的情况,...
  • ,另外如果你自己做机器人的话, 记得去设置 -> 隐私 -> 加我为朋友需要验证,把这个给勾选!!!) 关键词回复 @itchat.msg_register([TEXT])   :监测信息的,里面那个列表代表监测的类型, 这里目前只需要对文本...
  • 拒绝做工具小子—编写Python漏洞验证脚本

    千次阅读 多人点赞 2022-02-09 20:59:52
    allow_redirects=False) SSL 证书验证 Requests在请求https网站默认会验证SSL证书,可有些网站并没有证书,可增加verify=False参数忽略证书验证,但此时可能会遇到烦人的InsecureRequestWarning警告消息。...
  • 消息中间件(消息队列)

    千次阅读 2022-02-17 13:52:30
    消息中间件
  • 使用C#实现邮箱验证

    千次阅读 热门讨论 2019-11-18 11:23:28
    前言 昨天晚上和师傅聊天,说到机房重构的时候添加新功能,比如找回密码进行密码验证,扫码登录一类的东西,今天早上开始试着实现一下。... 首先在UI层创建一个验证的窗体(因为开始是实验,做了一个简单...
  • 转载自:https://mp.weixin.qq.com/s/UiGEzXoCn3F66NRz_T9crA 原创: 涛哥 coding涛 6月9日作者对https 解释的入目三分啊(全文太长,太懒不想,-_-b 那就直接拉到底部总结 )前面的文章中,提到了,https是...
  • 总结数字签名实现身份验证

    千次阅读 2019-12-23 18:10:35
    消息篡改和不可抵赖性 TCP协议确保数据能够正确发送到通信双方,加上数据加密算法保证数据安全传输,但是在HTTP应用中通信双方通常不清楚发送方的身份,尤其在客户端服务器通信下,通常一个服务器会处理多个客户端...
  • udp网络程序流程 创建一个基于udp的网络程序流程很简单,具体步骤如下: ...基本格式:版本号:包编号:发送者姓名:发送者机器号:命令字(32表示发送消息):发送信息内容 举例:1:134871264:haogege:admin:32...
  • 个人建议:结构清晰,方便的人,也方便以后自己复习使用,嘿嘿,一举多得何乐不为呢?你说是不是呢! 总的说测试点:消息内容、发送键、用户状态、网络情况、群聊或单聊五个方面。 1.消息内容类型:纯文字、纯...
  • 微信企业号验证/发送/接收消息

    千次阅读 2016-07-01 17:44:49
    1. 内网映射  由于微信企业号回调模式的URL尽支持域名方式访问,估需要注册花生壳,做一个内网穿透(需要花16块钱,购买一个免费版,购买之后,第二天才能添加上域名...企业号 -> 应用中心 -> 新建应用 -> 消息型应用
  • ——因为博主是一个刚刚...一、根据微信公众号开发文档编写的验证方法,写在util包中。1、首先在util包下创建SignUtil类package com.util;import java.security.MessageDigest; import java.security.NoSuchAlgorith
  • 消息验证码-MAC算法总结

    千次阅读 2019-12-02 18:15:26
    MAC就是消息验证码(Message Authentication Code)的简称,是一种与密钥相关的单向散列函数,它能够做到验证消息是来自发送者发送的,正确的没有被篡改过的。具体做法是: 发送方和接收方事先共享同一个密钥。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 119,440
精华内容 47,776
关键字:

如何看自己发的验证消息