importreimporttimeimportjsonimportrequestsfrom bs4 importBeautifulSoupfrom django.shortcuts importrender, HttpResponse#Create your views here.

#一些全局变量#当前时间戳

CURRENT_TIME =None#验证码

QCODE =None#图片

PICTURE =None#tip

TIP = 1

#LOGININ cookies#all_cookie_dict = {}#保存cookies

LOGIN_COOLIES_DICT ={}

TICKET_COOKIES_DICT={}

TICKET_DICT={}#用户信息

USER_INIT_DATA ={}deflogin(request):'''获取登录二维码

:param request:

:return:'''

globalQCODEglobalCURRENT_TIME

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&_={0}'CURRENT_TIME=str(time.time())

q_code_url=url.format(CURRENT_TIME)

response=requests.get(q_code_url)#打印返回值

#window.QRLogin.code = 200; window.QRLogin.uuid = "4c5VeLH00g==";

#print(response.text)

code = re.findall('uuid = "(.*)";', response.text)[0]

QCODE=code#print(code)

return render(request, 'login.html', {'code': code})deflong_polling(request):'''长轮询,有408、201、200三种状态

:param request:

:return:'''

globalTIPglobalPICTUREprint('polling')#默认返回Ajax状态为408

ret = {'status': 408, 'data': None}

base_login_url= 'https://login.wx.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid={0}&tip={1}&r=970980966&_={1}'login_url=base_login_url.format(QCODE, TIP, CURRENT_TIME)

response=requests.get(login_url)#print(response.text)

#判断

if 'window.code=201' inresponse.text:

TIP=0#图片地址

avatar = re.findall("userAvatar = '(.*)';", response.text)[0]#print(avatar)

ret['data'] =avatar

ret['status'] = 201

#获得个人信息头像使用(index函数中,直接在函数返回值中提取链接获取不到图片)

PICTURE =avatarelif 'window.code=200' inresponse.text:#获取登录时的cookie值,存到全局变量中

LOGIN_COOLIES_DICT.update(response.cookies.get_dict())#提取返回值中的url地址

redirect_uri = re.findall('redirect_uri="(.*)";', response.text)[0]

redirect_uri+= '&fun=new&version=v2'

#获取以后要用到的ticket等数据

response_ticket = requests.get(redirect_uri, cookies=LOGIN_COOLIES_DICT)

TICKET_COOKIES_DICT.update(response_ticket.cookies.get_dict())#print(response_ticket.text)

#soup1 = BeautifulSoup(response_ticket.text, 'lxml')

soup2 = BeautifulSoup(response_ticket.text, 'html.parser')#print(soup1)

#print(soup2)

for tag insoup2.find():

TICKET_DICT[tag.name]=tag.string#print(TICKET_DICT)

ret['status'] = 200

returnHttpResponse(json.dumps(ret))defindex(request):'''获取个人信息、最近联系人、公众号

:param request:

:return:'''

#用户初始化

user_init_url = 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxinit?r=855409185&pass_ticket=%s' % TICKET_DICT['pass_ticket']

form_data={'BaseRequest': {'DeviceID': 'e531777446530354','Sid': TICKET_DICT['wxsid'],'Skey': TICKET_DICT['skey'],'Uin': TICKET_DICT['wxuin']

}

}#带上所有的coolkie

all_cookie_dict ={}

all_cookie_dict.update(LOGIN_COOLIES_DICT)

all_cookie_dict.update(TICKET_COOKIES_DICT)#json= 发送过去会自动带一个请求头,用json解析

response_init = requests.post(user_init_url, json=form_data, cookies=all_cookie_dict)#print(response_init.text)

response_init.encoding = 'utf-8'

#print(response_init.text)

user_init_data =json.loads(response_init.text)

USER_INIT_DATA.update(user_init_data)return render(request, 'index.html', {'data': user_init_data, 'code':PICTURE})defcontact_list(request):'''获取所有联系人列表

:param request:

:return:'''

#print(all_cookie_dict)

#print(TICKET_DICT)

#print(LOGIN_COOLIES_DICT)

#print(TICKET_COOKIES_DICT)

url= ("https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxgetcontact?lang=zh_CN&pass_ticket=%s&r=%s&seq=0&skey=%s" %\

(TICKET_DICT['pass_ticket'], str(time.time()), TICKET_DICT['skey']))#base_url = '{0} {1} {2}'

#url = base_url.format(TICKET_DICT['pass_ticket'], str(time.time()), TICKET_DICT['skey'])

#print(base_url)

all_cookie_dict ={}

all_cookie_dict.update(LOGIN_COOLIES_DICT)

all_cookie_dict.update(TICKET_COOKIES_DICT)

response= requests.get(url, cookies=all_cookie_dict)

