python逆向微信指数爬取实现步骤
作者:别None了 发布时间:2022-03-31 03:36:48
微信指数爬取
Appium + mitmproxy + 网易mumu安卓模拟器实现微信指数小程序爬取
通过appium实现将指令传输给手机进行相关的操作,mitmproxy运行Python脚本过滤出相关的请求,安卓模拟器取代真机使项目可以更好的落地。
1.MAC系统Appium的环境搭建
1. homebrew的安装
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
2. 通过brew安装node
brew install node
检查node是否安装成功
node -v
3. 安装npm
sudo bash
sudo curl -L https://npmjs.org/install.sh | sh
检查npm是否安装完成
npm -v
4. 安装android-sdk-macosx
链接: android-sdk-macosx.
下载完成因sdk缺少对应的platform-tools和build-tools 执行命令在弹出窗口进行勾选下载platform-tools和build-tools
5. 安装jdk
去官网下载:下载地址为直接下载dmg去安装
链接:JDK
6. 环境变量配置
可参考以下配置
JAVA_HOME=/Library/java/JavaVirtualMachines/jdk1.8.0_201.jdk/Contents/Home
CLASSPAHT=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/bin:$PATH:
export JAVA_HOME
export CLASSPATH
export PATH
export ANDROID_HOME=/Users/admin/Desktop/android-sdk-macosx
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
7. 安装appium-doctor
检查已有的环境是否都已成功
npm install -g appium-doctor
安装完成appium-doctor 在终端输入appium-doctor命令自动检查appium所依赖的包是否有缺失
8. 安装appium命令行版
npm install -g appium
appium -v 查看版本号
9. 安装mitmproxy
(抓包,中间人代理工具、支持SSL)
brew install mitmproxy
具体用法自行研究 本文只是简单的使用
10.安装网易mumu安卓模拟器
官网直接下载 有Mac版的
2.微信指数小程序爬取
1.启动appium 在终端输入
appium
2.启动网易mumu安卓模拟器并安装微信
3. 查看adb连接的设备
首次需要先连接到模拟器 网易mumu端口号为7555 终端输入
adb connect 127.0.0.1:7555
4. 模拟器安装mitmproxy证书
将该证书打开在钥匙串中找到修改全部信任
然后在模拟器中安装 打开模拟器的设置—安全—从SD卡安装
打开内部存储空间—MuMu共享文件夹—将信任的证书拖进去即可
5.通过抓包发现微信指数小程序生成search_key的接口
编写Python脚本过滤出该请求并将该请求的响应内容(search_key)写入Mongo库
import json
import time
import sys
from pymongo import MongoClient
def response(flow):
client = MongoClient("xx.xx.xx.xx",27017)
db = client["Spider"]
url = "https://search.weixin.qq.com/cgi-bin/searchweb/weapplogin"
if flow.request.url.startswith(url):
text = flow.response.text
data = json.loads(text)
search_key = data.get("data").get("search_key")
with open("./search_key.txt",'w+') as f:
f.write(search_key)
'''
search_key 博主是入库然后scrapy爬虫从库中读search_key进行请求 具体怎么用自己按情况即可
'''
使用mitmdump -s xxx.py 执行Python脚本
先手动点击进入微信指数小程序触发生成search_key的接口 此时mitmproxy运行python程序按照代码对该请求进行过滤并将响应中的search_key取出写入到本地文件
到了这一步大家应该已经知道微信指数小程序的爬取方式了 在这里说下生成search_key接口的触发规则:首次进入微信指数小程序 2.三十分钟search_key失效
6.编写appium模拟点击微信进入微信指数小程序触发search_key指令代码
import time
from appium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from pymongo import MongoClient
PLATFORM='Android'
deviceName='emulator-5554'
# app_package和app_activity可以通过adb shell进行获取
app_package='com.tencent.mm'
app_activity='.ui.LauncherUI'
driver_server='http://127.0.0.1:4723/wd/hub'
class Moments():
def __init__(self):
self.desired_caps={
'platformName':PLATFORM,
'deviceName':deviceName,
'appPackage':app_package,
'appActivity':app_activity,
'noReset': "True",
}
self.driver=webdriver.Remote(driver_server,self.desired_caps)
self.wait=WebDriverWait(self.driver,300)
def login(self):
# 允许获取xx
yunxu1 = self.wait.until(EC.presence_of_element_located((By.ID,'com.android.packageinstaller:id/permission_allow_button')))
yunxu1.click()
time.sleep(5)
# 允许获取xxx
yunxu2 = self.wait.until(EC.presence_of_element_located((By.ID,'com.android.packageinstaller:id/permission_allow_button')))
yunxu2.click()
time.sleep(5)
# 登陆按钮
login = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/d75')))
login.click()
time.sleep(3)
# 手机号
phone = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/hz')))
phone.send_keys("xxxxxx")
time.sleep(3)
# 下一步
nextButton = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/alr')))
nextButton.click()
time.sleep(2)
# 密码
passButton = self.wait.until(EC.presence_of_element_located((By.ID,"com.tencent.mm:id/hz")))
passButton.send_keys("xxxxx")
time.sleep(2)
# 登陆
login2 = self.wait.until(EC.presence_of_element_located((By.ID,'com.tencent.mm:id/alr')))
login2.click()
time.sleep(6)
# 不允许获取通讯录
notButton = self.wait.until(EC.presence_of_element_located((By.ID,"com.tencent.mm:id/an2")))
notButton.click()
time.sleep(5)
def test(self):
'''
登陆之后 依次点击发现 小程序 微信指数 触发接口
'''
time.sleep(10)
self.driver.tap([(428,1214),(471,1251)],100)
time.sleep(5)
# 发现页小程序的坐标
self.driver.tap([(85,787),(148,816)],100)
time.sleep(5)
self.driver.tap([(114,237),(206,269)],100)
time.sleep(20)
self.driver.tap([(644,42),(708,85)],100)
def main(self):
# 首次登陆
self.login()
self.test()
M=Moments()
M.main()
郑重声明:首次登陆以后的每次操作只需要执行test方法点击到发现—小程序—微信指数即可,可以通过noReset:True设置每次不重新安装app,所以不必每次都登陆账号导致增加不必要的操作
通过uiautomatorviewer获取appium页面元素进行定位
总结:
通过appium将模拟点击的指令操控模拟器进行点击进入微信指数的小程序触发search_key接口的生成,然后通过mitmdump -s xx.py程序进行过滤出相应请求将响应中的search_key进行持久化 爬取数据的时候还是使用scrapy (直接使用模拟器爬取不是好的方法)。方案可能不是最好的但是比直接破解微信登录接口、js_code(生成search_key的必要参数) 要好很多了
来源:https://coderl.blog.csdn.net/article/details/87944020
猜你喜欢
- 内容摘要:ASP开发人员为了在他们的设计项目中获得更好的性能和可扩展性而不断努力。幸运地是,有许多书籍和站点在这方面提供了很好的建议。但是这
- 本文实例讲述了PHP简单实现正则匹配省市区的方法。分享给大家供大家参考,具体如下:省市区正则匹配preg_match('/(.*?(
- 本文实例讲述了Python数据结构与算法之图的广度优先与深度优先搜索算法。分享给大家供大家参考,具体如下:根据 * 的伪代码实现:广度优先
- 1、修改MD5算法重的4个常数,这是最捷径的作法,其特点是加密后的数据和加密前非常类似,但是不会被破解 2、多次加密,对MD5加密过的数据进
- 数学函数 1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取
- 阅读上一篇:javascript面向对象编程(二) [Interface,Class.implement 接口及实现]接口规定了一些方法,如
- 在程序中,经常需要将⼀组(通常是同为某个类型的)数据元素作为整体 管理和使⽤,需要创建这种元素组,⽤变量记录它们,传进传出函数等。 ⼀组数据
- 今天发现了一个显示ORACLE语法的好网站。内容太多,就不一一摘录了,记在这里,也方便自己查找。http://ss64.com/ora/ 目
- 对于任何一个开发项目来说最大的错误可能就是没有计划。最近,有些人认为开始前无需计划,一个优秀的开发者需要的是随机应变。我敢肯定这样的做法最后
- 为了提高Asp程序的性能,人们常常将经常使用的数据缓存在 Application,但是你修改了数据库后怎么让application更新呢,本
- 设计师不等于美工设计无所不在,但大多数企业不知道如何使用它。现代设计进入中国大概是二十多年的时间,而在国外,尤其在美国在欧洲,大概有一百年的
- 初次安装完PyCharm后,新建项目时,遇到了No Python interpreter selected的问题。意思是说没有找到Pytho
- asp之家注:作为一个学习asp的爱好者,相信一定接触过session,我们经常使用session来作为会员登录的验证,当然也可以使用COO
- 经过一轮的项目封闭开发,页面制作的动手能力提高了不少,用AW的话说就是被复杂的东西虐过以后很多问题都变得容易了,的确很有道理。我个人觉得技术
- redux-saga在学习它之前先了解es6生成器生成器关键字:yield next()定义函数需要在函数名前急+*号function *t
- 选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:存放到数据列中的数据类型。数据值
- Sequence Typessequence类型有六种:strings, byte sequences (bytes objects), b
- 【问】使用FCKeditor添加文章时,在文章最后多了逗号。【答】此情况发生在asp环境中。在asp里对于 提交的表单信息中如果有相同nam
- 今天小编给大家详细的讲解一下Scrapy爬虫框架,希望对大家的学习有帮助。1、Scrapy爬虫框架Scrapy是一个使用Python编程语言
- 前言tkinter:GUI桌面应用开发模块,写软件界面你还可以打包成exe软件, 哪怕你没有python环境, 一样可以用虽然不一定要有界面