python实现QQ机器人(自动登录,获取群消息,发送群消息)

一次偶然的机会我看见了一个群里的一个QQ号总是根据你所发的消息自动回复,当时很感觉到神奇,我知道可以模拟登录网站,没想到竟然也能模拟登录QQ,首先自己想到的就是如何实现模拟登录PC端的QQ, 开始研究了下,发现QQ所发送的包都很难理解。

于是就转到了网页版的QQ,因为在网页里可以捕获所有的请求从而更好的实现模拟功能!

首先第一步就是打开网页版的qq,打开浏览器的开发者模式 这里可以监控所有的请求!

打开登录界面的的时候

会捕捉到一个GET请求

https://ssl.ptlogin2.qq.com/check?uin=10588690&appid=1003903&js_ver=10080&js_type=0&login_sig=YW1ZUUsIU*7FepsR1blgEgcSVWeHCrNVVquTT1LZ0paOxZ-6xHtypEqNGoo-VELQ&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.5928007187321782

其中uin是你的QQ号

返回值是 ptui_checkVC(‘1‘,‘AAr4bdjMeh2hEa77PTuoHhqMTxbRqOp3‘,‘\x00\x00\x00\x00\x00\xa1\x92\x12‘);

其中1表示需要验证码 还有一种返回值 ptui_checkVC(‘0‘,‘!LJV‘,‘\x00\x00\x00\x00\x00\xa1\x92\x12‘) 这种表示是不需要的验证码的

def CheckVerify(self,uin):
        check="https://ssl.ptlogin2.qq.com/check?uin={uin}&appid=1003903&js_ver=10080&js_type=0&login_sig=YPD0P*wu2n8vW1OS2f7VfzvPf3Ku5vnkP4nzImF0GybR02fsKZdjGYB7f9R7nQRn&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&r=0.8179273759014904"
        check=check.replace('{uin}',uin)
        pattern=re.compile("ptui_checkVC\('(.*)','(.*)','(.*)'\);")
        result=self.Get(check)
        checked= pattern.search(result).groups()
        print 'Step1: CheckVerify'
        return checked

获取验证码的方法

def GetVerify(self):
        #url = 'https://ssl.captcha.qq.com/getimage?&uin='+str(self.QQ)+'&aid=1002101&0.45644426648505' + str(random.randint(10,99))
        verify="https://ssl.captcha.qq.com/getimage?aid=1003903&r=0.6472875226754695&uin={QQ}&cap_cd=aSD-ZVcNEcozlZUurhNYhp-MBHf4hjbJ"
        verify=verify.replace('{QQ}',self.QQ)
        path= r"c:/verify/1.jpg"
        #data = urllib.urlretrieve(url,path)
        data = urllib2.urlopen(verify)
        localPic =open(r"c:/verify/1.jpg",'wb')
        localPic.write(data.read())
        localPic.close()
        data.close() 

输入用户名和密码 还有验证码后发送一个GET请求

https://ssl.ptlogin2.qq.com/login?u=10588690&p=AB80CD3B6429D9660878E93058DD78BD&verifycode=TEYX&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=6-14-296574&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10080&login_sig=YW1ZUUsIU*7FepsR1blgEgcSVWeHCrNVVquTT1LZ0paOxZ-6xHtypEqNGoo-VELQ&pt_uistyle=5

这里面u代表账号  p代表密码 密码是经过一定算法加密的 verify是验证码

加密算法如下

    def PasswordSecret(self,password,v1,v2,md5=True):
        if md5==True:
            password=self.PCMd5(password).upper()
        length=len(password)
        temp=''
        for i in range(0,length,2):
            temp+=r'\x'+password[i:i+2]
        return self.PCMd5(self.PCMd5(self.hex2asc(temp)+self.hex2asc(v2)).upper()+v1).upper()

#md5加密函数
    def PCMd5(self,s):
        h=hashlib.md5()
        h.update(s)
        return h.hexdigest()
    #16进制转字符
    def hex2asc(self,s):
        _str="".join(s.split(r'\x'))
        length=len(_str)
        data=''
        for i in range(0,length,2):
            data+=chr(int(_str[i:i+2],16))
        return data

然后是登录部分代码