response.encoding= 'utf-8'contact_list_dict=json.loads(response.text)#print(contact_list_dict)

return render(request, 'contact_list.html', {'obj': contact_list_dict})#return HttpResponse("ok")

defsend_msg(request):'''发送消息

:param request:

:return:'''

#print(USER_INIT_DATA)

#print(TICKET_DICT)

#print(LOGIN_COOLIES_DICT)

#print(TICKET_COOKIES_DICT)

from_user_id = USER_INIT_DATA['User']['UserName']

to_user_id= request.POST.get('user_id')

msg= request.POST.get('user_msg')

send_url= 'https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsendmsg'form_data={'BaseRequest': {'DeviceID': 'e531777446530354','Sid': TICKET_DICT['wxsid'],'Skey': TICKET_DICT['skey'],'Uin': TICKET_DICT['wxuin']

},'Msg': {"ClientMsgId": str(time.time()),#"Content": msg,

"Content": '%(content)s',"FromUserName": from_user_id,"LocalID": str(time.time()),"ToUserName": to_user_id,"Type": 1},'Scene': 0

}importjson#字符串

form_data_str =json.dumps(form_data)#进行格式化

form_data_str = form_data_str % {'content': msg}#转换成字节

form_data_bytes = bytes(form_data_str, encoding='utf-8')

all_cookie_dict={}

all_cookie_dict.update(LOGIN_COOLIES_DICT)

all_cookie_dict.update(TICKET_COOKIES_DICT)#response = requests.post(send_url, json=form_data, cookies=all_cookie_dict)

response = requests.post(send_url, data=form_data_bytes, cookies=all_cookie_dict, headers={'Content-Type': 'application/json'})print(response.text)return HttpResponse('OK')defget_msg(request):

sync_url= 'https://webpush.wx.qq.com/cgi-bin/mmwebwx-bin/synccheck'sync_data_list=[]for item in USER_INIT_DATA['SyncKey']['List']:

temp= "%s_%s" % (item['Key'], item['Val'])

sync_data_list.append(temp)

sync_data_str= "|".join(sync_data_list)

nid=int(time.time())

sync_dict={"r": nid,"skey": TICKET_DICT['skey'],"sid": TICKET_DICT['wxsid'],"uin": TICKET_DICT['wxuin'],"deviceid": "e531777446530354","synckey": sync_data_str

}

all_cookie={}

all_cookie.update(LOGIN_COOLIES_DICT)

all_cookie.update(TICKET_COOKIES_DICT)

response_sync= requests.get(sync_url, params=sync_dict, cookies=all_cookie)print(response_sync.text)if 'selector:"2"' inresponse_sync.text:

fetch_msg_url= "https://wx.qq.com/cgi-bin/mmwebwx-bin/webwxsync?sid=%s&skey=%s&lang=zh_CN&pass_ticket=%s" %(

TICKET_DICT['wxsid'], TICKET_DICT['skey'], TICKET_DICT['pass_ticket'])

form_data={'BaseRequest': {'DeviceID': 'e531777446530354','Sid': TICKET_DICT['wxsid'],'Skey': TICKET_DICT['skey'],'Uin': TICKET_DICT['wxuin']

},'SyncKey': USER_INIT_DATA['SyncKey'],'rr': str(time.time())

}

response_fetch_msg= requests.post(fetch_msg_url, json=form_data)

response_fetch_msg.encoding= 'utf-8'res_fetch_msg_dict=json.loads(response_fetch_msg.text)

USER_INIT_DATA['SyncKey'] = res_fetch_msg_dict['SyncKey']for item in res_fetch_msg_dict['AddMsgList']:print(item['Content'], ":::::", item['FromUserName'], "---->", item['ToUserName'],)return HttpResponse('ok')

