您好,登錄后才能下訂單哦!
這里有一個問題,打開微信公眾平臺首頁,輸入賬號密碼后需要使用管理的微信號掃碼確認一下才能最終成功登錄微信公眾號,這個要怎么解決呢?
我們可以第一次登錄的時候按正常的流程輸入賬號密碼,掃碼登錄,拿到cookies,保存下來以便后面調用這個cookies來驗證登錄;當然cookies是有失效時間的,但是我在測試的時候好像過了3-4個小時還能用,夠做好多事情了。
- 基本思路:1.通過selenium驅動瀏覽器 打開登錄頁面 ,輸入賬號密碼登錄 ,獲取登錄后的cookies,保存cookies以便調用;2.拿到cookies之后 ,去請求首頁 登錄后直接跳轉到個人首頁,打開文章搜索框,找一些需要的信息;3.拿到有用的信息后,構造data數據包 ,模擬post請求, 然后返回數據,拿到數據之后 ,解析出我們需要的數據。
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
from selenium import webdriver
import time
import json
driver = webdriver.Chrome() #需要一個谷歌驅動chromedriver.exe,要支持你當前谷歌瀏覽器的版本
driver.get('https://mp.weixin.qq.com/') #發起get請求打開微信公眾號平臺登錄頁面,然后輸入賬號密碼登錄微信公眾號
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[1]/div/span/input').clear() #定位到賬號輸入框,清除里面的內容
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[1]/div/span/input').send_keys('這里輸入你的賬號') #定位到賬號輸入框,輸入賬號
time.sleep(3) #等待3秒后執行下一步操作,避免因為網絡延遲,瀏覽器來不及加載出輸入框,從而導致以下的操作失敗
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[2]/div/span/input').clear() #定位到密碼輸入框,清除里面的內容
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[1]/div[2]/div/span/input').send_keys('這里輸入你的密碼') #定位到密碼輸入框,輸入密碼
time.sleep(3) #原因和以上相同
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[3]/label').click() #點擊記住密碼
time.sleep(3) #原因和以上相同
driver.find_element_by_xpath('//*[@id="header"]/div[2]/div/div/form/div[4]/a').click() #點擊登錄
time.sleep(15) #15秒內掃碼登錄
cookies = driver.get_cookies() #獲取掃碼登錄成功之后的cookies
print(cookies) #打印出來看看,如果超時了還不掃碼,獲取到的cookies是不完整的,不能用來登錄公眾號,所以第一次必須掃碼登錄以獲取完整的cookies
cookie = {} #定義一個空字典,以便把獲取的cookies以字典的形式寫入
for items in cookies: #把登錄成功后獲取的cookies提取name和value參數寫入空字典cookie
cookie[items.get('name')] = items.get('value')
with open('cookies.txt','w') as file: #新建并打開一個cookies.txt文件
file.write(json.dumps(cookie)) #寫入轉成字符串的字典
driver.close() #關閉瀏覽器
#!/usr/bin/env python
# _*_ coding: utf-8 _*_
import requests
import json
import re #正則模塊
import random #隨機數模塊
import time
#query = 'python'
#讀取之前登錄后保存的cookies
with open('cookies.txt','r') as file:
cookie = file.read()
url = 'https://mp.weixin.qq.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=10&share=1&token=773059916&lang=zh_CN',
'Host': 'mp.weixin.qq.com',
}
cookies = json.loads(cookie) #加載之前獲取的cookies
print(cookies) #可以打印看看,和之前保存的cookies是一樣的
response = requests.get(url, cookies = cookies) #請求https://mp.weixin.qq.com/,傳cookies參數,登錄成功
token = re.findall(r'token=(\d+)',str(response.url))[0] #登錄成功后,這是的url里是包含token的,要把token參數拿出來,方便后面構造data數據包發起post請求
#print(token)
#random.random()返回0到1之間隨機數
#構造data數據包發起post請求
data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'url': 'python',
'begin': '0',
'count': '3',
}
search_url = 'https://mp.weixin.qq.com/cgi-bin/operate_appmsg?sub=check_appmsg_copyright_stat' #按F12在瀏覽器里找post請求的url(搜索文章請求的url)
search_response = requests.post(search_url, cookies=cookies, data=data, headers=headers) #發起post請求,傳cookies、data、headers參數
max_num = search_response.json().get('total') #獲取所有文章的條數
num = int(int(max_num/3)) #每頁顯示3篇文章,要翻total/3頁,不過實際上我搜索了幾個關鍵詞,發現微信公眾號文章搜索的接口最多顯示667頁,其實后面還有頁數,max_num/3的結果大于667沒關系
if __name__ == '__main__':
query = input('請輸入你要搜索的內容:')
begin = 0
while num +1 > 0:
print(begin)
data = {
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1',
'random': random.random(),
'url': query,
'begin': '{}'.format(str(begin)),
'count': '3',
}
search_response = requests.post(search_url, cookies=cookies, data=data, headers=headers)
contentt = search_response.json().get('list') #list里面是我們需要的內容,所以要獲取list
for items in contentt: #具體需要list里面的哪些參數可以自己選擇,這里只獲取title、url、nickname、author
f = open('search.txt',mode='a',) #打開一個txt文檔,把獲取的內容寫進去,mode='a'是追加的方式寫入,不覆蓋
print('文章標題:',items.get('title')) #獲取文章標題
f.write('文章標題:')
f.write(items.get('title'))
f.write("\n")
f.write('文章url:')
f.write(items.get('url'))
f.write("\n")
f.write('公眾號:')
f.write(items.get('nickname'))
f.write("\n")
f.write('作者:')
f.write(items.get('author'))
f.write("\n")
f.write("\n")
print('文章url:',items.get('url')) #獲取文章的url
print('公眾號:',items.get('nickname')) #獲取出自哪個微信公眾號
print('文章作者:',items.get('author')) #獲取文章作者
num -= 1
begin = int(begin)
begin += 3
time.sleep(3)
- 只要有一個微信公眾號就可以實現,可以注冊一個試一試。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。