python模仿網(wǎng)頁版微信發(fā)送消息功能
這個(gè)微信版網(wǎng)頁版雖然繁瑣,但是不是很難,全程不帶加密的。有興趣的可以試著玩一玩,如果有興趣的話,可以完善一下,做一些比較有意思的東西。
開發(fā)環(huán)境:Windows10
開發(fā)語言:Python3.6
開發(fā)工具:pycharm
抓包工具:fiddler
抓的包如下:

import requests
import time
import re
from bs4 import BeautifulSoup
import json
import random
from copyheaders import headers_raw_to_dict
DEFAULT_HEADERS={
b'Host': b'wx.qq.com',
b'Connection': b'keep-alive',
b'Cache-Control': b'max-age=0',
b'User-Agent': b'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
b'Upgrade-Insecure-Requests': b'1',
b'Accept': b'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
b'Accept-Language': b'zh-CN,zh;q=0.9',
}
def get_13_time():
return str(int(time.time()*1000))
class WXRobot(object):
def __init__(self):
self.s = requests.session()
self.s.verify = False
self.s.headers = DEFAULT_HEADERS
self.DeviceID='e'+str(random.random())[2:17]
def visit_index(self):
url = 'https://wx.qq.com/'
self.s.get(url)
def visit_jslogin(self):
url='https://login.wx.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=zh_CN&_={}'.format(get_13_time())
r=self.s.get(url)
text=r.text
maths=re.findall(r'window.QRLogin.code = 200; window.QRLogin.uuid = "(.*?)";',text)[0]
uuid=str(maths)
self.uuid=uuid
def visit_vcode(self):
#獲取驗(yàn)證碼
url='https://login.weixin.qq.com/qrcode/{}'.format(self.uuid)
r=self.s.get(url)
with open('qrcode.jpg','wb') as f:
f.write(r.content)
f.flush()
f.close()
print('等待掃描驗(yàn)證碼。。。')
def visit_login(self):
url='https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={}&tip=0&_={}'.format(self.uuid,get_13_time())
r=self.s.get(url)
text=r.text
code=re.findall(r'''window.code=(.*?);''',text)[0]
# print('獲取狀態(tài)碼', code)
if str(code)!='200':
# print('兩秒后重新調(diào)用')
time.sleep(2)
self.visit_login()
elif str(code)=='200':
maths = re.findall(r'''redirect_uri="(.*?)"''', text)[0]
self.redirect_uri=maths
print('redirect_uri獲取完成...',self.redirect_uri)
#得到一些關(guān)鍵字
def visit_newloginpage(self):
r=self.s.get(self.redirect_uri,allow_redirects=False)
text=r.text
bs=BeautifulSoup(text,'lxml')
self.skey = bs.find('skey').text
self.wxsid = bs.find('wxsid').text
self.wxuin = bs.find('wxuin').text
self.pass_ticket = bs.find('pass_ticket').text
self.isgrayscale = bs.find('isgrayscale').text
# print(self.skey,self.wxsid,self.wxuin,self.pass_ticket)
#得到初始化信息
def visit_webwxinit(self):
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?pass_ticket={}'.format(self.pass_ticket)
data={
"BaseRequest":{"Uin":self.wxuin ,"Sid":self.wxsid,"Skey":self.skey,"DeviceID":self.DeviceID}
}
r=self.s.post(url,json=data)
r.encoding='utf-8'
jsontext=r.json()
# =json.loads(text)
print('登錄用戶為:',jsontext["User"]["NickName"])
self.FromUserName=jsontext["User"]["UserName"]
self.group_list=jsontext['ContactList'] #
SyncKey=jsontext["SyncKey"]["List"]
ChatSet=jsontext["ChatSet"]
ChatSetlist=str(ChatSet).split(',')
self.ChatSet =[{"UserName":name ,"EncryChatRoomId":""} for name in ChatSetlist if name.startswith('@')]
def visit_notify(self):
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxstatusnotify?pass_ticket={}'.format(self.pass_ticket)
data={
"BaseRequest": {"Uin": self.wxuin, "Sid": self.wxsid,
"Skey": self.skey,
"DeviceID": self.DeviceID},
"Code": 3,
"FromUserName": self.FromUserName,
"ToUserName": self.FromUserName,
"ClientMsgId": int(get_13_time())
}
r=self.s.post(url=url,json=data)
r.encoding='utf-8'
self.MsgID=r.json()['MsgID']
print(r.json()['MsgID'],'消息id')
#獲取所有好友列表
def getcontact(self):
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?pass_ticket={}&r={}&seq=0&skey=@{}'.format(self.pass_ticket,get_13_time(),self.skey)
r=self.s.get(url)
r.encoding='utf=8'
contactjson=r.json()
# print(contactjson)
self.MemberList=contactjson["MemberList"]
for name in self.MemberList:
print(name['NickName'],name['UserName'])
# 聊天列表
def batchgetcontact(self):
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxbatchgetcontact?type=ex&r={}&pass_ticket={}'.format(get_13_time(),self.pass_ticket)
data={
"BaseRequest": {"Uin":self.wxuin,
"Sid": self.wxsid,
"Skey": self.skey,
"DeviceID": self.DeviceID},
"Count": len(self.ChatSet),
"List": self.ChatSet
}
r=self.s.post(url=url,json=data)
r.encoding='utf-8'
ContactList=r.json()["ContactList"]
for i in ContactList:
print('聊天窗口----',i.get('NickName'))
def get_local(self):
return str(time.time())+str(random.random())[2:9]
def send_msg(self):
ToUserName=input('你要發(fā)送給誰?')
msg = input('請輸入你要發(fā)送的信息內(nèi)容')
url='https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg?pass_ticket={}'.format(self.pass_ticket)
data={
"BaseRequest": {"Uin":self.wxuin,
"Sid": self.wxsid,
"Skey": self.skey,
"DeviceID": self.DeviceID},
"Msg": {"Type": 1,
"Content": msg,
"FromUserName": self.FromUserName,
"ToUserName": ToUserName,
"LocalID": self.get_local(),
"ClientMsgId": self.get_local()
},
"Scene": 0
}
r=self.s.post(url=url,json=data)
json_data=r.json()
if 0 == json_data['BaseResponse']['Ret']:
print('消息發(fā)送成功')
else:
print('消息發(fā)送失敗')
if __name__ == '__main__':
wx=WXRobot()
wx.visit_index()
wx.visit_jslogin()
wx.visit_vcode()
wx.visit_login()
wx.visit_newloginpage()
wx.visit_webwxinit()
wx.visit_notify()
wx.getcontact()
wx.batchgetcontact()
while True:
wx.send_msg()
# wx.x() #心跳包
# time.sleep(50)
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python制作定時(shí)發(fā)送信息腳本的實(shí)現(xiàn)思路
- python實(shí)現(xiàn)企業(yè)微信定時(shí)發(fā)送文本消息的示例代碼
- python向企業(yè)微信發(fā)送文字和圖片消息的示例
- python3.8 微信發(fā)送服務(wù)器監(jiān)控報(bào)警消息代碼實(shí)現(xiàn)
- Python 通過微信控制實(shí)現(xiàn)app定位發(fā)送到個(gè)人服務(wù)器再轉(zhuǎn)發(fā)微信服務(wù)器接收位置信息
- Python3 itchat實(shí)現(xiàn)微信定時(shí)發(fā)送群消息的實(shí)例代碼
- python實(shí)現(xiàn)給微信指定好友定時(shí)發(fā)送消息
- python實(shí)現(xiàn)微信定時(shí)每天和女友發(fā)送消息
- 詳解用python自制微信機(jī)器人,定時(shí)發(fā)送天氣預(yù)報(bào)
- python3操作微信itchat實(shí)現(xiàn)發(fā)送圖片
- 用python發(fā)送微信消息
相關(guān)文章
Python中用于轉(zhuǎn)換字母為小寫的lower()方法使用簡介
這篇文章主要介紹了Python中用于轉(zhuǎn)換字母為小寫的lower()方法使用,是Python學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-05-05
解決Tkinter中button按鈕未按卻主動(dòng)執(zhí)行command函數(shù)的問題
這篇文章主要介紹了解決Tkinter中button按鈕未按卻主動(dòng)執(zhí)行command函數(shù)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
pytorch動(dòng)態(tài)網(wǎng)絡(luò)以及權(quán)重共享實(shí)例
今天小編就為大家分享一篇pytorch動(dòng)態(tài)網(wǎng)絡(luò)以及權(quán)重共享實(shí)例,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01
Python基礎(chǔ)教程之pytest參數(shù)化詳解
參數(shù)化就是把測試過程中的數(shù)據(jù)提取出來,通過參數(shù)傳遞不同的數(shù)據(jù)來驅(qū)動(dòng)用例運(yùn)行,這篇文章主要給大家介紹了關(guān)于Python基礎(chǔ)教程之pytest參數(shù)化的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01
PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出
這篇文章主要為大家介紹了PyTorch深度學(xué)習(xí)LSTM從input輸入到Linear輸出深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
Python網(wǎng)絡(luò)編程之網(wǎng)絡(luò)與通信介紹
這篇文章主要介紹了Python網(wǎng)絡(luò)編程之網(wǎng)絡(luò)與通信介紹,計(jì)算機(jī)網(wǎng)絡(luò)就是分布在不同的地區(qū)的計(jì)算機(jī)與專門的外部設(shè)備通信線路互聯(lián)在一起,2023-08-08
成為一個(gè)功能強(qiáng),規(guī)模大的網(wǎng)絡(luò)系統(tǒng),本期就主要介紹網(wǎng)絡(luò)與通信的相關(guān)知識和原理,需要的朋友可以參考下