def Login(self,uin,pwd):
        #获取参数
        cheked=self.CheckVerify(uin)
        #加密密码
        #pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])
        #pwd=self.PasswordSecret(pwd,r'AAST',r'\x00\x00\x00\x00\x00\xa1\x92\x12')
        loginurl="https://ssl.ptlogin2.qq.com/login?u={uin}&p={pwd}&verifycode={verify}&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&daid=164&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=4-30-135914&mibao_css=m_webqq&t=1&g=1&js_type=0&js_ver=10080&login_sig=YPD0P*wu2n8vW1OS2f7VfzvPf3Ku5vnkP4nzImF0GybR02fsKZdjGYB7f9R7nQRn&pt_uistyle=5"
        loginurl=loginurl.replace('{uin}',uin)
        #loginurl=loginurl.replace('{pwd}',pwd)
        #loginurl=loginurl.replace('{verify}',cheked[1])
        #result=Get(loginurl)

        if(cheked[0]=="1"):
            #下载验证码
            self.GetVerify()
            image = Image.open(r"c:/verify/1.jpg")
            image.show()
            code=raw_input("verifycode:").strip()
            loginurl=loginurl.replace('{verify}',code.upper())
            pwd=self.PasswordSecret(pwd,r''+code.upper(),cheked[2])
            #pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])
        else:
            loginurl=loginurl.replace('{verify}',cheked[1])
            pwd=self.PasswordSecret(pwd,cheked[1],cheked[2])

        loginurl=loginurl.replace('{pwd}',pwd)
        result=self.Get(loginurl,'ssl.ptlogin2.qq.com','https://ui.ptlogin2.qq.com/cgi-bin/login?daid=164&target=self&style=5&mibao_css=m_webqq&appid=1003903&enable_qlogin=0&no_verifyimg=1&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html&f_url=loginerroralert&strong_login=1&login_state=10&t=20140514001',None)

        print 'Step2: Login'
        pattern=re.compile("ptuiCB\('(.*)','(.*)','(.*)','(.*)','(.*)',\s'(.*)'\);")
        ret= pattern.search(result).groups()
        #获取必要的cookie 否则第二次登陆会出错
        self.Get(ret[2])
        print 'Step3: GetCookie'
        for c in self.cj:
            if c.name=="ptwebqq":
                self.ptwebqq=c.value
        return result

登录成功后服务器会返回一串json数据

ptuiCB(‘0‘,‘0‘,‘http://ptlogin4.web2.qq.com/check_sig?pttype=1&uin=10588690&service=login&nodirect=0&ptsig=*ZwU0pfTmYP93Fbdt6uSzbbODzlZ0EY9g25PDge5zZU_&s_url=http%3A%2F%2Fweb2.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&f_url=&ptlang=2052&ptredirect=100&aid=1003903&daid=164&j_later=0&low_login_hour=0&regmaster=0&pt_login_type=1&pt_aid=0&pt_aaid=0&pt_light=0‘,‘0‘,‘登录成功!‘,
‘小竹‘);

第一个为0 就表示登录成功了 ,但是这并没有真正的登录成功

上面的返回值中的url是用来获取一个关键cookie的 那就是ptwebqq

然后进行第二次登录,这次才是真正的登录

http://d.web2.qq.com/channel/login2

