有時候會因爲各種原因需要去關注大量的微信公衆號,而關於這方面還沒有找到比較完整的解決方案。主要思路分類微信逆向和鍵鼠控制。本人太菜逆向不來,所以本文采用後者來實現(含完整代碼及思路)。注:需要使用pyautogui
這個第三方庫來自動控制鍵盤鼠標。可承接相關業務,wx同csdn的id,或見頭像(在新標籤頁打開圖片)。
由於PC端錄製視頻較麻煩,故放出安卓端演示視頻:
終端輸出
步驟概述
目的是根據大量公衆號的名稱來進行關注這個操縱。目前實現了PC端微信關注的操作,後續視情況放出安卓手機端的自動化步驟。
- 基於微信公衆號平臺,根據公衆號名稱得到公衆號的
__biz
。 - 基於微信客戶端,根據
__biz
來點擊關注。
詳細步驟
第一步獲取__biz
,網上大部分方法都是基於微信客戶端手動進入公衆號來獲取__biz
,又或者根據公衆號發表的文章來獲取。但矛盾的點在於,本身是沒有關注這些公衆號的前提下,要獲取這些是比較麻煩的。就變成了一個先有雞和先有蛋的問題。本文使用微信公衆號平臺來實現,可以很好的避免整這個問題。
在第一步獲取完所有公衆號的__biz
之後,根據http://mp.weixin.qq.com/mp/getmasssendmsg?__biz={}#wechat_redirect
網上提供的鏈接,將__biz
填進去,在微信客戶端打開該鏈接便可進入關注頁面進行關注。所以這部分需要用Python控制鍵鼠。注:在運行時,需要切換至微信來點擊,這裏爲了方便推薦最大化微信操作。
參數說明
cookie
和token
的獲取方式可以見我的另一篇文章 記一次微信公衆號爬蟲的經歷 。nickname_lst
是需要關注公衆號的名稱,可以提前寫入文件來讀取url_location
是每次發送鏈接後的大概位置。見下圖紅框標記位置,獲取紅框標記位置內的座標,方便點擊即可。
img_path
是關注按鈕的圖片在本地保存的位置。見下圖紅框標記微信。因爲關注
按鈕位置不確定,所以這裏需要用圖片的方式來確定此位置的座標。這裏我的方法是把下圖中紅框範圍的截圖,保存至本地,img_path
爲圖片所處位置。
詳細代碼:
# 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)