微信指数案例

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. 环境变量配置 可参考以下配置

cd ~
vi .bash_profile

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

source .bash_profile

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连接的设备

adb devices
首次需要先连接到模拟器 网易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脚本
mitmdump -s test.py
先手动点击进入微信指数小程序触发生成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的必要参数) 要好很多了
  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: 首先,在使用微信支付的时候,你需要在微信商户平台注册账号并完成相关资质审核,然后就可以获得微信支付所需的商户 ID 和 API 密钥。 然后,你需要在你的 Java 项目中添加微信支付的依赖包。最简单的方法就是使用 Maven,在你的 pom.xml 文件中添加如下依赖: ``` <dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>3.0.9</version> </dependency> ``` 接下来,你需要在你的 Java 代码中实现微信支付的功能。这里给出一个简单的示例,仅供参考: ```java import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; import java.util.HashMap; import java.util.Map; public class WeChatPayment { private static final String APP_ID = "YOUR_APP_ID"; private static final String MCH_ID = "YOUR_MCH_ID"; private static final String API_KEY = "YOUR_API_KEY"; public void doPayment(String outTradeNo, String totalFee, String body, String openid) throws Exception { WXPay wxpay = new WXPay(APP_ID, MCH_ID, API_KEY, WXPayConstants.SignType.MD5); Map<String, String> data = new HashMap<>(); data.put("body", body); data.put("out_trade_no", outTradeNo); data.put("total_fee", totalFee); data.put("openid", openid); data.put("trade_type", "JSAPI"); Map<String, String> resp = wxpay.unifiedOrder(data); String returnCode = resp.get("return_code"); if (!"SUCCESS".equals(returnCode)) { throw new Exception("微信支付统一下单失败:" + resp. ### 回答2: Java可以通过调用微信支付的API实现微信支付功能。下面以一个简单的案例来说明如何使用Java实现微信支付。 1. 首先需要在微信公众平台上注册并创建一个WeChat App,并获取到相应的AppID和AppSecret。 2. 在Java项目中引入相关的微信支付SDK(例如微信支付Java SDK)。 3. 创建一个支付页面,用户在该页面选择商品并提交订单。 4. 用户点击提交订单后,后台服务器接收到订单信息,根据订单信息生成支付参数。 5. 通过AppID和AppSecret调用微信支付的统一下单API,将生成的支付参数和订单信息发送给微信服务器。 6. 微信服务器返回一个prepay_id,将其传递给前端。 7. 前端通过prepay_id调用微信支付的SDK(例如微信小程序JavaScript SDK)发起支付请求。 8. 当用户在微信客户端确认支付后,微信服务器会发送一个支付结果通知到后台服务器。 9. 后台服务器接收到支付结果通知后,根据通知中的支付结果进行相应的处理。 10. 返回支付结果给前端,并展示给用户。 以上就是使用Java实现微信支付的简单案例。当然,实际情况会更加复杂,需要考虑支付安全性、订单管理、退款等问题。在开发过程中,可以参考微信支付开发文档,按照文档指引完成相应的接口调用和参数配置。 ### 回答3: Java实现微信支付有多种方式,下面以一个简单的案例介绍一种实现方式。 首先,我们需要获取微信支付API文档,并注册一个开发者账号。在开发者账号中创建一个应用,并获取到该应用的AppID和AppSecret。 接下来,我们通过Java SDK来进行开发。可以使用官方提供的开源项目-WXPay-来实现微信支付功能。这个项目提供了一些封装好的类和方法,可以简化开发流程。 首先,我们需要导入相关的jar包,包括微信支付的SDK和相关的依赖库。 然后,我们需要进行用户授权和获取access_token的过程。通过向微信服务器发送用户授权请求,获取到用户的openid和access_token。 接下来,我们可以通过openid和access_token来获取用户的支付信息。我们可以调用统一下单接口来获取预支付交易会话标识prepay_id。在调用接口时,我们需要传入一些必要的参数,如AppID、AppSecret、商户号、商户密钥等。 获取prepay_id后,我们需要进行二次签名。我们可以通过调用SDK中的方法来生成二次签名,并将其返回给客户端。 最后,我们可以在客户端调用SDK封装好的支付接口,完成支付流程。客户端需要将支付信息、prepay_id和二次签名等参数传给微信服务器,进行支付操作。 以上就是一个简单的Java实现微信支付的案例。通过调用微信支付的API,我们可以实现在Java项目中集成微信支付功能,并实现支付操作。当然,具体的实现还需要根据实际需求进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别None了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值