怎样用python模拟微信扫码登录_十一、模拟扫码登录微信(用Django简单的布置了下页面)发送接收消息...相关推荐

  1. 电脑微信扫一扫在哪_怎么进入和管理企业微信的后台?

    如何登陆企业微信管理后台 方式一:在电脑浏览器打开官网,点击页面右上角企业登录,可通过企业微信app的扫一扫或企业微信绑定的微信扫码登陆管理后台. 目前仅超级管理员或分级管理员支持登陆管理后台. 方式 ...

  2. 微信小程序云开发用户身份登录_你必须要掌握的微信小程序云开发

    微信小程序开发已经成为目前最火爆的技能之一,无论是在求职.毕设.兴趣培养等方面都已经成为一项必备技能,而小程序云开发技术的出现更是点燃了整个小程序生态圈. 在2019微信公开课PRO小程序分论坛上,腾 ...

  3. java多端登录_【Java】一个登录功能也能玩出这么多花样?sa-token带你轻松搞定多地登录、单地登录、同端互斥登录...

    需求场景 说起登录,你可能会不屑一顾,还有比这更简单的功能吗? 获取一下用户提交参数 username + password 和数据库中一比对,有记录返回[登录成功],无记录返回[用户名或密码错误] ...

  4. socket用起始码分割_常用条码Code128码及EAN13码的介绍

    在条码打印软件中,设计条码标签时经常用到的码制是Code128码和EAN13码.因为这两种码制比较贴近我们的生活.比如:我们去超市购物,商品上贴的条码标签都是EAN13码,因为EAN13码多用于零售产 ...

  5. 华数机器人码垛_华数工业机器人码垛路径操作教程

    InteRobot2018工业机器人离线编程软件提供工业机器人码垛路径功能的路径规划,以及相应的运动仿真.工业机器人代码的输出功能.在本软件中,所有有关工业机器人码垛路径的功能都是建立在工业机器人码垛 ...

  6. 隐藏windows 登录_如何在Windows 10登录屏幕上隐藏您的个人信息

    隐藏windows 登录 If you log in to Windows with a Microsoft account, the Windows 10 sign in screen shows ...

  7. python爬取微信小程序源代码_【实战】CrawlSpider实现微信小程序社区爬虫

    概述: 在人工智能来临的今天,数据显得格外重要.在互联网的浩瀚大海洋中,隐藏着无穷的数据和信息.因此学习网络爬虫是在今天立足的一项必备技能.本路线专门针对想要从事Python网络爬虫的同学而准备的,并 ...

  8. python下载微信公众号文章_一步步教你打造微信公众号文章爬虫(3)-批量下载

    本文为本专题第3篇,如果你基础不错的话只看这一篇的讲解及源代码应该就能轻松实现批量下载所有文章了,基础稍差的可以先看一下前两篇,只要你有点基础,有点耐心,八成朋友都至少能照葫芦画瓢实现批量下载文章的功 ...

  9. access突然需要登录_早知道早好,微信小程序登录开发需要注意的事项

    最近公司要做一个企业微信的小程序,方便企业内的成员来登录,以便一些公司内的业务,只限于公司内的成员来操作,因为有微信小程序的开发经验,所以先当作微信小程序来开发了! 首先来讲一下这个企业微信小程序与微 ...

最新文章

  1. 需要添加什么头文件_速冻水饺为什么需要食品添加剂?
  2. linux 解决依赖性错误,linux – 由于单模块依赖性,XSP配置失败
  3. mysql数据库表空间最大值_mysql 数据库取最大值
  4. HDOJ 1398 Square Coins
  5. python 颜色_如何使用python中matplotlib库分析图像颜色
  6. 使用ACME部署生成阿里云免费HTTPS证书
  7. NCRE四级网络工程师考题详解----三级索引结构
  8. 计算机等级考试绝对应用,96年4月至210年全国计算机等级考试绝对全收集.docx
  9. android 绑定类名,Android Studio为Class跟Activity等添加注解
  10. 《Linux编程》上机作业 ·005【进程管理与通信】
  11. 儿童机器人编程语言_儿童编程机器人
  12. 机房收费系统个人重构—图(文档)
  13. 在有位图索引的表上进行DML操作与enq: TX - row lock contention等待事件问题分析
  14. 远程访问及控制工具SSH
  15. 一些特殊字符(如:←↑→↓等箭头符号)的Unicode码值
  16. java ai寻路_AI自动寻路
  17. 计算机桌面的图标怎么删除,电脑桌面图标箭头怎么去掉_消除桌面图标小箭头的具体方法-系统城...
  18. 服务器抓不到mrcp信息,MRCP学习笔记-语音识别资源的事件和headers详解
  19. 蒙特卡洛方法 (Monte Carlo Method)(5)
  20. C语言实现简单的ai麻将对局(较大工程,持续更新ing)

热门文章

  1. 方舟服务器如何修改恐龙,方块方舟人物及驯养恐龙属性修改教程 人物属性怎么修改_游侠网...
  2. go where 不等于_go基础之map迭代(四)
  3. Nuke编辑工具包新版 Cara VR 插件发布
  4. 虚拟现实技术的发展和分类
  5. 手表可测血压,耳机支持颈椎保护……这届电子设备越来越“养生”了
  6. 我玩《王者荣耀》、斗地主、打麻将,但我是正经搞AI的北大教授
  7. 看不见的Unicode码让敏感词轻松逃过审核,谷歌IBM都中招
  8. 潘建伟团队最新研究成果登上Nature:首次实现1120公里长距离无中继纠缠量子密钥分发...
  9. 苹果2项最新专利曝光无人车路线:闭门造车、传感器先行,关注驾乘体验
  10. 不用再找换脸教程了,飞桨PaddleGAN给你一键式体验