请求如下

    1. Accept:

      */*

    2. Accept-Encoding:

      gzip,deflate,sdch

    3. Accept-Language:

      zh-CN,zh;q=0.8

    4. Connection:

      keep-alive

    5. Content-Length:

      244

    6. Content-Type:

      application/x-www-form-urlencoded

    7. Cookie:

      o_cookie=455910092; RK=fMEaWEZ0Qc; ts_last=web2.qq.com/; ts_refer=www.baidu.com/; ts_uid=4588821804; pgv_pvid=914251705; pgv_info=ssid=s3525422600&pgvReferrer=; verifysession=h02LeYrtarkWBZeSu_czkiczeNSNlDm7V1mCm-A5qatkwnHaNfgb2z46zH4X7OfyhFT7wH6LfschPvSLhDGXFA4eA**;
      ptui_loginuin=10588690; ptisp=cnc; ptcz=dace9cf90e7064a16ee56c8153273eff9f2de1d2827ba31f6571412ac18c50c3; ptwebqq=b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4; pt2gguin=o0010588690; uin=o0010588690; [email protected]; p_uin=o0010588690; p_skey=cZ5*kS-NOcXlD2Q0AEpJnmExwC2yA0g7jbTygpVFiA8_;
      pt4_token=1SyuJ39Eq6oKEwEhGIizeg__

    8. Host:

      d.web2.qq.com

    9. Origin:

      http://d.web2.qq.com

    10. Referer:

      http://d.web2.qq.com/proxy.html?v=20110331002&callback=1&id=2

    11. User-Agent:

      Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.116 Safari/537.36

  1. Form Dataview sourceview
    URL encoded

    1. r:

      {"status":"online","ptwebqq":"b21232ed3519839063d1c2ead8a8588c385d168097efdf88bc56e1a78be7dfb4","passwd_sig":"","clientid":"7963288","psessionid":null}

    2. clientid:

      7963288

    3. psessionid:

      null

其中的ptwebqq就是刚才我们从cookie中获取的

这部分代码是

def Login2(self):
        try:
            url="http://d.web2.qq.com/channel/login2"
            postdata="r=%7B%22status%22%3A%22online%22%2C%22ptwebqq%22%3A%22{$ptwebqq}%22%2C%22passwd_sig%22%3A%22%22%2C%22clientid%22%3A%22{$clientid}%22%2C%22psessionid%22%3Anull%7D&clientid={$clientid}&psessionid=null"
            postdata=postdata.replace("{$ptwebqq}",self.ptwebqq)
            postdata=postdata.replace("{$clientid}",str(self.clientid))
            print 'Step4: Login2'
            result=self.Post(url,postdata,QQRobot.HOST[0],QQRobot.REFERER[0],QQRobot.ORIGIN[0])
            retjson=json.loads(result)
            retjson=retjson["result"]
            return retjson
        except Exception,e:
                print "Login2 error "+str(e)

明天继续更新。。。。。。

python实现QQ机器人(自动登录,获取群消息,发送群消息)

时间: 2024-08-26 17:20:33

python实现QQ机器人(自动登录,获取群消息,发送群消息)的相关文章

python实现QQ机器人(自己主动登录,获取群消息,发送群消息)

一次偶然的机会我看见了一个群里的一个QQ号总是依据你所发的消息自己主动回复,当时非常感觉到奇妙.我知道能够模拟登录站点,没想到居然也能模拟登录QQ,首先自己想到的就是怎样实现模拟登录PC端的QQ, 開始研究了下,发现QQ所发送的包都非常难理解. 于是就转到了网页版的QQ,由于在网页里能够捕获全部的请求从而更好的实现模拟功能! 首先第一步就是打开网页版的qq.打开浏览器的开发人员模式 这里能够监控全部的请求! 打开登录界面的的时候 会捕捉到一个GET请求 https://ssl.ptlogin2.

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

目录(?)[+] 前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容.        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)        

Python爬虫,京东自动登录,在线抢购商品

京东抢购Python爬虫,自动登录京东网站,查询商品库存,价格,显示购物车详情等.可以指定抢购商品,自动购买下单,然后手动去京东付款就行. chang log2017-03-30 实现二维码扫码登陆 2017-06-27 Golang版JD_AutoBuy 运行环境Python 2.7 第三方库Requests: 简单好用,功能强大的Http请求库 beautifulsoup4: HTML文档格式化及便签选择器 环境配置 1 pip install requests 2 pip install

Python3实现QQ机器人自动爬取百度文库的搜索结果并发送给好友(主要是爬虫)

一.效果如下: 二.运行环境: win10系统:python3:PyCharm 三.QQ机器人用的是qqbot模块 用pip安装命令是: pip install qqbot (前提需要有requests库) 实现自己的机器人:网上好几种写法,很简单,不过有时候环境不同会出现错误,下面是亲测可以运行的: from qqbot import QQBotSlot as qqbotslot, RunBot @qqbotslot def onQQMessage(bot, contact, member,

python paramiko模块SSH自动登录linux系统进行操作

1). Linux系统首先要开启SSH服务:service ssh status 如果没安装的话,则要:apt-get install openssh-server service ssh restart 2). pip install paramiko example 1: import paramikossh = paramiko.SSHClient()ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())ssh.connect('

python 实现v2ex的自动登录并签到

之前有了实现模拟登陆coursera的经验,我们可以模仿着来模拟登陆V2EX,因为这个网站的登陆不需要验证码,所以先从这个网站下手. 先打开登陆页面,按F12,用错误的用户名和密码登陆一次. 关键的就是form_data中提交发送的数据.连续试了几次发现用户名和密码是自动生成的会变的每次,所以我们需要先获取用户名和密码. 这里我们就用到BeautifulSoup来提取我们需要的数据.这里的once值每次也是随机生成的 成功登陆后,我们可以获取签到奖励和余额. 运行结果: 完整代码:https:/

python webdriver 显示等待-自动登录126邮箱,添加联系人

脚本内容:#encoding=utf-8#author-夏晓旭from selenium import webdriverimport timefrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.common.by import Byfrom selenium.common.exceptions import TimeoutException, NoSuchElementExceptioni

Python 使用selenium实现自动登录博客园

需要做的准备: 本文章是使用Chrome,所以需要Chormedriver.exe,具体的下载过程可以百度查到 Selenium是一种自动化测试工具,能模拟浏览器的行为,所以今天我就模拟一下浏览器登陆博客园的行为. 首先,分析问题,登陆博客园需要做些什么: 1.打开浏览器 2.输入博客园主页的网址 3.点击登陆按钮,等待页面跳转 4.输入账号密码,点击登陆 知道了步骤,接下来我们用代码来实现它:from selenium import webdriverimport time#创建登陆类 fro

使用Python创建自定义机器人向群组人员发送消息

创建机器人 打开需要创建机器人的群组,点击 群组机器 人的图标 点击 + 号键创建机器人 点击 自定义 创建自定义机器人 点击 添加 设置机器人头像,机器人名称,机器人属组,点击下一步 复制API(webhook),点击完成 编写Python脚本 注意:修改脚本内requrl的值为机器人的webhook地址 脚本使用说明: 使用方法:脚本后面跟要发送的消息 at所有人将 isAtAll 的值改为True at指定人在 atMobiles 列表定义被at人的手机,列表形式 requrl的值为机器人