自動批量關注微信公衆號(非逆向)

有時候會因爲各種原因需要去關注大量的微信公衆號,而關於這方面還沒有找到比較完整的解決方案。主要思路分類微信逆向和鍵鼠控制。本人太菜逆向不來,所以本文采用後者來實現(含完整代碼及思路)。注:需要使用pyautogui這個第三方庫來自動控制鍵盤鼠標。可承接相關業務,wx同csdn的id,或見頭像(在新標籤頁打開圖片)。

由於PC端錄製視頻較麻煩,故放出安卓端演示視頻:

在這裏插入圖片描述
終端輸出
在這裏插入圖片描述

步驟概述

目的是根據大量公衆號的名稱來進行關注這個操縱。目前實現了PC端微信關注的操作,後續視情況放出安卓手機端的自動化步驟。

  1. 基於微信公衆號平臺,根據公衆號名稱得到公衆號的__biz
  2. 基於微信客戶端,根據__biz來點擊關注。

詳細步驟

第一步獲取__biz,網上大部分方法都是基於微信客戶端手動進入公衆號來獲取__biz,又或者根據公衆號發表的文章來獲取。但矛盾的點在於,本身是沒有關注這些公衆號的前提下,要獲取這些是比較麻煩的。就變成了一個先有雞和先有蛋的問題。本文使用微信公衆號平臺來實現,可以很好的避免整這個問題。

在第一步獲取完所有公衆號的__biz之後,根據http://mp.weixin.qq.com/mp/getmasssendmsg?__biz={}#wechat_redirect網上提供的鏈接,將__biz填進去,在微信客戶端打開該鏈接便可進入關注頁面進行關注。所以這部分需要用Python控制鍵鼠。注:在運行時,需要切換至微信來點擊,這裏爲了方便推薦最大化微信操作。

參數說明

  • cookietoken的獲取方式可以見我的另一篇文章 記一次微信公衆號爬蟲的經歷
  • nickname_lst是需要關注公衆號的名稱,可以提前寫入文件來讀取
  • url_location是每次發送鏈接後的大概位置。見下圖紅框標記位置,獲取紅框標記位置內的座標,方便點擊即可。
    圖1
  • img_path是關注按鈕的圖片在本地保存的位置。見下圖紅框標記微信。因爲關注按鈕位置不確定,所以這裏需要用圖片的方式來確定此位置的座標。這裏我的方法是把下圖中紅框範圍的截圖,保存至本地,img_path爲圖片所處位置。
    圖2

詳細代碼:

# coding:  utf-8
# ArticlesUrls.py:微信公衆號獲取__biz
import os

import requests
from requests.cookies import cookielib


class ArticlesUrls(object):
    """
    獲取需要爬取的微信公衆號的推文鏈接
    """

    def __init__(self, username=None, password=None, cookie=None, token=None):
        """
        初始化參數
        Parameters
        ----------
        username: str
            用戶賬號
        password: str
            用戶密碼
        nickname : str or unicode
            需要爬取公衆號名稱
        token : str
            登錄微信公衆號平臺之後獲取的token
        cookie : str
            登錄微信公衆號平臺之後獲取的cookie

        Returns
        -------
            None
        """
        self.s = requests.session()
        self.headers = {
            "User-Agent":
            "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36"
        }
        self.params = {
            "lang": "zh_CN",
            "f": "json",
        }

        # 手動輸入cookie和token登錄
        if (cookie != None) and (token != None):
            self.__verify_str(cookie, "cookie")
            self.__verify_str(token, "token")
            self.headers["Cookie"] = cookie
            self.params["token"] = token
        # 掃描二維碼登錄
        elif (username != None) and (password != None):
            self.__verify_str(username, "username")
            self.__verify_str(password, "password")
            # 暫不支持cookie緩存
            self.__startlogin_official(username, password)
        else:
            print("please check your paramse")
            raise SystemError

    def __verify_str(self, input_string, param_name):
        """
        驗證輸入是否爲字符串
        Parameters
        ----------
        input_string: str
            輸入
        param_name: str
            需要驗證的參數名
        Returns
        ----------
            None
        """
        if not isinstance(input_string, str):
            raise TypeError("{} must be an instance of str".format(param_name))
            
    def official_info(self, nickname, begin=0, count=5):
        """
        獲取公衆號的一些信息
        Parameters
        ----------
        begin: str or int
            起始爬取的頁數
        count: str or int
            每次爬取的數量,1-5

        Returns
        -------
        json:
            公衆號的一些信息
            {
              'alias': 公衆號別名,
              'fakeid': 公衆號唯一id,
              'nickname': 公衆號名稱,
              'round_head_img': 公衆號頭像的url,
              'service_type': 1公衆號性質
            }
        """
        self.__verify_str(nickname, "nickname")
        # 搜索公衆號的url
        search_url = "https://mp.weixin.qq.com/cgi-bin/searchbiz"

        # 增加/更改請求參數
        params = {
            "query": nickname,
            "count": str(count),
            "action": "search_biz",
            "ajax": "1",
            "begin": str(begin)
        }
        self.params.update(params)

        try:
            # 返回與輸入公衆號名稱最接近的公衆號信息
            official = self.s.get(
                search_url, headers=self.headers, params=self.params)
            return official.json()["list"][0]
        except Exception:
            raise Exception(u"公衆號名稱錯誤或cookie、token錯誤,請重新輸入")

# coding: utf-8
import os
from pprint import pprint
from ArticlesUrls import ArticlesUrls

import pyautogui
import time

if __name__ == "__main__":
    # 一般建議第一步和第二步分開處理,這裏爲了方便所以放在一個文件
    # 第一步,模擬登錄微信公衆號平臺,獲取微信公衆號的__biz
    # cookie, token 見微信爬蟲文章獲取
    cookie = yourcookie 
    token = yourtoken
    nickname_lst = nickname_lst  # 需要關注的微信公衆號名稱

    query = "query"
    test = ArticlesUrls(cookie=cookie, token=token)

    follow_url = 'http://mp.weixin.qq.com/mp/getmasssendmsg?__biz={}#wechat_redirect\n'
    follow_url_lst = []
    for nickname in nickname_lst:
        officical_info = test.official_info(nickname)
        biz = officical_info['fakeid']
        follow_url_lst.append(follow_url.format(biz))
        
        
    # 第二步,在微信聊天界面來進行自動化關注。這裏在運行程序後需立即切換至微信聊天界面
    url_location = x, y # 每次發送完鏈接之後,聊天界面中url的大致位置。
    img_path = img_path # “關注”按鈕的圖片位置。

    for url in follow_url_lst:
        # 輸入url併發送
        pyautogui.typewrite(url, 0)
        pyautogui.typewrite(['enter'], 0.25)
        # 點擊需要關注的url
        pyautogui.moveTo(url_location, duration=0.25)
        pyautogui.click(button='left')
        # 等待頁面加載
        time.sleep(1)
        # 在整個屏幕中找到`關注`按鈕的位置
        pos = pyautogui.locateOnScreen(img_path)
        # 如果未找到,可能是已經關注公衆號,屏幕中無關注按鈕;或者是圖片跟實際有明顯差距導致程序找不到
        if pos is not None:
            pyautogui.click(pos.left, pos.top, button='left', duration=0.5)
        # 點擊完成後,等1s響應。再點擊微信其他位置來進行發送下一個url,這個位置需要手動調整
        time.sleep(1)
        pyautogui.click(1800, 1000, button='left', duration=0.5)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章