亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

querylist采集微信公眾號文章

querylist采集微信公眾號文章

querylist采集微信公眾號文章信息介紹-樂(lè )題庫

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2021-08-01 03:04 ? 來(lái)自相關(guān)話(huà)題

  querylist采集微信公眾號文章信息介紹-樂(lè )題庫
  querylist采集微信公眾號文章信息。
  1、首先制作一個(gè)自定義菜單,
  2、在文章列表頁(yè)標簽里選擇“標題”,右鍵,選擇新建一個(gè)a標簽。圖2在a標簽里輸入公眾號文章標題。
  圖3然后要一點(diǎn)技巧:微信號:mfganju
  2、然后點(diǎn)這里的“標題”。然后在新建a標簽中選擇“標題1”的填空。圖4然后文章列表頁(yè)的時(shí)候,一個(gè)新標簽就點(diǎn)進(jìn)去了。
  3、點(diǎn)擊自定義菜單中的“添加微信好友”。圖5然后就是視頻播放列表界面,選擇“添加群聊”,點(diǎn)擊+號,視頻列表界面會(huì )出現你選擇的圖片。圖6點(diǎn)擊“添加”一直拉到最后。圖7最后,發(fā)送出去,就完成了。
  我也碰到一樣的問(wèn)題,當前po主已找到解決方案,在uc瀏覽器中解決,不需要自己做插件了,pc瀏覽器操作即可1。打開(kāi)微信公眾號后臺(/);2。在設置那里選擇獲取媒體信息3。在獲取媒體信息界面進(jìn)行下一步下一步最后點(diǎn)擊【獲取群發(fā)消息】、【發(fā)送到朋友圈】全部搞定4。獲取到鏈接鏈接里有個(gè)數字,復制出來(lái),粘貼到querylist里;圖片中間有個(gè)【/】,選擇剛才復制的那串數字發(fā)送到手機上即可(請配合開(kāi)發(fā)工具使用)。
  點(diǎn)擊添加群發(fā)消息中的群發(fā)號碼,然后對已加入的群發(fā)送信息(圖中a標簽),就可以看到標簽里面的文章了。點(diǎn)擊添加群發(fā)消息,文章就會(huì )出現在手機上了,再發(fā)送至朋友圈即可。 查看全部

  querylist采集微信公眾號文章信息介紹-樂(lè )題庫
  querylist采集微信公眾號文章信息。
  1、首先制作一個(gè)自定義菜單,
  2、在文章列表頁(yè)標簽里選擇“標題”,右鍵,選擇新建一個(gè)a標簽。圖2在a標簽里輸入公眾號文章標題。
  圖3然后要一點(diǎn)技巧:微信號:mfganju
  2、然后點(diǎn)這里的“標題”。然后在新建a標簽中選擇“標題1”的填空。圖4然后文章列表頁(yè)的時(shí)候,一個(gè)新標簽就點(diǎn)進(jìn)去了。
  3、點(diǎn)擊自定義菜單中的“添加微信好友”。圖5然后就是視頻播放列表界面,選擇“添加群聊”,點(diǎn)擊+號,視頻列表界面會(huì )出現你選擇的圖片。圖6點(diǎn)擊“添加”一直拉到最后。圖7最后,發(fā)送出去,就完成了。
  我也碰到一樣的問(wèn)題,當前po主已找到解決方案,在uc瀏覽器中解決,不需要自己做插件了,pc瀏覽器操作即可1。打開(kāi)微信公眾號后臺(/);2。在設置那里選擇獲取媒體信息3。在獲取媒體信息界面進(jìn)行下一步下一步最后點(diǎn)擊【獲取群發(fā)消息】、【發(fā)送到朋友圈】全部搞定4。獲取到鏈接鏈接里有個(gè)數字,復制出來(lái),粘貼到querylist里;圖片中間有個(gè)【/】,選擇剛才復制的那串數字發(fā)送到手機上即可(請配合開(kāi)發(fā)工具使用)。
  點(diǎn)擊添加群發(fā)消息中的群發(fā)號碼,然后對已加入的群發(fā)送信息(圖中a標簽),就可以看到標簽里面的文章了。點(diǎn)擊添加群發(fā)消息,文章就會(huì )出現在手機上了,再發(fā)送至朋友圈即可。

【早起簽到】CSS樣式表(2):0成果展示

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 81 次瀏覽 ? 2021-08-01 00:36 ? 來(lái)自相關(guān)話(huà)題

  【早起簽到】CSS樣式表(2):0成果展示
  0 結果顯示
  這篇文章比較長(cháng)。為了減少讀者的時(shí)間,先把這個(gè)項目的結果展示出來(lái),讓讀者可以快速確認這個(gè)文章是否就是他們要找的文章。
  這里需要說(shuō)明一下,項目中的前端頁(yè)面配色圖是指網(wǎng)上發(fā)布的CSS樣式表。
  有關(guān)項目的詳細信息,請稍后查看。
  0.1 登錄主頁(yè):
  用戶(hù)點(diǎn)擊公眾號菜單【提前登錄】后,會(huì )實(shí)現微信自動(dòng)登錄,進(jìn)入登錄主頁(yè)面。
  
  主頁(yè)顯示如下:
  
  左圖:缺席簽到時(shí)間。中圖:簽到頁(yè)面。右圖:簽到完成后顯示排名頁(yè)面。
  主頁(yè)面分為三個(gè)顯示頁(yè)面。無(wú)人簽到時(shí)間(0:00-05:50)如上左圖所示。當到達簽到時(shí)間時(shí),可以點(diǎn)擊按鈕狀態(tài),如上中圖所示。登錄完成后,會(huì )顯示用戶(hù)在公眾號當天的登錄位置。
  0.2 簽到記錄頁(yè)面
  用戶(hù)登錄后,可以查看自己的登錄記錄。詳情如下圖所示:
  
  左圖:可兌換獎勵簽到記錄和過(guò)期簽到記錄 右圖:兌換簽到記錄
  本項目用戶(hù)登錄后,可于當日或次日06:50-08:30在指定地點(diǎn)領(lǐng)取獎勵。過(guò)了這個(gè)時(shí)間,這個(gè)登錄記錄就失效了。三種狀態(tài)的簽到記錄如上圖所示。
  0.3后臺交流頁(yè)面
  下圖為后臺交易所的測試頁(yè)面。輸入登錄ID查詢(xún)登錄記錄。
  
  左圖:查詢(xún)過(guò)期的登錄記錄。中圖:查詢(xún)已兌換的登錄記錄。右圖:查詢(xún)可兌換的登錄記錄。
  如上圖所示。如果前來(lái)兌換的用戶(hù)的登錄記錄已過(guò)期,則會(huì )如上左圖顯示。如果用戶(hù)的簽到記錄已經(jīng)被兌換,會(huì )如上中圖顯示。如果用戶(hù)的簽到記錄可兌換,則會(huì )如右上圖所示。
  點(diǎn)擊“立即兌換”按鈕,出現“兌換成功”彈窗,如下圖。
  
  兌換成功彈窗(在微信開(kāi)發(fā)者工具中運行)
  看到這里,如果這不是你想要的項目,那么你可以關(guān)閉這個(gè)博客。
  如果這是你想要的項目,或者這個(gè)項目和你當前的項目很接近,或者你想學(xué)習如何寫(xiě)這個(gè)項目,或者...
  請繼續閱讀。下面正式開(kāi)始^_^
  1項目背景及需求分析1.1項目背景
  關(guān)于這個(gè)需求分析部分,我們先從項目的背景說(shuō)起。
  原因是這個(gè)。項目組在公眾號舉辦活動(dòng)。這個(gè)活動(dòng)簡(jiǎn)單易懂,就是“早起簽到領(lǐng)取獎勵”。每天早上指定時(shí)間開(kāi)啟簽到系統,然后用戶(hù)點(diǎn)擊菜單欄中的“提前簽到”按鈕,通過(guò)微信登錄,進(jìn)入簽到系統。
  用戶(hù)登錄完成后,用戶(hù)可以根據登錄記錄到指定地點(diǎn)領(lǐng)取早餐。同時(shí),每日早餐數量有限,先到先得。同時(shí),簽到記錄也有兌換期。本項目組指定的方案可在當日或次日8:30前收到。所以我今天check in,第二天早上就沒(méi)有早餐了^_^
  1.2 需求分析
  通過(guò)對項目背景的分析,本項目需求如下:
  1、本項目為公眾號項目,微信網(wǎng)頁(yè)開(kāi)發(fā);
  2、實(shí)現用戶(hù)微信登錄授權確定用戶(hù)身份,實(shí)現一天只能登錄一次;
  3、用戶(hù)登錄后,記錄登錄時(shí)間和當天登錄排名;
  4、顯示用戶(hù)的簽到記錄和簽到記錄的狀態(tài)(可兌換、已兌換、已過(guò)期);
  5、Background 管理員確認兌換。
  2概述設計2.1開(kāi)發(fā)技術(shù)分析
  既然是微信網(wǎng)頁(yè)的開(kāi)發(fā),要實(shí)現用戶(hù)登錄,那么就需要了解微信公眾號網(wǎng)頁(yè)的授權機制。
  微信開(kāi)放平臺有這方面的使用說(shuō)明介紹,大家可以通過(guò)開(kāi)發(fā)者的文檔自行學(xué)習。鏈接如下:
  具體來(lái)說(shuō),網(wǎng)頁(yè)授權過(guò)程分為四個(gè)步驟:
  1、引導用戶(hù)進(jìn)入授權頁(yè)面同意授權并獲取驗證碼
  2、交換網(wǎng)頁(yè)授權access_token代碼(與基礎支持的access_token不同)
  3、如有需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)對access_token進(jìn)行授權,避免過(guò)期
  4、通過(guò)網(wǎng)頁(yè)授權access_token和openid獲取用戶(hù)基本信息(支持UnionID機制??)
  只有通過(guò)微信認證的服務(wù)賬號才能使用“Web授權”界面。
  
  如果要用于開(kāi)發(fā)測試,可以申請一個(gè)測試賬號。申請鏈接如下:
  微信網(wǎng)頁(yè)授權登錄的詳細流程將在實(shí)踐代碼(后面編碼實(shí)現流程)中進(jìn)行說(shuō)明。
  ———————————————————————
  然后需要分析確定開(kāi)發(fā)語(yǔ)言。
  微信網(wǎng)頁(yè)可以用任何網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言實(shí)現。
  但是結合這個(gè)項目,需要對數據庫中的數據進(jìn)行增刪改查,所以最終使用的編程語(yǔ)言是PHP。
 ?。ù藭r(shí)筆者還沒(méi)有接觸到PHP開(kāi)發(fā)o(╥﹏╥)o,筆者熟悉的web開(kāi)發(fā)語(yǔ)言是Java Web。所以編碼實(shí)現過(guò)程,如有不對之處請指教忍著(zhù)我(*^▽^*))
  最后,數據庫使用 MySQL。
  2.2數據庫設計
  項目本身不大,所以設計的數據庫形式也很簡(jiǎn)單。
  第一個(gè)是用戶(hù)表。
  本項目中,只需要獲取用戶(hù)為本公眾號生成的唯一標識OpenID,無(wú)需獲取用戶(hù)昵稱(chēng)、城市、頭像等其他公開(kāi)信息。如果您需要有關(guān)用戶(hù)的這些信息,可以展開(kāi)用戶(hù)表。
  user表的user字段只有2列。如下圖所示:
  
  各個(gè)字段的含義:
  然后是用戶(hù)登錄記錄表。簽到表詳情如下:
  
  各個(gè)字段的含義:
  如果您的項目需要其他形式,您可以自行設計。
  3 開(kāi)發(fā)環(huán)境配置
  工人要想做好本職工作,就必須先磨礪他的工具。開(kāi)發(fā)前,需要先配置好開(kāi)發(fā)環(huán)境。
  
  使用的四個(gè)軟件
  3.1 編程環(huán)境:
  本項目使用PHP語(yǔ)言。所以編譯器使用了JetBrains PhpStorm。
  PHPStorm 是付費軟件。如果你是學(xué)生用戶(hù),有教育郵箱,可以到JetBrains官網(wǎng)授權免費版。
  3.2 編譯環(huán)境:
  在項目編寫(xiě)過(guò)程中,調試是不可避免的。所以這里使用的PHP網(wǎng)頁(yè)運行環(huán)境是phpStudy。
  本軟件是免費軟件。詳情請查看phpStudy官網(wǎng)相關(guān)文檔。
  3.3MySQL 數據庫可視化:
  在調試過(guò)程中,不可避免地要對數據庫中的數據進(jìn)行校驗和檢查。
  作者使用的MySQL數據庫可視化工具是Navicat for MySQL。
  本軟件為付費軟件。
  3.4網(wǎng)頁(yè)調試:
  如何調試公眾號網(wǎng)頁(yè)?微信公眾平臺開(kāi)發(fā)者工具欄提供網(wǎng)頁(yè)開(kāi)發(fā)者工具:微信網(wǎng)頁(yè)開(kāi)發(fā)者工具
  
  如上圖所示,點(diǎn)擊【web開(kāi)發(fā)者工具】跳轉到綁定開(kāi)發(fā)者的微信賬號頁(yè)面。這里我們綁定了開(kāi)發(fā)者的微信賬號。
  
  然后去:下載微信網(wǎng)頁(yè)開(kāi)發(fā)工具電腦客戶(hù)端。
  下載安裝后,運行后需要開(kāi)發(fā)者掃描登錄才能運行。運行頁(yè)面如下:
  
  
  3.5微信公眾后臺配置
  如果直接在公眾號菜單欄配置完成的項目,微信將無(wú)法識別你的項目。
  但是這個(gè)程序不配置公眾號后臺O(∩_∩)O
  所謂公眾號后臺配置,就是獲取公眾號秘鑰,并將域名加入公眾號界面白名單的過(guò)程。
  詳情如下:
  3.5.1配置域名
  項目最終需要使用域名訪(fǎng)問(wèn)。并且域名必須啟用SSL證書(shū)(HTTPS協(xié)議)
  關(guān)于如何在PHPStudy中配置SSL證書(shū),筆者之前寫(xiě)過(guò),點(diǎn)此查看。
  這里是關(guān)于將域名加入公眾號“白名單”。
  首先進(jìn)入公眾號后臺,點(diǎn)擊【設置】>>【公眾號設置】>>【功能設置】,如下圖:
  
  點(diǎn)擊上面紅框內兩個(gè)模塊的設置,為域名添加授權。
  為了驗證您是否擁有域名,您需要將指定文件上傳到域名服務(wù)器目錄進(jìn)行驗證。如下圖所示:
  
  具體的配置過(guò)程,按照上圖的提示進(jìn)行配置即可。
  微信公眾號支持配置2個(gè)網(wǎng)頁(yè)授權域名和3個(gè)JS接口安全域名。
  3.5.2 配置IP白名單
  本項目需要使用access_token接口,所以需要配置網(wǎng)站最終部署到IP白名單的服務(wù)器的IP地址!
  即把域名解析的IP地址配置到公眾號IP白名單(詳見(jiàn)域名解析列表)。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】修改IP白名單配置。
  
  點(diǎn)擊上圖下方紅框中的【查看】查看和修改IP白名單。
  
  3.5.3獲取開(kāi)發(fā)者密碼
  開(kāi)發(fā)者密碼是用于驗證公眾號開(kāi)發(fā)者身份的密碼,具有極高的安全性。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】重置開(kāi)發(fā)者密碼。
  
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  4 編碼實(shí)現
  據說(shuō)PHP是一種松散的語(yǔ)言。作者也是第一次接觸PHP,用PHP來(lái)實(shí)現這個(gè)項目...總體感覺(jué)PHP非常好用\(^o^)/~
  項目本身不大,客戶(hù)端有2個(gè)頁(yè)面,所以沒(méi)有框架,也沒(méi)有MVC開(kāi)發(fā)模型(以下模仿MVC開(kāi)發(fā)模型)
  4.1 模型(Model)層DAO類(lèi)代碼:
  首先,您需要創(chuàng )建一個(gè)新的 Dao 類(lèi)。該類(lèi)實(shí)現了Dao類(lèi)的構造,用于處理數據庫中的數據。
  流行的一般是實(shí)現數據庫的增刪改查,所以所有的SQL語(yǔ)句都在這里執行。
  文件名:dao.php
  詳細代碼和注釋如下:
  


早起簽到

images/banner.jpg



5:50開(kāi)啟今日簽到





立即簽到





今日簽到名次:



<p align="right">>>我的簽到記錄  


活動(dòng)詳情



1、每日05:50至23:59開(kāi)啟早起簽到。


2、其他內容……


3、其他內容……





技術(shù)支持:@拾年之璐
</p>
  本主頁(yè)使用的CSS文件來(lái)自互聯(lián)網(wǎng),長(cháng)度較長(cháng)。會(huì )在文末展示。
  這里注意,在上面代碼中“立即登錄”按鈕所在的表單中,動(dòng)作是跳轉到sign.php文件,注意這里!
  所以你需要編寫(xiě)sign.php文件。這個(gè)文件是一個(gè)控制頁(yè)和一個(gè)跳轉頁(yè)。詳細代碼如下:
  文件名:sign.php
  


我的簽到記錄

images/banner.jpg

我的簽到記錄


<p>簽到ID:    當日簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a><a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orange">  已過(guò)期</a>



您還沒(méi)有簽到記錄,快去簽到吧^_^



返回
</p>
  4.6后臺兌換頁(yè)面
  
  后臺交換頁(yè)面是一個(gè)非常簡(jiǎn)單的 HTML 頁(yè)面。其中主要由兩個(gè)PHP文件組成:
  主頁(yè)文件名:search.php
  完整代碼:
  


后臺查詢(xún)系統


input{
border: 1px solid #ccc;
padding: 10px 0px;
border-radius: 5px; /*css3屬性IE不支持*/
padding-left:10px;
width: 150px;
}
.btn5{ display:block;
border:0px;
margin:0rem auto 0% auto;
width: 94%;
background-color: #ef2122;
text-align: center;
font-weight: bold;
font-size:17px ;
color: #fff3f0;
border-radius: 10px;
}


function doAction() {
var usersignid = document.getElementById("usersignid");
window.location.href = "a.php?usersignid="+ usersignid.value;
}














用戶(hù)簽到記錄


<p>簽到ID:    簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a>


立即兌換
<a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orangered">  已過(guò)期</a>



未查詢(xún)到該簽到記錄!



</p>
  兌換按鈕文件名:submit.php
  完整代碼:
<p> 查看全部

  【早起簽到】CSS樣式表(2):0成果展示
  0 結果顯示
  這篇文章比較長(cháng)。為了減少讀者的時(shí)間,先把這個(gè)項目的結果展示出來(lái),讓讀者可以快速確認這個(gè)文章是否就是他們要找的文章。
  這里需要說(shuō)明一下,項目中的前端頁(yè)面配色圖是指網(wǎng)上發(fā)布的CSS樣式表。
  有關(guān)項目的詳細信息,請稍后查看。
  0.1 登錄主頁(yè):
  用戶(hù)點(diǎn)擊公眾號菜單【提前登錄】后,會(huì )實(shí)現微信自動(dòng)登錄,進(jìn)入登錄主頁(yè)面。
  
  主頁(yè)顯示如下:
  
  左圖:缺席簽到時(shí)間。中圖:簽到頁(yè)面。右圖:簽到完成后顯示排名頁(yè)面。
  主頁(yè)面分為三個(gè)顯示頁(yè)面。無(wú)人簽到時(shí)間(0:00-05:50)如上左圖所示。當到達簽到時(shí)間時(shí),可以點(diǎn)擊按鈕狀態(tài),如上中圖所示。登錄完成后,會(huì )顯示用戶(hù)在公眾號當天的登錄位置。
  0.2 簽到記錄頁(yè)面
  用戶(hù)登錄后,可以查看自己的登錄記錄。詳情如下圖所示:
  
  左圖:可兌換獎勵簽到記錄和過(guò)期簽到記錄 右圖:兌換簽到記錄
  本項目用戶(hù)登錄后,可于當日或次日06:50-08:30在指定地點(diǎn)領(lǐng)取獎勵。過(guò)了這個(gè)時(shí)間,這個(gè)登錄記錄就失效了。三種狀態(tài)的簽到記錄如上圖所示。
  0.3后臺交流頁(yè)面
  下圖為后臺交易所的測試頁(yè)面。輸入登錄ID查詢(xún)登錄記錄。
  
  左圖:查詢(xún)過(guò)期的登錄記錄。中圖:查詢(xún)已兌換的登錄記錄。右圖:查詢(xún)可兌換的登錄記錄。
  如上圖所示。如果前來(lái)兌換的用戶(hù)的登錄記錄已過(guò)期,則會(huì )如上左圖顯示。如果用戶(hù)的簽到記錄已經(jīng)被兌換,會(huì )如上中圖顯示。如果用戶(hù)的簽到記錄可兌換,則會(huì )如右上圖所示。
  點(diǎn)擊“立即兌換”按鈕,出現“兌換成功”彈窗,如下圖。
  
  兌換成功彈窗(在微信開(kāi)發(fā)者工具中運行)
  看到這里,如果這不是你想要的項目,那么你可以關(guān)閉這個(gè)博客。
  如果這是你想要的項目,或者這個(gè)項目和你當前的項目很接近,或者你想學(xué)習如何寫(xiě)這個(gè)項目,或者...
  請繼續閱讀。下面正式開(kāi)始^_^
  1項目背景及需求分析1.1項目背景
  關(guān)于這個(gè)需求分析部分,我們先從項目的背景說(shuō)起。
  原因是這個(gè)。項目組在公眾號舉辦活動(dòng)。這個(gè)活動(dòng)簡(jiǎn)單易懂,就是“早起簽到領(lǐng)取獎勵”。每天早上指定時(shí)間開(kāi)啟簽到系統,然后用戶(hù)點(diǎn)擊菜單欄中的“提前簽到”按鈕,通過(guò)微信登錄,進(jìn)入簽到系統。
  用戶(hù)登錄完成后,用戶(hù)可以根據登錄記錄到指定地點(diǎn)領(lǐng)取早餐。同時(shí),每日早餐數量有限,先到先得。同時(shí),簽到記錄也有兌換期。本項目組指定的方案可在當日或次日8:30前收到。所以我今天check in,第二天早上就沒(méi)有早餐了^_^
  1.2 需求分析
  通過(guò)對項目背景的分析,本項目需求如下:
  1、本項目為公眾號項目,微信網(wǎng)頁(yè)開(kāi)發(fā);
  2、實(shí)現用戶(hù)微信登錄授權確定用戶(hù)身份,實(shí)現一天只能登錄一次;
  3、用戶(hù)登錄后,記錄登錄時(shí)間和當天登錄排名;
  4、顯示用戶(hù)的簽到記錄和簽到記錄的狀態(tài)(可兌換、已兌換、已過(guò)期);
  5、Background 管理員確認兌換。
  2概述設計2.1開(kāi)發(fā)技術(shù)分析
  既然是微信網(wǎng)頁(yè)的開(kāi)發(fā),要實(shí)現用戶(hù)登錄,那么就需要了解微信公眾號網(wǎng)頁(yè)的授權機制。
  微信開(kāi)放平臺有這方面的使用說(shuō)明介紹,大家可以通過(guò)開(kāi)發(fā)者的文檔自行學(xué)習。鏈接如下:
  具體來(lái)說(shuō),網(wǎng)頁(yè)授權過(guò)程分為四個(gè)步驟:
  1、引導用戶(hù)進(jìn)入授權頁(yè)面同意授權并獲取驗證碼
  2、交換網(wǎng)頁(yè)授權access_token代碼(與基礎支持的access_token不同)
  3、如有需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)對access_token進(jìn)行授權,避免過(guò)期
  4、通過(guò)網(wǎng)頁(yè)授權access_token和openid獲取用戶(hù)基本信息(支持UnionID機制??)
  只有通過(guò)微信認證的服務(wù)賬號才能使用“Web授權”界面。
  
  如果要用于開(kāi)發(fā)測試,可以申請一個(gè)測試賬號。申請鏈接如下:
  微信網(wǎng)頁(yè)授權登錄的詳細流程將在實(shí)踐代碼(后面編碼實(shí)現流程)中進(jìn)行說(shuō)明。
  ———————————————————————
  然后需要分析確定開(kāi)發(fā)語(yǔ)言。
  微信網(wǎng)頁(yè)可以用任何網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言實(shí)現。
  但是結合這個(gè)項目,需要對數據庫中的數據進(jìn)行增刪改查,所以最終使用的編程語(yǔ)言是PHP。
 ?。ù藭r(shí)筆者還沒(méi)有接觸到PHP開(kāi)發(fā)o(╥﹏╥)o,筆者熟悉的web開(kāi)發(fā)語(yǔ)言是Java Web。所以編碼實(shí)現過(guò)程,如有不對之處請指教忍著(zhù)我(*^▽^*))
  最后,數據庫使用 MySQL。
  2.2數據庫設計
  項目本身不大,所以設計的數據庫形式也很簡(jiǎn)單。
  第一個(gè)是用戶(hù)表。
  本項目中,只需要獲取用戶(hù)為本公眾號生成的唯一標識OpenID,無(wú)需獲取用戶(hù)昵稱(chēng)、城市、頭像等其他公開(kāi)信息。如果您需要有關(guān)用戶(hù)的這些信息,可以展開(kāi)用戶(hù)表。
  user表的user字段只有2列。如下圖所示:
  
  各個(gè)字段的含義:
  然后是用戶(hù)登錄記錄表。簽到表詳情如下:
  
  各個(gè)字段的含義:
  如果您的項目需要其他形式,您可以自行設計。
  3 開(kāi)發(fā)環(huán)境配置
  工人要想做好本職工作,就必須先磨礪他的工具。開(kāi)發(fā)前,需要先配置好開(kāi)發(fā)環(huán)境。
  
  使用的四個(gè)軟件
  3.1 編程環(huán)境:
  本項目使用PHP語(yǔ)言。所以編譯器使用了JetBrains PhpStorm。
  PHPStorm 是付費軟件。如果你是學(xué)生用戶(hù),有教育郵箱,可以到JetBrains官網(wǎng)授權免費版。
  3.2 編譯環(huán)境:
  在項目編寫(xiě)過(guò)程中,調試是不可避免的。所以這里使用的PHP網(wǎng)頁(yè)運行環(huán)境是phpStudy。
  本軟件是免費軟件。詳情請查看phpStudy官網(wǎng)相關(guān)文檔。
  3.3MySQL 數據庫可視化:
  在調試過(guò)程中,不可避免地要對數據庫中的數據進(jìn)行校驗和檢查。
  作者使用的MySQL數據庫可視化工具是Navicat for MySQL。
  本軟件為付費軟件。
  3.4網(wǎng)頁(yè)調試:
  如何調試公眾號網(wǎng)頁(yè)?微信公眾平臺開(kāi)發(fā)者工具欄提供網(wǎng)頁(yè)開(kāi)發(fā)者工具:微信網(wǎng)頁(yè)開(kāi)發(fā)者工具
  
  如上圖所示,點(diǎn)擊【web開(kāi)發(fā)者工具】跳轉到綁定開(kāi)發(fā)者的微信賬號頁(yè)面。這里我們綁定了開(kāi)發(fā)者的微信賬號。
  
  然后去:下載微信網(wǎng)頁(yè)開(kāi)發(fā)工具電腦客戶(hù)端。
  下載安裝后,運行后需要開(kāi)發(fā)者掃描登錄才能運行。運行頁(yè)面如下:
  
  
  3.5微信公眾后臺配置
  如果直接在公眾號菜單欄配置完成的項目,微信將無(wú)法識別你的項目。
  但是這個(gè)程序不配置公眾號后臺O(∩_∩)O
  所謂公眾號后臺配置,就是獲取公眾號秘鑰,并將域名加入公眾號界面白名單的過(guò)程。
  詳情如下:
  3.5.1配置域名
  項目最終需要使用域名訪(fǎng)問(wèn)。并且域名必須啟用SSL證書(shū)(HTTPS協(xié)議)
  關(guān)于如何在PHPStudy中配置SSL證書(shū),筆者之前寫(xiě)過(guò),點(diǎn)此查看。
  這里是關(guān)于將域名加入公眾號“白名單”。
  首先進(jìn)入公眾號后臺,點(diǎn)擊【設置】>>【公眾號設置】>>【功能設置】,如下圖:
  
  點(diǎn)擊上面紅框內兩個(gè)模塊的設置,為域名添加授權。
  為了驗證您是否擁有域名,您需要將指定文件上傳到域名服務(wù)器目錄進(jìn)行驗證。如下圖所示:
  
  具體的配置過(guò)程,按照上圖的提示進(jìn)行配置即可。
  微信公眾號支持配置2個(gè)網(wǎng)頁(yè)授權域名和3個(gè)JS接口安全域名。
  3.5.2 配置IP白名單
  本項目需要使用access_token接口,所以需要配置網(wǎng)站最終部署到IP白名單的服務(wù)器的IP地址!
  即把域名解析的IP地址配置到公眾號IP白名單(詳見(jiàn)域名解析列表)。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】修改IP白名單配置。
  
  點(diǎn)擊上圖下方紅框中的【查看】查看和修改IP白名單。
  
  3.5.3獲取開(kāi)發(fā)者密碼
  開(kāi)發(fā)者密碼是用于驗證公眾號開(kāi)發(fā)者身份的密碼,具有極高的安全性。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】重置開(kāi)發(fā)者密碼。
  
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  4 編碼實(shí)現
  據說(shuō)PHP是一種松散的語(yǔ)言。作者也是第一次接觸PHP,用PHP來(lái)實(shí)現這個(gè)項目...總體感覺(jué)PHP非常好用\(^o^)/~
  項目本身不大,客戶(hù)端有2個(gè)頁(yè)面,所以沒(méi)有框架,也沒(méi)有MVC開(kāi)發(fā)模型(以下模仿MVC開(kāi)發(fā)模型)
  4.1 模型(Model)層DAO類(lèi)代碼:
  首先,您需要創(chuàng )建一個(gè)新的 Dao 類(lèi)。該類(lèi)實(shí)現了Dao類(lèi)的構造,用于處理數據庫中的數據。
  流行的一般是實(shí)現數據庫的增刪改查,所以所有的SQL語(yǔ)句都在這里執行。
  文件名:dao.php
  詳細代碼和注釋如下:
  


早起簽到

images/banner.jpg



5:50開(kāi)啟今日簽到





立即簽到





今日簽到名次:



<p align="right">>>我的簽到記錄  


活動(dòng)詳情



1、每日05:50至23:59開(kāi)啟早起簽到。


2、其他內容……


3、其他內容……





技術(shù)支持:@拾年之璐
</p>
  本主頁(yè)使用的CSS文件來(lái)自互聯(lián)網(wǎng),長(cháng)度較長(cháng)。會(huì )在文末展示。
  這里注意,在上面代碼中“立即登錄”按鈕所在的表單中,動(dòng)作是跳轉到sign.php文件,注意這里!
  所以你需要編寫(xiě)sign.php文件。這個(gè)文件是一個(gè)控制頁(yè)和一個(gè)跳轉頁(yè)。詳細代碼如下:
  文件名:sign.php
  


我的簽到記錄

images/banner.jpg

我的簽到記錄


<p>簽到ID:    當日簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a><a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orange">  已過(guò)期</a>



您還沒(méi)有簽到記錄,快去簽到吧^_^



返回
</p>
  4.6后臺兌換頁(yè)面
  
  后臺交換頁(yè)面是一個(gè)非常簡(jiǎn)單的 HTML 頁(yè)面。其中主要由兩個(gè)PHP文件組成:
  主頁(yè)文件名:search.php
  完整代碼:
  


后臺查詢(xún)系統


input{
border: 1px solid #ccc;
padding: 10px 0px;
border-radius: 5px; /*css3屬性IE不支持*/
padding-left:10px;
width: 150px;
}
.btn5{ display:block;
border:0px;
margin:0rem auto 0% auto;
width: 94%;
background-color: #ef2122;
text-align: center;
font-weight: bold;
font-size:17px ;
color: #fff3f0;
border-radius: 10px;
}


function doAction() {
var usersignid = document.getElementById("usersignid");
window.location.href = "a.php?usersignid="+ usersignid.value;
}














用戶(hù)簽到記錄


<p>簽到ID:    簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a>


立即兌換
<a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orangered">  已過(guò)期</a>



未查詢(xún)到該簽到記錄!



</p>
  兌換按鈕文件名:submit.php
  完整代碼:
<p>

開(kāi)發(fā)接入2.1微信公眾平臺接口測試賬號的申請流程及步驟

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 175 次瀏覽 ? 2021-08-01 00:31 ? 來(lái)自相關(guān)話(huà)題

  開(kāi)發(fā)接入2.1微信公眾平臺接口測試賬號的申請流程及步驟
  一、前言
  隨著(zhù)微信的普及,年輕一代逐漸從QQ轉向微信。界面簡(jiǎn)潔,功能強大,男女老少皆宜,是微信的特色。正是這一特性,使微信成為了中國社交軟件的巨頭。因此,很多產(chǎn)品需要在微信中開(kāi)發(fā)以滿(mǎn)足需求。
  本文主要講服務(wù)號的開(kāi)發(fā),與微信服務(wù)器的交互,以及使用微信公眾號的Oauth2授權,在微信中展示本地開(kāi)發(fā)的內容并進(jìn)行交互。由于公眾號申請需要時(shí)間和經(jīng)驗,需要公司相關(guān)資質(zhì),作為個(gè)人開(kāi)發(fā)者,可以先在微信官方平臺申請測試號,使用測試號授權與微信服務(wù)器交互并調試這一頁(yè)。在開(kāi)始之前,朋友們需要了解他們的需求。微信分為企業(yè)號、服務(wù)號、訂閱號。不同的賬戶(hù)有不同的功能。具體可以到微信官網(wǎng)查看需要開(kāi)發(fā)什么類(lèi)型的賬號。
  
  二、development 接入2.1 微信公眾平臺接口測試賬號申請
  如前言所述,在開(kāi)發(fā)中,我們一半人會(huì )使用官方微信公眾號作為我們的生產(chǎn)線(xiàn)環(huán)境,然后aut環(huán)境可以使用測試號進(jìn)行開(kāi)發(fā),從而實(shí)現與微信的交互。測試賬號申請鏈接如下
  測試帳戶(hù)申請
  進(jìn)入后,您將看到以下屏幕。登錄
  
  登錄后,您會(huì )看到以下屏幕:
  
  因為我已經(jīng)配置好了,所以顯示配置后的相關(guān)參數。如果是第一次進(jìn)入,需要自己配置相關(guān)參數。首先要注意的是,系統會(huì )為你生成一個(gè)appId,appsercet,后面會(huì )講到這個(gè)的作用?,F在你需要配置 URL 和 Token。
  具體來(lái)說(shuō),這個(gè)所謂的URL就是你需要在你的代碼中與微信進(jìn)行Token驗證交互的一種方法。配置完成后,微信會(huì )使用配置的url發(fā)起http請求。請注意,發(fā)起方法是獲取請求。因此,代碼中提供的接口需要將請求頭設置為get請求:
  method=(RequestMethod.GET) 方法中需要驗證微信發(fā)送的消息。下面的token需要和你項目中配置的token一致。微信發(fā)送請求后,會(huì )帶上簽名和時(shí)間戳。 , 隨機數被檢查。如果匹配成功,則可以進(jìn)行下一步。如果不一致,則匹配失敗。需要注意的是,這個(gè)url需要有自己的域名。我個(gè)人在Sunny-Ngrok上申請了內網(wǎng)穿透,并贈送了一個(gè)域名。
  2.2 sunn-Ngrok 內網(wǎng)滲透賬號申請
  點(diǎn)擊申請賬號
  
  賬戶(hù)創(chuàng )建后,會(huì )有如上圖所示。其實(shí),開(kāi)通域名的方式有很多種。這里我只是給我一個(gè)參考方法。然后點(diǎn)擊打開(kāi)隧道,購買(mǎi)隧道
  
  一個(gè)月10元不算貴。購買(mǎi)后點(diǎn)擊隧道管理
  
  購買(mǎi)后會(huì )有記錄,可以同時(shí)查看贈送域名和查看狀態(tài)。此時(shí)的狀態(tài)為離線(xiàn)。如果是離線(xiàn),微信公眾平臺微信發(fā)起的請求無(wú)法配置從本機接受,需要到官網(wǎng)下載客戶(hù)端啟動(dòng)隧道。
  cmd命令行進(jìn)入sunny.exe所在目錄并執行
  sunny.exe clientid 隧道 ID
  
  如上圖所示,將域名指向你本地的ip和端口號后,就可以在公眾號提交配置了。在我自己機器的代碼中,我做了如下配置:
  @RequestMapping(value = "/wx/wxmsgreceive", method = {RequestMethod.GET})
public void verifywxtoken(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
logger.info("開(kāi)始校驗信息是否是從微信服務(wù)器發(fā)出");
// 簽名
String signature = request.getParameter("signature");
// 時(shí)間戳
String timestamp = request.getParameter("timestamp");
// 隨機數
String nonce = request.getParameter("nonce");
// 通過(guò)檢驗signature對請求進(jìn)行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗
String result = Sha1.gen(SERVER_TOKEN, timestamp, nonce);
if (signature.equals(result)) {
// 隨機字符串
String echostr = request.getParameter("echostr");
logger.debug("接入成功,echostr {}", echostr);
response.getWriter().write(echostr);
}
}
  微信驗證碼
  public static String gen(String token, String timestamp, String nonce) throws NoSuchAlgorithmException {
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
StringBuffer content = new StringBuffer();
for (String a : arr) {
content.append(a);
}
return DigestUtils.sha1Hex(content.toString());
}
  因為我配置的請求頭是/wx/wxmsgreceive,所以公共平臺上的配置頁(yè)面是域名+/wx/wxmsgreceive。
  此時(shí),當您在網(wǎng)頁(yè)上點(diǎn)擊提交時(shí),微信會(huì )向本機發(fā)送認證請求,以確保本機的服務(wù)必須開(kāi)啟。
  
  這是官方的說(shuō)明,所以我們開(kāi)發(fā)的項目中需要提供一個(gè)暴露的接口來(lái)驗證微信服務(wù)器,主要是驗證微信公眾號網(wǎng)頁(yè)上填寫(xiě)的token驗證。官方文檔說(shuō)明如下:
  
  所以在項目中,放置在配置文件或常量池中的token必須是微信公眾號訪(fǎng)問(wèn)中填寫(xiě)的token的字符串。如果輸入不同或者方法中的解密比較有問(wèn)題,在網(wǎng)頁(yè)上點(diǎn)擊確定,就會(huì )出現“失敗”字樣。
  
  
  2.3 微信開(kāi)發(fā)者工具準備
  下載微信開(kāi)發(fā)者工具。
  點(diǎn)擊下載微信開(kāi)發(fā)者工具
  
  下載完成后掃碼登錄
  
  選擇微信公眾號網(wǎng)頁(yè)開(kāi)發(fā)
  
  
  此工具是后續開(kāi)發(fā)中訪(fǎng)問(wèn)URL和前端調試必不可少的工具。
  2.3 Oauth2 授權
  此時(shí)測試號已經(jīng)配置好了,那么接下來(lái)我們如何開(kāi)發(fā)呢?在微信公眾號頁(yè)面,部分頁(yè)面需要根據用戶(hù)的身份回顯不同的信息,比如用戶(hù)的還款清單。這些實(shí)現首先需要獲取個(gè)人信息然后與數據庫進(jìn)行交互,需要獲取用戶(hù)的唯一標識。在微信中,每個(gè)人都有并且只有一個(gè)唯一標識openId。這個(gè)openId需要通過(guò)微信的授權和回調獲取。同時(shí),微信公開(kāi)文檔上也有詳細的授權方式介紹。如何授權可以根據自己的業(yè)務(wù)需要使用。在實(shí)際業(yè)務(wù)中,根據項目的特點(diǎn)固化不同的用戶(hù)。我們所做的是將用戶(hù)固化到數據庫中,生成一個(gè) UUID,并將 UUID 放入 cookie。授權非常重要。通過(guò)它的控件,我們可以通過(guò)獲取當前用戶(hù)的openid來(lái)比較用戶(hù)是會(huì )員還是普通會(huì )員,是非管理員還是管理員等。這在頁(yè)面跳轉中起著(zhù)至關(guān)重要的作用。同時(shí),在代碼中,一些靜態(tài)頁(yè)面可能不一定需要授權,任何人都可以查看。所以在代碼中,我使用了一個(gè)過(guò)濾器,直接在前臺發(fā)布了一系列.css、.js、.html等。特殊要求,我拉過(guò)來(lái),要求微信授權。例如,我在項目中。 .go請求中需要驗證,通過(guò)微信回調獲取當前用戶(hù)信息,固化用戶(hù)。代碼如下:
  @WebFilter(urlPatterns = "/*", filterName = "authFilter")
public class AuthFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
@Autowired
private GeneralConfigService gcService;
@Autowired
private WxUserVerify wxUserVerify;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

try {
String url = request.getRequestURI();
logger.info("URL:" + url);
// 1.請求內容為WEB靜態(tài)內容時(shí)直接放行
if (StringUtil.separatorEndWith(gcService.getStaticResourceConfig(), url)) {
chain.doFilter(servletRequest, servletResponse);
return;
}
// 2.不是靜態(tài)資源進(jìn)行驗證
if(!checkUrl(request, response, url)){
return;
}
chain.doFilter(servletRequest, servletResponse);
return;

} catch (FilterException e1) {
//自定義異常,這里可以直接把錯誤信息拋出去,不需要記錄日志,因為這里是業(yè)務(wù)異常。
ResponseUtil.error(response, e1.getMessage());
} catch (Exception e2) {
//無(wú)法捕捉的異常,不能直接把錯誤信息拋出去,需要包裝下錯誤信息
logger.error(e2.getMessage(), e2);
ResponseUtil.error(response, "系統異常,請稍后再試...");
}
}
/**
* 與數據庫配置url進(jìn)行匹配
* @param request
* @param response
* @param url
* @return
*/
private boolean checkUrl(HttpServletRequest request, HttpServletResponse response, String url) {
boolean passFlag=true;
//與數據庫進(jìn)行匹配
Map urlConfig = getUrlConfig();
//比較匹配項
String substring = url.substring(url.lastIndexOf("/") + 1);
if (!urlConfig.containsKey(substring)) {
return passFlag;
}
CallBackMsg msg = wxUserVerify.doVerify(request, response);
if (msg.getResultCode().equals(CallBackMsg.WX_VALID_CONTINUE)) {
passFlag=false;
} else if (msg.getResultCode().equals(Const.ERROR_CODE)) {
throw new FilterException(FilterExceptionEnum.ERROR_WX_VALID_FAILE);
}
return passFlag;
}
/**
* 獲取地址配置信息
* @return
*/
private Map getUrlConfig() {
// 3.獲取需要驗證用戶(hù)的請求配置
Map configAddressList = gcService.getConfigAddressList();
logger.info(configAddressList.toString());
if (configAddressList.isEmpty()) {
logger.error("urlValidConfig為空,請檢查!");
throw new FilterException(FilterExceptionEnum.ERROR_VALIDCONF_NULL);
}
return configAddressList;
}
@Override
public void destroy() {
}
}
  通過(guò)創(chuàng )建一個(gè)類(lèi)來(lái)實(shí)現Filter過(guò)濾器進(jìn)行驗證,@WebFilter(urlPatterns = "/*", filterName = "authFilter")對所有請求進(jìn)行過(guò)濾攔截,其中封裝的方法當是特定請求時(shí)會(huì )被拉取申請授權
  private CallBackMsg impower(HttpServletRequest request, HttpServletResponse response) {
CallBackMsg msg = new CallBackMsg();
String code = request.getParameter("code");
try {
// 從配置獲取access_token
String appId = getWxParams("wxAppid");
String secret = getWxParams("wxSecret");
String accessTokenUrl = gcService.getUrlWxFwGetToken() + "?appid=" + appId + "&secret=" + secret + "&code="
+ code + "&grant_type=authorization_code";
logger.info("accessTokenUrl:" + accessTokenUrl);
String accessTokenResult = "";
if (StringUtil.isEmpty(proxyFlag)) {
proxyFlag = gcService.getProxyFlag();
}
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
accessTokenResult = HttpUtils.sendPostHttpsViaProxy(accessTokenUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
accessTokenResult = HttpUtils.sendPostHttps(accessTokenUrl, "");
}
logger.info("accessTokenResult:" + accessTokenResult);
JSONObject accessTokenJson = JSONObject.parseObject(accessTokenResult);
String accessToken = accessTokenJson.getString("access_token");
logger.info("accessToken:" + accessToken);
String openid = accessTokenJson.getString("openid");
logger.info("openid:" + openid);
// 查詢(xún)數據庫中的用戶(hù)數據
String reqUrl = gcService.getSkylarkServiceUrl() + "wechat/searchwxuserinfo";
ResponseDto responseQuery = this.restInvoke(reqUrl, getQueryParam(openid, null, 1));
String userInfoDb = responseQuery.getRspMesg();
JSONObject userInfoDbJson = JSONObject.parseObject(userInfoDb);
String uuid = "";
// 數據庫不存在該用戶(hù)則保存數據庫,存在則返回已存在的UUID
if (StringUtils.isEmpty(userInfoDbJson)) {
// 查詢(xún)微信中的用戶(hù)數據
uuid = UUIDGenerator.genUUID();
// 獲取用戶(hù)信息
String userInfoUrl = gcService.getUrlWxFwGetUser() + "?access_token=" + accessToken + "&openid="
+ openid + "&lang=zh_CN";
logger.info("userInfoUrl:" + userInfoUrl);

String userInfoResult = "";
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
userInfoResult = HttpUtils.sendPostHttpsViaProxy(userInfoUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
userInfoResult = HttpUtils.sendPostHttps(userInfoUrl, "");
}
logger.info("userInfoResult:" + userInfoResult);
JSONObject userInfoJson = JSONObject.parseObject(userInfoResult);
// 固化用戶(hù)
String addReq = gcService.getSkylarkServiceUrl() + "wechat/addwxuserinfo";
ResponseDto addResp = this.restInvoke(addReq,
getEntityParam(uuid, openid, userInfoJson));
// 失敗另處理
if (!(Const.SUCCESS_CODE).equals(addResp.getRspCode())) {
// 保存數據失敗,認證失敗
msg.setResultCode(Const.ERROR_CODE);
return msg;
}
} else {
uuid = userInfoDbJson.getString("id");
}
// 權限:本項目中的類(lèi)都可以訪(fǎng)問(wèn)該cookie,存儲到客戶(hù)端
Cookie cookie = new Cookie(Const.TOKEN, uuid);
cookie.setPath("/");
response.addCookie(cookie);
//將token存入session
HttpSession session = request.getSession();
session.setAttribute("authToken",uuid);
} catch (IOException e) {
logger.error(e.getMessage());
}
msg.setResultCode(Const.SUCCESS_CODE);
return msg;
}
  因為項目中使用了代理服務(wù)器,不需要本地開(kāi)發(fā),所以方法有點(diǎn)亂,但是大體思路是客戶(hù)端發(fā)起帶有特殊后綴的請求時(shí),被過(guò)濾器攔截接下來(lái),與微信服務(wù)器進(jìn)行交互授權的過(guò)程。授權成功后,向微信提供回調地址,并將微信帶回的用戶(hù)信息保存在表中。同時(shí),當前用戶(hù)在庫表中生成的唯一標識標識存儲在cookie域中。
  
  這樣就可以將獲取到的openid放入cookie中了。那么這個(gè)openId就可以固化了,也就是存儲在數據庫中。在會(huì )話(huà)中,如果點(diǎn)擊某個(gè)頁(yè)面需要使用微信授權,可以先從cookie域中獲取。如果cookie不可用,則向微信發(fā)起授權請求,獲取openid后,存儲cookie和curing。有一些步驟可以實(shí)現這一點(diǎn)。微信開(kāi)放平臺上有相關(guān)的demo。如果您需要我提供它們,請留言。后續授權碼我會(huì )貼出來(lái)供大家參考。 查看全部

  開(kāi)發(fā)接入2.1微信公眾平臺接口測試賬號的申請流程及步驟
  一、前言
  隨著(zhù)微信的普及,年輕一代逐漸從QQ轉向微信。界面簡(jiǎn)潔,功能強大,男女老少皆宜,是微信的特色。正是這一特性,使微信成為了中國社交軟件的巨頭。因此,很多產(chǎn)品需要在微信中開(kāi)發(fā)以滿(mǎn)足需求。
  本文主要講服務(wù)號的開(kāi)發(fā),與微信服務(wù)器的交互,以及使用微信公眾號的Oauth2授權,在微信中展示本地開(kāi)發(fā)的內容并進(jìn)行交互。由于公眾號申請需要時(shí)間和經(jīng)驗,需要公司相關(guān)資質(zhì),作為個(gè)人開(kāi)發(fā)者,可以先在微信官方平臺申請測試號,使用測試號授權與微信服務(wù)器交互并調試這一頁(yè)。在開(kāi)始之前,朋友們需要了解他們的需求。微信分為企業(yè)號、服務(wù)號、訂閱號。不同的賬戶(hù)有不同的功能。具體可以到微信官網(wǎng)查看需要開(kāi)發(fā)什么類(lèi)型的賬號。
  
  二、development 接入2.1 微信公眾平臺接口測試賬號申請
  如前言所述,在開(kāi)發(fā)中,我們一半人會(huì )使用官方微信公眾號作為我們的生產(chǎn)線(xiàn)環(huán)境,然后aut環(huán)境可以使用測試號進(jìn)行開(kāi)發(fā),從而實(shí)現與微信的交互。測試賬號申請鏈接如下
  測試帳戶(hù)申請
  進(jìn)入后,您將看到以下屏幕。登錄
  
  登錄后,您會(huì )看到以下屏幕:
  
  因為我已經(jīng)配置好了,所以顯示配置后的相關(guān)參數。如果是第一次進(jìn)入,需要自己配置相關(guān)參數。首先要注意的是,系統會(huì )為你生成一個(gè)appId,appsercet,后面會(huì )講到這個(gè)的作用?,F在你需要配置 URL 和 Token。
  具體來(lái)說(shuō),這個(gè)所謂的URL就是你需要在你的代碼中與微信進(jìn)行Token驗證交互的一種方法。配置完成后,微信會(huì )使用配置的url發(fā)起http請求。請注意,發(fā)起方法是獲取請求。因此,代碼中提供的接口需要將請求頭設置為get請求:
  method=(RequestMethod.GET) 方法中需要驗證微信發(fā)送的消息。下面的token需要和你項目中配置的token一致。微信發(fā)送請求后,會(huì )帶上簽名和時(shí)間戳。 , 隨機數被檢查。如果匹配成功,則可以進(jìn)行下一步。如果不一致,則匹配失敗。需要注意的是,這個(gè)url需要有自己的域名。我個(gè)人在Sunny-Ngrok上申請了內網(wǎng)穿透,并贈送了一個(gè)域名。
  2.2 sunn-Ngrok 內網(wǎng)滲透賬號申請
  點(diǎn)擊申請賬號
  
  賬戶(hù)創(chuàng )建后,會(huì )有如上圖所示。其實(shí),開(kāi)通域名的方式有很多種。這里我只是給我一個(gè)參考方法。然后點(diǎn)擊打開(kāi)隧道,購買(mǎi)隧道
  
  一個(gè)月10元不算貴。購買(mǎi)后點(diǎn)擊隧道管理
  
  購買(mǎi)后會(huì )有記錄,可以同時(shí)查看贈送域名和查看狀態(tài)。此時(shí)的狀態(tài)為離線(xiàn)。如果是離線(xiàn),微信公眾平臺微信發(fā)起的請求無(wú)法配置從本機接受,需要到官網(wǎng)下載客戶(hù)端啟動(dòng)隧道。
  cmd命令行進(jìn)入sunny.exe所在目錄并執行
  sunny.exe clientid 隧道 ID
  
  如上圖所示,將域名指向你本地的ip和端口號后,就可以在公眾號提交配置了。在我自己機器的代碼中,我做了如下配置:
  @RequestMapping(value = "/wx/wxmsgreceive", method = {RequestMethod.GET})
public void verifywxtoken(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
logger.info("開(kāi)始校驗信息是否是從微信服務(wù)器發(fā)出");
// 簽名
String signature = request.getParameter("signature");
// 時(shí)間戳
String timestamp = request.getParameter("timestamp");
// 隨機數
String nonce = request.getParameter("nonce");
// 通過(guò)檢驗signature對請求進(jìn)行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗
String result = Sha1.gen(SERVER_TOKEN, timestamp, nonce);
if (signature.equals(result)) {
// 隨機字符串
String echostr = request.getParameter("echostr");
logger.debug("接入成功,echostr {}", echostr);
response.getWriter().write(echostr);
}
}
  微信驗證碼
  public static String gen(String token, String timestamp, String nonce) throws NoSuchAlgorithmException {
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
StringBuffer content = new StringBuffer();
for (String a : arr) {
content.append(a);
}
return DigestUtils.sha1Hex(content.toString());
}
  因為我配置的請求頭是/wx/wxmsgreceive,所以公共平臺上的配置頁(yè)面是域名+/wx/wxmsgreceive。
  此時(shí),當您在網(wǎng)頁(yè)上點(diǎn)擊提交時(shí),微信會(huì )向本機發(fā)送認證請求,以確保本機的服務(wù)必須開(kāi)啟。
  
  這是官方的說(shuō)明,所以我們開(kāi)發(fā)的項目中需要提供一個(gè)暴露的接口來(lái)驗證微信服務(wù)器,主要是驗證微信公眾號網(wǎng)頁(yè)上填寫(xiě)的token驗證。官方文檔說(shuō)明如下:
  
  所以在項目中,放置在配置文件或常量池中的token必須是微信公眾號訪(fǎng)問(wèn)中填寫(xiě)的token的字符串。如果輸入不同或者方法中的解密比較有問(wèn)題,在網(wǎng)頁(yè)上點(diǎn)擊確定,就會(huì )出現“失敗”字樣。
  
  
  2.3 微信開(kāi)發(fā)者工具準備
  下載微信開(kāi)發(fā)者工具。
  點(diǎn)擊下載微信開(kāi)發(fā)者工具
  
  下載完成后掃碼登錄
  
  選擇微信公眾號網(wǎng)頁(yè)開(kāi)發(fā)
  
  
  此工具是后續開(kāi)發(fā)中訪(fǎng)問(wèn)URL和前端調試必不可少的工具。
  2.3 Oauth2 授權
  此時(shí)測試號已經(jīng)配置好了,那么接下來(lái)我們如何開(kāi)發(fā)呢?在微信公眾號頁(yè)面,部分頁(yè)面需要根據用戶(hù)的身份回顯不同的信息,比如用戶(hù)的還款清單。這些實(shí)現首先需要獲取個(gè)人信息然后與數據庫進(jìn)行交互,需要獲取用戶(hù)的唯一標識。在微信中,每個(gè)人都有并且只有一個(gè)唯一標識openId。這個(gè)openId需要通過(guò)微信的授權和回調獲取。同時(shí),微信公開(kāi)文檔上也有詳細的授權方式介紹。如何授權可以根據自己的業(yè)務(wù)需要使用。在實(shí)際業(yè)務(wù)中,根據項目的特點(diǎn)固化不同的用戶(hù)。我們所做的是將用戶(hù)固化到數據庫中,生成一個(gè) UUID,并將 UUID 放入 cookie。授權非常重要。通過(guò)它的控件,我們可以通過(guò)獲取當前用戶(hù)的openid來(lái)比較用戶(hù)是會(huì )員還是普通會(huì )員,是非管理員還是管理員等。這在頁(yè)面跳轉中起著(zhù)至關(guān)重要的作用。同時(shí),在代碼中,一些靜態(tài)頁(yè)面可能不一定需要授權,任何人都可以查看。所以在代碼中,我使用了一個(gè)過(guò)濾器,直接在前臺發(fā)布了一系列.css、.js、.html等。特殊要求,我拉過(guò)來(lái),要求微信授權。例如,我在項目中。 .go請求中需要驗證,通過(guò)微信回調獲取當前用戶(hù)信息,固化用戶(hù)。代碼如下:
  @WebFilter(urlPatterns = "/*", filterName = "authFilter")
public class AuthFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
@Autowired
private GeneralConfigService gcService;
@Autowired
private WxUserVerify wxUserVerify;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

try {
String url = request.getRequestURI();
logger.info("URL:" + url);
// 1.請求內容為WEB靜態(tài)內容時(shí)直接放行
if (StringUtil.separatorEndWith(gcService.getStaticResourceConfig(), url)) {
chain.doFilter(servletRequest, servletResponse);
return;
}
// 2.不是靜態(tài)資源進(jìn)行驗證
if(!checkUrl(request, response, url)){
return;
}
chain.doFilter(servletRequest, servletResponse);
return;

} catch (FilterException e1) {
//自定義異常,這里可以直接把錯誤信息拋出去,不需要記錄日志,因為這里是業(yè)務(wù)異常。
ResponseUtil.error(response, e1.getMessage());
} catch (Exception e2) {
//無(wú)法捕捉的異常,不能直接把錯誤信息拋出去,需要包裝下錯誤信息
logger.error(e2.getMessage(), e2);
ResponseUtil.error(response, "系統異常,請稍后再試...");
}
}
/**
* 與數據庫配置url進(jìn)行匹配
* @param request
* @param response
* @param url
* @return
*/
private boolean checkUrl(HttpServletRequest request, HttpServletResponse response, String url) {
boolean passFlag=true;
//與數據庫進(jìn)行匹配
Map urlConfig = getUrlConfig();
//比較匹配項
String substring = url.substring(url.lastIndexOf("/") + 1);
if (!urlConfig.containsKey(substring)) {
return passFlag;
}
CallBackMsg msg = wxUserVerify.doVerify(request, response);
if (msg.getResultCode().equals(CallBackMsg.WX_VALID_CONTINUE)) {
passFlag=false;
} else if (msg.getResultCode().equals(Const.ERROR_CODE)) {
throw new FilterException(FilterExceptionEnum.ERROR_WX_VALID_FAILE);
}
return passFlag;
}
/**
* 獲取地址配置信息
* @return
*/
private Map getUrlConfig() {
// 3.獲取需要驗證用戶(hù)的請求配置
Map configAddressList = gcService.getConfigAddressList();
logger.info(configAddressList.toString());
if (configAddressList.isEmpty()) {
logger.error("urlValidConfig為空,請檢查!");
throw new FilterException(FilterExceptionEnum.ERROR_VALIDCONF_NULL);
}
return configAddressList;
}
@Override
public void destroy() {
}
}
  通過(guò)創(chuàng )建一個(gè)類(lèi)來(lái)實(shí)現Filter過(guò)濾器進(jìn)行驗證,@WebFilter(urlPatterns = "/*", filterName = "authFilter")對所有請求進(jìn)行過(guò)濾攔截,其中封裝的方法當是特定請求時(shí)會(huì )被拉取申請授權
  private CallBackMsg impower(HttpServletRequest request, HttpServletResponse response) {
CallBackMsg msg = new CallBackMsg();
String code = request.getParameter("code");
try {
// 從配置獲取access_token
String appId = getWxParams("wxAppid");
String secret = getWxParams("wxSecret");
String accessTokenUrl = gcService.getUrlWxFwGetToken() + "?appid=" + appId + "&secret=" + secret + "&code="
+ code + "&grant_type=authorization_code";
logger.info("accessTokenUrl:" + accessTokenUrl);
String accessTokenResult = "";
if (StringUtil.isEmpty(proxyFlag)) {
proxyFlag = gcService.getProxyFlag();
}
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
accessTokenResult = HttpUtils.sendPostHttpsViaProxy(accessTokenUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
accessTokenResult = HttpUtils.sendPostHttps(accessTokenUrl, "");
}
logger.info("accessTokenResult:" + accessTokenResult);
JSONObject accessTokenJson = JSONObject.parseObject(accessTokenResult);
String accessToken = accessTokenJson.getString("access_token");
logger.info("accessToken:" + accessToken);
String openid = accessTokenJson.getString("openid");
logger.info("openid:" + openid);
// 查詢(xún)數據庫中的用戶(hù)數據
String reqUrl = gcService.getSkylarkServiceUrl() + "wechat/searchwxuserinfo";
ResponseDto responseQuery = this.restInvoke(reqUrl, getQueryParam(openid, null, 1));
String userInfoDb = responseQuery.getRspMesg();
JSONObject userInfoDbJson = JSONObject.parseObject(userInfoDb);
String uuid = "";
// 數據庫不存在該用戶(hù)則保存數據庫,存在則返回已存在的UUID
if (StringUtils.isEmpty(userInfoDbJson)) {
// 查詢(xún)微信中的用戶(hù)數據
uuid = UUIDGenerator.genUUID();
// 獲取用戶(hù)信息
String userInfoUrl = gcService.getUrlWxFwGetUser() + "?access_token=" + accessToken + "&openid="
+ openid + "&lang=zh_CN";
logger.info("userInfoUrl:" + userInfoUrl);

String userInfoResult = "";
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
userInfoResult = HttpUtils.sendPostHttpsViaProxy(userInfoUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
userInfoResult = HttpUtils.sendPostHttps(userInfoUrl, "");
}
logger.info("userInfoResult:" + userInfoResult);
JSONObject userInfoJson = JSONObject.parseObject(userInfoResult);
// 固化用戶(hù)
String addReq = gcService.getSkylarkServiceUrl() + "wechat/addwxuserinfo";
ResponseDto addResp = this.restInvoke(addReq,
getEntityParam(uuid, openid, userInfoJson));
// 失敗另處理
if (!(Const.SUCCESS_CODE).equals(addResp.getRspCode())) {
// 保存數據失敗,認證失敗
msg.setResultCode(Const.ERROR_CODE);
return msg;
}
} else {
uuid = userInfoDbJson.getString("id");
}
// 權限:本項目中的類(lèi)都可以訪(fǎng)問(wèn)該cookie,存儲到客戶(hù)端
Cookie cookie = new Cookie(Const.TOKEN, uuid);
cookie.setPath("/");
response.addCookie(cookie);
//將token存入session
HttpSession session = request.getSession();
session.setAttribute("authToken",uuid);
} catch (IOException e) {
logger.error(e.getMessage());
}
msg.setResultCode(Const.SUCCESS_CODE);
return msg;
}
  因為項目中使用了代理服務(wù)器,不需要本地開(kāi)發(fā),所以方法有點(diǎn)亂,但是大體思路是客戶(hù)端發(fā)起帶有特殊后綴的請求時(shí),被過(guò)濾器攔截接下來(lái),與微信服務(wù)器進(jìn)行交互授權的過(guò)程。授權成功后,向微信提供回調地址,并將微信帶回的用戶(hù)信息保存在表中。同時(shí),當前用戶(hù)在庫表中生成的唯一標識標識存儲在cookie域中。
  
  這樣就可以將獲取到的openid放入cookie中了。那么這個(gè)openId就可以固化了,也就是存儲在數據庫中。在會(huì )話(huà)中,如果點(diǎn)擊某個(gè)頁(yè)面需要使用微信授權,可以先從cookie域中獲取。如果cookie不可用,則向微信發(fā)起授權請求,獲取openid后,存儲cookie和curing。有一些步驟可以實(shí)現這一點(diǎn)。微信開(kāi)放平臺上有相關(guān)的demo。如果您需要我提供它們,請留言。后續授權碼我會(huì )貼出來(lái)供大家參考。

如何實(shí)際操作公眾號可以讓小游戲在一定程度上裂變

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 117 次瀏覽 ? 2021-07-29 03:22 ? 來(lái)自相關(guān)話(huà)題

  如何實(shí)際操作公眾號可以讓小游戲在一定程度上裂變
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  問(wèn)題就在這里。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià) 查看全部

  如何實(shí)際操作公眾號可以讓小游戲在一定程度上裂變
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  問(wèn)題就在這里。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià)

微信公眾號的兩種開(kāi)發(fā)模式你可能會(huì )有一個(gè)疑惑?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 104 次瀏覽 ? 2021-07-28 23:34 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號的兩種開(kāi)發(fā)模式你可能會(huì )有一個(gè)疑惑?
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  那么問(wèn)題來(lái)了。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià) 查看全部

  微信公眾號的兩種開(kāi)發(fā)模式你可能會(huì )有一個(gè)疑惑?
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  那么問(wèn)題來(lái)了。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià)

使用到的技術(shù):python3,微信公眾號的全部?jì)热莘治?/a>

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 94 次瀏覽 ? 2021-07-28 21:03 ? 來(lái)自相關(guān)話(huà)題

  使用到的技術(shù):python3,微信公眾號的全部?jì)热莘治?br />   使用的技術(shù):python3、selenium、requests
  最近接到一個(gè)新項目,需要爬取微信公眾號的數據。接下來(lái)就和大家分享一下
  筆者在網(wǎng)上也看到過(guò)使用**搜狗微信API來(lái)抓取數據,但是如果我想按照公眾號把它的文章全部抓取,發(fā)現不行
  
  它只有最近的文章,意思是我想把他的文章全部弄到手,但是不行(可能作者不合格,但是我沒(méi)找到。歡迎大家同學(xué)幫我改正)。如果你搜索文章,是這種
  
  比如我想爬取公眾號的所有文章,還是不行。
  還有使用抓包工具**來(lái)抓app的數據接口。這是可行的,但是抓包工具的配置和網(wǎng)頁(yè)數據接口的分析非常復雜,這里就不介紹了。
  接下來(lái)說(shuō)說(shuō)我的想法
  1.在微信公眾號平臺注冊一個(gè)賬號(注冊一個(gè)即可)
  
  然后點(diǎn)擊超鏈接,進(jìn)入公眾號,選擇顯示公眾號的所有文章信息,如圖
  
  
  好的,現在我們找到了數據,繼續進(jìn)行網(wǎng)絡(luò )分析
  2.分析網(wǎng)頁(yè)
  F12 調試
  
  這里我們可以觀(guān)察信息界面,分析這個(gè)json數據,可以看到鏈接收錄文章,鏈接,標題,時(shí)間等,所以,接下來(lái)添加代碼
  3.上代碼
  首先解決的是登錄問(wèn)題,我用selenium+chrome登錄,
  account_name = "賬號"
password = "密碼"
def wechat_login():
# 用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome()
driver.get("https://mp.weixin.qq.com/")
time.sleep(2)
print("正在輸入微信公眾號登錄賬號和密碼......")
# 清空賬號框中的內容
try:
driver.find_element_by_name("account").clear()
print("正在輸入微信公眾號登錄賬號和密碼......")
driver.find_element_by_name("account").send_keys(account_name)
time.sleep(1)
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys(password)
time.sleep(1)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
driver.find_element_by_class_name("frm_checkbox_label").click()
time.sleep(5)
# 自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_class_name("btn_login").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
except:
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
post = {}
# 獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
post[cookie_item[&#39;name&#39;]] = cookie_item[&#39;value&#39;]
cookie_str = json.dumps(post)
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print("cookies信息已保存到本地")
driver.quit()
  這里說(shuō)明一下,微信公眾號平臺的登錄界面可能不同。
  
  這是一種情況,就是直接掃碼登錄,另一種是
  
  用賬號登錄,所以登錄的時(shí)候多了一種情況,最后記得把網(wǎng)頁(yè)中的cookie信息保存在本地,用來(lái)爬取
  2.獲取具體的文章
  def get_content(query):
# query為要爬取的公眾號名稱(chēng)
# 公眾號主頁(yè)
url = &#39;https://mp.weixin.qq.com&#39;

# 設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}
from requests.packages import urllib3
urllib3.disable_warnings() # 關(guān)閉警告

# 讀取上一步獲取到的cookies
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
# 增加重試連接次數
session = requests.Session()
session.keep_alive = False
# 增加重試連接次數
session.adapters.DEFAULT_RETRIES = 511
time.sleep(5)

# 登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = session.get(url=url, cookies=cookies, verify=False)

token = re.findall(r&#39;token=(\d+)&#39;, str(response.url))[0]
time.sleep(2)
# 搜索微信公眾號的接口地址
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
# 搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;query&#39;: query,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;
}
# 打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = session.get(
search_url,
cookies=cookies,
headers=header,
params=query_id)
# 取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get(&#39;list&#39;)[0]
print(lists)
# 獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get(&#39;fakeid&#39;)

# 微信公眾號文章接口地址
appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
# 搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;, # 不同頁(yè),此參數變化,變化規則為每頁(yè)加5
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
# 打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = session.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
# 獲取文章總數
max_num = appmsg_response.json().get(&#39;app_msg_cnt&#39;)
# 每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
# 起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
seq = 0
while num + 1 > 0:
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;{}&#39;.format(str(begin)),
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
print(&#39;正在翻頁(yè):--------------&#39;, begin)
time.sleep(5)

# 獲取每一頁(yè)文章的標題和鏈接地址,并寫(xiě)入本地文本中
query_fakeid_response = requests.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
fakeid_list = query_fakeid_response.json().get(&#39;app_msg_list&#39;)
if fakeid_list:
for item in fakeid_list:
content_link = item.get(&#39;link&#39;)
content_title = item.get(&#39;title&#39;)
fileName = query + &#39;.txt&#39;
seq += 1
with open(fileName, &#39;a&#39;, encoding=&#39;utf-8&#39;) as fh:
fh.write(
str(seq) +
"|" +
content_title +
"|" +
content_link +
"\n")
num -= 1
begin = int(begin)
begin += 5
  好了朋友們,以上就是對微信公眾號全部?jì)热莸淖ト?,希望對大家有所幫助,歡迎各位大佬指正修改,共同學(xué)習進(jìn)步 查看全部

  使用到的技術(shù):python3,微信公眾號的全部?jì)热莘治?br />   使用的技術(shù):python3、selenium、requests
  最近接到一個(gè)新項目,需要爬取微信公眾號的數據。接下來(lái)就和大家分享一下
  筆者在網(wǎng)上也看到過(guò)使用**搜狗微信API來(lái)抓取數據,但是如果我想按照公眾號把它的文章全部抓取,發(fā)現不行
  
  它只有最近的文章,意思是我想把他的文章全部弄到手,但是不行(可能作者不合格,但是我沒(méi)找到。歡迎大家同學(xué)幫我改正)。如果你搜索文章,是這種
  
  比如我想爬取公眾號的所有文章,還是不行。
  還有使用抓包工具**來(lái)抓app的數據接口。這是可行的,但是抓包工具的配置和網(wǎng)頁(yè)數據接口的分析非常復雜,這里就不介紹了。
  接下來(lái)說(shuō)說(shuō)我的想法
  1.在微信公眾號平臺注冊一個(gè)賬號(注冊一個(gè)即可)
  
  然后點(diǎn)擊超鏈接,進(jìn)入公眾號,選擇顯示公眾號的所有文章信息,如圖
  
  
  好的,現在我們找到了數據,繼續進(jìn)行網(wǎng)絡(luò )分析
  2.分析網(wǎng)頁(yè)
  F12 調試
  
  這里我們可以觀(guān)察信息界面,分析這個(gè)json數據,可以看到鏈接收錄文章,鏈接,標題,時(shí)間等,所以,接下來(lái)添加代碼
  3.上代碼
  首先解決的是登錄問(wèn)題,我用selenium+chrome登錄,
  account_name = "賬號"
password = "密碼"
def wechat_login():
# 用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome()
driver.get("https://mp.weixin.qq.com/";)
time.sleep(2)
print("正在輸入微信公眾號登錄賬號和密碼......")
# 清空賬號框中的內容
try:
driver.find_element_by_name("account").clear()
print("正在輸入微信公眾號登錄賬號和密碼......")
driver.find_element_by_name("account").send_keys(account_name)
time.sleep(1)
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys(password)
time.sleep(1)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
driver.find_element_by_class_name("frm_checkbox_label").click()
time.sleep(5)
# 自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_class_name("btn_login").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
except:
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
post = {}
# 獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
post[cookie_item[&#39;name&#39;]] = cookie_item[&#39;value&#39;]
cookie_str = json.dumps(post)
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print("cookies信息已保存到本地")
driver.quit()
  這里說(shuō)明一下,微信公眾號平臺的登錄界面可能不同。
  
  這是一種情況,就是直接掃碼登錄,另一種是
  
  用賬號登錄,所以登錄的時(shí)候多了一種情況,最后記得把網(wǎng)頁(yè)中的cookie信息保存在本地,用來(lái)爬取
  2.獲取具體的文章
  def get_content(query):
# query為要爬取的公眾號名稱(chēng)
# 公眾號主頁(yè)
url = &#39;https://mp.weixin.qq.com&#39;

# 設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}
from requests.packages import urllib3
urllib3.disable_warnings() # 關(guān)閉警告

# 讀取上一步獲取到的cookies
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
# 增加重試連接次數
session = requests.Session()
session.keep_alive = False
# 增加重試連接次數
session.adapters.DEFAULT_RETRIES = 511
time.sleep(5)

# 登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = session.get(url=url, cookies=cookies, verify=False)

token = re.findall(r&#39;token=(\d+)&#39;, str(response.url))[0]
time.sleep(2)
# 搜索微信公眾號的接口地址
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
# 搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;query&#39;: query,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;
}
# 打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = session.get(
search_url,
cookies=cookies,
headers=header,
params=query_id)
# 取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get(&#39;list&#39;)[0]
print(lists)
# 獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get(&#39;fakeid&#39;)

# 微信公眾號文章接口地址
appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
# 搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;, # 不同頁(yè),此參數變化,變化規則為每頁(yè)加5
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
# 打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = session.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
# 獲取文章總數
max_num = appmsg_response.json().get(&#39;app_msg_cnt&#39;)
# 每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
# 起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
seq = 0
while num + 1 > 0:
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;{}&#39;.format(str(begin)),
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
print(&#39;正在翻頁(yè):--------------&#39;, begin)
time.sleep(5)

# 獲取每一頁(yè)文章的標題和鏈接地址,并寫(xiě)入本地文本中
query_fakeid_response = requests.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
fakeid_list = query_fakeid_response.json().get(&#39;app_msg_list&#39;)
if fakeid_list:
for item in fakeid_list:
content_link = item.get(&#39;link&#39;)
content_title = item.get(&#39;title&#39;)
fileName = query + &#39;.txt&#39;
seq += 1
with open(fileName, &#39;a&#39;, encoding=&#39;utf-8&#39;) as fh:
fh.write(
str(seq) +
"|" +
content_title +
"|" +
content_link +
"\n")
num -= 1
begin = int(begin)
begin += 5
  好了朋友們,以上就是對微信公眾號全部?jì)热莸淖ト?,希望對大家有所幫助,歡迎各位大佬指正修改,共同學(xué)習進(jìn)步

Python3.5+fiddler4 抓取微信公眾號點(diǎn)贊、閱讀、標題

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 92 次瀏覽 ? 2021-07-28 20:44 ? 來(lái)自相關(guān)話(huà)題

  Python3.5+fiddler4 抓取微信公眾號點(diǎn)贊、閱讀、標題
  代碼測試有效期至2019/03/08
  微信爬蟲(chóng)步驟:
  必需品:
  自有微信公眾號Fiddler抓包工具Python 3+版
  提琴手下載鏈接
  HTTP 代理工具也稱(chēng)為抓包工具。主流的抓包工具是Windows平臺的Fiddler,macOS平臺的Charles,阿里開(kāi)源了一個(gè)叫AnyProxy的工具。它們的基本原理是相似的,就是通過(guò)在移動(dòng)客戶(hù)端上設置代理IP和端口,所有來(lái)自客戶(hù)端的HTTP和HTTPS請求都會(huì )經(jīng)過(guò)代理工具,每個(gè)請求都可以在代理工具中清晰的看到。然后可以分析詳細信息以找出每個(gè)請求的構造方式。搞清楚這些之后,我們就可以用Python來(lái)模擬發(fā)起請求了,然后就可以得到我們想要的數據了。
  安裝包超過(guò)4M。配置前,首先確保您的手機和電腦在同一個(gè)局域網(wǎng)內。如果不在同一個(gè)局域網(wǎng)內,可以購買(mǎi)便攜式WiFi,在電腦上搭建一個(gè)極簡(jiǎn)的無(wú)線(xiàn)路由器。一路點(diǎn)擊下一步完成安裝過(guò)程。
  Fiddler 配置選擇工具> Fiddler 選項> 連接 Fiddler 的默認端口為8888,如果該端口已經(jīng)被其他程序占用,需要手動(dòng)更改,勾選允許遠程計算機連接,其他選項即可。 , 配置更新后記得重啟Fiddler。一定要重啟Fiddler,否則代理將失效。 .接下來(lái)需要配置手機,但是這里微信有pc客戶(hù)端,所以不需要配置手機
  現在打開(kāi)微信,隨機選擇一個(gè)公眾號,進(jìn)入公眾號的【查看歷史信息】
  同時(shí)觀(guān)察 Fiddler 的主面板。當微信從公眾號介紹頁(yè)面進(jìn)入歷史消息頁(yè)面時(shí),已經(jīng)可以在Fiddler上看到請求進(jìn)來(lái)了。這些請求是微信APP向服務(wù)器發(fā)送的請求?,F在簡(jiǎn)單介紹一下這個(gè)請求面板上各個(gè)模塊的含義。
  
  我將上面的主面板分成了 7 個(gè)塊。需要了解每個(gè)區塊的內容,然后才可以使用Python代碼模擬微信請求。 1、服務(wù)器響應結果,200表示服務(wù)器成功響應了2、請求協(xié)議,微信請求協(xié)議是基于HTTPS的,所以之前一定要配置好,否則看不到HTTPS請求。 3、微信服務(wù)器主機名4、請求路徑5、請求行,包括請求方法(GET)、請求協(xié)議(HTTP/1.1)、請求路徑(/mp/profile_ext...)一長(cháng)串參數)6、收錄cookie信息的請求頭。7、微信服務(wù)器返回的響應數據,我們切換到TextView和WebView看看返回的數據是什么樣子的。
  TextView模式下的預覽效果為服務(wù)器返回的HTML源代碼
  
  WebView 模式是 HTML 代碼的渲染效果。其實(shí)就是我們在手機微信上看到的效果,但是因為風(fēng)格欠缺,在手機上沒(méi)有看到美化效果。
  
  如果服務(wù)器返回的是Json格式或者XML,也可以切換到對應的頁(yè)面進(jìn)行預覽查看。
  開(kāi)始抓?。?br />   1、擁有微信公眾號
  登錄微信公眾號,在菜單欄:素材管理—>新建素材,出現如下頁(yè)面
  
  F12查看網(wǎng)絡(luò ),點(diǎn)擊圖中位置
  
  公眾號和user-Agent的cookies如下
  
  Fakeid和token獲取如下: 查看全部

  Python3.5+fiddler4 抓取微信公眾號點(diǎn)贊、閱讀、標題
  代碼測試有效期至2019/03/08
  微信爬蟲(chóng)步驟:
  必需品:
  自有微信公眾號Fiddler抓包工具Python 3+版
  提琴手下載鏈接
  HTTP 代理工具也稱(chēng)為抓包工具。主流的抓包工具是Windows平臺的Fiddler,macOS平臺的Charles,阿里開(kāi)源了一個(gè)叫AnyProxy的工具。它們的基本原理是相似的,就是通過(guò)在移動(dòng)客戶(hù)端上設置代理IP和端口,所有來(lái)自客戶(hù)端的HTTP和HTTPS請求都會(huì )經(jīng)過(guò)代理工具,每個(gè)請求都可以在代理工具中清晰的看到。然后可以分析詳細信息以找出每個(gè)請求的構造方式。搞清楚這些之后,我們就可以用Python來(lái)模擬發(fā)起請求了,然后就可以得到我們想要的數據了。
  安裝包超過(guò)4M。配置前,首先確保您的手機和電腦在同一個(gè)局域網(wǎng)內。如果不在同一個(gè)局域網(wǎng)內,可以購買(mǎi)便攜式WiFi,在電腦上搭建一個(gè)極簡(jiǎn)的無(wú)線(xiàn)路由器。一路點(diǎn)擊下一步完成安裝過(guò)程。
  Fiddler 配置選擇工具> Fiddler 選項> 連接 Fiddler 的默認端口為8888,如果該端口已經(jīng)被其他程序占用,需要手動(dòng)更改,勾選允許遠程計算機連接,其他選項即可。 , 配置更新后記得重啟Fiddler。一定要重啟Fiddler,否則代理將失效。 .接下來(lái)需要配置手機,但是這里微信有pc客戶(hù)端,所以不需要配置手機
  現在打開(kāi)微信,隨機選擇一個(gè)公眾號,進(jìn)入公眾號的【查看歷史信息】
  同時(shí)觀(guān)察 Fiddler 的主面板。當微信從公眾號介紹頁(yè)面進(jìn)入歷史消息頁(yè)面時(shí),已經(jīng)可以在Fiddler上看到請求進(jìn)來(lái)了。這些請求是微信APP向服務(wù)器發(fā)送的請求?,F在簡(jiǎn)單介紹一下這個(gè)請求面板上各個(gè)模塊的含義。
  
  我將上面的主面板分成了 7 個(gè)塊。需要了解每個(gè)區塊的內容,然后才可以使用Python代碼模擬微信請求。 1、服務(wù)器響應結果,200表示服務(wù)器成功響應了2、請求協(xié)議,微信請求協(xié)議是基于HTTPS的,所以之前一定要配置好,否則看不到HTTPS請求。 3、微信服務(wù)器主機名4、請求路徑5、請求行,包括請求方法(GET)、請求協(xié)議(HTTP/1.1)、請求路徑(/mp/profile_ext...)一長(cháng)串參數)6、收錄cookie信息的請求頭。7、微信服務(wù)器返回的響應數據,我們切換到TextView和WebView看看返回的數據是什么樣子的。
  TextView模式下的預覽效果為服務(wù)器返回的HTML源代碼
  
  WebView 模式是 HTML 代碼的渲染效果。其實(shí)就是我們在手機微信上看到的效果,但是因為風(fēng)格欠缺,在手機上沒(méi)有看到美化效果。
  
  如果服務(wù)器返回的是Json格式或者XML,也可以切換到對應的頁(yè)面進(jìn)行預覽查看。
  開(kāi)始抓?。?br />   1、擁有微信公眾號
  登錄微信公眾號,在菜單欄:素材管理—>新建素材,出現如下頁(yè)面
  
  F12查看網(wǎng)絡(luò ),點(diǎn)擊圖中位置
  
  公眾號和user-Agent的cookies如下
  
  Fakeid和token獲取如下:

微信PC端解鎖新功能搜索更方便微信生態(tài)內容觸手可達

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 91 次瀏覽 ? 2021-07-28 07:54 ? 來(lái)自相關(guān)話(huà)題

  
微信PC端解鎖新功能搜索更方便微信生態(tài)內容觸手可達
  
  記者從騰訊獲悉,PC端微信搜一搜近日迎來(lái)迭代更新,提供更豐富的搜索入口和更多樣化的搜索內容。 Windows版微信更新為3.3.0后,用戶(hù)可以通過(guò)對話(huà)、文章指尖搜索、對話(huà)、朋友圈#hyperlinks更快速地進(jìn)行搜索。
  同時(shí),PC端微信搜索在搜索文章的基礎上,增加了對公眾號、小程序、新聞、表情、朋友圈、視頻等微信生態(tài)內容搜索的支持。用戶(hù)只需選擇相關(guān)詞表右鍵即可搜索微信生態(tài)中的各類(lèi)優(yōu)質(zhì)內容,極大滿(mǎn)足用戶(hù)在工作、學(xué)習等多種搜索場(chǎng)景下的需求。
  
  微信PC端解鎖新功能
  搜索更便捷,微信生態(tài)內容觸手可及
  Windows版微信更新為3.3.0后,PC端微信搜索支持會(huì )話(huà)、文章指尖搜索、會(huì )話(huà)、朋友圈#超鏈接搜索等多種能力,為用戶(hù)提供更豐富的搜索條目。在PC端微信頂部,點(diǎn)擊搜索框進(jìn)入微信搜索,大大提高了用戶(hù)在PC端搜索的便利性。
  現在微信對話(huà)界面和公眾號文章瀏覽界面都支持文本選擇搜索。用戶(hù)可以快速查找和理解聊天中出現的專(zhuān)有名詞、網(wǎng)絡(luò )熱點(diǎn)和外語(yǔ)詞。在瀏覽公眾號文章時(shí),還可以輕松選擇產(chǎn)品名稱(chēng),快速找到更多相關(guān)評價(jià)和用戶(hù)體驗。您還可以快速選詞搜索定義,了解更多信息,提高閱讀效率。 查看全部

  
微信PC端解鎖新功能搜索更方便微信生態(tài)內容觸手可達
  
  記者從騰訊獲悉,PC端微信搜一搜近日迎來(lái)迭代更新,提供更豐富的搜索入口和更多樣化的搜索內容。 Windows版微信更新為3.3.0后,用戶(hù)可以通過(guò)對話(huà)、文章指尖搜索、對話(huà)、朋友圈#hyperlinks更快速地進(jìn)行搜索。
  同時(shí),PC端微信搜索在搜索文章的基礎上,增加了對公眾號、小程序、新聞、表情、朋友圈、視頻等微信生態(tài)內容搜索的支持。用戶(hù)只需選擇相關(guān)詞表右鍵即可搜索微信生態(tài)中的各類(lèi)優(yōu)質(zhì)內容,極大滿(mǎn)足用戶(hù)在工作、學(xué)習等多種搜索場(chǎng)景下的需求。
  
  微信PC端解鎖新功能
  搜索更便捷,微信生態(tài)內容觸手可及
  Windows版微信更新為3.3.0后,PC端微信搜索支持會(huì )話(huà)、文章指尖搜索、會(huì )話(huà)、朋友圈#超鏈接搜索等多種能力,為用戶(hù)提供更豐富的搜索條目。在PC端微信頂部,點(diǎn)擊搜索框進(jìn)入微信搜索,大大提高了用戶(hù)在PC端搜索的便利性。
  現在微信對話(huà)界面和公眾號文章瀏覽界面都支持文本選擇搜索。用戶(hù)可以快速查找和理解聊天中出現的專(zhuān)有名詞、網(wǎng)絡(luò )熱點(diǎn)和外語(yǔ)詞。在瀏覽公眾號文章時(shí),還可以輕松選擇產(chǎn)品名稱(chēng),快速找到更多相關(guān)評價(jià)和用戶(hù)體驗。您還可以快速選詞搜索定義,了解更多信息,提高閱讀效率。

微信公眾號后臺編輯素材界面的原理和原理

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 119 次瀏覽 ? 2021-07-26 22:05 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號后臺編輯素材界面的原理和原理
  準備階段
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  fig1 正式啟動(dòng)
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  圖2
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  圖3
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  圖4
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  圖5
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requestsurl = "https://mp.weixin.qq.com/cgi-b ... s.get(url).json() # {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agentimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  ?
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  ?
  
  圖 6 ?
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  ?
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import jsonimport requestsimport timeimport randomimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }# 請求參數url = "https://mp.weixin.qq.com/cgi-bin/appmsg"begin = "0"params = { "action": "list_ex", "begin": begin, "count": "5", "fakeid": config[&#39;fakeid&#39;], "type": "9", "token": config[&#39;token&#39;], "lang": "zh_CN", "f": "json", "ajax": "1"}# 存放結果app_msg_list = []# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句# 也方便重新運行時(shí)設置頁(yè)數i = 0while True: begin = i * 5 params["begin"] = str(begin) # 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到 time.sleep(random.randint(1,10)) resp = requests.get(url, headers=headers, params = params, verify=False) # 微信流量控制, 退出 if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013: print("frequencey control, stop at {}".format(str(begin))) break # 如果返回的內容中為空則結束 if len(resp.json()[&#39;app_msg_list&#39;]) == 0: print("all ariticle parsed") break app_msg_list.append(resp.json()) # 翻頁(yè) i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  圖7
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  圖8
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,你可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,或者你可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSONjson_name = "mp_data_{}.json".format(str(begin))with open(json_name, "w") as file: file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []for msg in app_msg_list: if "app_msg_list" in msg: for item in msg["app_msg_list"]: info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;])) info_list.append(info)# save as csvwith open("app_msg_list.csv", "w") as file: file.writelines("\n".join(info_list)) 查看全部

  微信公眾號后臺編輯素材界面的原理和原理
  準備階段
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  fig1 正式啟動(dòng)
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  圖2
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  圖3
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  圖4
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  圖5
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requestsurl = "https://mp.weixin.qq.com/cgi-b ... s.get(url).json() # {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agentimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  ?
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  ?
  
  圖 6 ?
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  ?
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import jsonimport requestsimport timeimport randomimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }# 請求參數url = "https://mp.weixin.qq.com/cgi-bin/appmsg"begin = "0"params = { "action": "list_ex", "begin": begin, "count": "5", "fakeid": config[&#39;fakeid&#39;], "type": "9", "token": config[&#39;token&#39;], "lang": "zh_CN", "f": "json", "ajax": "1"}# 存放結果app_msg_list = []# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句# 也方便重新運行時(shí)設置頁(yè)數i = 0while True: begin = i * 5 params["begin"] = str(begin) # 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到 time.sleep(random.randint(1,10)) resp = requests.get(url, headers=headers, params = params, verify=False) # 微信流量控制, 退出 if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013: print("frequencey control, stop at {}".format(str(begin))) break # 如果返回的內容中為空則結束 if len(resp.json()[&#39;app_msg_list&#39;]) == 0: print("all ariticle parsed") break app_msg_list.append(resp.json()) # 翻頁(yè) i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  圖7
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  圖8
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,你可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,或者你可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSONjson_name = "mp_data_{}.json".format(str(begin))with open(json_name, "w") as file: file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []for msg in app_msg_list: if "app_msg_list" in msg: for item in msg["app_msg_list"]: info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;])) info_list.append(info)# save as csvwith open("app_msg_list.csv", "w") as file: file.writelines("\n".join(info_list))

分詞采集微信公眾號文章分析用料清單的基本步驟采集

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 162 次瀏覽 ? 2021-07-25 18:06 ? 來(lái)自相關(guān)話(huà)題

  分詞采集微信公眾號文章分析用料清單的基本步驟采集
  querylist采集微信公眾號文章詳情頁(yè)分詞檢索文本分析用料清單的基本步驟1.web上獲取,每條微信文章url,用http請求的方式抓取微信公眾號關(guān)注鏈接的抓取方式,見(jiàn):百度url抓取方式。2.主程序代碼寫(xiě)法定義querylist,用于存放爬取的文章url。主要步驟node.js最小堆實(shí)現。querylist定義:。
  謝邀,這個(gè)問(wèn)題我已經(jīng)解決了,簡(jiǎn)單總結一下,你所需要準備的有:1。這個(gè)querylist用你自己的語(yǔ)言做出來(lái)2。相應的一種字符串類(lèi)型,如{"title":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"},分別放不同的字符串類(lèi)型3。要爬取的數據表達式4。
  結構體的設計(哈希,鏈表),以便最小程度保存數據。node。js寫(xiě)代碼#//-st-ilwearf051ijzee9zowscp9cc45c1v1gs0={"name":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"}packagemainimport("fmt""math""dom""site")functionmake_new_scheduler(initial_querylist){//initial_querylist可任意可參考文檔,非必需varlines=[];varindex=initial_querylist。
<p>length;varpath="{"+site。meta。path;varfirst_line="{"+site。meta。content;varlast_line="{"+site。meta。content;varformat="{"+path。length+1;varsize=1000000;}";for(varpage=index;page 查看全部

  分詞采集微信公眾號文章分析用料清單的基本步驟采集
  querylist采集微信公眾號文章詳情頁(yè)分詞檢索文本分析用料清單的基本步驟1.web上獲取,每條微信文章url,用http請求的方式抓取微信公眾號關(guān)注鏈接的抓取方式,見(jiàn):百度url抓取方式。2.主程序代碼寫(xiě)法定義querylist,用于存放爬取的文章url。主要步驟node.js最小堆實(shí)現。querylist定義:。
  謝邀,這個(gè)問(wèn)題我已經(jīng)解決了,簡(jiǎn)單總結一下,你所需要準備的有:1。這個(gè)querylist用你自己的語(yǔ)言做出來(lái)2。相應的一種字符串類(lèi)型,如{"title":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"},分別放不同的字符串類(lèi)型3。要爬取的數據表達式4。
  結構體的設計(哈希,鏈表),以便最小程度保存數據。node。js寫(xiě)代碼#//-st-ilwearf051ijzee9zowscp9cc45c1v1gs0={"name":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"}packagemainimport("fmt""math""dom""site")functionmake_new_scheduler(initial_querylist){//initial_querylist可任意可參考文檔,非必需varlines=[];varindex=initial_querylist。
<p>length;varpath="{"+site。meta。path;varfirst_line="{"+site。meta。content;varlast_line="{"+site。meta。content;varformat="{"+path。length+1;varsize=1000000;}";for(varpage=index;page

獲取微信公眾號文章的方法,你get到了嗎?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 157 次瀏覽 ? 2021-07-25 06:33 ? 來(lái)自相關(guān)話(huà)題

  
獲取微信公眾號文章的方法,你get到了嗎?
  通過(guò)微信公眾平臺獲取公眾號文章的示例
  之前是自己維護一個(gè)公眾號,但是因為個(gè)人關(guān)系好久沒(méi)有更新,今天上來(lái)想起來(lái),卻偶然發(fā)現了微信公眾號文章的獲取方式。
  之前有很多獲取方式,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不是很好,但是操作簡(jiǎn)單易懂。
  所以,首先你要有一個(gè)微信公眾平臺帳號
  微信公眾平臺:
  
  登錄后,進(jìn)入首頁(yè),點(diǎn)擊新建群發(fā)。
  
  選擇自創(chuàng )圖形和文字:
  
  好像是公眾號操作教學(xué)
  進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接
  
  彈出一個(gè)選擇框,我們在框中輸入對應的公眾號,就會(huì )出現對應的文章列表
  
  你感到驚訝嗎?可以打開(kāi)控制臺查看請求的接口
  
  打開(kāi)回復,有我們需要的文章鏈接
  
  確認數據后,我們需要分析這個(gè)界面。
  感覺(jué)很簡(jiǎn)單。 GET 請求攜帶一些參數。
  
  Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。
  我們輸入公眾號后,點(diǎn)擊搜索??梢钥吹剿阉鹘缑姹挥|發(fā),返回fakeid。
  
  這個(gè)接口需要的參數不多。
  
  接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。
  但您還需要使用現有的 cookie 來(lái)避免登錄。
  
  目前我還沒(méi)有測試cookies的有效期??赡苄枰皶r(shí)更新 cookie。
  測試代碼:
  
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  這樣可以得到最新的10篇文章。如果想獲得更多的歷史文章,可以修改數據中的“begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(以此類(lèi)推)
  但如果你想大規模爬行:
  請自己安排一個(gè)穩定的代理,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被屏蔽的可能性。
  以上是本文的全部?jì)热?。希望對大家的學(xué)習有所幫助,也希望大家多多支持。
  時(shí)間:2019-12-23
  如何訪(fǎng)問(wèn)微信小程序公眾號文章
  
  前言隨著(zhù)小程序的不斷發(fā)展,現在個(gè)人小程序已經(jīng)開(kāi)通了很多功能,個(gè)人小程序直接打開(kāi)公眾號鏈接。群里看到的一個(gè)小程序,點(diǎn)擊直接閱讀文章了,所以琢磨了一下,寫(xiě)了一些源碼。主要代碼:
  python爬取微信公眾號文章的方法
  
  最近學(xué)習了Python3網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)踐(崔慶才),剛剛了解到他這里使用代理爬取了公眾號文章這里,但是根據他的代碼,出現了一些問(wèn)題。這里我用了這本書(shū)前面提到的一些內容進(jìn)行了改進(jìn)。 (這個(gè)代碼作者半年前寫(xiě)的,但騰訊的網(wǎng)站半年前更新了)下面我直接上傳代碼:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
  使用anyproxy提高公眾號文章采集的效率
  
  主要影響因素如下:1.網(wǎng)絡(luò )環(huán)境差:2.微信客戶(hù)端手機或模擬器崩潰:3.其他網(wǎng)絡(luò )傳輸錯誤:因為我看重采集system 這個(gè)成本包括硬件投資、算力投資和人力占用。所以必須提高操作的穩定性。因此,如果采集中斷,人工能量的成本必然會(huì )增加。所以針對這一點(diǎn),我對 anyproxy 做了一些高級的改造,并利用其他工具來(lái)提高運行效率。以下是具體解決方法:一.code upgrade1)微信 瀏覽器白屏解決方法:修改文件requestHandler.js,或者在rule_default中
  python下載微信公眾號相關(guān)文章
  
  本文示例分享python下載微信公眾號文章的具體代碼,供大家參考。具體內容如下: 從零開(kāi)始學(xué)自動(dòng)化測試,從公眾號1.下載一系列文檔1.搜索微信文章Keyword search2.解析搜索結果的前N頁(yè)為獲取文章titles和對應的url,主要使用Beautifulsoup Weixin.py import requests from urllib.parse import quote in requests和bs4 from bs4 import BeautifulSoup im
  Python抓取指定的微信公眾號文章
  本文示例分享了python爬取微信公眾號文章的具體代碼,供大家參考。具體內容如下。此方法依賴(lài)于 urllib2 庫。首先,你需要安裝你的python環(huán)境。然后安裝urllib2庫程序的啟動(dòng)方法(返回值為公眾號文章list): def openUrl(): print("啟動(dòng)爬蟲(chóng),打開(kāi)搜狗搜索微信界面") #加載頁(yè)面url =' ;s_from=input&query=要爬取的公眾號
  python采集微信公號文章
  
  本文示例分享了python采集微信公號文章的具體代碼,供大家參考。具體內容如下。在python的一個(gè)子目錄下保存2個(gè)文件,分別是:采集公號文章.py和config.py。代碼如下:1.采集公號文章.py from urllib.parse import urlencode import pymongo import requests from lxml.etree import XMLSyntaxError from requests.exceptions import Connec
  python搶搜狗微信公眾號文章
  
<p>初學(xué)者學(xué)習python,抓取搜狗微信公眾號文章保存到mysql mysql表中:代碼:import requests import json import re import pymysql #創(chuàng )建連接conn = pymysql.connect(host='your database address', port =port, user='user name', passwd='password', db='database name', charset='utf8') # 創(chuàng )建一個(gè)游標 cursor = conn.cursor() cursor.execute("sel 查看全部

  
獲取微信公眾號文章的方法,你get到了嗎?
  通過(guò)微信公眾平臺獲取公眾號文章的示例
  之前是自己維護一個(gè)公眾號,但是因為個(gè)人關(guān)系好久沒(méi)有更新,今天上來(lái)想起來(lái),卻偶然發(fā)現了微信公眾號文章的獲取方式。
  之前有很多獲取方式,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不是很好,但是操作簡(jiǎn)單易懂。
  所以,首先你要有一個(gè)微信公眾平臺帳號
  微信公眾平臺:
  
  登錄后,進(jìn)入首頁(yè),點(diǎn)擊新建群發(fā)。
  
  選擇自創(chuàng )圖形和文字:
  
  好像是公眾號操作教學(xué)
  進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接
  
  彈出一個(gè)選擇框,我們在框中輸入對應的公眾號,就會(huì )出現對應的文章列表
  
  你感到驚訝嗎?可以打開(kāi)控制臺查看請求的接口
  
  打開(kāi)回復,有我們需要的文章鏈接
  
  確認數據后,我們需要分析這個(gè)界面。
  感覺(jué)很簡(jiǎn)單。 GET 請求攜帶一些參數。
  
  Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。
  我們輸入公眾號后,點(diǎn)擊搜索??梢钥吹剿阉鹘缑姹挥|發(fā),返回fakeid。
  
  這個(gè)接口需要的參數不多。
  
  接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。
  但您還需要使用現有的 cookie 來(lái)避免登錄。
  
  目前我還沒(méi)有測試cookies的有效期??赡苄枰皶r(shí)更新 cookie。
  測試代碼:
  
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  這樣可以得到最新的10篇文章。如果想獲得更多的歷史文章,可以修改數據中的“begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(以此類(lèi)推)
  但如果你想大規模爬行:
  請自己安排一個(gè)穩定的代理,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被屏蔽的可能性。
  以上是本文的全部?jì)热?。希望對大家的學(xué)習有所幫助,也希望大家多多支持。
  時(shí)間:2019-12-23
  如何訪(fǎng)問(wèn)微信小程序公眾號文章
  
  前言隨著(zhù)小程序的不斷發(fā)展,現在個(gè)人小程序已經(jīng)開(kāi)通了很多功能,個(gè)人小程序直接打開(kāi)公眾號鏈接。群里看到的一個(gè)小程序,點(diǎn)擊直接閱讀文章了,所以琢磨了一下,寫(xiě)了一些源碼。主要代碼:
  python爬取微信公眾號文章的方法
  
  最近學(xué)習了Python3網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)踐(崔慶才),剛剛了解到他這里使用代理爬取了公眾號文章這里,但是根據他的代碼,出現了一些問(wèn)題。這里我用了這本書(shū)前面提到的一些內容進(jìn)行了改進(jìn)。 (這個(gè)代碼作者半年前寫(xiě)的,但騰訊的網(wǎng)站半年前更新了)下面我直接上傳代碼:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
  使用anyproxy提高公眾號文章采集的效率
  
  主要影響因素如下:1.網(wǎng)絡(luò )環(huán)境差:2.微信客戶(hù)端手機或模擬器崩潰:3.其他網(wǎng)絡(luò )傳輸錯誤:因為我看重采集system 這個(gè)成本包括硬件投資、算力投資和人力占用。所以必須提高操作的穩定性。因此,如果采集中斷,人工能量的成本必然會(huì )增加。所以針對這一點(diǎn),我對 anyproxy 做了一些高級的改造,并利用其他工具來(lái)提高運行效率。以下是具體解決方法:一.code upgrade1)微信 瀏覽器白屏解決方法:修改文件requestHandler.js,或者在rule_default中
  python下載微信公眾號相關(guān)文章
  
  本文示例分享python下載微信公眾號文章的具體代碼,供大家參考。具體內容如下: 從零開(kāi)始學(xué)自動(dòng)化測試,從公眾號1.下載一系列文檔1.搜索微信文章Keyword search2.解析搜索結果的前N頁(yè)為獲取文章titles和對應的url,主要使用Beautifulsoup Weixin.py import requests from urllib.parse import quote in requests和bs4 from bs4 import BeautifulSoup im
  Python抓取指定的微信公眾號文章
  本文示例分享了python爬取微信公眾號文章的具體代碼,供大家參考。具體內容如下。此方法依賴(lài)于 urllib2 庫。首先,你需要安裝你的python環(huán)境。然后安裝urllib2庫程序的啟動(dòng)方法(返回值為公眾號文章list): def openUrl(): print("啟動(dòng)爬蟲(chóng),打開(kāi)搜狗搜索微信界面") #加載頁(yè)面url =' ;s_from=input&query=要爬取的公眾號
  python采集微信公號文章
  
  本文示例分享了python采集微信公號文章的具體代碼,供大家參考。具體內容如下。在python的一個(gè)子目錄下保存2個(gè)文件,分別是:采集公號文章.py和config.py。代碼如下:1.采集公號文章.py from urllib.parse import urlencode import pymongo import requests from lxml.etree import XMLSyntaxError from requests.exceptions import Connec
  python搶搜狗微信公眾號文章
  
<p>初學(xué)者學(xué)習python,抓取搜狗微信公眾號文章保存到mysql mysql表中:代碼:import requests import json import re import pymysql #創(chuàng )建連接conn = pymysql.connect(host='your database address', port =port, user='user name', passwd='password', db='database name', charset='utf8') # 創(chuàng )建一個(gè)游標 cursor = conn.cursor() cursor.execute("sel

文章自動(dòng)更新,推送給微信服務(wù)器,送給客戶(hù)端

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 92 次瀏覽 ? 2021-07-24 06:02 ? 來(lái)自相關(guān)話(huà)題

  文章自動(dòng)更新,推送給微信服務(wù)器,送給客戶(hù)端
  querylist采集微信公眾號文章、個(gè)人公眾號文章、個(gè)人微信公眾號文章、微信原生導入的文章等,經(jīng)過(guò)用戶(hù)的有效提問(wèn),文章自動(dòng)更新,推送給微信服務(wù)器,并通過(guò)第三方推送服務(wù)將文章推送給客戶(hù)端。querylist插件詳細信息:1.修改你的submit用戶(hù)名:你是否設置了用戶(hù)名為“昵稱(chēng)”而不是“賬號”?例如,你在guest用戶(hù)下設置用戶(hù)名為“莉莉”,對應文章將自動(dòng)更新到list中;當用戶(hù)不需要登錄才能進(jìn)行查看時(shí),你可以修改用戶(hù)名:xiaomi2.刪除網(wǎng)頁(yè)中現存的公眾號文章、個(gè)人微信公眾號文章:如果公眾號和個(gè)人公眾號已有不需要的文章,你可以刪除現有的文章到文件://需要全選你需要引入querylist插件的文章,可以通過(guò)excel快速選擇目標文章3.刪除網(wǎng)頁(yè)中的子域名和老域名:當公眾號和個(gè)人公眾號文章的網(wǎng)址中都包含.com、.php時(shí),需要設置你的目標域名。
  老域名是你要刪除的,如果你忘記了,可以使用ipcss中的查看。4.使用多個(gè)post發(fā)送到多個(gè)微信公眾號:你可以安排多個(gè)長(cháng)期/短期post發(fā)送到多個(gè)微信公眾號中去,實(shí)現一次性多渠道發(fā)送。5.完成頁(yè)面輸出設置之后你可以通過(guò)querylist在本地查看和編輯你制作的rss源碼:6.querylist實(shí)時(shí)查看微信服務(wù)器推送的文章信息,方便你配置微信客戶(hù)端。
  7.對于1,2,3不滿(mǎn)足的你,querylist還有詳細的指導,你可以添加第三方推送服務(wù)://讓第三方推送服務(wù)來(lái)幫你推送文章、參考鏈接建議刪除自己的個(gè)人微信公眾號rss發(fā)送到你的guest公眾號:xiaomi)刪除文章到文件:xiaomiipcss地址:ipcssguyge/ipcssguyge.excel您可以將所有的guest的文章保存到某個(gè)wordpress目錄下:xiaomi到的網(wǎng)址:/@vuerno/gh000-ipcssquerylist的用法:導入插件->右擊選擇:settings|extensions|rss。 查看全部

  文章自動(dòng)更新,推送給微信服務(wù)器,送給客戶(hù)端
  querylist采集微信公眾號文章、個(gè)人公眾號文章、個(gè)人微信公眾號文章、微信原生導入的文章等,經(jīng)過(guò)用戶(hù)的有效提問(wèn),文章自動(dòng)更新,推送給微信服務(wù)器,并通過(guò)第三方推送服務(wù)將文章推送給客戶(hù)端。querylist插件詳細信息:1.修改你的submit用戶(hù)名:你是否設置了用戶(hù)名為“昵稱(chēng)”而不是“賬號”?例如,你在guest用戶(hù)下設置用戶(hù)名為“莉莉”,對應文章將自動(dòng)更新到list中;當用戶(hù)不需要登錄才能進(jìn)行查看時(shí),你可以修改用戶(hù)名:xiaomi2.刪除網(wǎng)頁(yè)中現存的公眾號文章、個(gè)人微信公眾號文章:如果公眾號和個(gè)人公眾號已有不需要的文章,你可以刪除現有的文章到文件://需要全選你需要引入querylist插件的文章,可以通過(guò)excel快速選擇目標文章3.刪除網(wǎng)頁(yè)中的子域名和老域名:當公眾號和個(gè)人公眾號文章的網(wǎng)址中都包含.com、.php時(shí),需要設置你的目標域名。
  老域名是你要刪除的,如果你忘記了,可以使用ipcss中的查看。4.使用多個(gè)post發(fā)送到多個(gè)微信公眾號:你可以安排多個(gè)長(cháng)期/短期post發(fā)送到多個(gè)微信公眾號中去,實(shí)現一次性多渠道發(fā)送。5.完成頁(yè)面輸出設置之后你可以通過(guò)querylist在本地查看和編輯你制作的rss源碼:6.querylist實(shí)時(shí)查看微信服務(wù)器推送的文章信息,方便你配置微信客戶(hù)端。
  7.對于1,2,3不滿(mǎn)足的你,querylist還有詳細的指導,你可以添加第三方推送服務(wù)://讓第三方推送服務(wù)來(lái)幫你推送文章、參考鏈接建議刪除自己的個(gè)人微信公眾號rss發(fā)送到你的guest公眾號:xiaomi)刪除文章到文件:xiaomiipcss地址:ipcssguyge/ipcssguyge.excel您可以將所有的guest的文章保存到某個(gè)wordpress目錄下:xiaomi到的網(wǎng)址:/@vuerno/gh000-ipcssquerylist的用法:導入插件->右擊選擇:settings|extensions|rss。

querylist采集微信公眾號文章進(jìn)行二次加工后得到的

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 156 次瀏覽 ? 2021-07-24 03:02 ? 來(lái)自相關(guān)話(huà)題

  querylist采集微信公眾號文章進(jìn)行二次加工后得到的
  querylist采集微信公眾號文章并且進(jìn)行二次加工后得到的。比如文章的標題,鏈接,圖片等等。
  python。在微信中搜索公眾號,然后找到自己公眾號的文章。不需要下載,
  不知道你是想爬什么類(lèi)型的公眾號,因為每個(gè)公眾號自己的公眾號主頁(yè)有自己的爬取接口,有的是只能爬本地的,有的是只支持本地文件的提取。
  你可以這樣,登錄原公眾號,然后在分析選項里面選擇爬蟲(chóng)。
  還是建議爬一個(gè)的
  要么自己構建網(wǎng)站,要么用爬蟲(chóng)軟件,如scrapy或python寫(xiě)一個(gè)能爬取微信公眾號的小爬蟲(chóng),
  用python從一個(gè)公眾號文章抓取并上傳到千牛上給別人,然后再由別人去爬取微信公眾號的文章,
  你說(shuō)的這個(gè)簡(jiǎn)單來(lái)說(shuō)就是爬蟲(chóng),現在應該有公司提供這種服務(wù),
<p>爬蟲(chóng),不管是用flask也好用python也好。還是別的什么如果上傳不能成功上傳的話(huà),可以看下我做的服務(wù),中間上傳失敗多次后就是用本地目錄下的文件夾,一路敲一路寫(xiě)就可以了~微信掃一掃就可以。但是有一個(gè)問(wèn)題,你可以想象中如果人們都愛(ài)你不需要二維碼,你就用這種形式獲取了,如果你有很多很多二維碼,你會(huì )哭的。想了解我的爬蟲(chóng)服務(wù)的同學(xué),可以留言~如果對您有幫助,歡迎收藏點(diǎn)贊(?> 查看全部

  querylist采集微信公眾號文章進(jìn)行二次加工后得到的
  querylist采集微信公眾號文章并且進(jìn)行二次加工后得到的。比如文章的標題,鏈接,圖片等等。
  python。在微信中搜索公眾號,然后找到自己公眾號的文章。不需要下載,
  不知道你是想爬什么類(lèi)型的公眾號,因為每個(gè)公眾號自己的公眾號主頁(yè)有自己的爬取接口,有的是只能爬本地的,有的是只支持本地文件的提取。
  你可以這樣,登錄原公眾號,然后在分析選項里面選擇爬蟲(chóng)。
  還是建議爬一個(gè)的
  要么自己構建網(wǎng)站,要么用爬蟲(chóng)軟件,如scrapy或python寫(xiě)一個(gè)能爬取微信公眾號的小爬蟲(chóng),
  用python從一個(gè)公眾號文章抓取并上傳到千牛上給別人,然后再由別人去爬取微信公眾號的文章,
  你說(shuō)的這個(gè)簡(jiǎn)單來(lái)說(shuō)就是爬蟲(chóng),現在應該有公司提供這種服務(wù),
<p>爬蟲(chóng),不管是用flask也好用python也好。還是別的什么如果上傳不能成功上傳的話(huà),可以看下我做的服務(wù),中間上傳失敗多次后就是用本地目錄下的文件夾,一路敲一路寫(xiě)就可以了~微信掃一掃就可以。但是有一個(gè)問(wèn)題,你可以想象中如果人們都愛(ài)你不需要二維碼,你就用這種形式獲取了,如果你有很多很多二維碼,你會(huì )哭的。想了解我的爬蟲(chóng)服務(wù)的同學(xué),可以留言~如果對您有幫助,歡迎收藏點(diǎn)贊(?>

querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 223 次瀏覽 ? 2021-07-22 00:39 ? 來(lái)自相關(guān)話(huà)題

  querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
  每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!
  
  請允許我強制投放一波廣告:
  因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
  一個(gè)喜歡小寵物,養不起貓的碼農,下班后很開(kāi)心??梢躁P(guān)注哦!
  為保證視頻安全,避免丟失,請樓主為視頻添加水印。
  一、獲取公眾號信息:標題、摘要、封面、文章URL
  步驟:
  1、先自己申請公眾號
  2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接
  
  3、彈出搜索框,搜索你需要的公眾號,查看歷史文章
  
  
  4、抓包獲取信息并定位請求的url
  
  通過(guò)查資料,找到了我們需要的關(guān)鍵內容:title、abstract、cover、文章URL。我們確保這是我們需要的 URL。通過(guò)點(diǎn)擊下一頁(yè),我們得到了幾次url,發(fā)現只找到了random和bengin。的參數已更改
  
  這樣就確定了主要信息網(wǎng)址。
  讓我們開(kāi)始吧:
  原來(lái)我們需要修改的參數是:token、random、cookie
  獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
  # -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
  獲取結果(成功):
  
  二、Get文章內視頻:實(shí)現批量下載
  分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:
  
  打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:
  
  
  嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
  我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
  與獲取的其他信息無(wú)關(guān),只能強制。
  這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
  response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
  視頻下載:
  def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
  然后所有的信息都完成了,進(jìn)行代碼組裝。
  一個(gè)。獲取公眾號信息
  B.過(guò)濾單篇文章文章information
  c.獲取視頻信息
  d。拼接視頻頁(yè)面下載地址
  e.下載視頻并保存
  代碼實(shí)驗結果:
  
  
  獲取公眾號:標題、摘要、封面、視頻、
  可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
  危險動(dòng)作,請勿操作!記??!記??!記??!
  獲取代碼請回復公眾號:20191210或公眾號
   查看全部

  querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
  每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!
  
  請允許我強制投放一波廣告:
  因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
  一個(gè)喜歡小寵物,養不起貓的碼農,下班后很開(kāi)心??梢躁P(guān)注哦!
  為保證視頻安全,避免丟失,請樓主為視頻添加水印。
  一、獲取公眾號信息:標題、摘要、封面、文章URL
  步驟:
  1、先自己申請公眾號
  2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接
  
  3、彈出搜索框,搜索你需要的公眾號,查看歷史文章
  
  
  4、抓包獲取信息并定位請求的url
  
  通過(guò)查資料,找到了我們需要的關(guān)鍵內容:title、abstract、cover、文章URL。我們確保這是我們需要的 URL。通過(guò)點(diǎn)擊下一頁(yè),我們得到了幾次url,發(fā)現只找到了random和bengin。的參數已更改
  
  這樣就確定了主要信息網(wǎng)址。
  讓我們開(kāi)始吧:
  原來(lái)我們需要修改的參數是:token、random、cookie
  獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
  # -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
  獲取結果(成功):
  
  二、Get文章內視頻:實(shí)現批量下載
  分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:
  
  打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:
  
  
  嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
  我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
  與獲取的其他信息無(wú)關(guān),只能強制。
  這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
  response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
  視頻下載:
  def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
  然后所有的信息都完成了,進(jìn)行代碼組裝。
  一個(gè)。獲取公眾號信息
  B.過(guò)濾單篇文章文章information
  c.獲取視頻信息
  d。拼接視頻頁(yè)面下載地址
  e.下載視頻并保存
  代碼實(shí)驗結果:
  
  
  獲取公眾號:標題、摘要、封面、視頻、
  可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
  危險動(dòng)作,請勿操作!記??!記??!記??!
  獲取代碼請回復公眾號:20191210或公眾號
  

微信公眾號爬取程序利用的原理和原理摘要

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 145 次瀏覽 ? 2021-07-22 00:34 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號爬取程序利用的原理和原理摘要
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  正式開(kāi)始
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
# 請求參數
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config[&#39;fakeid&#39;],
"type": "9",
"token": config[&#39;token&#39;],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放結果
app_msg_list = []
# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句
# 也方便重新運行時(shí)設置頁(yè)數
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的內容中為空則結束
if len(resp.json()[&#39;app_msg_list&#39;]) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻頁(yè)
i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,您可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,也可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []
for msg in app_msg_list:
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;]))
info_list.append(info)
# save as csv
with open("app_msg_list.csv", "w") as file:
file.writelines("n".join(info_list)) 查看全部

  微信公眾號爬取程序利用的原理和原理摘要
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  正式開(kāi)始
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
# 請求參數
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config[&#39;fakeid&#39;],
"type": "9",
"token": config[&#39;token&#39;],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放結果
app_msg_list = []
# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句
# 也方便重新運行時(shí)設置頁(yè)數
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的內容中為空則結束
if len(resp.json()[&#39;app_msg_list&#39;]) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻頁(yè)
i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,您可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,也可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []
for msg in app_msg_list:
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;]))
info_list.append(info)
# save as csv
with open("app_msg_list.csv", "w") as file:
file.writelines("n".join(info_list))

大牛用微信公眾號爬取程序的難點(diǎn)和解決辦法

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 114 次瀏覽 ? 2021-07-21 03:00 ? 來(lái)自相關(guān)話(huà)題

  大牛用微信公眾號爬取程序的難點(diǎn)和解決辦法
  最近需要爬取微信公眾號的文章信息。上網(wǎng)查了一下,發(fā)現微信公眾號爬取的難點(diǎn)是公眾號文章的鏈接在PC端打不開(kāi)。需要使用微信的瀏覽器(獲取微信客戶(hù)端的補充參數才能在其他平臺訪(fǎng)問(wèn)Open),給爬蟲(chóng)程序帶來(lái)很大的麻煩。后來(lái)在知乎上看到一個(gè)大牛用php寫(xiě)的微信公眾號爬蟲(chóng)程序,他按照大佬的思路直接做了java。改造過(guò)程中遇到的細節問(wèn)題比較多,分享給大家。
  附上Daniel文章的鏈接:寫(xiě)php或者只需要爬取思路的可以直接看這個(gè)。思路很詳細。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
  系統的基本思想是在安卓模擬器上運行微信。模擬器設置代理,通過(guò)代理服務(wù)器攔截微信數據,并將獲取到的數據發(fā)送給自己的程序進(jìn)行處理。
  需要準備的環(huán)境:nodejs、anyproxy代理、Android模擬器
  nodejs下載地址:我下載的是windows版本,直接下載安裝即可。安裝完成后,直接運行C:\Program Files\nodejs\npm.cmd自動(dòng)配置環(huán)境。
  anyproxy安裝:上一步安裝好nodejs后,在cmd中直接運行npm install -g anyproxy就會(huì )安裝
  互聯(lián)網(wǎng)上只有一個(gè) Android 模擬器,很多。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
  首先安裝代理服務(wù)器的證書(shū)。 Anyproxy 默認不解析 https 鏈接。安裝證書(shū)后即可解決。在cmd中執行anyproxy --root后,就會(huì )安裝證書(shū)。之后,您必須在模擬器上下載證書(shū)。
  然后輸入anyproxy -i命令開(kāi)啟代理服務(wù)。 (記得加參數?。?br />   
  記住這個(gè)ip和端口,然后安卓模擬器的代理就會(huì )用到這個(gè)?,F在用瀏覽器打開(kāi)網(wǎng)頁(yè)::8002/ 這是anyproxy的網(wǎng)頁(yè)界面,用于顯示http傳輸數據。
  
  點(diǎn)擊上方紅框中的菜單,會(huì )顯示一個(gè)二維碼。使用安卓模擬器掃碼識別。模擬器(手機)會(huì )下載證書(shū)并安裝。
  現在我們準備為模擬器設置代理,代理模式設置為手動(dòng),代理ip為運行anyproxy的機器的ip,端口為8001
  
  準備工作到此基本完成。在模擬器上打開(kāi)微信,開(kāi)通公眾號文章,從剛剛打開(kāi)的網(wǎng)頁(yè)界面就可以看到anyproxy抓取到的數據了:
  
  在上面的紅框中,有一個(gè)微信文章的鏈接,點(diǎn)進(jìn)去查看具體數據。如果響應正文中沒(méi)有任何內容,則可能是證書(shū)安裝有問(wèn)題。
  如果一切順利,你就可以下去了。
  這里我們依靠代理服務(wù)來(lái)抓取微信數據,但是我們不能抓取一條數據,只能自己操作微信。最好手動(dòng)復制。所以我們需要微信客戶(hù)端自己跳轉到頁(yè)面。這時(shí)候可以使用anyproxy來(lái)攔截微信服務(wù)器返回的數據,將頁(yè)面跳轉代碼注入其中,然后將處理后的數據返回給模擬器,實(shí)現微信客戶(hù)端的自動(dòng)重定向。
  在anyproxy中打開(kāi)一個(gè)名為rule_default.js的js文件,windows下文件為:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
  文件中有一個(gè)方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。該方法負責對anyproxy獲得的數據進(jìn)行各種操作。開(kāi)頭應該只有 callback(serverResData) ;該語(yǔ)句的意思是直接將服務(wù)器響應數據返回給客戶(hù)端。把這條語(yǔ)句刪掉,換成下面丹尼爾寫(xiě)的代碼就行了。這里的代碼我沒(méi)有做任何改動(dòng),里面的注釋也解釋的很清楚,按照邏輯來(lái)理解就好了,問(wèn)題不大。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
3 //console.log("開(kāi)始第一種頁(yè)面爬取");
4 if(serverResData.toString() !== ""){
try {//防止報錯退出程序
7 var reg = /msgList = (.*?);/;//定義歷史消息正則匹配規則
8 var ret = reg.exec(serverResData.toString());//轉換變量為string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
14 })
15 });
16 }catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
17 //console.log("開(kāi)始第一種頁(yè)面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
22 }
23 }catch(e){
24 console.log(e);//錯誤捕捉
25 }
26 callback(serverResData);//直接返回第二頁(yè)json內容
27 }
28 }
29 //console.log("開(kāi)始第一種頁(yè)面爬取 結束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
33 var ret = reg.exec(serverResData.toString());//轉換變量為string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
  這里是一個(gè)簡(jiǎn)單的解釋。微信公眾號歷史新聞頁(yè)面的鏈接有兩種形式:一種以/mp/getmasssendmsg開(kāi)頭,另一種以/mp/profile_ext開(kāi)頭。歷史頁(yè)面可以關(guān)閉。如果被拒絕,則會(huì )觸發(fā)一個(gè)js事件,發(fā)送獲取json數據(下一頁(yè)內容)的??請求。還有公眾號文章的鏈接,以及文章的閱讀量和喜歡的鏈接(返回json數據)。這些鏈接的形式是固定的,可以通過(guò)邏輯判斷來(lái)區分。這里的問(wèn)題是,如果所有的歷史頁(yè)面都需要爬取,怎么做。我的想法是模擬鼠標通過(guò)js向下滑動(dòng)觸發(fā)提交加載列表下一部分的請求?;蛘咧苯邮褂胊nyproxy分析滑動(dòng)加載請求,直接將請求發(fā)送到微信服務(wù)器。但是一直存在一個(gè)問(wèn)題,就是如何判斷沒(méi)有剩余數據。我正在抓取最新數據。我暫時(shí)沒(méi)有這個(gè)需求,以后可能需要。有需要的可以試試。 查看全部

  大牛用微信公眾號爬取程序的難點(diǎn)和解決辦法
  最近需要爬取微信公眾號的文章信息。上網(wǎng)查了一下,發(fā)現微信公眾號爬取的難點(diǎn)是公眾號文章的鏈接在PC端打不開(kāi)。需要使用微信的瀏覽器(獲取微信客戶(hù)端的補充參數才能在其他平臺訪(fǎng)問(wèn)Open),給爬蟲(chóng)程序帶來(lái)很大的麻煩。后來(lái)在知乎上看到一個(gè)大牛用php寫(xiě)的微信公眾號爬蟲(chóng)程序,他按照大佬的思路直接做了java。改造過(guò)程中遇到的細節問(wèn)題比較多,分享給大家。
  附上Daniel文章的鏈接:寫(xiě)php或者只需要爬取思路的可以直接看這個(gè)。思路很詳細。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
  系統的基本思想是在安卓模擬器上運行微信。模擬器設置代理,通過(guò)代理服務(wù)器攔截微信數據,并將獲取到的數據發(fā)送給自己的程序進(jìn)行處理。
  需要準備的環(huán)境:nodejs、anyproxy代理、Android模擬器
  nodejs下載地址:我下載的是windows版本,直接下載安裝即可。安裝完成后,直接運行C:\Program Files\nodejs\npm.cmd自動(dòng)配置環(huán)境。
  anyproxy安裝:上一步安裝好nodejs后,在cmd中直接運行npm install -g anyproxy就會(huì )安裝
  互聯(lián)網(wǎng)上只有一個(gè) Android 模擬器,很多。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
  首先安裝代理服務(wù)器的證書(shū)。 Anyproxy 默認不解析 https 鏈接。安裝證書(shū)后即可解決。在cmd中執行anyproxy --root后,就會(huì )安裝證書(shū)。之后,您必須在模擬器上下載證書(shū)。
  然后輸入anyproxy -i命令開(kāi)啟代理服務(wù)。 (記得加參數?。?br />   
  記住這個(gè)ip和端口,然后安卓模擬器的代理就會(huì )用到這個(gè)?,F在用瀏覽器打開(kāi)網(wǎng)頁(yè)::8002/ 這是anyproxy的網(wǎng)頁(yè)界面,用于顯示http傳輸數據。
  
  點(diǎn)擊上方紅框中的菜單,會(huì )顯示一個(gè)二維碼。使用安卓模擬器掃碼識別。模擬器(手機)會(huì )下載證書(shū)并安裝。
  現在我們準備為模擬器設置代理,代理模式設置為手動(dòng),代理ip為運行anyproxy的機器的ip,端口為8001
  
  準備工作到此基本完成。在模擬器上打開(kāi)微信,開(kāi)通公眾號文章,從剛剛打開(kāi)的網(wǎng)頁(yè)界面就可以看到anyproxy抓取到的數據了:
  
  在上面的紅框中,有一個(gè)微信文章的鏈接,點(diǎn)進(jìn)去查看具體數據。如果響應正文中沒(méi)有任何內容,則可能是證書(shū)安裝有問(wèn)題。
  如果一切順利,你就可以下去了。
  這里我們依靠代理服務(wù)來(lái)抓取微信數據,但是我們不能抓取一條數據,只能自己操作微信。最好手動(dòng)復制。所以我們需要微信客戶(hù)端自己跳轉到頁(yè)面。這時(shí)候可以使用anyproxy來(lái)攔截微信服務(wù)器返回的數據,將頁(yè)面跳轉代碼注入其中,然后將處理后的數據返回給模擬器,實(shí)現微信客戶(hù)端的自動(dòng)重定向。
  在anyproxy中打開(kāi)一個(gè)名為rule_default.js的js文件,windows下文件為:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
  文件中有一個(gè)方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。該方法負責對anyproxy獲得的數據進(jìn)行各種操作。開(kāi)頭應該只有 callback(serverResData) ;該語(yǔ)句的意思是直接將服務(wù)器響應數據返回給客戶(hù)端。把這條語(yǔ)句刪掉,換成下面丹尼爾寫(xiě)的代碼就行了。這里的代碼我沒(méi)有做任何改動(dòng),里面的注釋也解釋的很清楚,按照邏輯來(lái)理解就好了,問(wèn)題不大。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
3 //console.log("開(kāi)始第一種頁(yè)面爬取");
4 if(serverResData.toString() !== ""){
try {//防止報錯退出程序
7 var reg = /msgList = (.*?);/;//定義歷史消息正則匹配規則
8 var ret = reg.exec(serverResData.toString());//轉換變量為string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
14 })
15 });
16 }catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
17 //console.log("開(kāi)始第一種頁(yè)面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
22 }
23 }catch(e){
24 console.log(e);//錯誤捕捉
25 }
26 callback(serverResData);//直接返回第二頁(yè)json內容
27 }
28 }
29 //console.log("開(kāi)始第一種頁(yè)面爬取 結束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
33 var ret = reg.exec(serverResData.toString());//轉換變量為string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
  這里是一個(gè)簡(jiǎn)單的解釋。微信公眾號歷史新聞頁(yè)面的鏈接有兩種形式:一種以/mp/getmasssendmsg開(kāi)頭,另一種以/mp/profile_ext開(kāi)頭。歷史頁(yè)面可以關(guān)閉。如果被拒絕,則會(huì )觸發(fā)一個(gè)js事件,發(fā)送獲取json數據(下一頁(yè)內容)的??請求。還有公眾號文章的鏈接,以及文章的閱讀量和喜歡的鏈接(返回json數據)。這些鏈接的形式是固定的,可以通過(guò)邏輯判斷來(lái)區分。這里的問(wèn)題是,如果所有的歷史頁(yè)面都需要爬取,怎么做。我的想法是模擬鼠標通過(guò)js向下滑動(dòng)觸發(fā)提交加載列表下一部分的請求?;蛘咧苯邮褂胊nyproxy分析滑動(dòng)加載請求,直接將請求發(fā)送到微信服務(wù)器。但是一直存在一個(gè)問(wèn)題,就是如何判斷沒(méi)有剩余數據。我正在抓取最新數據。我暫時(shí)沒(méi)有這個(gè)需求,以后可能需要。有需要的可以試試。

微信公眾號文章的接口分析及應用方法(一)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 194 次瀏覽 ? 2021-07-21 02:31 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號文章的接口分析及應用方法(一)
  一.Idea
  我們通過(guò)微信公眾平臺網(wǎng)頁(yè)版圖文消息中的超鏈接獲取我們需要的界面
  
  
  從界面我們可以得到對應的微信公眾號和所有對應的微信公眾號文章。
  二.接口分析
  微信公眾號獲取接口: 參數:action=search_biz begin=0 count=5 query=公眾號token=每個(gè)帳號對應的Token值 lang=zh_CN f=json ajax=1 請求方式:GET so this在界面中,我們只需要獲取token,查詢(xún)的是你需要搜索的公眾號,登錄后可以通過(guò)網(wǎng)頁(yè)鏈接獲取token。
  
  獲取公眾號對應文章的接口: 參數:action=list_ex begin=0 count=5 fakeid=MjM5NDAwMTA2MA== type=9 query= token=557131216 lang=zh_CN f=json ajax=1 Request method: GET 在這個(gè)接口中,我們需要獲取的值是上一步的token和fakeid,這個(gè)fakeid可以在第一個(gè)接口中獲取。這樣我們就可以獲取到微信公眾號文章的數據了。
  
  三.Realization 第一步:
  首先我們需要通過(guò)selenium模擬登錄,然后獲取cookie和對應的token
  def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 點(diǎn)擊切換到賬號密碼輸入
browser.find_element_by_xpath("//a[@class=&#39;login__type__container__select-type&#39;]").click()
sleep(2)
# 模擬用戶(hù)點(diǎn)擊
input_user = browser.find_element_by_xpath("//input[@name=&#39;account&#39;]")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name=&#39;password&#39;]")
input_password.send_keys(password)
sleep(2)
# 點(diǎn)擊登錄
browser.find_element_by_xpath("//a[@class=&#39;btn_login&#39;]").click()
sleep(2)
# 微信登錄驗證
print(&#39;請掃描二維碼&#39;)
sleep(20)
# 刷新當前網(wǎng)頁(yè)
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(5)
# 獲取當前網(wǎng)頁(yè)鏈接
url = browser.current_url
# 獲取當前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item[&#39;name&#39;]] = item[&#39;value&#39;]
# 轉換為字符串
cookie_str = json.dumps(post)
# 存儲到本地
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print(&#39;cookie保存到本地成功&#39;)
# 對當前網(wǎng)頁(yè)鏈接進(jìn)行切片,獲取到token
paramList = url.strip().split(&#39;?&#39;)[1].split(&#39;&&#39;)
# 定義一個(gè)字典存儲數據
paramdict = {}
for item in paramList:
paramdict[item.split(&#39;=&#39;)[0]] = item.split(&#39;=&#39;)[1]
# 返回token
return paramdict[&#39;token&#39;]
  定義一個(gè)登錄方法,里面的參數是登錄賬號和密碼,然后定義一個(gè)字典來(lái)存儲cookie的值。模擬用戶(hù),輸入對應的賬號密碼,點(diǎn)擊登錄,會(huì )出現掃碼驗證,用登錄微信掃一掃即可。
  刷新當前網(wǎng)頁(yè)后,獲取當前cookie和token,然后返回。
  第二步:1.請求獲取對應的公眾號接口,獲取我們需要的fakeid
   url = &#39;https://mp.weixin.qq.com&#39;
headers = {
&#39;HOST&#39;: &#39;mp.weixin.qq.com&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63&#39;
}
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
params = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;搜索的公眾號名稱(chēng)&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
  傳入我們獲取的token和cookie,然后通過(guò)requests.get請求獲取返回的微信公眾號的json數據
  lists = search_resp.json().get(&#39;list&#39;)[0]
  通過(guò)上面的代碼可以得到對應的公眾號數據
  fakeid = lists.get(&#39;fakeid&#39;)
  通過(guò)上面的代碼可以得到對應的fakeid
  2.請求獲取微信公眾號文章接口,獲取我們需要的文章data
   appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
params_data = {
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
  我們傳入fakeid和token,然后調用requests.get請求接口獲取返回的json數據。
  我們已經(jīng)實(shí)現了微信公眾號文章的抓取。
  四.Summary
  通過(guò)爬取微信公眾號文章,需要掌握selenium和requests的用法,以及如何獲取request接口。但是需要注意的是,當我們在循環(huán)中獲取文章時(shí),一定要設置一個(gè)延遲時(shí)間,否則賬號很容易被封,獲取不到返回的數據。
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  Python免費學(xué)習資料和群交流答案點(diǎn)擊加入 查看全部

  微信公眾號文章的接口分析及應用方法(一)
  一.Idea
  我們通過(guò)微信公眾平臺網(wǎng)頁(yè)版圖文消息中的超鏈接獲取我們需要的界面
  
  
  從界面我們可以得到對應的微信公眾號和所有對應的微信公眾號文章。
  二.接口分析
  微信公眾號獲取接口: 參數:action=search_biz begin=0 count=5 query=公眾號token=每個(gè)帳號對應的Token值 lang=zh_CN f=json ajax=1 請求方式:GET so this在界面中,我們只需要獲取token,查詢(xún)的是你需要搜索的公眾號,登錄后可以通過(guò)網(wǎng)頁(yè)鏈接獲取token。
  
  獲取公眾號對應文章的接口: 參數:action=list_ex begin=0 count=5 fakeid=MjM5NDAwMTA2MA== type=9 query= token=557131216 lang=zh_CN f=json ajax=1 Request method: GET 在這個(gè)接口中,我們需要獲取的值是上一步的token和fakeid,這個(gè)fakeid可以在第一個(gè)接口中獲取。這樣我們就可以獲取到微信公眾號文章的數據了。
  
  三.Realization 第一步:
  首先我們需要通過(guò)selenium模擬登錄,然后獲取cookie和對應的token
  def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 點(diǎn)擊切換到賬號密碼輸入
browser.find_element_by_xpath("//a[@class=&#39;login__type__container__select-type&#39;]").click()
sleep(2)
# 模擬用戶(hù)點(diǎn)擊
input_user = browser.find_element_by_xpath("//input[@name=&#39;account&#39;]")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name=&#39;password&#39;]")
input_password.send_keys(password)
sleep(2)
# 點(diǎn)擊登錄
browser.find_element_by_xpath("//a[@class=&#39;btn_login&#39;]").click()
sleep(2)
# 微信登錄驗證
print(&#39;請掃描二維碼&#39;)
sleep(20)
# 刷新當前網(wǎng)頁(yè)
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(5)
# 獲取當前網(wǎng)頁(yè)鏈接
url = browser.current_url
# 獲取當前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item[&#39;name&#39;]] = item[&#39;value&#39;]
# 轉換為字符串
cookie_str = json.dumps(post)
# 存儲到本地
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print(&#39;cookie保存到本地成功&#39;)
# 對當前網(wǎng)頁(yè)鏈接進(jìn)行切片,獲取到token
paramList = url.strip().split(&#39;?&#39;)[1].split(&#39;&&#39;)
# 定義一個(gè)字典存儲數據
paramdict = {}
for item in paramList:
paramdict[item.split(&#39;=&#39;)[0]] = item.split(&#39;=&#39;)[1]
# 返回token
return paramdict[&#39;token&#39;]
  定義一個(gè)登錄方法,里面的參數是登錄賬號和密碼,然后定義一個(gè)字典來(lái)存儲cookie的值。模擬用戶(hù),輸入對應的賬號密碼,點(diǎn)擊登錄,會(huì )出現掃碼驗證,用登錄微信掃一掃即可。
  刷新當前網(wǎng)頁(yè)后,獲取當前cookie和token,然后返回。
  第二步:1.請求獲取對應的公眾號接口,獲取我們需要的fakeid
   url = &#39;https://mp.weixin.qq.com&#39;
headers = {
&#39;HOST&#39;: &#39;mp.weixin.qq.com&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63&#39;
}
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
params = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;搜索的公眾號名稱(chēng)&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
  傳入我們獲取的token和cookie,然后通過(guò)requests.get請求獲取返回的微信公眾號的json數據
  lists = search_resp.json().get(&#39;list&#39;)[0]
  通過(guò)上面的代碼可以得到對應的公眾號數據
  fakeid = lists.get(&#39;fakeid&#39;)
  通過(guò)上面的代碼可以得到對應的fakeid
  2.請求獲取微信公眾號文章接口,獲取我們需要的文章data
   appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
params_data = {
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
  我們傳入fakeid和token,然后調用requests.get請求接口獲取返回的json數據。
  我們已經(jīng)實(shí)現了微信公眾號文章的抓取。
  四.Summary
  通過(guò)爬取微信公眾號文章,需要掌握selenium和requests的用法,以及如何獲取request接口。但是需要注意的是,當我們在循環(huán)中獲取文章時(shí),一定要設置一個(gè)延遲時(shí)間,否則賬號很容易被封,獲取不到返回的數據。
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  Python免費學(xué)習資料和群交流答案點(diǎn)擊加入

微信讀書(shū)App已經(jīng)上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊(圖)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 117 次瀏覽 ? 2021-07-20 01:25 ? 來(lái)自相關(guān)話(huà)題

  
微信讀書(shū)App已經(jīng)上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊(圖)
  
  微信閱讀APP上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊。
  鈦媒體編輯今天點(diǎn)擊微信閱讀App主界面左下角的書(shū)店,彈出“優(yōu)質(zhì)公眾號”模塊。
  在“查看全部”內容列表中,鈦媒體發(fā)現該模塊分為8個(gè)子模塊:“全部”、“輕松搞笑”、“影評”、“文學(xué)雜志”、“互聯(lián)網(wǎng)”、 “知識教育”、“商業(yè)金融”和“其他”。在每個(gè)子模塊中,收錄在微信公眾平臺上的每個(gè)自媒體號都有文章。
  
  另外,通過(guò)微信閱讀App搜索欄,可以直接搜索相關(guān)公眾號和內容。
  其實(shí)在今年4月份,微信閱讀2.4.0就增加了一個(gè)新功能:引入優(yōu)質(zhì)公眾號。
  馬化騰去年在朋友圈與kol的對話(huà)中也透露,微信正在測試公眾號的付費訂閱功能。此后,一直沒(méi)有消息表明該功能何時(shí)正式發(fā)布。
  微信閱讀App的自然付費閱讀模式與微信公眾號付費閱讀自然匹配。不過(guò)微信閱讀App中的優(yōu)質(zhì)公眾號模塊還是可以免費閱讀的。
  鈦媒體發(fā)現,這并不是微信閱讀和微信公眾號的第一次結合。早在去年9月2.2.0版本上線(xiàn)時(shí),就已經(jīng)有“支持看書(shū)的公眾號”文章”提示了。
  針對新功能,鈦媒體編輯采訪(fǎng)了幾家公眾號運營(yíng)商,發(fā)現微信閱讀沒(méi)有事先與運營(yíng)商溝通授權和版權問(wèn)題。
  這一次,我們將在微信公眾號中直接抓取文章,并將其作為一個(gè)獨立的部分。以后會(huì )不會(huì )涉及版權問(wèn)題?
  就目前的功能而言,微信閱讀App看起來(lái)是一個(gè)完美的“接現成孩子”的過(guò)程。同時(shí)在搜索一些不知名的公眾號時(shí),發(fā)現系統沒(méi)有收錄??梢钥闯?,“優(yōu)質(zhì)公眾號”是在微信閱讀相關(guān)數據庫篩選后導入的。
  
  據了解,微信閱讀App于2015年8月27日正式上線(xiàn),目前華為應用商店下載量已超過(guò)1億。龐大的流量平臺未來(lái)將如何與微信公眾號運營(yíng)商分享收益?值得期待。 (本文首發(fā)于鈦媒體,作者/桑明強,編輯/洋蔥) 查看全部

  
微信讀書(shū)App已經(jīng)上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊(圖)
  
  微信閱讀APP上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊。
  鈦媒體編輯今天點(diǎn)擊微信閱讀App主界面左下角的書(shū)店,彈出“優(yōu)質(zhì)公眾號”模塊。
  在“查看全部”內容列表中,鈦媒體發(fā)現該模塊分為8個(gè)子模塊:“全部”、“輕松搞笑”、“影評”、“文學(xué)雜志”、“互聯(lián)網(wǎng)”、 “知識教育”、“商業(yè)金融”和“其他”。在每個(gè)子模塊中,收錄在微信公眾平臺上的每個(gè)自媒體號都有文章。
  
  另外,通過(guò)微信閱讀App搜索欄,可以直接搜索相關(guān)公眾號和內容。
  其實(shí)在今年4月份,微信閱讀2.4.0就增加了一個(gè)新功能:引入優(yōu)質(zhì)公眾號。
  馬化騰去年在朋友圈與kol的對話(huà)中也透露,微信正在測試公眾號的付費訂閱功能。此后,一直沒(méi)有消息表明該功能何時(shí)正式發(fā)布。
  微信閱讀App的自然付費閱讀模式與微信公眾號付費閱讀自然匹配。不過(guò)微信閱讀App中的優(yōu)質(zhì)公眾號模塊還是可以免費閱讀的。
  鈦媒體發(fā)現,這并不是微信閱讀和微信公眾號的第一次結合。早在去年9月2.2.0版本上線(xiàn)時(shí),就已經(jīng)有“支持看書(shū)的公眾號”文章”提示了。
  針對新功能,鈦媒體編輯采訪(fǎng)了幾家公眾號運營(yíng)商,發(fā)現微信閱讀沒(méi)有事先與運營(yíng)商溝通授權和版權問(wèn)題。
  這一次,我們將在微信公眾號中直接抓取文章,并將其作為一個(gè)獨立的部分。以后會(huì )不會(huì )涉及版權問(wèn)題?
  就目前的功能而言,微信閱讀App看起來(lái)是一個(gè)完美的“接現成孩子”的過(guò)程。同時(shí)在搜索一些不知名的公眾號時(shí),發(fā)現系統沒(méi)有收錄??梢钥闯?,“優(yōu)質(zhì)公眾號”是在微信閱讀相關(guān)數據庫篩選后導入的。
  
  據了解,微信閱讀App于2015年8月27日正式上線(xiàn),目前華為應用商店下載量已超過(guò)1億。龐大的流量平臺未來(lái)將如何與微信公眾號運營(yíng)商分享收益?值得期待。 (本文首發(fā)于鈦媒體,作者/桑明強,編輯/洋蔥)

翻頁(yè)打開(kāi)headers,開(kāi)發(fā)工具思路首先start_url==?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 106 次瀏覽 ? 2021-07-18 23:25 ? 來(lái)自相關(guān)話(huà)題

  翻頁(yè)打開(kāi)headers,開(kāi)發(fā)工具思路首先start_url==?
  由于微信流量封閉,微信內容比較難看。為了能夠在微信公眾號爬文章,有網(wǎng)友用python實(shí)現了。我們來(lái)看看他的實(shí)現思路和代碼。也許它可以使用?要知道微信公眾號里的內容不是百度上的收錄,能做到就太牛了。
  開(kāi)發(fā)工具
  思考
  首先start_url=””,掃碼注冊微信公眾平臺,有的話(huà)直接忽略?huà)叽a登錄即可。(注冊個(gè)人訂閱號即可),使用selenium自動(dòng)掃碼登錄獲取cookie值,然后使用cookie進(jìn)行響應。
  您需要先下載webdriver插件。插件下載谷歌瀏覽器對應的版本。下載后會(huì )得到chromedriver.exe,然后把這個(gè)chromedriver.exe和python解釋器的python.exe文件放在同一個(gè)目錄下。作為響應,取回網(wǎng)頁(yè)的源代碼并取回令牌值。令牌值具有時(shí)間敏感性。
  首先打開(kāi)公眾號,點(diǎn)擊圖文編輯中的超鏈接。
  
  使用python爬取微信公眾號文章
  
  使用python爬取微信公眾號文章
  
  使用python爬取微信公眾號文章
  按F12查看公眾號對應的fakeid值。
  
  使用python爬取微信公眾號文章
  
  使用python爬取微信公眾號文章
  翻頁(yè)打開(kāi)headers,取回首頁(yè)url地址
  第二頁(yè)地址
  找到模式,上傳代碼
  # !/usr/bin/nev python
# -*-coding:utf8-*-
import tkinter as tk
from selenium import webdriver
import time, re, jsonpath, xlwt
from requests_html import HTMLSession
session = HTMLSession()
class GZHSpider(object):
def __init__(self):
"""定義可視化窗口,并設置窗口和主題大小布局"""
self.window = tk.Tk()
self.window.title('公眾號信息采集')
self.window.geometry('800x600')
"""創(chuàng )建label_user按鈕,與說(shuō)明書(shū)"""
self.label_user = tk.Label(self.window, text='需要爬取的公眾號:', font=('Arial', 12), width=30, height=2)
self.label_user.pack()
"""創(chuàng )建label_user關(guān)聯(lián)輸入"""
self.entry_user = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_user.pack(after=self.label_user)
"""創(chuàng )建label_passwd按鈕,與說(shuō)明書(shū)"""
self.label_passwd = tk.Label(self.window, text="爬取多少頁(yè):(小于100)", font=('Arial', 12), width=30, height=2)
self.label_passwd.pack()
"""創(chuàng )建label_passwd關(guān)聯(lián)輸入"""
self.entry_passwd = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_passwd.pack(after=self.label_passwd)
"""創(chuàng )建Text富文本框,用于按鈕操作結果的展示"""
self.text1 = tk.Text(self.window, font=('Arial', 12), width=85, height=22)
self.text1.pack()
"""定義按鈕1,綁定觸發(fā)事件方法"""
self.button_1 = tk.Button(self.window, text='爬取', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_1)
self.button_1.pack(before=self.text1)
"""定義按鈕2,綁定觸發(fā)事件方法"""
self.button_2 = tk.Button(self.window, text='清除', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_2)
self.button_2.pack(anchor="e")
def parse_hit_click_1(self):
"""定義觸發(fā)事件1,調用main函數"""
user_name = self.entry_user.get()
pass_wd = int(self.entry_passwd.get())
self.main(user_name, pass_wd)
def main(self, user_name, pass_wd):
# 網(wǎng)頁(yè)登錄
driver_path = r'D:\python\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://mp.weixin.qq.com/')
time.sleep(2)
# 網(wǎng)頁(yè)最大化
driver.maximize_window()
# 拿微信掃描登錄
time.sleep(20)
# 獲得登錄的cookies
cookies_list = driver.get_cookies()
# 轉化成能用的cookie格式
cookie = [item["name"] + "=" + item["value"] for item in cookies_list]
cookie_str = '; '.join(item for item in cookie)
# 請求頭
headers_1 = {
'cookie': cookie_str,
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36'
}
# 起始地址
start_url = 'https://mp.weixin.qq.com/'
response = session.get(start_url, headers=headers_1).content.decode()
# 拿到token值,token值是有時(shí)效性的
token = re.findall(r'token=(\d+)', response)[0]
# 搜索出所有跟輸入的公眾號有關(guān)的
next_url = f'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={user_name}&token=' \
f'{token}&lang=zh_CN&f=json&ajax=1'
# 獲取響應
response_1 = session.get(next_url, headers=headers_1).content.decode()
# 拿到fakeid的值,確定公眾號,唯一的
fakeid = re.findall(r'"fakeid":"(.*?)",', response_1)[0]
# 構造公眾號的url地址
next_url_2 = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
headers_2 = {
'cookie': cookie_str,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36',
'referer': f'https://mp.weixin.qq.com/cgi-bin/appmsgtemplate?action=edit&lang=zh_CN&token={token}',
'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-requested-with': 'XMLHttpRequest'
}
# 表的創(chuàng )建
workbook = xlwt.Workbook(encoding='gbk', style_compression=0)
sheet = workbook.add_sheet('test', cell_overwrite_ok=True)
j = 1
# 構造表頭
sheet.write(0, 0, '時(shí)間')
sheet.write(0, 1, '標題')
sheet.write(0, 2, '地址')
# 循環(huán)翻頁(yè)
for i in range(pass_wd):
data["begin"] = i * 5
time.sleep(3)
# 獲取響應的json數據
response_2 = session.get(next_url_2, params=data, headers=headers_2).json()
# jsonpath 獲取時(shí)間,標題,地址
title_list = jsonpath.jsonpath(response_2, '$..title')
url_list = jsonpath.jsonpath(response_2, '$..link')
create_time_list = jsonpath.jsonpath(response_2, '$..create_time')
# 將時(shí)間戳轉化為北京時(shí)間
list_1 = []
for create_time in create_time_list:
time_local = time.localtime(int(create_time))
time_1 = time.strftime("%Y-%m-%d", time_local)
time_2 = time.strftime("%H:%M:%S", time_local)
time_3 = time_1 + ' ' + time_2
list_1.append(time_3)
# for循環(huán)遍歷
for times, title, url in zip(list_1, title_list, url_list):
# 其中的'0-行, 0-列'指定表中的單元
sheet.write(j, 0, times)
sheet.write(j, 1, title)
sheet.write(j, 2, url)
j = j + 1
# 窗口顯示進(jìn)程
self.text1.insert("insert", f'*****************第{i+1}頁(yè)爬取成功*****************')
time.sleep(2)
self.text1.insert("insert", '\n ')
self.text1.insert("insert", '\n ')
# 最后保存成功
workbook.save(f'{user_name}公眾號信息.xls')
print(f"*********{user_name}公眾號信息保存成功*********")
def parse_hit_click_2(self):
"""定義觸發(fā)事件2,刪除文本框中內容"""
self.entry_user.delete(0, "end")
self.entry_passwd.delete(0, "end")
self.text1.delete("1.0", "end")
def center(self):
"""創(chuàng )建窗口居中函數方法"""
ws = self.window.winfo_screenwidth()
hs = self.window.winfo_screenheight()
x = int((ws / 2) - (800 / 2))
y = int((hs / 2) - (600 / 2))
self.window.geometry('{}x{}+{}+{}'.format(800, 600, x, y))
def run_loop(self):
"""禁止修改窗體大小規格"""
self.window.resizable(False, False)
"""窗口居中"""
self.center()
"""窗口維持--持久化"""
self.window.mainloop()
if __name__ == '__main__':
g = GZHSpider()
g.run_loop() 查看全部

  翻頁(yè)打開(kāi)headers,開(kāi)發(fā)工具思路首先start_url==?
  由于微信流量封閉,微信內容比較難看。為了能夠在微信公眾號爬文章,有網(wǎng)友用python實(shí)現了。我們來(lái)看看他的實(shí)現思路和代碼。也許它可以使用?要知道微信公眾號里的內容不是百度上的收錄,能做到就太牛了。
  開(kāi)發(fā)工具
  思考
  首先start_url=””,掃碼注冊微信公眾平臺,有的話(huà)直接忽略?huà)叽a登錄即可。(注冊個(gè)人訂閱號即可),使用selenium自動(dòng)掃碼登錄獲取cookie值,然后使用cookie進(jìn)行響應。
  您需要先下載webdriver插件。插件下載谷歌瀏覽器對應的版本。下載后會(huì )得到chromedriver.exe,然后把這個(gè)chromedriver.exe和python解釋器的python.exe文件放在同一個(gè)目錄下。作為響應,取回網(wǎng)頁(yè)的源代碼并取回令牌值。令牌值具有時(shí)間敏感性。
  首先打開(kāi)公眾號,點(diǎn)擊圖文編輯中的超鏈接。
  https://www.daimadog.com/wp-co ... 8.png 440w, https://www.daimadog.com/wp-co ... 0.png 768w, https://www.daimadog.com/wp-co ... 3.png 1362w" />
  使用python爬取微信公眾號文章
  https://www.daimadog.com/wp-co ... 8.png 440w, https://www.daimadog.com/wp-co ... 2.png 768w" />
  使用python爬取微信公眾號文章
  https://www.daimadog.com/wp-co ... 4.png 440w, https://www.daimadog.com/wp-co ... 1.png 768w" />
  使用python爬取微信公眾號文章
  按F12查看公眾號對應的fakeid值。
  https://www.daimadog.com/wp-co ... 3.png 440w, https://www.daimadog.com/wp-co ... 9.png 768w, https://www.daimadog.com/wp-co ... 6.png 1365w" />
  使用python爬取微信公眾號文章
  https://www.daimadog.com/wp-co ... 9.png 440w, https://www.daimadog.com/wp-co ... 8.png 768w, https://www.daimadog.com/wp-co ... 6.png 1364w" />
  使用python爬取微信公眾號文章
  翻頁(yè)打開(kāi)headers,取回首頁(yè)url地址
  第二頁(yè)地址
  找到模式,上傳代碼
  # !/usr/bin/nev python
# -*-coding:utf8-*-
import tkinter as tk
from selenium import webdriver
import time, re, jsonpath, xlwt
from requests_html import HTMLSession
session = HTMLSession()
class GZHSpider(object):
def __init__(self):
"""定義可視化窗口,并設置窗口和主題大小布局"""
self.window = tk.Tk()
self.window.title('公眾號信息采集')
self.window.geometry('800x600')
"""創(chuàng )建label_user按鈕,與說(shuō)明書(shū)"""
self.label_user = tk.Label(self.window, text='需要爬取的公眾號:', font=('Arial', 12), width=30, height=2)
self.label_user.pack()
"""創(chuàng )建label_user關(guān)聯(lián)輸入"""
self.entry_user = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_user.pack(after=self.label_user)
"""創(chuàng )建label_passwd按鈕,與說(shuō)明書(shū)"""
self.label_passwd = tk.Label(self.window, text="爬取多少頁(yè):(小于100)", font=('Arial', 12), width=30, height=2)
self.label_passwd.pack()
"""創(chuàng )建label_passwd關(guān)聯(lián)輸入"""
self.entry_passwd = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_passwd.pack(after=self.label_passwd)
"""創(chuàng )建Text富文本框,用于按鈕操作結果的展示"""
self.text1 = tk.Text(self.window, font=('Arial', 12), width=85, height=22)
self.text1.pack()
"""定義按鈕1,綁定觸發(fā)事件方法"""
self.button_1 = tk.Button(self.window, text='爬取', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_1)
self.button_1.pack(before=self.text1)
"""定義按鈕2,綁定觸發(fā)事件方法"""
self.button_2 = tk.Button(self.window, text='清除', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_2)
self.button_2.pack(anchor="e")
def parse_hit_click_1(self):
"""定義觸發(fā)事件1,調用main函數"""
user_name = self.entry_user.get()
pass_wd = int(self.entry_passwd.get())
self.main(user_name, pass_wd)
def main(self, user_name, pass_wd):
# 網(wǎng)頁(yè)登錄
driver_path = r'D:\python\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://mp.weixin.qq.com/')
time.sleep(2)
# 網(wǎng)頁(yè)最大化
driver.maximize_window()
# 拿微信掃描登錄
time.sleep(20)
# 獲得登錄的cookies
cookies_list = driver.get_cookies()
# 轉化成能用的cookie格式
cookie = [item["name"] + "=" + item["value"] for item in cookies_list]
cookie_str = '; '.join(item for item in cookie)
# 請求頭
headers_1 = {
'cookie': cookie_str,
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36'
}
# 起始地址
start_url = 'https://mp.weixin.qq.com/'
response = session.get(start_url, headers=headers_1).content.decode()
# 拿到token值,token值是有時(shí)效性的
token = re.findall(r'token=(\d+)', response)[0]
# 搜索出所有跟輸入的公眾號有關(guān)的
next_url = f'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={user_name}&token=' \
f'{token}&lang=zh_CN&f=json&ajax=1'
# 獲取響應
response_1 = session.get(next_url, headers=headers_1).content.decode()
# 拿到fakeid的值,確定公眾號,唯一的
fakeid = re.findall(r'"fakeid":"(.*?)",', response_1)[0]
# 構造公眾號的url地址
next_url_2 = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
headers_2 = {
'cookie': cookie_str,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36',
'referer': f'https://mp.weixin.qq.com/cgi-bin/appmsgtemplate?action=edit&lang=zh_CN&token={token}',
'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-requested-with': 'XMLHttpRequest'
}
# 表的創(chuàng )建
workbook = xlwt.Workbook(encoding='gbk', style_compression=0)
sheet = workbook.add_sheet('test', cell_overwrite_ok=True)
j = 1
# 構造表頭
sheet.write(0, 0, '時(shí)間')
sheet.write(0, 1, '標題')
sheet.write(0, 2, '地址')
# 循環(huán)翻頁(yè)
for i in range(pass_wd):
data["begin"] = i * 5
time.sleep(3)
# 獲取響應的json數據
response_2 = session.get(next_url_2, params=data, headers=headers_2).json()
# jsonpath 獲取時(shí)間,標題,地址
title_list = jsonpath.jsonpath(response_2, '$..title')
url_list = jsonpath.jsonpath(response_2, '$..link')
create_time_list = jsonpath.jsonpath(response_2, '$..create_time')
# 將時(shí)間戳轉化為北京時(shí)間
list_1 = []
for create_time in create_time_list:
time_local = time.localtime(int(create_time))
time_1 = time.strftime("%Y-%m-%d", time_local)
time_2 = time.strftime("%H:%M:%S", time_local)
time_3 = time_1 + ' ' + time_2
list_1.append(time_3)
# for循環(huán)遍歷
for times, title, url in zip(list_1, title_list, url_list):
# 其中的'0-行, 0-列'指定表中的單元
sheet.write(j, 0, times)
sheet.write(j, 1, title)
sheet.write(j, 2, url)
j = j + 1
# 窗口顯示進(jìn)程
self.text1.insert("insert", f'*****************第{i+1}頁(yè)爬取成功*****************')
time.sleep(2)
self.text1.insert("insert", '\n ')
self.text1.insert("insert", '\n ')
# 最后保存成功
workbook.save(f'{user_name}公眾號信息.xls')
print(f"*********{user_name}公眾號信息保存成功*********")
def parse_hit_click_2(self):
"""定義觸發(fā)事件2,刪除文本框中內容"""
self.entry_user.delete(0, "end")
self.entry_passwd.delete(0, "end")
self.text1.delete("1.0", "end")
def center(self):
"""創(chuàng )建窗口居中函數方法"""
ws = self.window.winfo_screenwidth()
hs = self.window.winfo_screenheight()
x = int((ws / 2) - (800 / 2))
y = int((hs / 2) - (600 / 2))
self.window.geometry('{}x{}+{}+{}'.format(800, 600, x, y))
def run_loop(self):
"""禁止修改窗體大小規格"""
self.window.resizable(False, False)
"""窗口居中"""
self.center()
"""窗口維持--持久化"""
self.window.mainloop()
if __name__ == '__main__':
g = GZHSpider()
g.run_loop()

利用搜狗微信搜索抓取指定公眾號的最新一條推送

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 111 次瀏覽 ? 2021-07-17 23:10 ? 來(lái)自相關(guān)話(huà)題

  利用搜狗微信搜索抓取指定公眾號的最新一條推送
  問(wèn)題描述
  使用搜狗微信搜索抓取指定公眾號的最新推送,并將相應網(wǎng)頁(yè)保存到本地。
  注意搜狗微信獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(由JavaScript渲染),使用requests.get()獲取的內容不收錄推送消息。這里使用selenium+PhantomJS來(lái)處理代碼
  #! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
  參考輸出
  
  
  解析鏈接獲取 首先進(jìn)入搜狗的微信搜索頁(yè)面,在地址欄中提取需要的鏈接部分,將字符串與公眾號名連接,然后生成請求鏈接。對于靜態(tài)網(wǎng)頁(yè),使用requests獲取html文件,然后使用BeautifulSoup選擇所需內容為動(dòng)態(tài)網(wǎng)頁(yè)。使用selenium+PhantomJS獲取html文件,然后使用BeautifulSoup選擇需要的內容遇到驗證碼(CAPTCHA),并輸出提示。該版本的代碼實(shí)際上并沒(méi)有處理驗證碼,需要在運行程序之前手動(dòng)訪(fǎng)問(wèn),以避免驗證碼。文件寫(xiě)入使用os.path.join()構造存儲路徑,提高通用性。例如,Windows 路徑分隔符使用反斜杠 (\),而 OS X 和 Linux 使用正斜杠 (/)。此功能可根據平臺自動(dòng)轉換。 open() 使用 b(二進(jìn)制模式)參數提高通用性(適用于 Windows),使用 datetime.now() 獲取當前時(shí)間進(jìn)行命名,并通過(guò) strftime() 格式化時(shí)間(函數名中的 f 代表格式),具體參考下表(摘自Automate the Boring Stuff with Python)
  
  參考鏈接:文件夾創(chuàng )建:異常處理的使用:enumerate的使用:open()使用b參數原因: 查看全部

  利用搜狗微信搜索抓取指定公眾號的最新一條推送
  問(wèn)題描述
  使用搜狗微信搜索抓取指定公眾號的最新推送,并將相應網(wǎng)頁(yè)保存到本地。
  注意搜狗微信獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(由JavaScript渲染),使用requests.get()獲取的內容不收錄推送消息。這里使用selenium+PhantomJS來(lái)處理代碼
  #! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
  參考輸出
  
  
  解析鏈接獲取 首先進(jìn)入搜狗的微信搜索頁(yè)面,在地址欄中提取需要的鏈接部分,將字符串與公眾號名連接,然后生成請求鏈接。對于靜態(tài)網(wǎng)頁(yè),使用requests獲取html文件,然后使用BeautifulSoup選擇所需內容為動(dòng)態(tài)網(wǎng)頁(yè)。使用selenium+PhantomJS獲取html文件,然后使用BeautifulSoup選擇需要的內容遇到驗證碼(CAPTCHA),并輸出提示。該版本的代碼實(shí)際上并沒(méi)有處理驗證碼,需要在運行程序之前手動(dòng)訪(fǎng)問(wèn),以避免驗證碼。文件寫(xiě)入使用os.path.join()構造存儲路徑,提高通用性。例如,Windows 路徑分隔符使用反斜杠 (\),而 OS X 和 Linux 使用正斜杠 (/)。此功能可根據平臺自動(dòng)轉換。 open() 使用 b(二進(jìn)制模式)參數提高通用性(適用于 Windows),使用 datetime.now() 獲取當前時(shí)間進(jìn)行命名,并通過(guò) strftime() 格式化時(shí)間(函數名中的 f 代表格式),具體參考下表(摘自Automate the Boring Stuff with Python)
  
  參考鏈接:文件夾創(chuàng )建:異常處理的使用:enumerate的使用:open()使用b參數原因:

querylist采集微信公眾號文章信息介紹-樂(lè )題庫

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 173 次瀏覽 ? 2021-08-01 03:04 ? 來(lái)自相關(guān)話(huà)題

  querylist采集微信公眾號文章信息介紹-樂(lè )題庫
  querylist采集微信公眾號文章信息。
  1、首先制作一個(gè)自定義菜單,
  2、在文章列表頁(yè)標簽里選擇“標題”,右鍵,選擇新建一個(gè)a標簽。圖2在a標簽里輸入公眾號文章標題。
  圖3然后要一點(diǎn)技巧:微信號:mfganju
  2、然后點(diǎn)這里的“標題”。然后在新建a標簽中選擇“標題1”的填空。圖4然后文章列表頁(yè)的時(shí)候,一個(gè)新標簽就點(diǎn)進(jìn)去了。
  3、點(diǎn)擊自定義菜單中的“添加微信好友”。圖5然后就是視頻播放列表界面,選擇“添加群聊”,點(diǎn)擊+號,視頻列表界面會(huì )出現你選擇的圖片。圖6點(diǎn)擊“添加”一直拉到最后。圖7最后,發(fā)送出去,就完成了。
  我也碰到一樣的問(wèn)題,當前po主已找到解決方案,在uc瀏覽器中解決,不需要自己做插件了,pc瀏覽器操作即可1。打開(kāi)微信公眾號后臺(/);2。在設置那里選擇獲取媒體信息3。在獲取媒體信息界面進(jìn)行下一步下一步最后點(diǎn)擊【獲取群發(fā)消息】、【發(fā)送到朋友圈】全部搞定4。獲取到鏈接鏈接里有個(gè)數字,復制出來(lái),粘貼到querylist里;圖片中間有個(gè)【/】,選擇剛才復制的那串數字發(fā)送到手機上即可(請配合開(kāi)發(fā)工具使用)。
  點(diǎn)擊添加群發(fā)消息中的群發(fā)號碼,然后對已加入的群發(fā)送信息(圖中a標簽),就可以看到標簽里面的文章了。點(diǎn)擊添加群發(fā)消息,文章就會(huì )出現在手機上了,再發(fā)送至朋友圈即可。 查看全部

  querylist采集微信公眾號文章信息介紹-樂(lè )題庫
  querylist采集微信公眾號文章信息。
  1、首先制作一個(gè)自定義菜單,
  2、在文章列表頁(yè)標簽里選擇“標題”,右鍵,選擇新建一個(gè)a標簽。圖2在a標簽里輸入公眾號文章標題。
  圖3然后要一點(diǎn)技巧:微信號:mfganju
  2、然后點(diǎn)這里的“標題”。然后在新建a標簽中選擇“標題1”的填空。圖4然后文章列表頁(yè)的時(shí)候,一個(gè)新標簽就點(diǎn)進(jìn)去了。
  3、點(diǎn)擊自定義菜單中的“添加微信好友”。圖5然后就是視頻播放列表界面,選擇“添加群聊”,點(diǎn)擊+號,視頻列表界面會(huì )出現你選擇的圖片。圖6點(diǎn)擊“添加”一直拉到最后。圖7最后,發(fā)送出去,就完成了。
  我也碰到一樣的問(wèn)題,當前po主已找到解決方案,在uc瀏覽器中解決,不需要自己做插件了,pc瀏覽器操作即可1。打開(kāi)微信公眾號后臺(/);2。在設置那里選擇獲取媒體信息3。在獲取媒體信息界面進(jìn)行下一步下一步最后點(diǎn)擊【獲取群發(fā)消息】、【發(fā)送到朋友圈】全部搞定4。獲取到鏈接鏈接里有個(gè)數字,復制出來(lái),粘貼到querylist里;圖片中間有個(gè)【/】,選擇剛才復制的那串數字發(fā)送到手機上即可(請配合開(kāi)發(fā)工具使用)。
  點(diǎn)擊添加群發(fā)消息中的群發(fā)號碼,然后對已加入的群發(fā)送信息(圖中a標簽),就可以看到標簽里面的文章了。點(diǎn)擊添加群發(fā)消息,文章就會(huì )出現在手機上了,再發(fā)送至朋友圈即可。

【早起簽到】CSS樣式表(2):0成果展示

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 81 次瀏覽 ? 2021-08-01 00:36 ? 來(lái)自相關(guān)話(huà)題

  【早起簽到】CSS樣式表(2):0成果展示
  0 結果顯示
  這篇文章比較長(cháng)。為了減少讀者的時(shí)間,先把這個(gè)項目的結果展示出來(lái),讓讀者可以快速確認這個(gè)文章是否就是他們要找的文章。
  這里需要說(shuō)明一下,項目中的前端頁(yè)面配色圖是指網(wǎng)上發(fā)布的CSS樣式表。
  有關(guān)項目的詳細信息,請稍后查看。
  0.1 登錄主頁(yè):
  用戶(hù)點(diǎn)擊公眾號菜單【提前登錄】后,會(huì )實(shí)現微信自動(dòng)登錄,進(jìn)入登錄主頁(yè)面。
  
  主頁(yè)顯示如下:
  
  左圖:缺席簽到時(shí)間。中圖:簽到頁(yè)面。右圖:簽到完成后顯示排名頁(yè)面。
  主頁(yè)面分為三個(gè)顯示頁(yè)面。無(wú)人簽到時(shí)間(0:00-05:50)如上左圖所示。當到達簽到時(shí)間時(shí),可以點(diǎn)擊按鈕狀態(tài),如上中圖所示。登錄完成后,會(huì )顯示用戶(hù)在公眾號當天的登錄位置。
  0.2 簽到記錄頁(yè)面
  用戶(hù)登錄后,可以查看自己的登錄記錄。詳情如下圖所示:
  
  左圖:可兌換獎勵簽到記錄和過(guò)期簽到記錄 右圖:兌換簽到記錄
  本項目用戶(hù)登錄后,可于當日或次日06:50-08:30在指定地點(diǎn)領(lǐng)取獎勵。過(guò)了這個(gè)時(shí)間,這個(gè)登錄記錄就失效了。三種狀態(tài)的簽到記錄如上圖所示。
  0.3后臺交流頁(yè)面
  下圖為后臺交易所的測試頁(yè)面。輸入登錄ID查詢(xún)登錄記錄。
  
  左圖:查詢(xún)過(guò)期的登錄記錄。中圖:查詢(xún)已兌換的登錄記錄。右圖:查詢(xún)可兌換的登錄記錄。
  如上圖所示。如果前來(lái)兌換的用戶(hù)的登錄記錄已過(guò)期,則會(huì )如上左圖顯示。如果用戶(hù)的簽到記錄已經(jīng)被兌換,會(huì )如上中圖顯示。如果用戶(hù)的簽到記錄可兌換,則會(huì )如右上圖所示。
  點(diǎn)擊“立即兌換”按鈕,出現“兌換成功”彈窗,如下圖。
  
  兌換成功彈窗(在微信開(kāi)發(fā)者工具中運行)
  看到這里,如果這不是你想要的項目,那么你可以關(guān)閉這個(gè)博客。
  如果這是你想要的項目,或者這個(gè)項目和你當前的項目很接近,或者你想學(xué)習如何寫(xiě)這個(gè)項目,或者...
  請繼續閱讀。下面正式開(kāi)始^_^
  1項目背景及需求分析1.1項目背景
  關(guān)于這個(gè)需求分析部分,我們先從項目的背景說(shuō)起。
  原因是這個(gè)。項目組在公眾號舉辦活動(dòng)。這個(gè)活動(dòng)簡(jiǎn)單易懂,就是“早起簽到領(lǐng)取獎勵”。每天早上指定時(shí)間開(kāi)啟簽到系統,然后用戶(hù)點(diǎn)擊菜單欄中的“提前簽到”按鈕,通過(guò)微信登錄,進(jìn)入簽到系統。
  用戶(hù)登錄完成后,用戶(hù)可以根據登錄記錄到指定地點(diǎn)領(lǐng)取早餐。同時(shí),每日早餐數量有限,先到先得。同時(shí),簽到記錄也有兌換期。本項目組指定的方案可在當日或次日8:30前收到。所以我今天check in,第二天早上就沒(méi)有早餐了^_^
  1.2 需求分析
  通過(guò)對項目背景的分析,本項目需求如下:
  1、本項目為公眾號項目,微信網(wǎng)頁(yè)開(kāi)發(fā);
  2、實(shí)現用戶(hù)微信登錄授權確定用戶(hù)身份,實(shí)現一天只能登錄一次;
  3、用戶(hù)登錄后,記錄登錄時(shí)間和當天登錄排名;
  4、顯示用戶(hù)的簽到記錄和簽到記錄的狀態(tài)(可兌換、已兌換、已過(guò)期);
  5、Background 管理員確認兌換。
  2概述設計2.1開(kāi)發(fā)技術(shù)分析
  既然是微信網(wǎng)頁(yè)的開(kāi)發(fā),要實(shí)現用戶(hù)登錄,那么就需要了解微信公眾號網(wǎng)頁(yè)的授權機制。
  微信開(kāi)放平臺有這方面的使用說(shuō)明介紹,大家可以通過(guò)開(kāi)發(fā)者的文檔自行學(xué)習。鏈接如下:
  具體來(lái)說(shuō),網(wǎng)頁(yè)授權過(guò)程分為四個(gè)步驟:
  1、引導用戶(hù)進(jìn)入授權頁(yè)面同意授權并獲取驗證碼
  2、交換網(wǎng)頁(yè)授權access_token代碼(與基礎支持的access_token不同)
  3、如有需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)對access_token進(jìn)行授權,避免過(guò)期
  4、通過(guò)網(wǎng)頁(yè)授權access_token和openid獲取用戶(hù)基本信息(支持UnionID機制??)
  只有通過(guò)微信認證的服務(wù)賬號才能使用“Web授權”界面。
  
  如果要用于開(kāi)發(fā)測試,可以申請一個(gè)測試賬號。申請鏈接如下:
  微信網(wǎng)頁(yè)授權登錄的詳細流程將在實(shí)踐代碼(后面編碼實(shí)現流程)中進(jìn)行說(shuō)明。
  ———————————————————————
  然后需要分析確定開(kāi)發(fā)語(yǔ)言。
  微信網(wǎng)頁(yè)可以用任何網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言實(shí)現。
  但是結合這個(gè)項目,需要對數據庫中的數據進(jìn)行增刪改查,所以最終使用的編程語(yǔ)言是PHP。
 ?。ù藭r(shí)筆者還沒(méi)有接觸到PHP開(kāi)發(fā)o(╥﹏╥)o,筆者熟悉的web開(kāi)發(fā)語(yǔ)言是Java Web。所以編碼實(shí)現過(guò)程,如有不對之處請指教忍著(zhù)我(*^▽^*))
  最后,數據庫使用 MySQL。
  2.2數據庫設計
  項目本身不大,所以設計的數據庫形式也很簡(jiǎn)單。
  第一個(gè)是用戶(hù)表。
  本項目中,只需要獲取用戶(hù)為本公眾號生成的唯一標識OpenID,無(wú)需獲取用戶(hù)昵稱(chēng)、城市、頭像等其他公開(kāi)信息。如果您需要有關(guān)用戶(hù)的這些信息,可以展開(kāi)用戶(hù)表。
  user表的user字段只有2列。如下圖所示:
  
  各個(gè)字段的含義:
  然后是用戶(hù)登錄記錄表。簽到表詳情如下:
  
  各個(gè)字段的含義:
  如果您的項目需要其他形式,您可以自行設計。
  3 開(kāi)發(fā)環(huán)境配置
  工人要想做好本職工作,就必須先磨礪他的工具。開(kāi)發(fā)前,需要先配置好開(kāi)發(fā)環(huán)境。
  
  使用的四個(gè)軟件
  3.1 編程環(huán)境:
  本項目使用PHP語(yǔ)言。所以編譯器使用了JetBrains PhpStorm。
  PHPStorm 是付費軟件。如果你是學(xué)生用戶(hù),有教育郵箱,可以到JetBrains官網(wǎng)授權免費版。
  3.2 編譯環(huán)境:
  在項目編寫(xiě)過(guò)程中,調試是不可避免的。所以這里使用的PHP網(wǎng)頁(yè)運行環(huán)境是phpStudy。
  本軟件是免費軟件。詳情請查看phpStudy官網(wǎng)相關(guān)文檔。
  3.3MySQL 數據庫可視化:
  在調試過(guò)程中,不可避免地要對數據庫中的數據進(jìn)行校驗和檢查。
  作者使用的MySQL數據庫可視化工具是Navicat for MySQL。
  本軟件為付費軟件。
  3.4網(wǎng)頁(yè)調試:
  如何調試公眾號網(wǎng)頁(yè)?微信公眾平臺開(kāi)發(fā)者工具欄提供網(wǎng)頁(yè)開(kāi)發(fā)者工具:微信網(wǎng)頁(yè)開(kāi)發(fā)者工具
  
  如上圖所示,點(diǎn)擊【web開(kāi)發(fā)者工具】跳轉到綁定開(kāi)發(fā)者的微信賬號頁(yè)面。這里我們綁定了開(kāi)發(fā)者的微信賬號。
  
  然后去:下載微信網(wǎng)頁(yè)開(kāi)發(fā)工具電腦客戶(hù)端。
  下載安裝后,運行后需要開(kāi)發(fā)者掃描登錄才能運行。運行頁(yè)面如下:
  
  
  3.5微信公眾后臺配置
  如果直接在公眾號菜單欄配置完成的項目,微信將無(wú)法識別你的項目。
  但是這個(gè)程序不配置公眾號后臺O(∩_∩)O
  所謂公眾號后臺配置,就是獲取公眾號秘鑰,并將域名加入公眾號界面白名單的過(guò)程。
  詳情如下:
  3.5.1配置域名
  項目最終需要使用域名訪(fǎng)問(wèn)。并且域名必須啟用SSL證書(shū)(HTTPS協(xié)議)
  關(guān)于如何在PHPStudy中配置SSL證書(shū),筆者之前寫(xiě)過(guò),點(diǎn)此查看。
  這里是關(guān)于將域名加入公眾號“白名單”。
  首先進(jìn)入公眾號后臺,點(diǎn)擊【設置】>>【公眾號設置】>>【功能設置】,如下圖:
  
  點(diǎn)擊上面紅框內兩個(gè)模塊的設置,為域名添加授權。
  為了驗證您是否擁有域名,您需要將指定文件上傳到域名服務(wù)器目錄進(jìn)行驗證。如下圖所示:
  
  具體的配置過(guò)程,按照上圖的提示進(jìn)行配置即可。
  微信公眾號支持配置2個(gè)網(wǎng)頁(yè)授權域名和3個(gè)JS接口安全域名。
  3.5.2 配置IP白名單
  本項目需要使用access_token接口,所以需要配置網(wǎng)站最終部署到IP白名單的服務(wù)器的IP地址!
  即把域名解析的IP地址配置到公眾號IP白名單(詳見(jiàn)域名解析列表)。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】修改IP白名單配置。
  
  點(diǎn)擊上圖下方紅框中的【查看】查看和修改IP白名單。
  
  3.5.3獲取開(kāi)發(fā)者密碼
  開(kāi)發(fā)者密碼是用于驗證公眾號開(kāi)發(fā)者身份的密碼,具有極高的安全性。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】重置開(kāi)發(fā)者密碼。
  
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  4 編碼實(shí)現
  據說(shuō)PHP是一種松散的語(yǔ)言。作者也是第一次接觸PHP,用PHP來(lái)實(shí)現這個(gè)項目...總體感覺(jué)PHP非常好用\(^o^)/~
  項目本身不大,客戶(hù)端有2個(gè)頁(yè)面,所以沒(méi)有框架,也沒(méi)有MVC開(kāi)發(fā)模型(以下模仿MVC開(kāi)發(fā)模型)
  4.1 模型(Model)層DAO類(lèi)代碼:
  首先,您需要創(chuàng )建一個(gè)新的 Dao 類(lèi)。該類(lèi)實(shí)現了Dao類(lèi)的構造,用于處理數據庫中的數據。
  流行的一般是實(shí)現數據庫的增刪改查,所以所有的SQL語(yǔ)句都在這里執行。
  文件名:dao.php
  詳細代碼和注釋如下:
  


早起簽到

images/banner.jpg



5:50開(kāi)啟今日簽到





立即簽到





今日簽到名次:



<p align="right">>>我的簽到記錄  


活動(dòng)詳情



1、每日05:50至23:59開(kāi)啟早起簽到。


2、其他內容……


3、其他內容……





技術(shù)支持:@拾年之璐
</p>
  本主頁(yè)使用的CSS文件來(lái)自互聯(lián)網(wǎng),長(cháng)度較長(cháng)。會(huì )在文末展示。
  這里注意,在上面代碼中“立即登錄”按鈕所在的表單中,動(dòng)作是跳轉到sign.php文件,注意這里!
  所以你需要編寫(xiě)sign.php文件。這個(gè)文件是一個(gè)控制頁(yè)和一個(gè)跳轉頁(yè)。詳細代碼如下:
  文件名:sign.php
  


我的簽到記錄

images/banner.jpg

我的簽到記錄


<p>簽到ID:    當日簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a><a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orange">  已過(guò)期</a>



您還沒(méi)有簽到記錄,快去簽到吧^_^



返回
</p>
  4.6后臺兌換頁(yè)面
  
  后臺交換頁(yè)面是一個(gè)非常簡(jiǎn)單的 HTML 頁(yè)面。其中主要由兩個(gè)PHP文件組成:
  主頁(yè)文件名:search.php
  完整代碼:
  


后臺查詢(xún)系統


input{
border: 1px solid #ccc;
padding: 10px 0px;
border-radius: 5px; /*css3屬性IE不支持*/
padding-left:10px;
width: 150px;
}
.btn5{ display:block;
border:0px;
margin:0rem auto 0% auto;
width: 94%;
background-color: #ef2122;
text-align: center;
font-weight: bold;
font-size:17px ;
color: #fff3f0;
border-radius: 10px;
}


function doAction() {
var usersignid = document.getElementById("usersignid");
window.location.href = "a.php?usersignid="+ usersignid.value;
}














用戶(hù)簽到記錄


<p>簽到ID:    簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a>


立即兌換
<a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orangered">  已過(guò)期</a>



未查詢(xún)到該簽到記錄!



</p>
  兌換按鈕文件名:submit.php
  完整代碼:
<p> 查看全部

  【早起簽到】CSS樣式表(2):0成果展示
  0 結果顯示
  這篇文章比較長(cháng)。為了減少讀者的時(shí)間,先把這個(gè)項目的結果展示出來(lái),讓讀者可以快速確認這個(gè)文章是否就是他們要找的文章。
  這里需要說(shuō)明一下,項目中的前端頁(yè)面配色圖是指網(wǎng)上發(fā)布的CSS樣式表。
  有關(guān)項目的詳細信息,請稍后查看。
  0.1 登錄主頁(yè):
  用戶(hù)點(diǎn)擊公眾號菜單【提前登錄】后,會(huì )實(shí)現微信自動(dòng)登錄,進(jìn)入登錄主頁(yè)面。
  
  主頁(yè)顯示如下:
  
  左圖:缺席簽到時(shí)間。中圖:簽到頁(yè)面。右圖:簽到完成后顯示排名頁(yè)面。
  主頁(yè)面分為三個(gè)顯示頁(yè)面。無(wú)人簽到時(shí)間(0:00-05:50)如上左圖所示。當到達簽到時(shí)間時(shí),可以點(diǎn)擊按鈕狀態(tài),如上中圖所示。登錄完成后,會(huì )顯示用戶(hù)在公眾號當天的登錄位置。
  0.2 簽到記錄頁(yè)面
  用戶(hù)登錄后,可以查看自己的登錄記錄。詳情如下圖所示:
  
  左圖:可兌換獎勵簽到記錄和過(guò)期簽到記錄 右圖:兌換簽到記錄
  本項目用戶(hù)登錄后,可于當日或次日06:50-08:30在指定地點(diǎn)領(lǐng)取獎勵。過(guò)了這個(gè)時(shí)間,這個(gè)登錄記錄就失效了。三種狀態(tài)的簽到記錄如上圖所示。
  0.3后臺交流頁(yè)面
  下圖為后臺交易所的測試頁(yè)面。輸入登錄ID查詢(xún)登錄記錄。
  
  左圖:查詢(xún)過(guò)期的登錄記錄。中圖:查詢(xún)已兌換的登錄記錄。右圖:查詢(xún)可兌換的登錄記錄。
  如上圖所示。如果前來(lái)兌換的用戶(hù)的登錄記錄已過(guò)期,則會(huì )如上左圖顯示。如果用戶(hù)的簽到記錄已經(jīng)被兌換,會(huì )如上中圖顯示。如果用戶(hù)的簽到記錄可兌換,則會(huì )如右上圖所示。
  點(diǎn)擊“立即兌換”按鈕,出現“兌換成功”彈窗,如下圖。
  
  兌換成功彈窗(在微信開(kāi)發(fā)者工具中運行)
  看到這里,如果這不是你想要的項目,那么你可以關(guān)閉這個(gè)博客。
  如果這是你想要的項目,或者這個(gè)項目和你當前的項目很接近,或者你想學(xué)習如何寫(xiě)這個(gè)項目,或者...
  請繼續閱讀。下面正式開(kāi)始^_^
  1項目背景及需求分析1.1項目背景
  關(guān)于這個(gè)需求分析部分,我們先從項目的背景說(shuō)起。
  原因是這個(gè)。項目組在公眾號舉辦活動(dòng)。這個(gè)活動(dòng)簡(jiǎn)單易懂,就是“早起簽到領(lǐng)取獎勵”。每天早上指定時(shí)間開(kāi)啟簽到系統,然后用戶(hù)點(diǎn)擊菜單欄中的“提前簽到”按鈕,通過(guò)微信登錄,進(jìn)入簽到系統。
  用戶(hù)登錄完成后,用戶(hù)可以根據登錄記錄到指定地點(diǎn)領(lǐng)取早餐。同時(shí),每日早餐數量有限,先到先得。同時(shí),簽到記錄也有兌換期。本項目組指定的方案可在當日或次日8:30前收到。所以我今天check in,第二天早上就沒(méi)有早餐了^_^
  1.2 需求分析
  通過(guò)對項目背景的分析,本項目需求如下:
  1、本項目為公眾號項目,微信網(wǎng)頁(yè)開(kāi)發(fā);
  2、實(shí)現用戶(hù)微信登錄授權確定用戶(hù)身份,實(shí)現一天只能登錄一次;
  3、用戶(hù)登錄后,記錄登錄時(shí)間和當天登錄排名;
  4、顯示用戶(hù)的簽到記錄和簽到記錄的狀態(tài)(可兌換、已兌換、已過(guò)期);
  5、Background 管理員確認兌換。
  2概述設計2.1開(kāi)發(fā)技術(shù)分析
  既然是微信網(wǎng)頁(yè)的開(kāi)發(fā),要實(shí)現用戶(hù)登錄,那么就需要了解微信公眾號網(wǎng)頁(yè)的授權機制。
  微信開(kāi)放平臺有這方面的使用說(shuō)明介紹,大家可以通過(guò)開(kāi)發(fā)者的文檔自行學(xué)習。鏈接如下:
  具體來(lái)說(shuō),網(wǎng)頁(yè)授權過(guò)程分為四個(gè)步驟:
  1、引導用戶(hù)進(jìn)入授權頁(yè)面同意授權并獲取驗證碼
  2、交換網(wǎng)頁(yè)授權access_token代碼(與基礎支持的access_token不同)
  3、如有需要,開(kāi)發(fā)者可以刷新網(wǎng)頁(yè)對access_token進(jìn)行授權,避免過(guò)期
  4、通過(guò)網(wǎng)頁(yè)授權access_token和openid獲取用戶(hù)基本信息(支持UnionID機制??)
  只有通過(guò)微信認證的服務(wù)賬號才能使用“Web授權”界面。
  
  如果要用于開(kāi)發(fā)測試,可以申請一個(gè)測試賬號。申請鏈接如下:
  微信網(wǎng)頁(yè)授權登錄的詳細流程將在實(shí)踐代碼(后面編碼實(shí)現流程)中進(jìn)行說(shuō)明。
  ———————————————————————
  然后需要分析確定開(kāi)發(fā)語(yǔ)言。
  微信網(wǎng)頁(yè)可以用任何網(wǎng)頁(yè)開(kāi)發(fā)語(yǔ)言實(shí)現。
  但是結合這個(gè)項目,需要對數據庫中的數據進(jìn)行增刪改查,所以最終使用的編程語(yǔ)言是PHP。
 ?。ù藭r(shí)筆者還沒(méi)有接觸到PHP開(kāi)發(fā)o(╥﹏╥)o,筆者熟悉的web開(kāi)發(fā)語(yǔ)言是Java Web。所以編碼實(shí)現過(guò)程,如有不對之處請指教忍著(zhù)我(*^▽^*))
  最后,數據庫使用 MySQL。
  2.2數據庫設計
  項目本身不大,所以設計的數據庫形式也很簡(jiǎn)單。
  第一個(gè)是用戶(hù)表。
  本項目中,只需要獲取用戶(hù)為本公眾號生成的唯一標識OpenID,無(wú)需獲取用戶(hù)昵稱(chēng)、城市、頭像等其他公開(kāi)信息。如果您需要有關(guān)用戶(hù)的這些信息,可以展開(kāi)用戶(hù)表。
  user表的user字段只有2列。如下圖所示:
  
  各個(gè)字段的含義:
  然后是用戶(hù)登錄記錄表。簽到表詳情如下:
  
  各個(gè)字段的含義:
  如果您的項目需要其他形式,您可以自行設計。
  3 開(kāi)發(fā)環(huán)境配置
  工人要想做好本職工作,就必須先磨礪他的工具。開(kāi)發(fā)前,需要先配置好開(kāi)發(fā)環(huán)境。
  
  使用的四個(gè)軟件
  3.1 編程環(huán)境:
  本項目使用PHP語(yǔ)言。所以編譯器使用了JetBrains PhpStorm。
  PHPStorm 是付費軟件。如果你是學(xué)生用戶(hù),有教育郵箱,可以到JetBrains官網(wǎng)授權免費版。
  3.2 編譯環(huán)境:
  在項目編寫(xiě)過(guò)程中,調試是不可避免的。所以這里使用的PHP網(wǎng)頁(yè)運行環(huán)境是phpStudy。
  本軟件是免費軟件。詳情請查看phpStudy官網(wǎng)相關(guān)文檔。
  3.3MySQL 數據庫可視化:
  在調試過(guò)程中,不可避免地要對數據庫中的數據進(jìn)行校驗和檢查。
  作者使用的MySQL數據庫可視化工具是Navicat for MySQL。
  本軟件為付費軟件。
  3.4網(wǎng)頁(yè)調試:
  如何調試公眾號網(wǎng)頁(yè)?微信公眾平臺開(kāi)發(fā)者工具欄提供網(wǎng)頁(yè)開(kāi)發(fā)者工具:微信網(wǎng)頁(yè)開(kāi)發(fā)者工具
  
  如上圖所示,點(diǎn)擊【web開(kāi)發(fā)者工具】跳轉到綁定開(kāi)發(fā)者的微信賬號頁(yè)面。這里我們綁定了開(kāi)發(fā)者的微信賬號。
  
  然后去:下載微信網(wǎng)頁(yè)開(kāi)發(fā)工具電腦客戶(hù)端。
  下載安裝后,運行后需要開(kāi)發(fā)者掃描登錄才能運行。運行頁(yè)面如下:
  
  
  3.5微信公眾后臺配置
  如果直接在公眾號菜單欄配置完成的項目,微信將無(wú)法識別你的項目。
  但是這個(gè)程序不配置公眾號后臺O(∩_∩)O
  所謂公眾號后臺配置,就是獲取公眾號秘鑰,并將域名加入公眾號界面白名單的過(guò)程。
  詳情如下:
  3.5.1配置域名
  項目最終需要使用域名訪(fǎng)問(wèn)。并且域名必須啟用SSL證書(shū)(HTTPS協(xié)議)
  關(guān)于如何在PHPStudy中配置SSL證書(shū),筆者之前寫(xiě)過(guò),點(diǎn)此查看。
  這里是關(guān)于將域名加入公眾號“白名單”。
  首先進(jìn)入公眾號后臺,點(diǎn)擊【設置】>>【公眾號設置】>>【功能設置】,如下圖:
  
  點(diǎn)擊上面紅框內兩個(gè)模塊的設置,為域名添加授權。
  為了驗證您是否擁有域名,您需要將指定文件上傳到域名服務(wù)器目錄進(jìn)行驗證。如下圖所示:
  
  具體的配置過(guò)程,按照上圖的提示進(jìn)行配置即可。
  微信公眾號支持配置2個(gè)網(wǎng)頁(yè)授權域名和3個(gè)JS接口安全域名。
  3.5.2 配置IP白名單
  本項目需要使用access_token接口,所以需要配置網(wǎng)站最終部署到IP白名單的服務(wù)器的IP地址!
  即把域名解析的IP地址配置到公眾號IP白名單(詳見(jiàn)域名解析列表)。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】修改IP白名單配置。
  
  點(diǎn)擊上圖下方紅框中的【查看】查看和修改IP白名單。
  
  3.5.3獲取開(kāi)發(fā)者密碼
  開(kāi)發(fā)者密碼是用于驗證公眾號開(kāi)發(fā)者身份的密碼,具有極高的安全性。
  在微信公眾平臺后臺點(diǎn)擊【開(kāi)發(fā)】>>【基礎配置】重置開(kāi)發(fā)者密碼。
  
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  重要提示:這里需要記錄開(kāi)發(fā)者ID(AppID)和開(kāi)發(fā)者密碼(AppSecret)!
  4 編碼實(shí)現
  據說(shuō)PHP是一種松散的語(yǔ)言。作者也是第一次接觸PHP,用PHP來(lái)實(shí)現這個(gè)項目...總體感覺(jué)PHP非常好用\(^o^)/~
  項目本身不大,客戶(hù)端有2個(gè)頁(yè)面,所以沒(méi)有框架,也沒(méi)有MVC開(kāi)發(fā)模型(以下模仿MVC開(kāi)發(fā)模型)
  4.1 模型(Model)層DAO類(lèi)代碼:
  首先,您需要創(chuàng )建一個(gè)新的 Dao 類(lèi)。該類(lèi)實(shí)現了Dao類(lèi)的構造,用于處理數據庫中的數據。
  流行的一般是實(shí)現數據庫的增刪改查,所以所有的SQL語(yǔ)句都在這里執行。
  文件名:dao.php
  詳細代碼和注釋如下:
  


早起簽到

images/banner.jpg



5:50開(kāi)啟今日簽到





立即簽到





今日簽到名次:



<p align="right">>>我的簽到記錄  


活動(dòng)詳情



1、每日05:50至23:59開(kāi)啟早起簽到。


2、其他內容……


3、其他內容……





技術(shù)支持:@拾年之璐
</p>
  本主頁(yè)使用的CSS文件來(lái)自互聯(lián)網(wǎng),長(cháng)度較長(cháng)。會(huì )在文末展示。
  這里注意,在上面代碼中“立即登錄”按鈕所在的表單中,動(dòng)作是跳轉到sign.php文件,注意這里!
  所以你需要編寫(xiě)sign.php文件。這個(gè)文件是一個(gè)控制頁(yè)和一個(gè)跳轉頁(yè)。詳細代碼如下:
  文件名:sign.php
  


我的簽到記錄

images/banner.jpg

我的簽到記錄


<p>簽到ID:    當日簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a><a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orange">  已過(guò)期</a>



您還沒(méi)有簽到記錄,快去簽到吧^_^



返回
</p>
  4.6后臺兌換頁(yè)面
  
  后臺交換頁(yè)面是一個(gè)非常簡(jiǎn)單的 HTML 頁(yè)面。其中主要由兩個(gè)PHP文件組成:
  主頁(yè)文件名:search.php
  完整代碼:
  


后臺查詢(xún)系統


input{
border: 1px solid #ccc;
padding: 10px 0px;
border-radius: 5px; /*css3屬性IE不支持*/
padding-left:10px;
width: 150px;
}
.btn5{ display:block;
border:0px;
margin:0rem auto 0% auto;
width: 94%;
background-color: #ef2122;
text-align: center;
font-weight: bold;
font-size:17px ;
color: #fff3f0;
border-radius: 10px;
}


function doAction() {
var usersignid = document.getElementById("usersignid");
window.location.href = "a.php?usersignid="+ usersignid.value;
}














用戶(hù)簽到記錄


<p>簽到ID:    簽到名次:
簽到時(shí)間:<a style="font-weight: bold;color:green">  可兌換</a>


立即兌換
<a style="font-weight: bold;color:red">  已兌換</a>
兌換時(shí)間:
<a style="font-weight: bold;color:orangered">  已過(guò)期</a>



未查詢(xún)到該簽到記錄!



</p>
  兌換按鈕文件名:submit.php
  完整代碼:
<p>

開(kāi)發(fā)接入2.1微信公眾平臺接口測試賬號的申請流程及步驟

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 175 次瀏覽 ? 2021-08-01 00:31 ? 來(lái)自相關(guān)話(huà)題

  開(kāi)發(fā)接入2.1微信公眾平臺接口測試賬號的申請流程及步驟
  一、前言
  隨著(zhù)微信的普及,年輕一代逐漸從QQ轉向微信。界面簡(jiǎn)潔,功能強大,男女老少皆宜,是微信的特色。正是這一特性,使微信成為了中國社交軟件的巨頭。因此,很多產(chǎn)品需要在微信中開(kāi)發(fā)以滿(mǎn)足需求。
  本文主要講服務(wù)號的開(kāi)發(fā),與微信服務(wù)器的交互,以及使用微信公眾號的Oauth2授權,在微信中展示本地開(kāi)發(fā)的內容并進(jìn)行交互。由于公眾號申請需要時(shí)間和經(jīng)驗,需要公司相關(guān)資質(zhì),作為個(gè)人開(kāi)發(fā)者,可以先在微信官方平臺申請測試號,使用測試號授權與微信服務(wù)器交互并調試這一頁(yè)。在開(kāi)始之前,朋友們需要了解他們的需求。微信分為企業(yè)號、服務(wù)號、訂閱號。不同的賬戶(hù)有不同的功能。具體可以到微信官網(wǎng)查看需要開(kāi)發(fā)什么類(lèi)型的賬號。
  
  二、development 接入2.1 微信公眾平臺接口測試賬號申請
  如前言所述,在開(kāi)發(fā)中,我們一半人會(huì )使用官方微信公眾號作為我們的生產(chǎn)線(xiàn)環(huán)境,然后aut環(huán)境可以使用測試號進(jìn)行開(kāi)發(fā),從而實(shí)現與微信的交互。測試賬號申請鏈接如下
  測試帳戶(hù)申請
  進(jìn)入后,您將看到以下屏幕。登錄
  
  登錄后,您會(huì )看到以下屏幕:
  
  因為我已經(jīng)配置好了,所以顯示配置后的相關(guān)參數。如果是第一次進(jìn)入,需要自己配置相關(guān)參數。首先要注意的是,系統會(huì )為你生成一個(gè)appId,appsercet,后面會(huì )講到這個(gè)的作用?,F在你需要配置 URL 和 Token。
  具體來(lái)說(shuō),這個(gè)所謂的URL就是你需要在你的代碼中與微信進(jìn)行Token驗證交互的一種方法。配置完成后,微信會(huì )使用配置的url發(fā)起http請求。請注意,發(fā)起方法是獲取請求。因此,代碼中提供的接口需要將請求頭設置為get請求:
  method=(RequestMethod.GET) 方法中需要驗證微信發(fā)送的消息。下面的token需要和你項目中配置的token一致。微信發(fā)送請求后,會(huì )帶上簽名和時(shí)間戳。 , 隨機數被檢查。如果匹配成功,則可以進(jìn)行下一步。如果不一致,則匹配失敗。需要注意的是,這個(gè)url需要有自己的域名。我個(gè)人在Sunny-Ngrok上申請了內網(wǎng)穿透,并贈送了一個(gè)域名。
  2.2 sunn-Ngrok 內網(wǎng)滲透賬號申請
  點(diǎn)擊申請賬號
  
  賬戶(hù)創(chuàng )建后,會(huì )有如上圖所示。其實(shí),開(kāi)通域名的方式有很多種。這里我只是給我一個(gè)參考方法。然后點(diǎn)擊打開(kāi)隧道,購買(mǎi)隧道
  
  一個(gè)月10元不算貴。購買(mǎi)后點(diǎn)擊隧道管理
  
  購買(mǎi)后會(huì )有記錄,可以同時(shí)查看贈送域名和查看狀態(tài)。此時(shí)的狀態(tài)為離線(xiàn)。如果是離線(xiàn),微信公眾平臺微信發(fā)起的請求無(wú)法配置從本機接受,需要到官網(wǎng)下載客戶(hù)端啟動(dòng)隧道。
  cmd命令行進(jìn)入sunny.exe所在目錄并執行
  sunny.exe clientid 隧道 ID
  
  如上圖所示,將域名指向你本地的ip和端口號后,就可以在公眾號提交配置了。在我自己機器的代碼中,我做了如下配置:
  @RequestMapping(value = "/wx/wxmsgreceive", method = {RequestMethod.GET})
public void verifywxtoken(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
logger.info("開(kāi)始校驗信息是否是從微信服務(wù)器發(fā)出");
// 簽名
String signature = request.getParameter("signature");
// 時(shí)間戳
String timestamp = request.getParameter("timestamp");
// 隨機數
String nonce = request.getParameter("nonce");
// 通過(guò)檢驗signature對請求進(jìn)行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗
String result = Sha1.gen(SERVER_TOKEN, timestamp, nonce);
if (signature.equals(result)) {
// 隨機字符串
String echostr = request.getParameter("echostr");
logger.debug("接入成功,echostr {}", echostr);
response.getWriter().write(echostr);
}
}
  微信驗證碼
  public static String gen(String token, String timestamp, String nonce) throws NoSuchAlgorithmException {
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
StringBuffer content = new StringBuffer();
for (String a : arr) {
content.append(a);
}
return DigestUtils.sha1Hex(content.toString());
}
  因為我配置的請求頭是/wx/wxmsgreceive,所以公共平臺上的配置頁(yè)面是域名+/wx/wxmsgreceive。
  此時(shí),當您在網(wǎng)頁(yè)上點(diǎn)擊提交時(shí),微信會(huì )向本機發(fā)送認證請求,以確保本機的服務(wù)必須開(kāi)啟。
  
  這是官方的說(shuō)明,所以我們開(kāi)發(fā)的項目中需要提供一個(gè)暴露的接口來(lái)驗證微信服務(wù)器,主要是驗證微信公眾號網(wǎng)頁(yè)上填寫(xiě)的token驗證。官方文檔說(shuō)明如下:
  
  所以在項目中,放置在配置文件或常量池中的token必須是微信公眾號訪(fǎng)問(wèn)中填寫(xiě)的token的字符串。如果輸入不同或者方法中的解密比較有問(wèn)題,在網(wǎng)頁(yè)上點(diǎn)擊確定,就會(huì )出現“失敗”字樣。
  
  
  2.3 微信開(kāi)發(fā)者工具準備
  下載微信開(kāi)發(fā)者工具。
  點(diǎn)擊下載微信開(kāi)發(fā)者工具
  
  下載完成后掃碼登錄
  
  選擇微信公眾號網(wǎng)頁(yè)開(kāi)發(fā)
  
  
  此工具是后續開(kāi)發(fā)中訪(fǎng)問(wèn)URL和前端調試必不可少的工具。
  2.3 Oauth2 授權
  此時(shí)測試號已經(jīng)配置好了,那么接下來(lái)我們如何開(kāi)發(fā)呢?在微信公眾號頁(yè)面,部分頁(yè)面需要根據用戶(hù)的身份回顯不同的信息,比如用戶(hù)的還款清單。這些實(shí)現首先需要獲取個(gè)人信息然后與數據庫進(jìn)行交互,需要獲取用戶(hù)的唯一標識。在微信中,每個(gè)人都有并且只有一個(gè)唯一標識openId。這個(gè)openId需要通過(guò)微信的授權和回調獲取。同時(shí),微信公開(kāi)文檔上也有詳細的授權方式介紹。如何授權可以根據自己的業(yè)務(wù)需要使用。在實(shí)際業(yè)務(wù)中,根據項目的特點(diǎn)固化不同的用戶(hù)。我們所做的是將用戶(hù)固化到數據庫中,生成一個(gè) UUID,并將 UUID 放入 cookie。授權非常重要。通過(guò)它的控件,我們可以通過(guò)獲取當前用戶(hù)的openid來(lái)比較用戶(hù)是會(huì )員還是普通會(huì )員,是非管理員還是管理員等。這在頁(yè)面跳轉中起著(zhù)至關(guān)重要的作用。同時(shí),在代碼中,一些靜態(tài)頁(yè)面可能不一定需要授權,任何人都可以查看。所以在代碼中,我使用了一個(gè)過(guò)濾器,直接在前臺發(fā)布了一系列.css、.js、.html等。特殊要求,我拉過(guò)來(lái),要求微信授權。例如,我在項目中。 .go請求中需要驗證,通過(guò)微信回調獲取當前用戶(hù)信息,固化用戶(hù)。代碼如下:
  @WebFilter(urlPatterns = "/*", filterName = "authFilter")
public class AuthFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
@Autowired
private GeneralConfigService gcService;
@Autowired
private WxUserVerify wxUserVerify;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

try {
String url = request.getRequestURI();
logger.info("URL:" + url);
// 1.請求內容為WEB靜態(tài)內容時(shí)直接放行
if (StringUtil.separatorEndWith(gcService.getStaticResourceConfig(), url)) {
chain.doFilter(servletRequest, servletResponse);
return;
}
// 2.不是靜態(tài)資源進(jìn)行驗證
if(!checkUrl(request, response, url)){
return;
}
chain.doFilter(servletRequest, servletResponse);
return;

} catch (FilterException e1) {
//自定義異常,這里可以直接把錯誤信息拋出去,不需要記錄日志,因為這里是業(yè)務(wù)異常。
ResponseUtil.error(response, e1.getMessage());
} catch (Exception e2) {
//無(wú)法捕捉的異常,不能直接把錯誤信息拋出去,需要包裝下錯誤信息
logger.error(e2.getMessage(), e2);
ResponseUtil.error(response, "系統異常,請稍后再試...");
}
}
/**
* 與數據庫配置url進(jìn)行匹配
* @param request
* @param response
* @param url
* @return
*/
private boolean checkUrl(HttpServletRequest request, HttpServletResponse response, String url) {
boolean passFlag=true;
//與數據庫進(jìn)行匹配
Map urlConfig = getUrlConfig();
//比較匹配項
String substring = url.substring(url.lastIndexOf("/") + 1);
if (!urlConfig.containsKey(substring)) {
return passFlag;
}
CallBackMsg msg = wxUserVerify.doVerify(request, response);
if (msg.getResultCode().equals(CallBackMsg.WX_VALID_CONTINUE)) {
passFlag=false;
} else if (msg.getResultCode().equals(Const.ERROR_CODE)) {
throw new FilterException(FilterExceptionEnum.ERROR_WX_VALID_FAILE);
}
return passFlag;
}
/**
* 獲取地址配置信息
* @return
*/
private Map getUrlConfig() {
// 3.獲取需要驗證用戶(hù)的請求配置
Map configAddressList = gcService.getConfigAddressList();
logger.info(configAddressList.toString());
if (configAddressList.isEmpty()) {
logger.error("urlValidConfig為空,請檢查!");
throw new FilterException(FilterExceptionEnum.ERROR_VALIDCONF_NULL);
}
return configAddressList;
}
@Override
public void destroy() {
}
}
  通過(guò)創(chuàng )建一個(gè)類(lèi)來(lái)實(shí)現Filter過(guò)濾器進(jìn)行驗證,@WebFilter(urlPatterns = "/*", filterName = "authFilter")對所有請求進(jìn)行過(guò)濾攔截,其中封裝的方法當是特定請求時(shí)會(huì )被拉取申請授權
  private CallBackMsg impower(HttpServletRequest request, HttpServletResponse response) {
CallBackMsg msg = new CallBackMsg();
String code = request.getParameter("code");
try {
// 從配置獲取access_token
String appId = getWxParams("wxAppid");
String secret = getWxParams("wxSecret");
String accessTokenUrl = gcService.getUrlWxFwGetToken() + "?appid=" + appId + "&secret=" + secret + "&code="
+ code + "&grant_type=authorization_code";
logger.info("accessTokenUrl:" + accessTokenUrl);
String accessTokenResult = "";
if (StringUtil.isEmpty(proxyFlag)) {
proxyFlag = gcService.getProxyFlag();
}
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
accessTokenResult = HttpUtils.sendPostHttpsViaProxy(accessTokenUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
accessTokenResult = HttpUtils.sendPostHttps(accessTokenUrl, "");
}
logger.info("accessTokenResult:" + accessTokenResult);
JSONObject accessTokenJson = JSONObject.parseObject(accessTokenResult);
String accessToken = accessTokenJson.getString("access_token");
logger.info("accessToken:" + accessToken);
String openid = accessTokenJson.getString("openid");
logger.info("openid:" + openid);
// 查詢(xún)數據庫中的用戶(hù)數據
String reqUrl = gcService.getSkylarkServiceUrl() + "wechat/searchwxuserinfo";
ResponseDto responseQuery = this.restInvoke(reqUrl, getQueryParam(openid, null, 1));
String userInfoDb = responseQuery.getRspMesg();
JSONObject userInfoDbJson = JSONObject.parseObject(userInfoDb);
String uuid = "";
// 數據庫不存在該用戶(hù)則保存數據庫,存在則返回已存在的UUID
if (StringUtils.isEmpty(userInfoDbJson)) {
// 查詢(xún)微信中的用戶(hù)數據
uuid = UUIDGenerator.genUUID();
// 獲取用戶(hù)信息
String userInfoUrl = gcService.getUrlWxFwGetUser() + "?access_token=" + accessToken + "&openid="
+ openid + "&lang=zh_CN";
logger.info("userInfoUrl:" + userInfoUrl);

String userInfoResult = "";
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
userInfoResult = HttpUtils.sendPostHttpsViaProxy(userInfoUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
userInfoResult = HttpUtils.sendPostHttps(userInfoUrl, "");
}
logger.info("userInfoResult:" + userInfoResult);
JSONObject userInfoJson = JSONObject.parseObject(userInfoResult);
// 固化用戶(hù)
String addReq = gcService.getSkylarkServiceUrl() + "wechat/addwxuserinfo";
ResponseDto addResp = this.restInvoke(addReq,
getEntityParam(uuid, openid, userInfoJson));
// 失敗另處理
if (!(Const.SUCCESS_CODE).equals(addResp.getRspCode())) {
// 保存數據失敗,認證失敗
msg.setResultCode(Const.ERROR_CODE);
return msg;
}
} else {
uuid = userInfoDbJson.getString("id");
}
// 權限:本項目中的類(lèi)都可以訪(fǎng)問(wèn)該cookie,存儲到客戶(hù)端
Cookie cookie = new Cookie(Const.TOKEN, uuid);
cookie.setPath("/");
response.addCookie(cookie);
//將token存入session
HttpSession session = request.getSession();
session.setAttribute("authToken",uuid);
} catch (IOException e) {
logger.error(e.getMessage());
}
msg.setResultCode(Const.SUCCESS_CODE);
return msg;
}
  因為項目中使用了代理服務(wù)器,不需要本地開(kāi)發(fā),所以方法有點(diǎn)亂,但是大體思路是客戶(hù)端發(fā)起帶有特殊后綴的請求時(shí),被過(guò)濾器攔截接下來(lái),與微信服務(wù)器進(jìn)行交互授權的過(guò)程。授權成功后,向微信提供回調地址,并將微信帶回的用戶(hù)信息保存在表中。同時(shí),當前用戶(hù)在庫表中生成的唯一標識標識存儲在cookie域中。
  
  這樣就可以將獲取到的openid放入cookie中了。那么這個(gè)openId就可以固化了,也就是存儲在數據庫中。在會(huì )話(huà)中,如果點(diǎn)擊某個(gè)頁(yè)面需要使用微信授權,可以先從cookie域中獲取。如果cookie不可用,則向微信發(fā)起授權請求,獲取openid后,存儲cookie和curing。有一些步驟可以實(shí)現這一點(diǎn)。微信開(kāi)放平臺上有相關(guān)的demo。如果您需要我提供它們,請留言。后續授權碼我會(huì )貼出來(lái)供大家參考。 查看全部

  開(kāi)發(fā)接入2.1微信公眾平臺接口測試賬號的申請流程及步驟
  一、前言
  隨著(zhù)微信的普及,年輕一代逐漸從QQ轉向微信。界面簡(jiǎn)潔,功能強大,男女老少皆宜,是微信的特色。正是這一特性,使微信成為了中國社交軟件的巨頭。因此,很多產(chǎn)品需要在微信中開(kāi)發(fā)以滿(mǎn)足需求。
  本文主要講服務(wù)號的開(kāi)發(fā),與微信服務(wù)器的交互,以及使用微信公眾號的Oauth2授權,在微信中展示本地開(kāi)發(fā)的內容并進(jìn)行交互。由于公眾號申請需要時(shí)間和經(jīng)驗,需要公司相關(guān)資質(zhì),作為個(gè)人開(kāi)發(fā)者,可以先在微信官方平臺申請測試號,使用測試號授權與微信服務(wù)器交互并調試這一頁(yè)。在開(kāi)始之前,朋友們需要了解他們的需求。微信分為企業(yè)號、服務(wù)號、訂閱號。不同的賬戶(hù)有不同的功能。具體可以到微信官網(wǎng)查看需要開(kāi)發(fā)什么類(lèi)型的賬號。
  
  二、development 接入2.1 微信公眾平臺接口測試賬號申請
  如前言所述,在開(kāi)發(fā)中,我們一半人會(huì )使用官方微信公眾號作為我們的生產(chǎn)線(xiàn)環(huán)境,然后aut環(huán)境可以使用測試號進(jìn)行開(kāi)發(fā),從而實(shí)現與微信的交互。測試賬號申請鏈接如下
  測試帳戶(hù)申請
  進(jìn)入后,您將看到以下屏幕。登錄
  
  登錄后,您會(huì )看到以下屏幕:
  
  因為我已經(jīng)配置好了,所以顯示配置后的相關(guān)參數。如果是第一次進(jìn)入,需要自己配置相關(guān)參數。首先要注意的是,系統會(huì )為你生成一個(gè)appId,appsercet,后面會(huì )講到這個(gè)的作用?,F在你需要配置 URL 和 Token。
  具體來(lái)說(shuō),這個(gè)所謂的URL就是你需要在你的代碼中與微信進(jìn)行Token驗證交互的一種方法。配置完成后,微信會(huì )使用配置的url發(fā)起http請求。請注意,發(fā)起方法是獲取請求。因此,代碼中提供的接口需要將請求頭設置為get請求:
  method=(RequestMethod.GET) 方法中需要驗證微信發(fā)送的消息。下面的token需要和你項目中配置的token一致。微信發(fā)送請求后,會(huì )帶上簽名和時(shí)間戳。 , 隨機數被檢查。如果匹配成功,則可以進(jìn)行下一步。如果不一致,則匹配失敗。需要注意的是,這個(gè)url需要有自己的域名。我個(gè)人在Sunny-Ngrok上申請了內網(wǎng)穿透,并贈送了一個(gè)域名。
  2.2 sunn-Ngrok 內網(wǎng)滲透賬號申請
  點(diǎn)擊申請賬號
  
  賬戶(hù)創(chuàng )建后,會(huì )有如上圖所示。其實(shí),開(kāi)通域名的方式有很多種。這里我只是給我一個(gè)參考方法。然后點(diǎn)擊打開(kāi)隧道,購買(mǎi)隧道
  
  一個(gè)月10元不算貴。購買(mǎi)后點(diǎn)擊隧道管理
  
  購買(mǎi)后會(huì )有記錄,可以同時(shí)查看贈送域名和查看狀態(tài)。此時(shí)的狀態(tài)為離線(xiàn)。如果是離線(xiàn),微信公眾平臺微信發(fā)起的請求無(wú)法配置從本機接受,需要到官網(wǎng)下載客戶(hù)端啟動(dòng)隧道。
  cmd命令行進(jìn)入sunny.exe所在目錄并執行
  sunny.exe clientid 隧道 ID
  
  如上圖所示,將域名指向你本地的ip和端口號后,就可以在公眾號提交配置了。在我自己機器的代碼中,我做了如下配置:
  @RequestMapping(value = "/wx/wxmsgreceive", method = {RequestMethod.GET})
public void verifywxtoken(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
logger.info("開(kāi)始校驗信息是否是從微信服務(wù)器發(fā)出");
// 簽名
String signature = request.getParameter("signature");
// 時(shí)間戳
String timestamp = request.getParameter("timestamp");
// 隨機數
String nonce = request.getParameter("nonce");
// 通過(guò)檢驗signature對請求進(jìn)行校驗,若校驗成功則原樣返回echostr,表示接入成功,否則接入失敗
String result = Sha1.gen(SERVER_TOKEN, timestamp, nonce);
if (signature.equals(result)) {
// 隨機字符串
String echostr = request.getParameter("echostr");
logger.debug("接入成功,echostr {}", echostr);
response.getWriter().write(echostr);
}
}
  微信驗證碼
  public static String gen(String token, String timestamp, String nonce) throws NoSuchAlgorithmException {
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
StringBuffer content = new StringBuffer();
for (String a : arr) {
content.append(a);
}
return DigestUtils.sha1Hex(content.toString());
}
  因為我配置的請求頭是/wx/wxmsgreceive,所以公共平臺上的配置頁(yè)面是域名+/wx/wxmsgreceive。
  此時(shí),當您在網(wǎng)頁(yè)上點(diǎn)擊提交時(shí),微信會(huì )向本機發(fā)送認證請求,以確保本機的服務(wù)必須開(kāi)啟。
  
  這是官方的說(shuō)明,所以我們開(kāi)發(fā)的項目中需要提供一個(gè)暴露的接口來(lái)驗證微信服務(wù)器,主要是驗證微信公眾號網(wǎng)頁(yè)上填寫(xiě)的token驗證。官方文檔說(shuō)明如下:
  
  所以在項目中,放置在配置文件或常量池中的token必須是微信公眾號訪(fǎng)問(wèn)中填寫(xiě)的token的字符串。如果輸入不同或者方法中的解密比較有問(wèn)題,在網(wǎng)頁(yè)上點(diǎn)擊確定,就會(huì )出現“失敗”字樣。
  
  
  2.3 微信開(kāi)發(fā)者工具準備
  下載微信開(kāi)發(fā)者工具。
  點(diǎn)擊下載微信開(kāi)發(fā)者工具
  
  下載完成后掃碼登錄
  
  選擇微信公眾號網(wǎng)頁(yè)開(kāi)發(fā)
  
  
  此工具是后續開(kāi)發(fā)中訪(fǎng)問(wèn)URL和前端調試必不可少的工具。
  2.3 Oauth2 授權
  此時(shí)測試號已經(jīng)配置好了,那么接下來(lái)我們如何開(kāi)發(fā)呢?在微信公眾號頁(yè)面,部分頁(yè)面需要根據用戶(hù)的身份回顯不同的信息,比如用戶(hù)的還款清單。這些實(shí)現首先需要獲取個(gè)人信息然后與數據庫進(jìn)行交互,需要獲取用戶(hù)的唯一標識。在微信中,每個(gè)人都有并且只有一個(gè)唯一標識openId。這個(gè)openId需要通過(guò)微信的授權和回調獲取。同時(shí),微信公開(kāi)文檔上也有詳細的授權方式介紹。如何授權可以根據自己的業(yè)務(wù)需要使用。在實(shí)際業(yè)務(wù)中,根據項目的特點(diǎn)固化不同的用戶(hù)。我們所做的是將用戶(hù)固化到數據庫中,生成一個(gè) UUID,并將 UUID 放入 cookie。授權非常重要。通過(guò)它的控件,我們可以通過(guò)獲取當前用戶(hù)的openid來(lái)比較用戶(hù)是會(huì )員還是普通會(huì )員,是非管理員還是管理員等。這在頁(yè)面跳轉中起著(zhù)至關(guān)重要的作用。同時(shí),在代碼中,一些靜態(tài)頁(yè)面可能不一定需要授權,任何人都可以查看。所以在代碼中,我使用了一個(gè)過(guò)濾器,直接在前臺發(fā)布了一系列.css、.js、.html等。特殊要求,我拉過(guò)來(lái),要求微信授權。例如,我在項目中。 .go請求中需要驗證,通過(guò)微信回調獲取當前用戶(hù)信息,固化用戶(hù)。代碼如下:
  @WebFilter(urlPatterns = "/*", filterName = "authFilter")
public class AuthFilter implements Filter {
private final Logger logger = LoggerFactory.getLogger(AuthFilter.class);
@Autowired
private GeneralConfigService gcService;
@Autowired
private WxUserVerify wxUserVerify;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;

try {
String url = request.getRequestURI();
logger.info("URL:" + url);
// 1.請求內容為WEB靜態(tài)內容時(shí)直接放行
if (StringUtil.separatorEndWith(gcService.getStaticResourceConfig(), url)) {
chain.doFilter(servletRequest, servletResponse);
return;
}
// 2.不是靜態(tài)資源進(jìn)行驗證
if(!checkUrl(request, response, url)){
return;
}
chain.doFilter(servletRequest, servletResponse);
return;

} catch (FilterException e1) {
//自定義異常,這里可以直接把錯誤信息拋出去,不需要記錄日志,因為這里是業(yè)務(wù)異常。
ResponseUtil.error(response, e1.getMessage());
} catch (Exception e2) {
//無(wú)法捕捉的異常,不能直接把錯誤信息拋出去,需要包裝下錯誤信息
logger.error(e2.getMessage(), e2);
ResponseUtil.error(response, "系統異常,請稍后再試...");
}
}
/**
* 與數據庫配置url進(jìn)行匹配
* @param request
* @param response
* @param url
* @return
*/
private boolean checkUrl(HttpServletRequest request, HttpServletResponse response, String url) {
boolean passFlag=true;
//與數據庫進(jìn)行匹配
Map urlConfig = getUrlConfig();
//比較匹配項
String substring = url.substring(url.lastIndexOf("/") + 1);
if (!urlConfig.containsKey(substring)) {
return passFlag;
}
CallBackMsg msg = wxUserVerify.doVerify(request, response);
if (msg.getResultCode().equals(CallBackMsg.WX_VALID_CONTINUE)) {
passFlag=false;
} else if (msg.getResultCode().equals(Const.ERROR_CODE)) {
throw new FilterException(FilterExceptionEnum.ERROR_WX_VALID_FAILE);
}
return passFlag;
}
/**
* 獲取地址配置信息
* @return
*/
private Map getUrlConfig() {
// 3.獲取需要驗證用戶(hù)的請求配置
Map configAddressList = gcService.getConfigAddressList();
logger.info(configAddressList.toString());
if (configAddressList.isEmpty()) {
logger.error("urlValidConfig為空,請檢查!");
throw new FilterException(FilterExceptionEnum.ERROR_VALIDCONF_NULL);
}
return configAddressList;
}
@Override
public void destroy() {
}
}
  通過(guò)創(chuàng )建一個(gè)類(lèi)來(lái)實(shí)現Filter過(guò)濾器進(jìn)行驗證,@WebFilter(urlPatterns = "/*", filterName = "authFilter")對所有請求進(jìn)行過(guò)濾攔截,其中封裝的方法當是特定請求時(shí)會(huì )被拉取申請授權
  private CallBackMsg impower(HttpServletRequest request, HttpServletResponse response) {
CallBackMsg msg = new CallBackMsg();
String code = request.getParameter("code");
try {
// 從配置獲取access_token
String appId = getWxParams("wxAppid");
String secret = getWxParams("wxSecret");
String accessTokenUrl = gcService.getUrlWxFwGetToken() + "?appid=" + appId + "&secret=" + secret + "&code="
+ code + "&grant_type=authorization_code";
logger.info("accessTokenUrl:" + accessTokenUrl);
String accessTokenResult = "";
if (StringUtil.isEmpty(proxyFlag)) {
proxyFlag = gcService.getProxyFlag();
}
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
accessTokenResult = HttpUtils.sendPostHttpsViaProxy(accessTokenUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
accessTokenResult = HttpUtils.sendPostHttps(accessTokenUrl, "");
}
logger.info("accessTokenResult:" + accessTokenResult);
JSONObject accessTokenJson = JSONObject.parseObject(accessTokenResult);
String accessToken = accessTokenJson.getString("access_token");
logger.info("accessToken:" + accessToken);
String openid = accessTokenJson.getString("openid");
logger.info("openid:" + openid);
// 查詢(xún)數據庫中的用戶(hù)數據
String reqUrl = gcService.getSkylarkServiceUrl() + "wechat/searchwxuserinfo";
ResponseDto responseQuery = this.restInvoke(reqUrl, getQueryParam(openid, null, 1));
String userInfoDb = responseQuery.getRspMesg();
JSONObject userInfoDbJson = JSONObject.parseObject(userInfoDb);
String uuid = "";
// 數據庫不存在該用戶(hù)則保存數據庫,存在則返回已存在的UUID
if (StringUtils.isEmpty(userInfoDbJson)) {
// 查詢(xún)微信中的用戶(hù)數據
uuid = UUIDGenerator.genUUID();
// 獲取用戶(hù)信息
String userInfoUrl = gcService.getUrlWxFwGetUser() + "?access_token=" + accessToken + "&openid="
+ openid + "&lang=zh_CN";
logger.info("userInfoUrl:" + userInfoUrl);

String userInfoResult = "";
if (Const.PROXY_FLAG_USED.equals(proxyFlag)) {
userInfoResult = HttpUtils.sendPostHttpsViaProxy(userInfoUrl, "", gcService.getProxyIp(),
gcService.getProxyPort());
} else {
userInfoResult = HttpUtils.sendPostHttps(userInfoUrl, "");
}
logger.info("userInfoResult:" + userInfoResult);
JSONObject userInfoJson = JSONObject.parseObject(userInfoResult);
// 固化用戶(hù)
String addReq = gcService.getSkylarkServiceUrl() + "wechat/addwxuserinfo";
ResponseDto addResp = this.restInvoke(addReq,
getEntityParam(uuid, openid, userInfoJson));
// 失敗另處理
if (!(Const.SUCCESS_CODE).equals(addResp.getRspCode())) {
// 保存數據失敗,認證失敗
msg.setResultCode(Const.ERROR_CODE);
return msg;
}
} else {
uuid = userInfoDbJson.getString("id");
}
// 權限:本項目中的類(lèi)都可以訪(fǎng)問(wèn)該cookie,存儲到客戶(hù)端
Cookie cookie = new Cookie(Const.TOKEN, uuid);
cookie.setPath("/");
response.addCookie(cookie);
//將token存入session
HttpSession session = request.getSession();
session.setAttribute("authToken",uuid);
} catch (IOException e) {
logger.error(e.getMessage());
}
msg.setResultCode(Const.SUCCESS_CODE);
return msg;
}
  因為項目中使用了代理服務(wù)器,不需要本地開(kāi)發(fā),所以方法有點(diǎn)亂,但是大體思路是客戶(hù)端發(fā)起帶有特殊后綴的請求時(shí),被過(guò)濾器攔截接下來(lái),與微信服務(wù)器進(jìn)行交互授權的過(guò)程。授權成功后,向微信提供回調地址,并將微信帶回的用戶(hù)信息保存在表中。同時(shí),當前用戶(hù)在庫表中生成的唯一標識標識存儲在cookie域中。
  
  這樣就可以將獲取到的openid放入cookie中了。那么這個(gè)openId就可以固化了,也就是存儲在數據庫中。在會(huì )話(huà)中,如果點(diǎn)擊某個(gè)頁(yè)面需要使用微信授權,可以先從cookie域中獲取。如果cookie不可用,則向微信發(fā)起授權請求,獲取openid后,存儲cookie和curing。有一些步驟可以實(shí)現這一點(diǎn)。微信開(kāi)放平臺上有相關(guān)的demo。如果您需要我提供它們,請留言。后續授權碼我會(huì )貼出來(lái)供大家參考。

如何實(shí)際操作公眾號可以讓小游戲在一定程度上裂變

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 117 次瀏覽 ? 2021-07-29 03:22 ? 來(lái)自相關(guān)話(huà)題

  如何實(shí)際操作公眾號可以讓小游戲在一定程度上裂變
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  問(wèn)題就在這里。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià) 查看全部

  如何實(shí)際操作公眾號可以讓小游戲在一定程度上裂變
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  問(wèn)題就在這里。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià)

微信公眾號的兩種開(kāi)發(fā)模式你可能會(huì )有一個(gè)疑惑?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 104 次瀏覽 ? 2021-07-28 23:34 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號的兩種開(kāi)發(fā)模式你可能會(huì )有一個(gè)疑惑?
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  那么問(wèn)題來(lái)了。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià) 查看全部

  微信公眾號的兩種開(kāi)發(fā)模式你可能會(huì )有一個(gè)疑惑?
  微信公眾號的兩種開(kāi)發(fā)模式
  你可能有疑問(wèn)?為什么要使用小號進(jìn)行測試?其實(shí)微信公眾號的開(kāi)發(fā)有兩種模式:
  編輯模式:主要針對非程序員和信息發(fā)布公眾號。開(kāi)啟此模式后,您可以通過(guò)界面輕松配置“自定義菜單”和“自動(dòng)回復消息”。
  開(kāi)發(fā)模式:主要針對有開(kāi)發(fā)能力的人。開(kāi)啟該模式后,您可以使用微信公眾平臺上開(kāi)放的界面,通過(guò)編程實(shí)現自定義菜單的創(chuàng )建和用戶(hù)消息的接收/處理/響應。這種模式比較靈活,建議有開(kāi)發(fā)能力的公司或個(gè)人采用這種模式。
  簡(jiǎn)單來(lái)說(shuō),不需要編寫(xiě)代碼,直接在微信公眾號網(wǎng)頁(yè)上配置自定義菜單或自動(dòng)回復。這稱(chēng)為編輯模式;您需要編寫(xiě)代碼來(lái)實(shí)現自動(dòng)回復或更高級的邏輯,這稱(chēng)為開(kāi)發(fā)模式;而這兩種模式是互斥的,即一旦開(kāi)啟了開(kāi)發(fā)模式,編輯模式就失效了。之前配置的自定義菜單和自動(dòng)回復都是無(wú)效的。這對于我現在的公眾號來(lái)說(shuō)是不能接受的,因為編輯模式是模式里面的配置太多了。遷移到開(kāi)發(fā)者模式需要大量的時(shí)間和成本,其次不穩定,所以我想到了我的塵土飛揚的小號。
  在正式開(kāi)發(fā)之前,您需要有以下“紙”或“筆”:
  一臺服務(wù)器(華南、華北、華東、華西最佳位置)
  一個(gè)有據可查的域名是最好的
  服務(wù)器訪(fǎng)問(wèn)微信公眾號
  那么,在微信公眾號的開(kāi)發(fā)過(guò)程中,微信公眾號后端就像一個(gè)代理服務(wù)器。微信公眾號消息首先由微信公眾號后端處理,然后轉發(fā)到我們自己的服務(wù)器進(jìn)行處理。這個(gè)過(guò)程我們必須遵循微信公眾號的開(kāi)發(fā)規范;那么,我們如何將微信公眾號與我們自己的服務(wù)器連接起來(lái)呢?開(kāi)發(fā)者接入微信公眾平臺進(jìn)行開(kāi)發(fā),需要完成以下步驟:
  填寫(xiě)服務(wù)器配置:填寫(xiě)URL(只支持80(http)和443(https)端口,開(kāi)發(fā)者文檔說(shuō)是服務(wù)器域名,準確的說(shuō)不是你的服務(wù)器域名,但是你服務(wù)器上的微信公眾號轉發(fā)消息的根路由)、Token(可以填寫(xiě))和EncodingAESKey(可以自動(dòng)生成),這兩個(gè)參數可能只有在訪(fǎng)問(wèn)時(shí)才有用。它們是使用 sha1 加密來(lái)確保安全性的幾個(gè)參數中的第二個(gè)。比較在意,這一步主要是注意網(wǎng)址的正確性。
  驗證服務(wù)器地址的有效性:點(diǎn)擊驗證按鈕,網(wǎng)頁(yè)會(huì )出現Token驗證成功或失敗的提示。
  根據接口文檔實(shí)現業(yè)務(wù)邏輯:這是我們手寫(xiě)代碼的部分。
  應用邏輯
  有個(gè)坑需要填寫(xiě),個(gè)人微信公眾號無(wú)法獲取用戶(hù)的基本信息:昵稱(chēng)、頭像等
  獲得這個(gè)權限需要認證,但是認證需要拿錢(qián),但是我寫(xiě)的很爛
  回到我們創(chuàng )作的初衷,涉及到個(gè)性化的預測海報。我將簡(jiǎn)單地處理個(gè)性化部分,只是隨機字符串。深入挖掘,需要個(gè)性化推薦,但沒(méi)有用戶(hù)信息,是不是要寫(xiě)點(diǎn)邏輯?用戶(hù)丟了興趣又回來(lái)了?這已經(jīng)超出了本次創(chuàng )作的初衷,下次補上。
  至于制作海報,我使用PIL庫中的ImageDraw對象,直接在預設海報上填寫(xiě)字符串即可。
  PIL 庫的安裝姿勢是 pip install Pillow 而不是 pip install PIL
  然后應用服務(wù)器使用Flask框架(Flask是應用框架,nginx是web服務(wù)器,都是軟件,Flask自己的生產(chǎn)環(huán)境服務(wù)器不足以支持實(shí)際應用,需要uwsgi應用服務(wù)器,nginx直接處理靜態(tài)資源請求,邏輯請求轉發(fā)給uwsgi;阿里云服務(wù)器是一個(gè)虛擬化的PC,包括軟硬件;
  回到正題,假設我們的根路由是
  我們可以給這個(gè)路由綁定一個(gè)視圖函數my_view(),同時(shí)打開(kāi)開(kāi)關(guān)處理post請求(默認只處理get)。我們所有的邏輯都可以通過(guò)這個(gè)視圖函數來(lái)實(shí)現,并連接到公眾號進(jìn)行開(kāi)發(fā) 當通過(guò)get方法向我們的服務(wù)器請求Token驗證公眾號時(shí),驗證后轉發(fā)的消息通過(guò)post方法,那么我們就可以通過(guò)請求方式區分是驗證還是轉發(fā)。
  f request.method == ‘GET’:
  signature = request.args[‘signature’]
  timestamp = request.args[‘timestamp’]
  echostr = request.args[‘echostr’]
  nonce = request.args[‘nonce’]
  token = ‘我要愛(ài)這個(gè)世界’
  tempList = [令牌、時(shí)間戳、隨機數]
  #字典順序排序
  tempList.sort()
  #轉成字符串
  tempStr = ”.join(tempList)
  #sha1 加密
  tempStr = hashlib.sha1(tempStr.encode(‘utf-8’)).hexdigest()
  如果 tempStr == 簽名:
  print('令牌驗證成功')
  返回 echostr
  其他:
  #可以發(fā)現之前的驗證碼其實(shí)無(wú)關(guān)緊要,只要返回echostr就驗證成功
  返回 echostr
  elif request.method == ‘POST’:
  print('在這里寫(xiě)業(yè)務(wù)邏輯')
  我們還需要調用我們服務(wù)器上的微信接口。比如海報制作完成后,通過(guò)微信轉發(fā)給用戶(hù),不能直接返回圖片的二進(jìn)制數據。事實(shí)上,這是由微信公眾號完成的。我們需要上傳發(fā)送海報到微信公眾號素材庫,獲取海報的id,然后封裝成xml數據返回給微信公眾號(吐槽還沒(méi)有升級成json交換數據) ,以便用戶(hù)收到我們的海報。
  那么問(wèn)題來(lái)了。將海報上傳至微信公眾號素材庫。我在公眾號文章編輯界面已經(jīng)很久了。我以為我必須手動(dòng)上傳它。幸運的是,我找到了接口1,我們可以在服務(wù)器上調用它。這個(gè)接口1,為了防止這個(gè)接口1被濫用,必須提供access_token,但是access_token是從哪里來(lái)的呢?需要調用另一個(gè)接口2,接口2需要提供AppId和AppSecret參數。如果不自己修改,這兩個(gè)長(cháng)期有效,可以直接獲取。
  接口 1:POST
  接口 2:獲取
  另一個(gè)陷阱是這個(gè)access_token的有效期只有2個(gè)小時(shí),所以需要不斷更新,所以需要在我們的Flask中引入循環(huán)任務(wù)配置
  #定時(shí)任務(wù)配置類(lèi)Config(object):#創(chuàng )建配置
  #任務(wù)列表
  工作 = [
  {
  ‘id’: ‘1’,
  'func': '__main__:refreshToken', # 定時(shí)執行的方法名
  'trigger': 'interval',#interval 表示循環(huán)任務(wù)
  'hours': 2, # 每?jì)尚r(shí)執行一次
  }
  ]
  app.config.from_object(Config()) # 為實(shí)例化的flask引入配置
  億奇達積累了10年的行業(yè)經(jīng)驗!專(zhuān)業(yè)小程序,公眾號H5、APP定制開(kāi)發(fā)
  來(lái)電即刻享受優(yōu)惠
  點(diǎn)擊獲取報價(jià)

使用到的技術(shù):python3,微信公眾號的全部?jì)热莘治?/a>

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 94 次瀏覽 ? 2021-07-28 21:03 ? 來(lái)自相關(guān)話(huà)題

  使用到的技術(shù):python3,微信公眾號的全部?jì)热莘治?br />   使用的技術(shù):python3、selenium、requests
  最近接到一個(gè)新項目,需要爬取微信公眾號的數據。接下來(lái)就和大家分享一下
  筆者在網(wǎng)上也看到過(guò)使用**搜狗微信API來(lái)抓取數據,但是如果我想按照公眾號把它的文章全部抓取,發(fā)現不行
  
  它只有最近的文章,意思是我想把他的文章全部弄到手,但是不行(可能作者不合格,但是我沒(méi)找到。歡迎大家同學(xué)幫我改正)。如果你搜索文章,是這種
  
  比如我想爬取公眾號的所有文章,還是不行。
  還有使用抓包工具**來(lái)抓app的數據接口。這是可行的,但是抓包工具的配置和網(wǎng)頁(yè)數據接口的分析非常復雜,這里就不介紹了。
  接下來(lái)說(shuō)說(shuō)我的想法
  1.在微信公眾號平臺注冊一個(gè)賬號(注冊一個(gè)即可)
  
  然后點(diǎn)擊超鏈接,進(jìn)入公眾號,選擇顯示公眾號的所有文章信息,如圖
  
  
  好的,現在我們找到了數據,繼續進(jìn)行網(wǎng)絡(luò )分析
  2.分析網(wǎng)頁(yè)
  F12 調試
  
  這里我們可以觀(guān)察信息界面,分析這個(gè)json數據,可以看到鏈接收錄文章,鏈接,標題,時(shí)間等,所以,接下來(lái)添加代碼
  3.上代碼
  首先解決的是登錄問(wèn)題,我用selenium+chrome登錄,
  account_name = "賬號"
password = "密碼"
def wechat_login():
# 用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome()
driver.get("https://mp.weixin.qq.com/")
time.sleep(2)
print("正在輸入微信公眾號登錄賬號和密碼......")
# 清空賬號框中的內容
try:
driver.find_element_by_name("account").clear()
print("正在輸入微信公眾號登錄賬號和密碼......")
driver.find_element_by_name("account").send_keys(account_name)
time.sleep(1)
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys(password)
time.sleep(1)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
driver.find_element_by_class_name("frm_checkbox_label").click()
time.sleep(5)
# 自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_class_name("btn_login").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
except:
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
post = {}
# 獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
post[cookie_item[&#39;name&#39;]] = cookie_item[&#39;value&#39;]
cookie_str = json.dumps(post)
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print("cookies信息已保存到本地")
driver.quit()
  這里說(shuō)明一下,微信公眾號平臺的登錄界面可能不同。
  
  這是一種情況,就是直接掃碼登錄,另一種是
  
  用賬號登錄,所以登錄的時(shí)候多了一種情況,最后記得把網(wǎng)頁(yè)中的cookie信息保存在本地,用來(lái)爬取
  2.獲取具體的文章
  def get_content(query):
# query為要爬取的公眾號名稱(chēng)
# 公眾號主頁(yè)
url = &#39;https://mp.weixin.qq.com&#39;

# 設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}
from requests.packages import urllib3
urllib3.disable_warnings() # 關(guān)閉警告

# 讀取上一步獲取到的cookies
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
# 增加重試連接次數
session = requests.Session()
session.keep_alive = False
# 增加重試連接次數
session.adapters.DEFAULT_RETRIES = 511
time.sleep(5)

# 登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = session.get(url=url, cookies=cookies, verify=False)

token = re.findall(r&#39;token=(\d+)&#39;, str(response.url))[0]
time.sleep(2)
# 搜索微信公眾號的接口地址
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
# 搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;query&#39;: query,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;
}
# 打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = session.get(
search_url,
cookies=cookies,
headers=header,
params=query_id)
# 取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get(&#39;list&#39;)[0]
print(lists)
# 獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get(&#39;fakeid&#39;)

# 微信公眾號文章接口地址
appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
# 搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;, # 不同頁(yè),此參數變化,變化規則為每頁(yè)加5
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
# 打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = session.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
# 獲取文章總數
max_num = appmsg_response.json().get(&#39;app_msg_cnt&#39;)
# 每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
# 起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
seq = 0
while num + 1 > 0:
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;{}&#39;.format(str(begin)),
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
print(&#39;正在翻頁(yè):--------------&#39;, begin)
time.sleep(5)

# 獲取每一頁(yè)文章的標題和鏈接地址,并寫(xiě)入本地文本中
query_fakeid_response = requests.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
fakeid_list = query_fakeid_response.json().get(&#39;app_msg_list&#39;)
if fakeid_list:
for item in fakeid_list:
content_link = item.get(&#39;link&#39;)
content_title = item.get(&#39;title&#39;)
fileName = query + &#39;.txt&#39;
seq += 1
with open(fileName, &#39;a&#39;, encoding=&#39;utf-8&#39;) as fh:
fh.write(
str(seq) +
"|" +
content_title +
"|" +
content_link +
"\n")
num -= 1
begin = int(begin)
begin += 5
  好了朋友們,以上就是對微信公眾號全部?jì)热莸淖ト?,希望對大家有所幫助,歡迎各位大佬指正修改,共同學(xué)習進(jìn)步 查看全部

  使用到的技術(shù):python3,微信公眾號的全部?jì)热莘治?br />   使用的技術(shù):python3、selenium、requests
  最近接到一個(gè)新項目,需要爬取微信公眾號的數據。接下來(lái)就和大家分享一下
  筆者在網(wǎng)上也看到過(guò)使用**搜狗微信API來(lái)抓取數據,但是如果我想按照公眾號把它的文章全部抓取,發(fā)現不行
  
  它只有最近的文章,意思是我想把他的文章全部弄到手,但是不行(可能作者不合格,但是我沒(méi)找到。歡迎大家同學(xué)幫我改正)。如果你搜索文章,是這種
  
  比如我想爬取公眾號的所有文章,還是不行。
  還有使用抓包工具**來(lái)抓app的數據接口。這是可行的,但是抓包工具的配置和網(wǎng)頁(yè)數據接口的分析非常復雜,這里就不介紹了。
  接下來(lái)說(shuō)說(shuō)我的想法
  1.在微信公眾號平臺注冊一個(gè)賬號(注冊一個(gè)即可)
  
  然后點(diǎn)擊超鏈接,進(jìn)入公眾號,選擇顯示公眾號的所有文章信息,如圖
  
  
  好的,現在我們找到了數據,繼續進(jìn)行網(wǎng)絡(luò )分析
  2.分析網(wǎng)頁(yè)
  F12 調試
  
  這里我們可以觀(guān)察信息界面,分析這個(gè)json數據,可以看到鏈接收錄文章,鏈接,標題,時(shí)間等,所以,接下來(lái)添加代碼
  3.上代碼
  首先解決的是登錄問(wèn)題,我用selenium+chrome登錄,
  account_name = "賬號"
password = "密碼"
def wechat_login():
# 用webdriver啟動(dòng)谷歌瀏覽器
print("啟動(dòng)瀏覽器,打開(kāi)微信公眾號登錄界面")
driver = webdriver.Chrome()
driver.get("https://mp.weixin.qq.com/";)
time.sleep(2)
print("正在輸入微信公眾號登錄賬號和密碼......")
# 清空賬號框中的內容
try:
driver.find_element_by_name("account").clear()
print("正在輸入微信公眾號登錄賬號和密碼......")
driver.find_element_by_name("account").send_keys(account_name)
time.sleep(1)
driver.find_element_by_name("password").clear()
driver.find_element_by_name("password").send_keys(password)
time.sleep(1)
# 在自動(dòng)輸完密碼之后需要手動(dòng)點(diǎn)一下記住我
print("請在登錄界面點(diǎn)擊:記住賬號")
driver.find_element_by_class_name("frm_checkbox_label").click()
time.sleep(5)
# 自動(dòng)點(diǎn)擊登錄按鈕進(jìn)行登錄
driver.find_element_by_class_name("btn_login").click()
# 拿手機掃二維碼!
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
except:
print("請拿手機掃碼二維碼登錄公眾號")
time.sleep(30)
print("登錄成功")
# 獲取cookies
cookie_items = driver.get_cookies()
post = {}
# 獲取到的cookies是列表形式,將cookies轉成json形式并存入本地名為cookie的文本中
for cookie_item in cookie_items:
post[cookie_item[&#39;name&#39;]] = cookie_item[&#39;value&#39;]
cookie_str = json.dumps(post)
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print("cookies信息已保存到本地")
driver.quit()
  這里說(shuō)明一下,微信公眾號平臺的登錄界面可能不同。
  
  這是一種情況,就是直接掃碼登錄,另一種是
  
  用賬號登錄,所以登錄的時(shí)候多了一種情況,最后記得把網(wǎng)頁(yè)中的cookie信息保存在本地,用來(lái)爬取
  2.獲取具體的文章
  def get_content(query):
# query為要爬取的公眾號名稱(chēng)
# 公眾號主頁(yè)
url = &#39;https://mp.weixin.qq.com&#39;

# 設置headers
header = {
"HOST": "mp.weixin.qq.com",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"

}
from requests.packages import urllib3
urllib3.disable_warnings() # 關(guān)閉警告

# 讀取上一步獲取到的cookies
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
# 增加重試連接次數
session = requests.Session()
session.keep_alive = False
# 增加重試連接次數
session.adapters.DEFAULT_RETRIES = 511
time.sleep(5)

# 登錄之后的微信公眾號首頁(yè)url變化為:https://mp.weixin.qq.com/cgi-b ... 51598,從這里獲取token信息
response = session.get(url=url, cookies=cookies, verify=False)

token = re.findall(r&#39;token=(\d+)&#39;, str(response.url))[0]
time.sleep(2)
# 搜索微信公眾號的接口地址
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
# 搜索微信公眾號接口需要傳入的參數,有三個(gè)變量:微信公眾號token、隨機數random、搜索的微信公眾號名字
query_id = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;query&#39;: query,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;
}
# 打開(kāi)搜索微信公眾號接口地址,需要傳入相關(guān)參數信息如:cookies、params、headers
search_response = session.get(
search_url,
cookies=cookies,
headers=header,
params=query_id)
# 取搜索結果中的第一個(gè)公眾號
lists = search_response.json().get(&#39;list&#39;)[0]
print(lists)
# 獲取這個(gè)公眾號的fakeid,后面爬取公眾號文章需要此字段
fakeid = lists.get(&#39;fakeid&#39;)

# 微信公眾號文章接口地址
appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
# 搜索文章需要傳入幾個(gè)參數:登錄的公眾號token、要爬取文章的公眾號fakeid、隨機數random
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;, # 不同頁(yè),此參數變化,變化規則為每頁(yè)加5
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
# 打開(kāi)搜索的微信公眾號文章列表頁(yè)
appmsg_response = session.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
# 獲取文章總數
max_num = appmsg_response.json().get(&#39;app_msg_cnt&#39;)
# 每頁(yè)至少有5條,獲取文章總的頁(yè)數,爬取時(shí)需要分頁(yè)爬
num = int(int(max_num) / 5)
# 起始頁(yè)begin參數,往后每頁(yè)加5
begin = 0
seq = 0
while num + 1 > 0:
query_id_data = {
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;,
&#39;random&#39;: random.random(),
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;{}&#39;.format(str(begin)),
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;
}
print(&#39;正在翻頁(yè):--------------&#39;, begin)
time.sleep(5)

# 獲取每一頁(yè)文章的標題和鏈接地址,并寫(xiě)入本地文本中
query_fakeid_response = requests.get(
appmsg_url,
cookies=cookies,
headers=header,
params=query_id_data)
fakeid_list = query_fakeid_response.json().get(&#39;app_msg_list&#39;)
if fakeid_list:
for item in fakeid_list:
content_link = item.get(&#39;link&#39;)
content_title = item.get(&#39;title&#39;)
fileName = query + &#39;.txt&#39;
seq += 1
with open(fileName, &#39;a&#39;, encoding=&#39;utf-8&#39;) as fh:
fh.write(
str(seq) +
"|" +
content_title +
"|" +
content_link +
"\n")
num -= 1
begin = int(begin)
begin += 5
  好了朋友們,以上就是對微信公眾號全部?jì)热莸淖ト?,希望對大家有所幫助,歡迎各位大佬指正修改,共同學(xué)習進(jìn)步

Python3.5+fiddler4 抓取微信公眾號點(diǎn)贊、閱讀、標題

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 92 次瀏覽 ? 2021-07-28 20:44 ? 來(lái)自相關(guān)話(huà)題

  Python3.5+fiddler4 抓取微信公眾號點(diǎn)贊、閱讀、標題
  代碼測試有效期至2019/03/08
  微信爬蟲(chóng)步驟:
  必需品:
  自有微信公眾號Fiddler抓包工具Python 3+版
  提琴手下載鏈接
  HTTP 代理工具也稱(chēng)為抓包工具。主流的抓包工具是Windows平臺的Fiddler,macOS平臺的Charles,阿里開(kāi)源了一個(gè)叫AnyProxy的工具。它們的基本原理是相似的,就是通過(guò)在移動(dòng)客戶(hù)端上設置代理IP和端口,所有來(lái)自客戶(hù)端的HTTP和HTTPS請求都會(huì )經(jīng)過(guò)代理工具,每個(gè)請求都可以在代理工具中清晰的看到。然后可以分析詳細信息以找出每個(gè)請求的構造方式。搞清楚這些之后,我們就可以用Python來(lái)模擬發(fā)起請求了,然后就可以得到我們想要的數據了。
  安裝包超過(guò)4M。配置前,首先確保您的手機和電腦在同一個(gè)局域網(wǎng)內。如果不在同一個(gè)局域網(wǎng)內,可以購買(mǎi)便攜式WiFi,在電腦上搭建一個(gè)極簡(jiǎn)的無(wú)線(xiàn)路由器。一路點(diǎn)擊下一步完成安裝過(guò)程。
  Fiddler 配置選擇工具> Fiddler 選項> 連接 Fiddler 的默認端口為8888,如果該端口已經(jīng)被其他程序占用,需要手動(dòng)更改,勾選允許遠程計算機連接,其他選項即可。 , 配置更新后記得重啟Fiddler。一定要重啟Fiddler,否則代理將失效。 .接下來(lái)需要配置手機,但是這里微信有pc客戶(hù)端,所以不需要配置手機
  現在打開(kāi)微信,隨機選擇一個(gè)公眾號,進(jìn)入公眾號的【查看歷史信息】
  同時(shí)觀(guān)察 Fiddler 的主面板。當微信從公眾號介紹頁(yè)面進(jìn)入歷史消息頁(yè)面時(shí),已經(jīng)可以在Fiddler上看到請求進(jìn)來(lái)了。這些請求是微信APP向服務(wù)器發(fā)送的請求?,F在簡(jiǎn)單介紹一下這個(gè)請求面板上各個(gè)模塊的含義。
  
  我將上面的主面板分成了 7 個(gè)塊。需要了解每個(gè)區塊的內容,然后才可以使用Python代碼模擬微信請求。 1、服務(wù)器響應結果,200表示服務(wù)器成功響應了2、請求協(xié)議,微信請求協(xié)議是基于HTTPS的,所以之前一定要配置好,否則看不到HTTPS請求。 3、微信服務(wù)器主機名4、請求路徑5、請求行,包括請求方法(GET)、請求協(xié)議(HTTP/1.1)、請求路徑(/mp/profile_ext...)一長(cháng)串參數)6、收錄cookie信息的請求頭。7、微信服務(wù)器返回的響應數據,我們切換到TextView和WebView看看返回的數據是什么樣子的。
  TextView模式下的預覽效果為服務(wù)器返回的HTML源代碼
  
  WebView 模式是 HTML 代碼的渲染效果。其實(shí)就是我們在手機微信上看到的效果,但是因為風(fēng)格欠缺,在手機上沒(méi)有看到美化效果。
  
  如果服務(wù)器返回的是Json格式或者XML,也可以切換到對應的頁(yè)面進(jìn)行預覽查看。
  開(kāi)始抓?。?br />   1、擁有微信公眾號
  登錄微信公眾號,在菜單欄:素材管理—>新建素材,出現如下頁(yè)面
  
  F12查看網(wǎng)絡(luò ),點(diǎn)擊圖中位置
  
  公眾號和user-Agent的cookies如下
  
  Fakeid和token獲取如下: 查看全部

  Python3.5+fiddler4 抓取微信公眾號點(diǎn)贊、閱讀、標題
  代碼測試有效期至2019/03/08
  微信爬蟲(chóng)步驟:
  必需品:
  自有微信公眾號Fiddler抓包工具Python 3+版
  提琴手下載鏈接
  HTTP 代理工具也稱(chēng)為抓包工具。主流的抓包工具是Windows平臺的Fiddler,macOS平臺的Charles,阿里開(kāi)源了一個(gè)叫AnyProxy的工具。它們的基本原理是相似的,就是通過(guò)在移動(dòng)客戶(hù)端上設置代理IP和端口,所有來(lái)自客戶(hù)端的HTTP和HTTPS請求都會(huì )經(jīng)過(guò)代理工具,每個(gè)請求都可以在代理工具中清晰的看到。然后可以分析詳細信息以找出每個(gè)請求的構造方式。搞清楚這些之后,我們就可以用Python來(lái)模擬發(fā)起請求了,然后就可以得到我們想要的數據了。
  安裝包超過(guò)4M。配置前,首先確保您的手機和電腦在同一個(gè)局域網(wǎng)內。如果不在同一個(gè)局域網(wǎng)內,可以購買(mǎi)便攜式WiFi,在電腦上搭建一個(gè)極簡(jiǎn)的無(wú)線(xiàn)路由器。一路點(diǎn)擊下一步完成安裝過(guò)程。
  Fiddler 配置選擇工具> Fiddler 選項> 連接 Fiddler 的默認端口為8888,如果該端口已經(jīng)被其他程序占用,需要手動(dòng)更改,勾選允許遠程計算機連接,其他選項即可。 , 配置更新后記得重啟Fiddler。一定要重啟Fiddler,否則代理將失效。 .接下來(lái)需要配置手機,但是這里微信有pc客戶(hù)端,所以不需要配置手機
  現在打開(kāi)微信,隨機選擇一個(gè)公眾號,進(jìn)入公眾號的【查看歷史信息】
  同時(shí)觀(guān)察 Fiddler 的主面板。當微信從公眾號介紹頁(yè)面進(jìn)入歷史消息頁(yè)面時(shí),已經(jīng)可以在Fiddler上看到請求進(jìn)來(lái)了。這些請求是微信APP向服務(wù)器發(fā)送的請求?,F在簡(jiǎn)單介紹一下這個(gè)請求面板上各個(gè)模塊的含義。
  
  我將上面的主面板分成了 7 個(gè)塊。需要了解每個(gè)區塊的內容,然后才可以使用Python代碼模擬微信請求。 1、服務(wù)器響應結果,200表示服務(wù)器成功響應了2、請求協(xié)議,微信請求協(xié)議是基于HTTPS的,所以之前一定要配置好,否則看不到HTTPS請求。 3、微信服務(wù)器主機名4、請求路徑5、請求行,包括請求方法(GET)、請求協(xié)議(HTTP/1.1)、請求路徑(/mp/profile_ext...)一長(cháng)串參數)6、收錄cookie信息的請求頭。7、微信服務(wù)器返回的響應數據,我們切換到TextView和WebView看看返回的數據是什么樣子的。
  TextView模式下的預覽效果為服務(wù)器返回的HTML源代碼
  
  WebView 模式是 HTML 代碼的渲染效果。其實(shí)就是我們在手機微信上看到的效果,但是因為風(fēng)格欠缺,在手機上沒(méi)有看到美化效果。
  
  如果服務(wù)器返回的是Json格式或者XML,也可以切換到對應的頁(yè)面進(jìn)行預覽查看。
  開(kāi)始抓?。?br />   1、擁有微信公眾號
  登錄微信公眾號,在菜單欄:素材管理—>新建素材,出現如下頁(yè)面
  
  F12查看網(wǎng)絡(luò ),點(diǎn)擊圖中位置
  
  公眾號和user-Agent的cookies如下
  
  Fakeid和token獲取如下:

微信PC端解鎖新功能搜索更方便微信生態(tài)內容觸手可達

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 91 次瀏覽 ? 2021-07-28 07:54 ? 來(lái)自相關(guān)話(huà)題

  
微信PC端解鎖新功能搜索更方便微信生態(tài)內容觸手可達
  
  記者從騰訊獲悉,PC端微信搜一搜近日迎來(lái)迭代更新,提供更豐富的搜索入口和更多樣化的搜索內容。 Windows版微信更新為3.3.0后,用戶(hù)可以通過(guò)對話(huà)、文章指尖搜索、對話(huà)、朋友圈#hyperlinks更快速地進(jìn)行搜索。
  同時(shí),PC端微信搜索在搜索文章的基礎上,增加了對公眾號、小程序、新聞、表情、朋友圈、視頻等微信生態(tài)內容搜索的支持。用戶(hù)只需選擇相關(guān)詞表右鍵即可搜索微信生態(tài)中的各類(lèi)優(yōu)質(zhì)內容,極大滿(mǎn)足用戶(hù)在工作、學(xué)習等多種搜索場(chǎng)景下的需求。
  
  微信PC端解鎖新功能
  搜索更便捷,微信生態(tài)內容觸手可及
  Windows版微信更新為3.3.0后,PC端微信搜索支持會(huì )話(huà)、文章指尖搜索、會(huì )話(huà)、朋友圈#超鏈接搜索等多種能力,為用戶(hù)提供更豐富的搜索條目。在PC端微信頂部,點(diǎn)擊搜索框進(jìn)入微信搜索,大大提高了用戶(hù)在PC端搜索的便利性。
  現在微信對話(huà)界面和公眾號文章瀏覽界面都支持文本選擇搜索。用戶(hù)可以快速查找和理解聊天中出現的專(zhuān)有名詞、網(wǎng)絡(luò )熱點(diǎn)和外語(yǔ)詞。在瀏覽公眾號文章時(shí),還可以輕松選擇產(chǎn)品名稱(chēng),快速找到更多相關(guān)評價(jià)和用戶(hù)體驗。您還可以快速選詞搜索定義,了解更多信息,提高閱讀效率。 查看全部

  
微信PC端解鎖新功能搜索更方便微信生態(tài)內容觸手可達
  
  記者從騰訊獲悉,PC端微信搜一搜近日迎來(lái)迭代更新,提供更豐富的搜索入口和更多樣化的搜索內容。 Windows版微信更新為3.3.0后,用戶(hù)可以通過(guò)對話(huà)、文章指尖搜索、對話(huà)、朋友圈#hyperlinks更快速地進(jìn)行搜索。
  同時(shí),PC端微信搜索在搜索文章的基礎上,增加了對公眾號、小程序、新聞、表情、朋友圈、視頻等微信生態(tài)內容搜索的支持。用戶(hù)只需選擇相關(guān)詞表右鍵即可搜索微信生態(tài)中的各類(lèi)優(yōu)質(zhì)內容,極大滿(mǎn)足用戶(hù)在工作、學(xué)習等多種搜索場(chǎng)景下的需求。
  
  微信PC端解鎖新功能
  搜索更便捷,微信生態(tài)內容觸手可及
  Windows版微信更新為3.3.0后,PC端微信搜索支持會(huì )話(huà)、文章指尖搜索、會(huì )話(huà)、朋友圈#超鏈接搜索等多種能力,為用戶(hù)提供更豐富的搜索條目。在PC端微信頂部,點(diǎn)擊搜索框進(jìn)入微信搜索,大大提高了用戶(hù)在PC端搜索的便利性。
  現在微信對話(huà)界面和公眾號文章瀏覽界面都支持文本選擇搜索。用戶(hù)可以快速查找和理解聊天中出現的專(zhuān)有名詞、網(wǎng)絡(luò )熱點(diǎn)和外語(yǔ)詞。在瀏覽公眾號文章時(shí),還可以輕松選擇產(chǎn)品名稱(chēng),快速找到更多相關(guān)評價(jià)和用戶(hù)體驗。您還可以快速選詞搜索定義,了解更多信息,提高閱讀效率。

微信公眾號后臺編輯素材界面的原理和原理

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 119 次瀏覽 ? 2021-07-26 22:05 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號后臺編輯素材界面的原理和原理
  準備階段
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  fig1 正式啟動(dòng)
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  圖2
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  圖3
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  圖4
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  圖5
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requestsurl = "https://mp.weixin.qq.com/cgi-b ... s.get(url).json() # {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agentimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  ?
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  ?
  
  圖 6 ?
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  ?
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import jsonimport requestsimport timeimport randomimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }# 請求參數url = "https://mp.weixin.qq.com/cgi-bin/appmsg"begin = "0"params = { "action": "list_ex", "begin": begin, "count": "5", "fakeid": config[&#39;fakeid&#39;], "type": "9", "token": config[&#39;token&#39;], "lang": "zh_CN", "f": "json", "ajax": "1"}# 存放結果app_msg_list = []# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句# 也方便重新運行時(shí)設置頁(yè)數i = 0while True: begin = i * 5 params["begin"] = str(begin) # 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到 time.sleep(random.randint(1,10)) resp = requests.get(url, headers=headers, params = params, verify=False) # 微信流量控制, 退出 if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013: print("frequencey control, stop at {}".format(str(begin))) break # 如果返回的內容中為空則結束 if len(resp.json()[&#39;app_msg_list&#39;]) == 0: print("all ariticle parsed") break app_msg_list.append(resp.json()) # 翻頁(yè) i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  圖7
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  圖8
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,你可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,或者你可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSONjson_name = "mp_data_{}.json".format(str(begin))with open(json_name, "w") as file: file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []for msg in app_msg_list: if "app_msg_list" in msg: for item in msg["app_msg_list"]: info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;])) info_list.append(info)# save as csvwith open("app_msg_list.csv", "w") as file: file.writelines("\n".join(info_list)) 查看全部

  微信公眾號后臺編輯素材界面的原理和原理
  準備階段
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  fig1 正式啟動(dòng)
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  圖2
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  圖3
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  圖4
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  圖5
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requestsurl = "https://mp.weixin.qq.com/cgi-b ... s.get(url).json() # {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agentimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  ?
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  ?
  
  圖 6 ?
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  ?
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import jsonimport requestsimport timeimport randomimport yamlwith open("wechat.yaml", "r") as file: file_data = file.read()config = yaml.safe_load(file_data)headers = { "Cookie": config[&#39;cookie&#39;], "User-Agent": config[&#39;user_agent&#39;] }# 請求參數url = "https://mp.weixin.qq.com/cgi-bin/appmsg"begin = "0"params = { "action": "list_ex", "begin": begin, "count": "5", "fakeid": config[&#39;fakeid&#39;], "type": "9", "token": config[&#39;token&#39;], "lang": "zh_CN", "f": "json", "ajax": "1"}# 存放結果app_msg_list = []# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句# 也方便重新運行時(shí)設置頁(yè)數i = 0while True: begin = i * 5 params["begin"] = str(begin) # 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到 time.sleep(random.randint(1,10)) resp = requests.get(url, headers=headers, params = params, verify=False) # 微信流量控制, 退出 if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013: print("frequencey control, stop at {}".format(str(begin))) break # 如果返回的內容中為空則結束 if len(resp.json()[&#39;app_msg_list&#39;]) == 0: print("all ariticle parsed") break app_msg_list.append(resp.json()) # 翻頁(yè) i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  圖7
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  圖8
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,你可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,或者你可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSONjson_name = "mp_data_{}.json".format(str(begin))with open(json_name, "w") as file: file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []for msg in app_msg_list: if "app_msg_list" in msg: for item in msg["app_msg_list"]: info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;])) info_list.append(info)# save as csvwith open("app_msg_list.csv", "w") as file: file.writelines("\n".join(info_list))

分詞采集微信公眾號文章分析用料清單的基本步驟采集

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 162 次瀏覽 ? 2021-07-25 18:06 ? 來(lái)自相關(guān)話(huà)題

  分詞采集微信公眾號文章分析用料清單的基本步驟采集
  querylist采集微信公眾號文章詳情頁(yè)分詞檢索文本分析用料清單的基本步驟1.web上獲取,每條微信文章url,用http請求的方式抓取微信公眾號關(guān)注鏈接的抓取方式,見(jiàn):百度url抓取方式。2.主程序代碼寫(xiě)法定義querylist,用于存放爬取的文章url。主要步驟node.js最小堆實(shí)現。querylist定義:。
  謝邀,這個(gè)問(wèn)題我已經(jīng)解決了,簡(jiǎn)單總結一下,你所需要準備的有:1。這個(gè)querylist用你自己的語(yǔ)言做出來(lái)2。相應的一種字符串類(lèi)型,如{"title":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"},分別放不同的字符串類(lèi)型3。要爬取的數據表達式4。
  結構體的設計(哈希,鏈表),以便最小程度保存數據。node。js寫(xiě)代碼#//-st-ilwearf051ijzee9zowscp9cc45c1v1gs0={"name":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"}packagemainimport("fmt""math""dom""site")functionmake_new_scheduler(initial_querylist){//initial_querylist可任意可參考文檔,非必需varlines=[];varindex=initial_querylist。
<p>length;varpath="{"+site。meta。path;varfirst_line="{"+site。meta。content;varlast_line="{"+site。meta。content;varformat="{"+path。length+1;varsize=1000000;}";for(varpage=index;page 查看全部

  分詞采集微信公眾號文章分析用料清單的基本步驟采集
  querylist采集微信公眾號文章詳情頁(yè)分詞檢索文本分析用料清單的基本步驟1.web上獲取,每條微信文章url,用http請求的方式抓取微信公眾號關(guān)注鏈接的抓取方式,見(jiàn):百度url抓取方式。2.主程序代碼寫(xiě)法定義querylist,用于存放爬取的文章url。主要步驟node.js最小堆實(shí)現。querylist定義:。
  謝邀,這個(gè)問(wèn)題我已經(jīng)解決了,簡(jiǎn)單總結一下,你所需要準備的有:1。這個(gè)querylist用你自己的語(yǔ)言做出來(lái)2。相應的一種字符串類(lèi)型,如{"title":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"},分別放不同的字符串類(lèi)型3。要爬取的數據表達式4。
  結構體的設計(哈希,鏈表),以便最小程度保存數據。node。js寫(xiě)代碼#//-st-ilwearf051ijzee9zowscp9cc45c1v1gs0={"name":"錢(qián)錢(qián)","content":"[{"parent":"jwj","themes":"home"}]"}packagemainimport("fmt""math""dom""site")functionmake_new_scheduler(initial_querylist){//initial_querylist可任意可參考文檔,非必需varlines=[];varindex=initial_querylist。
<p>length;varpath="{"+site。meta。path;varfirst_line="{"+site。meta。content;varlast_line="{"+site。meta。content;varformat="{"+path。length+1;varsize=1000000;}";for(varpage=index;page

獲取微信公眾號文章的方法,你get到了嗎?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 157 次瀏覽 ? 2021-07-25 06:33 ? 來(lái)自相關(guān)話(huà)題

  
獲取微信公眾號文章的方法,你get到了嗎?
  通過(guò)微信公眾平臺獲取公眾號文章的示例
  之前是自己維護一個(gè)公眾號,但是因為個(gè)人關(guān)系好久沒(méi)有更新,今天上來(lái)想起來(lái),卻偶然發(fā)現了微信公眾號文章的獲取方式。
  之前有很多獲取方式,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不是很好,但是操作簡(jiǎn)單易懂。
  所以,首先你要有一個(gè)微信公眾平臺帳號
  微信公眾平臺:
  
  登錄后,進(jìn)入首頁(yè),點(diǎn)擊新建群發(fā)。
  
  選擇自創(chuàng )圖形和文字:
  
  好像是公眾號操作教學(xué)
  進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接
  
  彈出一個(gè)選擇框,我們在框中輸入對應的公眾號,就會(huì )出現對應的文章列表
  
  你感到驚訝嗎?可以打開(kāi)控制臺查看請求的接口
  
  打開(kāi)回復,有我們需要的文章鏈接
  
  確認數據后,我們需要分析這個(gè)界面。
  感覺(jué)很簡(jiǎn)單。 GET 請求攜帶一些參數。
  
  Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。
  我們輸入公眾號后,點(diǎn)擊搜索??梢钥吹剿阉鹘缑姹挥|發(fā),返回fakeid。
  
  這個(gè)接口需要的參數不多。
  
  接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。
  但您還需要使用現有的 cookie 來(lái)避免登錄。
  
  目前我還沒(méi)有測試cookies的有效期??赡苄枰皶r(shí)更新 cookie。
  測試代碼:
  
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  這樣可以得到最新的10篇文章。如果想獲得更多的歷史文章,可以修改數據中的“begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(以此類(lèi)推)
  但如果你想大規模爬行:
  請自己安排一個(gè)穩定的代理,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被屏蔽的可能性。
  以上是本文的全部?jì)热?。希望對大家的學(xué)習有所幫助,也希望大家多多支持。
  時(shí)間:2019-12-23
  如何訪(fǎng)問(wèn)微信小程序公眾號文章
  
  前言隨著(zhù)小程序的不斷發(fā)展,現在個(gè)人小程序已經(jīng)開(kāi)通了很多功能,個(gè)人小程序直接打開(kāi)公眾號鏈接。群里看到的一個(gè)小程序,點(diǎn)擊直接閱讀文章了,所以琢磨了一下,寫(xiě)了一些源碼。主要代碼:
  python爬取微信公眾號文章的方法
  
  最近學(xué)習了Python3網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)踐(崔慶才),剛剛了解到他這里使用代理爬取了公眾號文章這里,但是根據他的代碼,出現了一些問(wèn)題。這里我用了這本書(shū)前面提到的一些內容進(jìn)行了改進(jìn)。 (這個(gè)代碼作者半年前寫(xiě)的,但騰訊的網(wǎng)站半年前更新了)下面我直接上傳代碼:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
  使用anyproxy提高公眾號文章采集的效率
  
  主要影響因素如下:1.網(wǎng)絡(luò )環(huán)境差:2.微信客戶(hù)端手機或模擬器崩潰:3.其他網(wǎng)絡(luò )傳輸錯誤:因為我看重采集system 這個(gè)成本包括硬件投資、算力投資和人力占用。所以必須提高操作的穩定性。因此,如果采集中斷,人工能量的成本必然會(huì )增加。所以針對這一點(diǎn),我對 anyproxy 做了一些高級的改造,并利用其他工具來(lái)提高運行效率。以下是具體解決方法:一.code upgrade1)微信 瀏覽器白屏解決方法:修改文件requestHandler.js,或者在rule_default中
  python下載微信公眾號相關(guān)文章
  
  本文示例分享python下載微信公眾號文章的具體代碼,供大家參考。具體內容如下: 從零開(kāi)始學(xué)自動(dòng)化測試,從公眾號1.下載一系列文檔1.搜索微信文章Keyword search2.解析搜索結果的前N頁(yè)為獲取文章titles和對應的url,主要使用Beautifulsoup Weixin.py import requests from urllib.parse import quote in requests和bs4 from bs4 import BeautifulSoup im
  Python抓取指定的微信公眾號文章
  本文示例分享了python爬取微信公眾號文章的具體代碼,供大家參考。具體內容如下。此方法依賴(lài)于 urllib2 庫。首先,你需要安裝你的python環(huán)境。然后安裝urllib2庫程序的啟動(dòng)方法(返回值為公眾號文章list): def openUrl(): print("啟動(dòng)爬蟲(chóng),打開(kāi)搜狗搜索微信界面") #加載頁(yè)面url =' ;s_from=input&query=要爬取的公眾號
  python采集微信公號文章
  
  本文示例分享了python采集微信公號文章的具體代碼,供大家參考。具體內容如下。在python的一個(gè)子目錄下保存2個(gè)文件,分別是:采集公號文章.py和config.py。代碼如下:1.采集公號文章.py from urllib.parse import urlencode import pymongo import requests from lxml.etree import XMLSyntaxError from requests.exceptions import Connec
  python搶搜狗微信公眾號文章
  
<p>初學(xué)者學(xué)習python,抓取搜狗微信公眾號文章保存到mysql mysql表中:代碼:import requests import json import re import pymysql #創(chuàng )建連接conn = pymysql.connect(host='your database address', port =port, user='user name', passwd='password', db='database name', charset='utf8') # 創(chuàng )建一個(gè)游標 cursor = conn.cursor() cursor.execute("sel 查看全部

  
獲取微信公眾號文章的方法,你get到了嗎?
  通過(guò)微信公眾平臺獲取公眾號文章的示例
  之前是自己維護一個(gè)公眾號,但是因為個(gè)人關(guān)系好久沒(méi)有更新,今天上來(lái)想起來(lái),卻偶然發(fā)現了微信公眾號文章的獲取方式。
  之前有很多獲取方式,通過(guò)搜狗、清博、web、客戶(hù)端等都可以,這個(gè)可能不是很好,但是操作簡(jiǎn)單易懂。
  所以,首先你要有一個(gè)微信公眾平臺帳號
  微信公眾平臺:
  
  登錄后,進(jìn)入首頁(yè),點(diǎn)擊新建群發(fā)。
  
  選擇自創(chuàng )圖形和文字:
  
  好像是公眾號操作教學(xué)
  進(jìn)入編輯頁(yè)面后,點(diǎn)擊超鏈接
  
  彈出一個(gè)選擇框,我們在框中輸入對應的公眾號,就會(huì )出現對應的文章列表
  
  你感到驚訝嗎?可以打開(kāi)控制臺查看請求的接口
  
  打開(kāi)回復,有我們需要的文章鏈接
  
  確認數據后,我們需要分析這個(gè)界面。
  感覺(jué)很簡(jiǎn)單。 GET 請求攜帶一些參數。
  
  Fakeid是公眾號的唯一ID,所以如果想直接通過(guò)名字獲取文章列表,還需要先獲取fakeid。
  我們輸入公眾號后,點(diǎn)擊搜索??梢钥吹剿阉鹘缑姹挥|發(fā),返回fakeid。
  
  這個(gè)接口需要的參數不多。
  
  接下來(lái)我們就可以用代碼來(lái)模擬上面的操作了。
  但您還需要使用現有的 cookie 來(lái)避免登錄。
  
  目前我還沒(méi)有測試cookies的有效期??赡苄枰皶r(shí)更新 cookie。
  測試代碼:
  
import requests
import json
Cookie = '請換上自己的Cookie,獲取方法:直接復制下來(lái)'
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
headers = {
"Cookie": Cookie,
"User-Agent": 'Mozilla/5.0 (Linux; Android 10; YAL-AL00 Build/HUAWEIYAL-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.64 HuaweiBrowser/10.0.1.335 Mobile Safari/537.36'
}
keyword = 'pythonlx' # 公眾號名字:可自定義
token = '你的token' # 獲取方法:如上述 直接復制下來(lái)
search_url = 'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={}&token={}&lang=zh_CN&f=json&ajax=1'.format(keyword,token)
doc = requests.get(search_url,headers=headers).text
jstext = json.loads(doc)
fakeid = jstext['list'][0]['fakeid']
data = {
"token": token,
"lang": "zh_CN",
"f": "json",
"ajax": "1",
"action": "list_ex",
"begin": 0,
"count": "5",
"query": "",
"fakeid": fakeid,
"type": "9",
}
json_test = requests.get(url, headers=headers, params=data).text
json_test = json.loads(json_test)
print(json_test)
  這樣可以得到最新的10篇文章。如果想獲得更多的歷史文章,可以修改數據中的“begin”參數,0為第一頁(yè),5為第二頁(yè),10為第三頁(yè)(以此類(lèi)推)
  但如果你想大規模爬行:
  請自己安排一個(gè)穩定的代理,降低爬蟲(chóng)速度,準備多個(gè)賬號,減少被屏蔽的可能性。
  以上是本文的全部?jì)热?。希望對大家的學(xué)習有所幫助,也希望大家多多支持。
  時(shí)間:2019-12-23
  如何訪(fǎng)問(wèn)微信小程序公眾號文章
  
  前言隨著(zhù)小程序的不斷發(fā)展,現在個(gè)人小程序已經(jīng)開(kāi)通了很多功能,個(gè)人小程序直接打開(kāi)公眾號鏈接。群里看到的一個(gè)小程序,點(diǎn)擊直接閱讀文章了,所以琢磨了一下,寫(xiě)了一些源碼。主要代碼:
  python爬取微信公眾號文章的方法
  
  最近學(xué)習了Python3網(wǎng)絡(luò )爬蟲(chóng)開(kāi)發(fā)實(shí)踐(崔慶才),剛剛了解到他這里使用代理爬取了公眾號文章這里,但是根據他的代碼,出現了一些問(wèn)題。這里我用了這本書(shū)前面提到的一些內容進(jìn)行了改進(jìn)。 (這個(gè)代碼作者半年前寫(xiě)的,但騰訊的網(wǎng)站半年前更新了)下面我直接上傳代碼:TIMEOUT = 20 from requests import Request, Session, PreparedRequest import requests from selenium import webdrive
  使用anyproxy提高公眾號文章采集的效率
  
  主要影響因素如下:1.網(wǎng)絡(luò )環(huán)境差:2.微信客戶(hù)端手機或模擬器崩潰:3.其他網(wǎng)絡(luò )傳輸錯誤:因為我看重采集system 這個(gè)成本包括硬件投資、算力投資和人力占用。所以必須提高操作的穩定性。因此,如果采集中斷,人工能量的成本必然會(huì )增加。所以針對這一點(diǎn),我對 anyproxy 做了一些高級的改造,并利用其他工具來(lái)提高運行效率。以下是具體解決方法:一.code upgrade1)微信 瀏覽器白屏解決方法:修改文件requestHandler.js,或者在rule_default中
  python下載微信公眾號相關(guān)文章
  
  本文示例分享python下載微信公眾號文章的具體代碼,供大家參考。具體內容如下: 從零開(kāi)始學(xué)自動(dòng)化測試,從公眾號1.下載一系列文檔1.搜索微信文章Keyword search2.解析搜索結果的前N頁(yè)為獲取文章titles和對應的url,主要使用Beautifulsoup Weixin.py import requests from urllib.parse import quote in requests和bs4 from bs4 import BeautifulSoup im
  Python抓取指定的微信公眾號文章
  本文示例分享了python爬取微信公眾號文章的具體代碼,供大家參考。具體內容如下。此方法依賴(lài)于 urllib2 庫。首先,你需要安裝你的python環(huán)境。然后安裝urllib2庫程序的啟動(dòng)方法(返回值為公眾號文章list): def openUrl(): print("啟動(dòng)爬蟲(chóng),打開(kāi)搜狗搜索微信界面") #加載頁(yè)面url =' ;s_from=input&query=要爬取的公眾號
  python采集微信公號文章
  
  本文示例分享了python采集微信公號文章的具體代碼,供大家參考。具體內容如下。在python的一個(gè)子目錄下保存2個(gè)文件,分別是:采集公號文章.py和config.py。代碼如下:1.采集公號文章.py from urllib.parse import urlencode import pymongo import requests from lxml.etree import XMLSyntaxError from requests.exceptions import Connec
  python搶搜狗微信公眾號文章
  
<p>初學(xué)者學(xué)習python,抓取搜狗微信公眾號文章保存到mysql mysql表中:代碼:import requests import json import re import pymysql #創(chuàng )建連接conn = pymysql.connect(host='your database address', port =port, user='user name', passwd='password', db='database name', charset='utf8') # 創(chuàng )建一個(gè)游標 cursor = conn.cursor() cursor.execute("sel

文章自動(dòng)更新,推送給微信服務(wù)器,送給客戶(hù)端

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 92 次瀏覽 ? 2021-07-24 06:02 ? 來(lái)自相關(guān)話(huà)題

  文章自動(dòng)更新,推送給微信服務(wù)器,送給客戶(hù)端
  querylist采集微信公眾號文章、個(gè)人公眾號文章、個(gè)人微信公眾號文章、微信原生導入的文章等,經(jīng)過(guò)用戶(hù)的有效提問(wèn),文章自動(dòng)更新,推送給微信服務(wù)器,并通過(guò)第三方推送服務(wù)將文章推送給客戶(hù)端。querylist插件詳細信息:1.修改你的submit用戶(hù)名:你是否設置了用戶(hù)名為“昵稱(chēng)”而不是“賬號”?例如,你在guest用戶(hù)下設置用戶(hù)名為“莉莉”,對應文章將自動(dòng)更新到list中;當用戶(hù)不需要登錄才能進(jìn)行查看時(shí),你可以修改用戶(hù)名:xiaomi2.刪除網(wǎng)頁(yè)中現存的公眾號文章、個(gè)人微信公眾號文章:如果公眾號和個(gè)人公眾號已有不需要的文章,你可以刪除現有的文章到文件://需要全選你需要引入querylist插件的文章,可以通過(guò)excel快速選擇目標文章3.刪除網(wǎng)頁(yè)中的子域名和老域名:當公眾號和個(gè)人公眾號文章的網(wǎng)址中都包含.com、.php時(shí),需要設置你的目標域名。
  老域名是你要刪除的,如果你忘記了,可以使用ipcss中的查看。4.使用多個(gè)post發(fā)送到多個(gè)微信公眾號:你可以安排多個(gè)長(cháng)期/短期post發(fā)送到多個(gè)微信公眾號中去,實(shí)現一次性多渠道發(fā)送。5.完成頁(yè)面輸出設置之后你可以通過(guò)querylist在本地查看和編輯你制作的rss源碼:6.querylist實(shí)時(shí)查看微信服務(wù)器推送的文章信息,方便你配置微信客戶(hù)端。
  7.對于1,2,3不滿(mǎn)足的你,querylist還有詳細的指導,你可以添加第三方推送服務(wù)://讓第三方推送服務(wù)來(lái)幫你推送文章、參考鏈接建議刪除自己的個(gè)人微信公眾號rss發(fā)送到你的guest公眾號:xiaomi)刪除文章到文件:xiaomiipcss地址:ipcssguyge/ipcssguyge.excel您可以將所有的guest的文章保存到某個(gè)wordpress目錄下:xiaomi到的網(wǎng)址:/@vuerno/gh000-ipcssquerylist的用法:導入插件->右擊選擇:settings|extensions|rss。 查看全部

  文章自動(dòng)更新,推送給微信服務(wù)器,送給客戶(hù)端
  querylist采集微信公眾號文章、個(gè)人公眾號文章、個(gè)人微信公眾號文章、微信原生導入的文章等,經(jīng)過(guò)用戶(hù)的有效提問(wèn),文章自動(dòng)更新,推送給微信服務(wù)器,并通過(guò)第三方推送服務(wù)將文章推送給客戶(hù)端。querylist插件詳細信息:1.修改你的submit用戶(hù)名:你是否設置了用戶(hù)名為“昵稱(chēng)”而不是“賬號”?例如,你在guest用戶(hù)下設置用戶(hù)名為“莉莉”,對應文章將自動(dòng)更新到list中;當用戶(hù)不需要登錄才能進(jìn)行查看時(shí),你可以修改用戶(hù)名:xiaomi2.刪除網(wǎng)頁(yè)中現存的公眾號文章、個(gè)人微信公眾號文章:如果公眾號和個(gè)人公眾號已有不需要的文章,你可以刪除現有的文章到文件://需要全選你需要引入querylist插件的文章,可以通過(guò)excel快速選擇目標文章3.刪除網(wǎng)頁(yè)中的子域名和老域名:當公眾號和個(gè)人公眾號文章的網(wǎng)址中都包含.com、.php時(shí),需要設置你的目標域名。
  老域名是你要刪除的,如果你忘記了,可以使用ipcss中的查看。4.使用多個(gè)post發(fā)送到多個(gè)微信公眾號:你可以安排多個(gè)長(cháng)期/短期post發(fā)送到多個(gè)微信公眾號中去,實(shí)現一次性多渠道發(fā)送。5.完成頁(yè)面輸出設置之后你可以通過(guò)querylist在本地查看和編輯你制作的rss源碼:6.querylist實(shí)時(shí)查看微信服務(wù)器推送的文章信息,方便你配置微信客戶(hù)端。
  7.對于1,2,3不滿(mǎn)足的你,querylist還有詳細的指導,你可以添加第三方推送服務(wù)://讓第三方推送服務(wù)來(lái)幫你推送文章、參考鏈接建議刪除自己的個(gè)人微信公眾號rss發(fā)送到你的guest公眾號:xiaomi)刪除文章到文件:xiaomiipcss地址:ipcssguyge/ipcssguyge.excel您可以將所有的guest的文章保存到某個(gè)wordpress目錄下:xiaomi到的網(wǎng)址:/@vuerno/gh000-ipcssquerylist的用法:導入插件->右擊選擇:settings|extensions|rss。

querylist采集微信公眾號文章進(jìn)行二次加工后得到的

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 156 次瀏覽 ? 2021-07-24 03:02 ? 來(lái)自相關(guān)話(huà)題

  querylist采集微信公眾號文章進(jìn)行二次加工后得到的
  querylist采集微信公眾號文章并且進(jìn)行二次加工后得到的。比如文章的標題,鏈接,圖片等等。
  python。在微信中搜索公眾號,然后找到自己公眾號的文章。不需要下載,
  不知道你是想爬什么類(lèi)型的公眾號,因為每個(gè)公眾號自己的公眾號主頁(yè)有自己的爬取接口,有的是只能爬本地的,有的是只支持本地文件的提取。
  你可以這樣,登錄原公眾號,然后在分析選項里面選擇爬蟲(chóng)。
  還是建議爬一個(gè)的
  要么自己構建網(wǎng)站,要么用爬蟲(chóng)軟件,如scrapy或python寫(xiě)一個(gè)能爬取微信公眾號的小爬蟲(chóng),
  用python從一個(gè)公眾號文章抓取并上傳到千牛上給別人,然后再由別人去爬取微信公眾號的文章,
  你說(shuō)的這個(gè)簡(jiǎn)單來(lái)說(shuō)就是爬蟲(chóng),現在應該有公司提供這種服務(wù),
<p>爬蟲(chóng),不管是用flask也好用python也好。還是別的什么如果上傳不能成功上傳的話(huà),可以看下我做的服務(wù),中間上傳失敗多次后就是用本地目錄下的文件夾,一路敲一路寫(xiě)就可以了~微信掃一掃就可以。但是有一個(gè)問(wèn)題,你可以想象中如果人們都愛(ài)你不需要二維碼,你就用這種形式獲取了,如果你有很多很多二維碼,你會(huì )哭的。想了解我的爬蟲(chóng)服務(wù)的同學(xué),可以留言~如果對您有幫助,歡迎收藏點(diǎn)贊(?> 查看全部

  querylist采集微信公眾號文章進(jìn)行二次加工后得到的
  querylist采集微信公眾號文章并且進(jìn)行二次加工后得到的。比如文章的標題,鏈接,圖片等等。
  python。在微信中搜索公眾號,然后找到自己公眾號的文章。不需要下載,
  不知道你是想爬什么類(lèi)型的公眾號,因為每個(gè)公眾號自己的公眾號主頁(yè)有自己的爬取接口,有的是只能爬本地的,有的是只支持本地文件的提取。
  你可以這樣,登錄原公眾號,然后在分析選項里面選擇爬蟲(chóng)。
  還是建議爬一個(gè)的
  要么自己構建網(wǎng)站,要么用爬蟲(chóng)軟件,如scrapy或python寫(xiě)一個(gè)能爬取微信公眾號的小爬蟲(chóng),
  用python從一個(gè)公眾號文章抓取并上傳到千牛上給別人,然后再由別人去爬取微信公眾號的文章,
  你說(shuō)的這個(gè)簡(jiǎn)單來(lái)說(shuō)就是爬蟲(chóng),現在應該有公司提供這種服務(wù),
<p>爬蟲(chóng),不管是用flask也好用python也好。還是別的什么如果上傳不能成功上傳的話(huà),可以看下我做的服務(wù),中間上傳失敗多次后就是用本地目錄下的文件夾,一路敲一路寫(xiě)就可以了~微信掃一掃就可以。但是有一個(gè)問(wèn)題,你可以想象中如果人們都愛(ài)你不需要二維碼,你就用這種形式獲取了,如果你有很多很多二維碼,你會(huì )哭的。想了解我的爬蟲(chóng)服務(wù)的同學(xué),可以留言~如果對您有幫助,歡迎收藏點(diǎn)贊(?>

querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 223 次瀏覽 ? 2021-07-22 00:39 ? 來(lái)自相關(guān)話(huà)題

  querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
  每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!
  
  請允許我強制投放一波廣告:
  因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
  一個(gè)喜歡小寵物,養不起貓的碼農,下班后很開(kāi)心??梢躁P(guān)注哦!
  為保證視頻安全,避免丟失,請樓主為視頻添加水印。
  一、獲取公眾號信息:標題、摘要、封面、文章URL
  步驟:
  1、先自己申請公眾號
  2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接
  
  3、彈出搜索框,搜索你需要的公眾號,查看歷史文章
  
  
  4、抓包獲取信息并定位請求的url
  
  通過(guò)查資料,找到了我們需要的關(guān)鍵內容:title、abstract、cover、文章URL。我們確保這是我們需要的 URL。通過(guò)點(diǎn)擊下一頁(yè),我們得到了幾次url,發(fā)現只找到了random和bengin。的參數已更改
  
  這樣就確定了主要信息網(wǎng)址。
  讓我們開(kāi)始吧:
  原來(lái)我們需要修改的參數是:token、random、cookie
  獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
  # -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
  獲取結果(成功):
  
  二、Get文章內視頻:實(shí)現批量下載
  分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:
  
  打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:
  
  
  嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
  我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
  與獲取的其他信息無(wú)關(guān),只能強制。
  這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
  response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
  視頻下載:
  def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
  然后所有的信息都完成了,進(jìn)行代碼組裝。
  一個(gè)。獲取公眾號信息
  B.過(guò)濾單篇文章文章information
  c.獲取視頻信息
  d。拼接視頻頁(yè)面下載地址
  e.下載視頻并保存
  代碼實(shí)驗結果:
  
  
  獲取公眾號:標題、摘要、封面、視頻、
  可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
  危險動(dòng)作,請勿操作!記??!記??!記??!
  獲取代碼請回復公眾號:20191210或公眾號
   查看全部

  querylist采集微信公眾號文章 熊孩子和萌寵搞笑視頻笑聲不斷快樂(lè )常伴
  每天更新視頻:熊孩子的日常,萌寵的日常,熊孩子和萌寵的搞笑視頻,笑不停,一直陪著(zhù)你!
  
  請允許我強制投放一波廣告:
  因為每個(gè)爬蟲(chóng)官方賬號都是他家的,一年前的,現在的,只是主題和名字都變了。
  一個(gè)喜歡小寵物,養不起貓的碼農,下班后很開(kāi)心??梢躁P(guān)注哦!
  為保證視頻安全,避免丟失,請樓主為視頻添加水印。
  一、獲取公眾號信息:標題、摘要、封面、文章URL
  步驟:
  1、先自己申請公眾號
  2、登錄您的帳戶(hù),創(chuàng )建一個(gè)新的文章圖形,然后單擊超鏈接
  
  3、彈出搜索框,搜索你需要的公眾號,查看歷史文章
  
  
  4、抓包獲取信息并定位請求的url
  
  通過(guò)查資料,找到了我們需要的關(guān)鍵內容:title、abstract、cover、文章URL。我們確保這是我們需要的 URL。通過(guò)點(diǎn)擊下一頁(yè),我們得到了幾次url,發(fā)現只找到了random和bengin。的參數已更改
  
  這樣就確定了主要信息網(wǎng)址。
  讓我們開(kāi)始吧:
  原來(lái)我們需要修改的參數是:token、random、cookie
  獲取url的時(shí)候就可以得到這兩個(gè)值的來(lái)源。
  # -*- coding: utf-8 -*-
import re
import requests
import jsonpath
import json
headers = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36",
"Host": "mp.weixin.qq.com",
"Referer": "https://mp.weixin.qq.com/cgi-b ... ot%3B,
"Cookie": "自己獲取信息時(shí)的cookie"
}
def getInfo():
for i in range(80):
# token random 需要要自己的 begin:參數傳入
url = "https://mp.weixin.qq.com/cgi-b ... in%3D{}&count=5&query=&fakeid=MzI4MzkzMTc3OA%3D%3D&type=9".format(str(i * 5))
response = requests.get(url, headers = headers)
jsonRes = response.json()
titleList = jsonpath.jsonpath(jsonRes, "$..title")
coverList = jsonpath.jsonpath(jsonRes, "$..cover")
urlList = jsonpath.jsonpath(jsonRes, "$..link")
# 遍歷 構造可存儲字符串
for index in range(len(titleList)):
title = titleList[index]
cover = coverList[index]
url = urlList[index]
scvStr = "%s,%s, %s,\n" % (title, cover, url)
with open("info.csv", "a+", encoding="gbk", newline='') as f:
f.write(scvStr)
  獲取結果(成功):
  
  二、Get文章內視頻:實(shí)現批量下載
  分析一個(gè)視頻文章后,我找到了這個(gè)鏈接:
  
  打開(kāi)網(wǎng)頁(yè),發(fā)現是視頻網(wǎng)頁(yè)的下載鏈接:
  
  
  嘿嘿,好像有點(diǎn)意思,找到了視頻網(wǎng)頁(yè)的純下載鏈接,開(kāi)始吧。
  我發(fā)現鏈接中有一個(gè)關(guān)鍵參數vid。不知從何而來(lái)?
  與獲取的其他信息無(wú)關(guān),只能強制。
  這個(gè)參數是在文章單人的url請求信息中找到的,然后獲取。
  response = requests.get(url_wxv, headers=headers)
# 我用的是正則,也可以使用xpath
jsonRes = response.text # 匹配:wxv_1105179750743556096
dirRe = r"wxv_.{19}"
result = re.search(dirRe, jsonRes)
wxv = result.group(0)
print(wxv)
  視頻下載:
  def getVideo(video_title, url_wxv):
video_path = './videoFiles/' + video_title + ".mp4"
# 頁(yè)面可下載形式
video_url_temp = "https://mp.weixin.qq.com/mp/vi ... ot%3B + wxv
response = requests.get(video_url_temp, headers=headers)
content = response.content.decode()
content = json.loads(content)
url_info = content.get("url_info")
video_url2 = url_info[0].get("url")
print(video_url2)
# 請求要下載的url地址
html = requests.get(video_url2)
# content返回的是bytes型也就是二進(jìn)制的數據。
html = html.content
with open(video_path, 'wb') as f:
f.write(html)
  然后所有的信息都完成了,進(jìn)行代碼組裝。
  一個(gè)。獲取公眾號信息
  B.過(guò)濾單篇文章文章information
  c.獲取視頻信息
  d。拼接視頻頁(yè)面下載地址
  e.下載視頻并保存
  代碼實(shí)驗結果:
  
  
  獲取公眾號:標題、摘要、封面、視頻、
  可以說(shuō)你擁有一個(gè)視頻公眾號的所有信息,你可以復制一份。
  危險動(dòng)作,請勿操作!記??!記??!記??!
  獲取代碼請回復公眾號:20191210或公眾號
  

微信公眾號爬取程序利用的原理和原理摘要

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 145 次瀏覽 ? 2021-07-22 00:34 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號爬取程序利用的原理和原理摘要
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  正式開(kāi)始
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
# 請求參數
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config[&#39;fakeid&#39;],
"type": "9",
"token": config[&#39;token&#39;],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放結果
app_msg_list = []
# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句
# 也方便重新運行時(shí)設置頁(yè)數
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的內容中為空則結束
if len(resp.json()[&#39;app_msg_list&#39;]) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻頁(yè)
i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,您可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,也可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []
for msg in app_msg_list:
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;]))
info_list.append(info)
# save as csv
with open("app_msg_list.csv", "w") as file:
file.writelines("n".join(info_list)) 查看全部

  微信公眾號爬取程序利用的原理和原理摘要
  為了實(shí)現這個(gè)爬蟲(chóng),我們需要使用以下工具
  另外,這個(gè)爬蟲(chóng)程序使用了微信公眾號后臺編輯素材接口。原理是當我們插入超鏈接時(shí),微信會(huì )調用一個(gè)特殊的API(見(jiàn)下圖)來(lái)獲取指定公眾號的文章列表。因此,我們還需要有一個(gè)官方帳號。
  
  正式開(kāi)始
  我們需要登錄微信公眾號,點(diǎn)擊素材管理,點(diǎn)擊新建圖文消息,然后點(diǎn)擊上面的超鏈接。
  
  接下來(lái),按 F12,打開(kāi) Chrome 的開(kāi)發(fā)者工具,然后選擇網(wǎng)絡(luò )
  
  此時(shí),在之前的超鏈接界面,點(diǎn)擊“選擇其他公眾號”,輸入你需要抓取的公眾號(例如中國移動(dòng))
  
  這時(shí)候之前的Network會(huì )刷新一些鏈接,其中“appmsg”開(kāi)頭的內容就是我們需要分析的
  
  我們解析請求的 URL
  https://mp.weixin.qq.com/cgi-b ... x%3D1
  分為三個(gè)部分
  通過(guò)不斷瀏覽下一頁(yè),我們發(fā)現每次只有begin會(huì )改變,每次增加5,這就是count的值。
  接下來(lái)我們使用Python獲取同樣的資源,但是直接運行下面的代碼是無(wú)法獲取資源的。
  import requests
url = "https://mp.weixin.qq.com/cgi-b ... ot%3B
requests.get(url).json()
# {&#39;base_resp&#39;: {&#39;ret&#39;: 200003, &#39;err_msg&#39;: &#39;invalid session&#39;}}
  之所以能在瀏覽器上獲取資源,是因為我們登錄了微信公眾號后臺。而Python沒(méi)有我們的登錄信息,所以請求無(wú)效。我們需要在requests中設置headers參數,并傳入Cookie和User-Agent來(lái)模擬登錄
  由于頭信息的內容每次都會(huì )變化,所以我把這些內容放在一個(gè)單獨的文件中,即“wechat.yaml”,信息如下
  cookie: ua_id=wuzWM9FKE14...
user_agent: Mozilla/5.0...
  你只需要稍后閱讀
  # 讀取cookie和user_agent
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
requests.get(url, headers=headers, verify=False).json()
  在返回的JSON中,我們可以看到每個(gè)文章的標題(title)、摘要(digest)、鏈接(link)、推送時(shí)間(update_time)和封面地址(cover)。
  appmsgid 是每條推文的唯一標識符,aid 是每條推文的唯一標識符。
  其實(shí)除了cookies,URL中的token參數也會(huì )用來(lái)限制爬蟲(chóng),所以上面代碼的輸出很可能是{'base_resp': {'ret': 200040,'err_msg ':'無(wú)效的 csrf 令牌'}}
  接下來(lái),我們編寫(xiě)一個(gè)循環(huán)來(lái)獲取所有文章 JSON 并保存。
  import json
import requests
import time
import random
import yaml
with open("wechat.yaml", "r") as file:
file_data = file.read()
config = yaml.safe_load(file_data)
headers = {
"Cookie": config[&#39;cookie&#39;],
"User-Agent": config[&#39;user_agent&#39;]
}
# 請求參數
url = "https://mp.weixin.qq.com/cgi-bin/appmsg"
begin = "0"
params = {
"action": "list_ex",
"begin": begin,
"count": "5",
"fakeid": config[&#39;fakeid&#39;],
"type": "9",
"token": config[&#39;token&#39;],
"lang": "zh_CN",
"f": "json",
"ajax": "1"
}
# 存放結果
app_msg_list = []
# 在不知道公眾號有多少文章的情況下,使用while語(yǔ)句
# 也方便重新運行時(shí)設置頁(yè)數
i = 0
while True:
begin = i * 5
params["begin"] = str(begin)
# 隨機暫停幾秒,避免過(guò)快的請求導致過(guò)快的被查到
time.sleep(random.randint(1,10))
resp = requests.get(url, headers=headers, params = params, verify=False)
# 微信流量控制, 退出
if resp.json()[&#39;base_resp&#39;][&#39;ret&#39;] == 200013:
print("frequencey control, stop at {}".format(str(begin)))
break

# 如果返回的內容中為空則結束
if len(resp.json()[&#39;app_msg_list&#39;]) == 0:
print("all ariticle parsed")
break

app_msg_list.append(resp.json())
# 翻頁(yè)
i += 1
  在上面的代碼中,我還在“wechat.yaml”文件中存儲了fakeid和token。這是因為 fakeid 是每個(gè)公眾號的唯一標識符,令牌會(huì )經(jīng)常變化。這個(gè)信息可以通過(guò)解析URL獲取,也可以在開(kāi)發(fā)者工具中查看
  
  爬取一段時(shí)間后,會(huì )遇到以下問(wèn)題
  {&#39;base_resp&#39;: {&#39;err_msg&#39;: &#39;freq control&#39;, &#39;ret&#39;: 200013}}
  此時(shí)在公眾號后臺嘗試插入超鏈接時(shí),會(huì )遇到如下提示
  
  這是公眾號的流量限制,通常需要等待30-60分鐘才能繼續。為了完美處理這個(gè)問(wèn)題,您可能需要申請多個(gè)公眾號,可能需要對抗微信公眾號登錄系統,也可能需要設置代理池。
  但是我不需要工業(yè)級的爬蟲(chóng),我只想爬取自己的公眾號信息,所以等了一個(gè)小時(shí),再次登錄公眾號,獲取cookie和token,運行。我不想用自己的興趣挑戰別人的工作。
  最后,將結果保存為 JSON 格式。
  # 保存結果為JSON
json_name = "mp_data_{}.json".format(str(begin))
with open(json_name, "w") as file:
file.write(json.dumps(app_msg_list, indent=2, ensure_ascii=False))
  或者提取文章identifier、標題、網(wǎng)址、發(fā)布時(shí)間四列,保存為CSV。
  info_list = []
for msg in app_msg_list:
if "app_msg_list" in msg:
for item in msg["app_msg_list"]:
info = &#39;"{}","{}","{}","{}"&#39;.format(str(item["aid"]), item[&#39;title&#39;], item[&#39;link&#39;], str(item[&#39;create_time&#39;]))
info_list.append(info)
# save as csv
with open("app_msg_list.csv", "w") as file:
file.writelines("n".join(info_list))

大牛用微信公眾號爬取程序的難點(diǎn)和解決辦法

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 114 次瀏覽 ? 2021-07-21 03:00 ? 來(lái)自相關(guān)話(huà)題

  大牛用微信公眾號爬取程序的難點(diǎn)和解決辦法
  最近需要爬取微信公眾號的文章信息。上網(wǎng)查了一下,發(fā)現微信公眾號爬取的難點(diǎn)是公眾號文章的鏈接在PC端打不開(kāi)。需要使用微信的瀏覽器(獲取微信客戶(hù)端的補充參數才能在其他平臺訪(fǎng)問(wèn)Open),給爬蟲(chóng)程序帶來(lái)很大的麻煩。后來(lái)在知乎上看到一個(gè)大牛用php寫(xiě)的微信公眾號爬蟲(chóng)程序,他按照大佬的思路直接做了java。改造過(guò)程中遇到的細節問(wèn)題比較多,分享給大家。
  附上Daniel文章的鏈接:寫(xiě)php或者只需要爬取思路的可以直接看這個(gè)。思路很詳細。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
  系統的基本思想是在安卓模擬器上運行微信。模擬器設置代理,通過(guò)代理服務(wù)器攔截微信數據,并將獲取到的數據發(fā)送給自己的程序進(jìn)行處理。
  需要準備的環(huán)境:nodejs、anyproxy代理、Android模擬器
  nodejs下載地址:我下載的是windows版本,直接下載安裝即可。安裝完成后,直接運行C:\Program Files\nodejs\npm.cmd自動(dòng)配置環(huán)境。
  anyproxy安裝:上一步安裝好nodejs后,在cmd中直接運行npm install -g anyproxy就會(huì )安裝
  互聯(lián)網(wǎng)上只有一個(gè) Android 模擬器,很多。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
  首先安裝代理服務(wù)器的證書(shū)。 Anyproxy 默認不解析 https 鏈接。安裝證書(shū)后即可解決。在cmd中執行anyproxy --root后,就會(huì )安裝證書(shū)。之后,您必須在模擬器上下載證書(shū)。
  然后輸入anyproxy -i命令開(kāi)啟代理服務(wù)。 (記得加參數?。?br />   
  記住這個(gè)ip和端口,然后安卓模擬器的代理就會(huì )用到這個(gè)?,F在用瀏覽器打開(kāi)網(wǎng)頁(yè)::8002/ 這是anyproxy的網(wǎng)頁(yè)界面,用于顯示http傳輸數據。
  
  點(diǎn)擊上方紅框中的菜單,會(huì )顯示一個(gè)二維碼。使用安卓模擬器掃碼識別。模擬器(手機)會(huì )下載證書(shū)并安裝。
  現在我們準備為模擬器設置代理,代理模式設置為手動(dòng),代理ip為運行anyproxy的機器的ip,端口為8001
  
  準備工作到此基本完成。在模擬器上打開(kāi)微信,開(kāi)通公眾號文章,從剛剛打開(kāi)的網(wǎng)頁(yè)界面就可以看到anyproxy抓取到的數據了:
  
  在上面的紅框中,有一個(gè)微信文章的鏈接,點(diǎn)進(jìn)去查看具體數據。如果響應正文中沒(méi)有任何內容,則可能是證書(shū)安裝有問(wèn)題。
  如果一切順利,你就可以下去了。
  這里我們依靠代理服務(wù)來(lái)抓取微信數據,但是我們不能抓取一條數據,只能自己操作微信。最好手動(dòng)復制。所以我們需要微信客戶(hù)端自己跳轉到頁(yè)面。這時(shí)候可以使用anyproxy來(lái)攔截微信服務(wù)器返回的數據,將頁(yè)面跳轉代碼注入其中,然后將處理后的數據返回給模擬器,實(shí)現微信客戶(hù)端的自動(dòng)重定向。
  在anyproxy中打開(kāi)一個(gè)名為rule_default.js的js文件,windows下文件為:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
  文件中有一個(gè)方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。該方法負責對anyproxy獲得的數據進(jìn)行各種操作。開(kāi)頭應該只有 callback(serverResData) ;該語(yǔ)句的意思是直接將服務(wù)器響應數據返回給客戶(hù)端。把這條語(yǔ)句刪掉,換成下面丹尼爾寫(xiě)的代碼就行了。這里的代碼我沒(méi)有做任何改動(dòng),里面的注釋也解釋的很清楚,按照邏輯來(lái)理解就好了,問(wèn)題不大。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
3 //console.log("開(kāi)始第一種頁(yè)面爬取");
4 if(serverResData.toString() !== ""){
try {//防止報錯退出程序
7 var reg = /msgList = (.*?);/;//定義歷史消息正則匹配規則
8 var ret = reg.exec(serverResData.toString());//轉換變量為string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
14 })
15 });
16 }catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
17 //console.log("開(kāi)始第一種頁(yè)面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
22 }
23 }catch(e){
24 console.log(e);//錯誤捕捉
25 }
26 callback(serverResData);//直接返回第二頁(yè)json內容
27 }
28 }
29 //console.log("開(kāi)始第一種頁(yè)面爬取 結束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
33 var ret = reg.exec(serverResData.toString());//轉換變量為string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
  這里是一個(gè)簡(jiǎn)單的解釋。微信公眾號歷史新聞頁(yè)面的鏈接有兩種形式:一種以/mp/getmasssendmsg開(kāi)頭,另一種以/mp/profile_ext開(kāi)頭。歷史頁(yè)面可以關(guān)閉。如果被拒絕,則會(huì )觸發(fā)一個(gè)js事件,發(fā)送獲取json數據(下一頁(yè)內容)的??請求。還有公眾號文章的鏈接,以及文章的閱讀量和喜歡的鏈接(返回json數據)。這些鏈接的形式是固定的,可以通過(guò)邏輯判斷來(lái)區分。這里的問(wèn)題是,如果所有的歷史頁(yè)面都需要爬取,怎么做。我的想法是模擬鼠標通過(guò)js向下滑動(dòng)觸發(fā)提交加載列表下一部分的請求?;蛘咧苯邮褂胊nyproxy分析滑動(dòng)加載請求,直接將請求發(fā)送到微信服務(wù)器。但是一直存在一個(gè)問(wèn)題,就是如何判斷沒(méi)有剩余數據。我正在抓取最新數據。我暫時(shí)沒(méi)有這個(gè)需求,以后可能需要。有需要的可以試試。 查看全部

  大牛用微信公眾號爬取程序的難點(diǎn)和解決辦法
  最近需要爬取微信公眾號的文章信息。上網(wǎng)查了一下,發(fā)現微信公眾號爬取的難點(diǎn)是公眾號文章的鏈接在PC端打不開(kāi)。需要使用微信的瀏覽器(獲取微信客戶(hù)端的補充參數才能在其他平臺訪(fǎng)問(wèn)Open),給爬蟲(chóng)程序帶來(lái)很大的麻煩。后來(lái)在知乎上看到一個(gè)大牛用php寫(xiě)的微信公眾號爬蟲(chóng)程序,他按照大佬的思路直接做了java。改造過(guò)程中遇到的細節問(wèn)題比較多,分享給大家。
  附上Daniel文章的鏈接:寫(xiě)php或者只需要爬取思路的可以直接看這個(gè)。思路很詳細。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- --------------------------
  系統的基本思想是在安卓模擬器上運行微信。模擬器設置代理,通過(guò)代理服務(wù)器攔截微信數據,并將獲取到的數據發(fā)送給自己的程序進(jìn)行處理。
  需要準備的環(huán)境:nodejs、anyproxy代理、Android模擬器
  nodejs下載地址:我下載的是windows版本,直接下載安裝即可。安裝完成后,直接運行C:\Program Files\nodejs\npm.cmd自動(dòng)配置環(huán)境。
  anyproxy安裝:上一步安裝好nodejs后,在cmd中直接運行npm install -g anyproxy就會(huì )安裝
  互聯(lián)網(wǎng)上只有一個(gè) Android 模擬器,很多。
  ----------------------------------------------- -------------------------------------------------- -------------------------------------------------- ---------------------------------------
  首先安裝代理服務(wù)器的證書(shū)。 Anyproxy 默認不解析 https 鏈接。安裝證書(shū)后即可解決。在cmd中執行anyproxy --root后,就會(huì )安裝證書(shū)。之后,您必須在模擬器上下載證書(shū)。
  然后輸入anyproxy -i命令開(kāi)啟代理服務(wù)。 (記得加參數?。?br />   
  記住這個(gè)ip和端口,然后安卓模擬器的代理就會(huì )用到這個(gè)?,F在用瀏覽器打開(kāi)網(wǎng)頁(yè)::8002/ 這是anyproxy的網(wǎng)頁(yè)界面,用于顯示http傳輸數據。
  
  點(diǎn)擊上方紅框中的菜單,會(huì )顯示一個(gè)二維碼。使用安卓模擬器掃碼識別。模擬器(手機)會(huì )下載證書(shū)并安裝。
  現在我們準備為模擬器設置代理,代理模式設置為手動(dòng),代理ip為運行anyproxy的機器的ip,端口為8001
  
  準備工作到此基本完成。在模擬器上打開(kāi)微信,開(kāi)通公眾號文章,從剛剛打開(kāi)的網(wǎng)頁(yè)界面就可以看到anyproxy抓取到的數據了:
  
  在上面的紅框中,有一個(gè)微信文章的鏈接,點(diǎn)進(jìn)去查看具體數據。如果響應正文中沒(méi)有任何內容,則可能是證書(shū)安裝有問(wèn)題。
  如果一切順利,你就可以下去了。
  這里我們依靠代理服務(wù)來(lái)抓取微信數據,但是我們不能抓取一條數據,只能自己操作微信。最好手動(dòng)復制。所以我們需要微信客戶(hù)端自己跳轉到頁(yè)面。這時(shí)候可以使用anyproxy來(lái)攔截微信服務(wù)器返回的數據,將頁(yè)面跳轉代碼注入其中,然后將處理后的數據返回給模擬器,實(shí)現微信客戶(hù)端的自動(dòng)重定向。
  在anyproxy中打開(kāi)一個(gè)名為rule_default.js的js文件,windows下文件為:C:\Users\Administrator\AppData\Roaming\npm\node_modules\anyproxy\lib
  文件中有一個(gè)方法叫replaceServerResDataAsync:function(req,res,serverResData,callback)。該方法負責對anyproxy獲得的數據進(jìn)行各種操作。開(kāi)頭應該只有 callback(serverResData) ;該語(yǔ)句的意思是直接將服務(wù)器響應數據返回給客戶(hù)端。把這條語(yǔ)句刪掉,換成下面丹尼爾寫(xiě)的代碼就行了。這里的代碼我沒(méi)有做任何改動(dòng),里面的注釋也解釋的很清楚,按照邏輯來(lái)理解就好了,問(wèn)題不大。
   1 replaceServerResDataAsync: function(req,res,serverResData,callback){
2 if(/mp\/getmasssendmsg/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第一種頁(yè)面形式)
3 //console.log("開(kāi)始第一種頁(yè)面爬取");
4 if(serverResData.toString() !== ""){
try {//防止報錯退出程序
7 var reg = /msgList = (.*?);/;//定義歷史消息正則匹配規則
8 var ret = reg.exec(serverResData.toString());//轉換變量為string
9 HttpPost(ret[1],req.url,"/InternetSpider/getData/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
10 var http = require('http');
11 http.get('http://xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
12 res.on('data', function(chunk){
13 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
14 })
15 });
16 }catch(e){//如果上面的正則沒(méi)有匹配到,那么這個(gè)頁(yè)面內容可能是公眾號歷史消息頁(yè)面向下翻動(dòng)的第二頁(yè),因為歷史消息第一頁(yè)是html格式的,第二頁(yè)就是json格式的。
17 //console.log("開(kāi)始第一種頁(yè)面爬取向下翻形式");
18 try {
19 var json = JSON.parse(serverResData.toString());
20 if (json.general_msg_list != []) {
21 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
22 }
23 }catch(e){
24 console.log(e);//錯誤捕捉
25 }
26 callback(serverResData);//直接返回第二頁(yè)json內容
27 }
28 }
29 //console.log("開(kāi)始第一種頁(yè)面爬取 結束");
30 }else if(/mp\/profile_ext\?action=home/i.test(req.url)){//當鏈接地址為公眾號歷史消息頁(yè)面時(shí)(第二種頁(yè)面形式)
31 try {
32 var reg = /var msgList = \'(.*?)\';/;//定義歷史消息正則匹配規則(和第一種頁(yè)面形式的正則不同)
33 var ret = reg.exec(serverResData.toString());//轉換變量為string
34 HttpPost(ret[1],req.url,"/xxx/showBiz");//這個(gè)函數是后文定義的,將匹配到的歷史消息json發(fā)送到自己的服務(wù)器
35 var http = require('http');
36 http.get('xxx/getWxHis', function(res) {//這個(gè)地址是自己服務(wù)器上的一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxHis.php的原理。
37 res.on('data', function(chunk){
38 callback(chunk+serverResData);//將返回的代碼插入到歷史消息頁(yè)面中,并返回顯示出來(lái)
39 })
40 });
41 }catch(e){
42 //console.log(e);
43 callback(serverResData);
44 }
45 }else if(/mp\/profile_ext\?action=getmsg/i.test(req.url)){//第二種頁(yè)面表現形式的向下翻頁(yè)后的json
46 try {
47 var json = JSON.parse(serverResData.toString());
48 if (json.general_msg_list != []) {
49 HttpPost(json.general_msg_list,req.url,"/xxx/showBiz");//這個(gè)函數和上面的一樣是后文定義的,將第二頁(yè)歷史消息的json發(fā)送到自己的服務(wù)器
50 }
51 }catch(e){
52 console.log(e);
53 }
54 callback(serverResData);
55 }else if(/mp\/getappmsgext/i.test(req.url)){//當鏈接地址為公眾號文章閱讀量和點(diǎn)贊量時(shí)
56 try {
57 HttpPost(serverResData,req.url,"/xxx/getMsgExt");//函數是后文定義的,功能是將文章閱讀量點(diǎn)贊量的json發(fā)送到服務(wù)器
58 }catch(e){
59
60 }
61 callback(serverResData);
62 }else if(/s\?__biz/i.test(req.url) || /mp\/rumor/i.test(req.url)){//當鏈接地址為公眾號文章時(shí)(rumor這個(gè)地址是公眾號文章被辟謠了)
63 try {
64 var http = require('http');
65 http.get('http://xxx/getWxPost', function(res) {//這個(gè)地址是自己服務(wù)器上的另一個(gè)程序,目的是為了獲取到下一個(gè)鏈接地址,將地址放在一個(gè)js腳本中,將頁(yè)面自動(dòng)跳轉到下一頁(yè)。后文將介紹getWxPost.php的原理。
66 res.on('data', function(chunk){
67 callback(chunk+serverResData);
68 })
69 });
70 }catch(e){
71 callback(serverResData);
72 }
73 }else{
74 callback(serverResData);
75 }
76 //callback(serverResData);
77 },
  這里是一個(gè)簡(jiǎn)單的解釋。微信公眾號歷史新聞頁(yè)面的鏈接有兩種形式:一種以/mp/getmasssendmsg開(kāi)頭,另一種以/mp/profile_ext開(kāi)頭。歷史頁(yè)面可以關(guān)閉。如果被拒絕,則會(huì )觸發(fā)一個(gè)js事件,發(fā)送獲取json數據(下一頁(yè)內容)的??請求。還有公眾號文章的鏈接,以及文章的閱讀量和喜歡的鏈接(返回json數據)。這些鏈接的形式是固定的,可以通過(guò)邏輯判斷來(lái)區分。這里的問(wèn)題是,如果所有的歷史頁(yè)面都需要爬取,怎么做。我的想法是模擬鼠標通過(guò)js向下滑動(dòng)觸發(fā)提交加載列表下一部分的請求?;蛘咧苯邮褂胊nyproxy分析滑動(dòng)加載請求,直接將請求發(fā)送到微信服務(wù)器。但是一直存在一個(gè)問(wèn)題,就是如何判斷沒(méi)有剩余數據。我正在抓取最新數據。我暫時(shí)沒(méi)有這個(gè)需求,以后可能需要。有需要的可以試試。

微信公眾號文章的接口分析及應用方法(一)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 194 次瀏覽 ? 2021-07-21 02:31 ? 來(lái)自相關(guān)話(huà)題

  微信公眾號文章的接口分析及應用方法(一)
  一.Idea
  我們通過(guò)微信公眾平臺網(wǎng)頁(yè)版圖文消息中的超鏈接獲取我們需要的界面
  
  
  從界面我們可以得到對應的微信公眾號和所有對應的微信公眾號文章。
  二.接口分析
  微信公眾號獲取接口: 參數:action=search_biz begin=0 count=5 query=公眾號token=每個(gè)帳號對應的Token值 lang=zh_CN f=json ajax=1 請求方式:GET so this在界面中,我們只需要獲取token,查詢(xún)的是你需要搜索的公眾號,登錄后可以通過(guò)網(wǎng)頁(yè)鏈接獲取token。
  
  獲取公眾號對應文章的接口: 參數:action=list_ex begin=0 count=5 fakeid=MjM5NDAwMTA2MA== type=9 query= token=557131216 lang=zh_CN f=json ajax=1 Request method: GET 在這個(gè)接口中,我們需要獲取的值是上一步的token和fakeid,這個(gè)fakeid可以在第一個(gè)接口中獲取。這樣我們就可以獲取到微信公眾號文章的數據了。
  
  三.Realization 第一步:
  首先我們需要通過(guò)selenium模擬登錄,然后獲取cookie和對應的token
  def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 點(diǎn)擊切換到賬號密碼輸入
browser.find_element_by_xpath("//a[@class=&#39;login__type__container__select-type&#39;]").click()
sleep(2)
# 模擬用戶(hù)點(diǎn)擊
input_user = browser.find_element_by_xpath("//input[@name=&#39;account&#39;]")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name=&#39;password&#39;]")
input_password.send_keys(password)
sleep(2)
# 點(diǎn)擊登錄
browser.find_element_by_xpath("//a[@class=&#39;btn_login&#39;]").click()
sleep(2)
# 微信登錄驗證
print(&#39;請掃描二維碼&#39;)
sleep(20)
# 刷新當前網(wǎng)頁(yè)
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(5)
# 獲取當前網(wǎng)頁(yè)鏈接
url = browser.current_url
# 獲取當前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item[&#39;name&#39;]] = item[&#39;value&#39;]
# 轉換為字符串
cookie_str = json.dumps(post)
# 存儲到本地
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print(&#39;cookie保存到本地成功&#39;)
# 對當前網(wǎng)頁(yè)鏈接進(jìn)行切片,獲取到token
paramList = url.strip().split(&#39;?&#39;)[1].split(&#39;&&#39;)
# 定義一個(gè)字典存儲數據
paramdict = {}
for item in paramList:
paramdict[item.split(&#39;=&#39;)[0]] = item.split(&#39;=&#39;)[1]
# 返回token
return paramdict[&#39;token&#39;]
  定義一個(gè)登錄方法,里面的參數是登錄賬號和密碼,然后定義一個(gè)字典來(lái)存儲cookie的值。模擬用戶(hù),輸入對應的賬號密碼,點(diǎn)擊登錄,會(huì )出現掃碼驗證,用登錄微信掃一掃即可。
  刷新當前網(wǎng)頁(yè)后,獲取當前cookie和token,然后返回。
  第二步:1.請求獲取對應的公眾號接口,獲取我們需要的fakeid
   url = &#39;https://mp.weixin.qq.com&#39;
headers = {
&#39;HOST&#39;: &#39;mp.weixin.qq.com&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63&#39;
}
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
params = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;搜索的公眾號名稱(chēng)&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
  傳入我們獲取的token和cookie,然后通過(guò)requests.get請求獲取返回的微信公眾號的json數據
  lists = search_resp.json().get(&#39;list&#39;)[0]
  通過(guò)上面的代碼可以得到對應的公眾號數據
  fakeid = lists.get(&#39;fakeid&#39;)
  通過(guò)上面的代碼可以得到對應的fakeid
  2.請求獲取微信公眾號文章接口,獲取我們需要的文章data
   appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
params_data = {
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
  我們傳入fakeid和token,然后調用requests.get請求接口獲取返回的json數據。
  我們已經(jīng)實(shí)現了微信公眾號文章的抓取。
  四.Summary
  通過(guò)爬取微信公眾號文章,需要掌握selenium和requests的用法,以及如何獲取request接口。但是需要注意的是,當我們在循環(huán)中獲取文章時(shí),一定要設置一個(gè)延遲時(shí)間,否則賬號很容易被封,獲取不到返回的數據。
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  Python免費學(xué)習資料和群交流答案點(diǎn)擊加入 查看全部

  微信公眾號文章的接口分析及應用方法(一)
  一.Idea
  我們通過(guò)微信公眾平臺網(wǎng)頁(yè)版圖文消息中的超鏈接獲取我們需要的界面
  
  
  從界面我們可以得到對應的微信公眾號和所有對應的微信公眾號文章。
  二.接口分析
  微信公眾號獲取接口: 參數:action=search_biz begin=0 count=5 query=公眾號token=每個(gè)帳號對應的Token值 lang=zh_CN f=json ajax=1 請求方式:GET so this在界面中,我們只需要獲取token,查詢(xún)的是你需要搜索的公眾號,登錄后可以通過(guò)網(wǎng)頁(yè)鏈接獲取token。
  
  獲取公眾號對應文章的接口: 參數:action=list_ex begin=0 count=5 fakeid=MjM5NDAwMTA2MA== type=9 query= token=557131216 lang=zh_CN f=json ajax=1 Request method: GET 在這個(gè)接口中,我們需要獲取的值是上一步的token和fakeid,這個(gè)fakeid可以在第一個(gè)接口中獲取。這樣我們就可以獲取到微信公眾號文章的數據了。
  
  三.Realization 第一步:
  首先我們需要通過(guò)selenium模擬登錄,然后獲取cookie和對應的token
  def weChat_login(user, password):
post = {}
browser = webdriver.Chrome()
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(3)
browser.delete_all_cookies()
sleep(2)
# 點(diǎn)擊切換到賬號密碼輸入
browser.find_element_by_xpath("//a[@class=&#39;login__type__container__select-type&#39;]").click()
sleep(2)
# 模擬用戶(hù)點(diǎn)擊
input_user = browser.find_element_by_xpath("//input[@name=&#39;account&#39;]")
input_user.send_keys(user)
input_password = browser.find_element_by_xpath("//input[@name=&#39;password&#39;]")
input_password.send_keys(password)
sleep(2)
# 點(diǎn)擊登錄
browser.find_element_by_xpath("//a[@class=&#39;btn_login&#39;]").click()
sleep(2)
# 微信登錄驗證
print(&#39;請掃描二維碼&#39;)
sleep(20)
# 刷新當前網(wǎng)頁(yè)
browser.get(&#39;https://mp.weixin.qq.com/&#39;)
sleep(5)
# 獲取當前網(wǎng)頁(yè)鏈接
url = browser.current_url
# 獲取當前cookie
cookies = browser.get_cookies()
for item in cookies:
post[item[&#39;name&#39;]] = item[&#39;value&#39;]
# 轉換為字符串
cookie_str = json.dumps(post)
# 存儲到本地
with open(&#39;cookie.txt&#39;, &#39;w+&#39;, encoding=&#39;utf-8&#39;) as f:
f.write(cookie_str)
print(&#39;cookie保存到本地成功&#39;)
# 對當前網(wǎng)頁(yè)鏈接進(jìn)行切片,獲取到token
paramList = url.strip().split(&#39;?&#39;)[1].split(&#39;&&#39;)
# 定義一個(gè)字典存儲數據
paramdict = {}
for item in paramList:
paramdict[item.split(&#39;=&#39;)[0]] = item.split(&#39;=&#39;)[1]
# 返回token
return paramdict[&#39;token&#39;]
  定義一個(gè)登錄方法,里面的參數是登錄賬號和密碼,然后定義一個(gè)字典來(lái)存儲cookie的值。模擬用戶(hù),輸入對應的賬號密碼,點(diǎn)擊登錄,會(huì )出現掃碼驗證,用登錄微信掃一掃即可。
  刷新當前網(wǎng)頁(yè)后,獲取當前cookie和token,然后返回。
  第二步:1.請求獲取對應的公眾號接口,獲取我們需要的fakeid
   url = &#39;https://mp.weixin.qq.com&#39;
headers = {
&#39;HOST&#39;: &#39;mp.weixin.qq.com&#39;,
&#39;User-Agent&#39;: &#39;Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36 Edg/86.0.622.63&#39;
}
with open(&#39;cookie.txt&#39;, &#39;r&#39;, encoding=&#39;utf-8&#39;) as f:
cookie = f.read()
cookies = json.loads(cookie)
resp = requests.get(url=url, headers=headers, cookies=cookies)
search_url = &#39;https://mp.weixin.qq.com/cgi-b ... 39%3B
params = {
&#39;action&#39;: &#39;search_biz&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;query&#39;: &#39;搜索的公眾號名稱(chēng)&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
search_resp = requests.get(url=search_url, cookies=cookies, headers=headers, params=params)
  傳入我們獲取的token和cookie,然后通過(guò)requests.get請求獲取返回的微信公眾號的json數據
  lists = search_resp.json().get(&#39;list&#39;)[0]
  通過(guò)上面的代碼可以得到對應的公眾號數據
  fakeid = lists.get(&#39;fakeid&#39;)
  通過(guò)上面的代碼可以得到對應的fakeid
  2.請求獲取微信公眾號文章接口,獲取我們需要的文章data
   appmsg_url = &#39;https://mp.weixin.qq.com/cgi-bin/appmsg?&#39;
params_data = {
&#39;action&#39;: &#39;list_ex&#39;,
&#39;begin&#39;: &#39;0&#39;,
&#39;count&#39;: &#39;5&#39;,
&#39;fakeid&#39;: fakeid,
&#39;type&#39;: &#39;9&#39;,
&#39;query&#39;: &#39;&#39;,
&#39;token&#39;: token,
&#39;lang&#39;: &#39;zh_CN&#39;,
&#39;f&#39;: &#39;json&#39;,
&#39;ajax&#39;: &#39;1&#39;
}
appmsg_resp = requests.get(url=appmsg_url, cookies=cookies, headers=headers, params=params_data)
  我們傳入fakeid和token,然后調用requests.get請求接口獲取返回的json數據。
  我們已經(jīng)實(shí)現了微信公眾號文章的抓取。
  四.Summary
  通過(guò)爬取微信公眾號文章,需要掌握selenium和requests的用法,以及如何獲取request接口。但是需要注意的是,當我們在循環(huán)中獲取文章時(shí),一定要設置一個(gè)延遲時(shí)間,否則賬號很容易被封,獲取不到返回的數據。
  PS:如需Python學(xué)習資料,可點(diǎn)擊下方鏈接自行獲取
  Python免費學(xué)習資料和群交流答案點(diǎn)擊加入

微信讀書(shū)App已經(jīng)上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊(圖)

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 117 次瀏覽 ? 2021-07-20 01:25 ? 來(lái)自相關(guān)話(huà)題

  
微信讀書(shū)App已經(jīng)上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊(圖)
  
  微信閱讀APP上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊。
  鈦媒體編輯今天點(diǎn)擊微信閱讀App主界面左下角的書(shū)店,彈出“優(yōu)質(zhì)公眾號”模塊。
  在“查看全部”內容列表中,鈦媒體發(fā)現該模塊分為8個(gè)子模塊:“全部”、“輕松搞笑”、“影評”、“文學(xué)雜志”、“互聯(lián)網(wǎng)”、 “知識教育”、“商業(yè)金融”和“其他”。在每個(gè)子模塊中,收錄在微信公眾平臺上的每個(gè)自媒體號都有文章。
  
  另外,通過(guò)微信閱讀App搜索欄,可以直接搜索相關(guān)公眾號和內容。
  其實(shí)在今年4月份,微信閱讀2.4.0就增加了一個(gè)新功能:引入優(yōu)質(zhì)公眾號。
  馬化騰去年在朋友圈與kol的對話(huà)中也透露,微信正在測試公眾號的付費訂閱功能。此后,一直沒(méi)有消息表明該功能何時(shí)正式發(fā)布。
  微信閱讀App的自然付費閱讀模式與微信公眾號付費閱讀自然匹配。不過(guò)微信閱讀App中的優(yōu)質(zhì)公眾號模塊還是可以免費閱讀的。
  鈦媒體發(fā)現,這并不是微信閱讀和微信公眾號的第一次結合。早在去年9月2.2.0版本上線(xiàn)時(shí),就已經(jīng)有“支持看書(shū)的公眾號”文章”提示了。
  針對新功能,鈦媒體編輯采訪(fǎng)了幾家公眾號運營(yíng)商,發(fā)現微信閱讀沒(méi)有事先與運營(yíng)商溝通授權和版權問(wèn)題。
  這一次,我們將在微信公眾號中直接抓取文章,并將其作為一個(gè)獨立的部分。以后會(huì )不會(huì )涉及版權問(wèn)題?
  就目前的功能而言,微信閱讀App看起來(lái)是一個(gè)完美的“接現成孩子”的過(guò)程。同時(shí)在搜索一些不知名的公眾號時(shí),發(fā)現系統沒(méi)有收錄??梢钥闯?,“優(yōu)質(zhì)公眾號”是在微信閱讀相關(guān)數據庫篩選后導入的。
  
  據了解,微信閱讀App于2015年8月27日正式上線(xiàn),目前華為應用商店下載量已超過(guò)1億。龐大的流量平臺未來(lái)將如何與微信公眾號運營(yíng)商分享收益?值得期待。 (本文首發(fā)于鈦媒體,作者/桑明強,編輯/洋蔥) 查看全部

  
微信讀書(shū)App已經(jīng)上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊(圖)
  
  微信閱讀APP上線(xiàn)優(yōu)質(zhì)公眾號推薦模塊。
  鈦媒體編輯今天點(diǎn)擊微信閱讀App主界面左下角的書(shū)店,彈出“優(yōu)質(zhì)公眾號”模塊。
  在“查看全部”內容列表中,鈦媒體發(fā)現該模塊分為8個(gè)子模塊:“全部”、“輕松搞笑”、“影評”、“文學(xué)雜志”、“互聯(lián)網(wǎng)”、 “知識教育”、“商業(yè)金融”和“其他”。在每個(gè)子模塊中,收錄在微信公眾平臺上的每個(gè)自媒體號都有文章。
  
  另外,通過(guò)微信閱讀App搜索欄,可以直接搜索相關(guān)公眾號和內容。
  其實(shí)在今年4月份,微信閱讀2.4.0就增加了一個(gè)新功能:引入優(yōu)質(zhì)公眾號。
  馬化騰去年在朋友圈與kol的對話(huà)中也透露,微信正在測試公眾號的付費訂閱功能。此后,一直沒(méi)有消息表明該功能何時(shí)正式發(fā)布。
  微信閱讀App的自然付費閱讀模式與微信公眾號付費閱讀自然匹配。不過(guò)微信閱讀App中的優(yōu)質(zhì)公眾號模塊還是可以免費閱讀的。
  鈦媒體發(fā)現,這并不是微信閱讀和微信公眾號的第一次結合。早在去年9月2.2.0版本上線(xiàn)時(shí),就已經(jīng)有“支持看書(shū)的公眾號”文章”提示了。
  針對新功能,鈦媒體編輯采訪(fǎng)了幾家公眾號運營(yíng)商,發(fā)現微信閱讀沒(méi)有事先與運營(yíng)商溝通授權和版權問(wèn)題。
  這一次,我們將在微信公眾號中直接抓取文章,并將其作為一個(gè)獨立的部分。以后會(huì )不會(huì )涉及版權問(wèn)題?
  就目前的功能而言,微信閱讀App看起來(lái)是一個(gè)完美的“接現成孩子”的過(guò)程。同時(shí)在搜索一些不知名的公眾號時(shí),發(fā)現系統沒(méi)有收錄??梢钥闯?,“優(yōu)質(zhì)公眾號”是在微信閱讀相關(guān)數據庫篩選后導入的。
  
  據了解,微信閱讀App于2015年8月27日正式上線(xiàn),目前華為應用商店下載量已超過(guò)1億。龐大的流量平臺未來(lái)將如何與微信公眾號運營(yíng)商分享收益?值得期待。 (本文首發(fā)于鈦媒體,作者/桑明強,編輯/洋蔥)

翻頁(yè)打開(kāi)headers,開(kāi)發(fā)工具思路首先start_url==?

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 106 次瀏覽 ? 2021-07-18 23:25 ? 來(lái)自相關(guān)話(huà)題

  翻頁(yè)打開(kāi)headers,開(kāi)發(fā)工具思路首先start_url==?
  由于微信流量封閉,微信內容比較難看。為了能夠在微信公眾號爬文章,有網(wǎng)友用python實(shí)現了。我們來(lái)看看他的實(shí)現思路和代碼。也許它可以使用?要知道微信公眾號里的內容不是百度上的收錄,能做到就太牛了。
  開(kāi)發(fā)工具
  思考
  首先start_url=””,掃碼注冊微信公眾平臺,有的話(huà)直接忽略?huà)叽a登錄即可。(注冊個(gè)人訂閱號即可),使用selenium自動(dòng)掃碼登錄獲取cookie值,然后使用cookie進(jìn)行響應。
  您需要先下載webdriver插件。插件下載谷歌瀏覽器對應的版本。下載后會(huì )得到chromedriver.exe,然后把這個(gè)chromedriver.exe和python解釋器的python.exe文件放在同一個(gè)目錄下。作為響應,取回網(wǎng)頁(yè)的源代碼并取回令牌值。令牌值具有時(shí)間敏感性。
  首先打開(kāi)公眾號,點(diǎn)擊圖文編輯中的超鏈接。
  
  使用python爬取微信公眾號文章
  
  使用python爬取微信公眾號文章
  
  使用python爬取微信公眾號文章
  按F12查看公眾號對應的fakeid值。
  
  使用python爬取微信公眾號文章
  
  使用python爬取微信公眾號文章
  翻頁(yè)打開(kāi)headers,取回首頁(yè)url地址
  第二頁(yè)地址
  找到模式,上傳代碼
  # !/usr/bin/nev python
# -*-coding:utf8-*-
import tkinter as tk
from selenium import webdriver
import time, re, jsonpath, xlwt
from requests_html import HTMLSession
session = HTMLSession()
class GZHSpider(object):
def __init__(self):
"""定義可視化窗口,并設置窗口和主題大小布局"""
self.window = tk.Tk()
self.window.title('公眾號信息采集')
self.window.geometry('800x600')
"""創(chuàng )建label_user按鈕,與說(shuō)明書(shū)"""
self.label_user = tk.Label(self.window, text='需要爬取的公眾號:', font=('Arial', 12), width=30, height=2)
self.label_user.pack()
"""創(chuàng )建label_user關(guān)聯(lián)輸入"""
self.entry_user = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_user.pack(after=self.label_user)
"""創(chuàng )建label_passwd按鈕,與說(shuō)明書(shū)"""
self.label_passwd = tk.Label(self.window, text="爬取多少頁(yè):(小于100)", font=('Arial', 12), width=30, height=2)
self.label_passwd.pack()
"""創(chuàng )建label_passwd關(guān)聯(lián)輸入"""
self.entry_passwd = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_passwd.pack(after=self.label_passwd)
"""創(chuàng )建Text富文本框,用于按鈕操作結果的展示"""
self.text1 = tk.Text(self.window, font=('Arial', 12), width=85, height=22)
self.text1.pack()
"""定義按鈕1,綁定觸發(fā)事件方法"""
self.button_1 = tk.Button(self.window, text='爬取', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_1)
self.button_1.pack(before=self.text1)
"""定義按鈕2,綁定觸發(fā)事件方法"""
self.button_2 = tk.Button(self.window, text='清除', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_2)
self.button_2.pack(anchor="e")
def parse_hit_click_1(self):
"""定義觸發(fā)事件1,調用main函數"""
user_name = self.entry_user.get()
pass_wd = int(self.entry_passwd.get())
self.main(user_name, pass_wd)
def main(self, user_name, pass_wd):
# 網(wǎng)頁(yè)登錄
driver_path = r'D:\python\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://mp.weixin.qq.com/')
time.sleep(2)
# 網(wǎng)頁(yè)最大化
driver.maximize_window()
# 拿微信掃描登錄
time.sleep(20)
# 獲得登錄的cookies
cookies_list = driver.get_cookies()
# 轉化成能用的cookie格式
cookie = [item["name"] + "=" + item["value"] for item in cookies_list]
cookie_str = '; '.join(item for item in cookie)
# 請求頭
headers_1 = {
'cookie': cookie_str,
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36'
}
# 起始地址
start_url = 'https://mp.weixin.qq.com/'
response = session.get(start_url, headers=headers_1).content.decode()
# 拿到token值,token值是有時(shí)效性的
token = re.findall(r'token=(\d+)', response)[0]
# 搜索出所有跟輸入的公眾號有關(guān)的
next_url = f'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={user_name}&token=' \
f'{token}&lang=zh_CN&f=json&ajax=1'
# 獲取響應
response_1 = session.get(next_url, headers=headers_1).content.decode()
# 拿到fakeid的值,確定公眾號,唯一的
fakeid = re.findall(r'"fakeid":"(.*?)",', response_1)[0]
# 構造公眾號的url地址
next_url_2 = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
headers_2 = {
'cookie': cookie_str,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36',
'referer': f'https://mp.weixin.qq.com/cgi-bin/appmsgtemplate?action=edit&lang=zh_CN&token={token}',
'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-requested-with': 'XMLHttpRequest'
}
# 表的創(chuàng )建
workbook = xlwt.Workbook(encoding='gbk', style_compression=0)
sheet = workbook.add_sheet('test', cell_overwrite_ok=True)
j = 1
# 構造表頭
sheet.write(0, 0, '時(shí)間')
sheet.write(0, 1, '標題')
sheet.write(0, 2, '地址')
# 循環(huán)翻頁(yè)
for i in range(pass_wd):
data["begin"] = i * 5
time.sleep(3)
# 獲取響應的json數據
response_2 = session.get(next_url_2, params=data, headers=headers_2).json()
# jsonpath 獲取時(shí)間,標題,地址
title_list = jsonpath.jsonpath(response_2, '$..title')
url_list = jsonpath.jsonpath(response_2, '$..link')
create_time_list = jsonpath.jsonpath(response_2, '$..create_time')
# 將時(shí)間戳轉化為北京時(shí)間
list_1 = []
for create_time in create_time_list:
time_local = time.localtime(int(create_time))
time_1 = time.strftime("%Y-%m-%d", time_local)
time_2 = time.strftime("%H:%M:%S", time_local)
time_3 = time_1 + ' ' + time_2
list_1.append(time_3)
# for循環(huán)遍歷
for times, title, url in zip(list_1, title_list, url_list):
# 其中的'0-行, 0-列'指定表中的單元
sheet.write(j, 0, times)
sheet.write(j, 1, title)
sheet.write(j, 2, url)
j = j + 1
# 窗口顯示進(jìn)程
self.text1.insert("insert", f'*****************第{i+1}頁(yè)爬取成功*****************')
time.sleep(2)
self.text1.insert("insert", '\n ')
self.text1.insert("insert", '\n ')
# 最后保存成功
workbook.save(f'{user_name}公眾號信息.xls')
print(f"*********{user_name}公眾號信息保存成功*********")
def parse_hit_click_2(self):
"""定義觸發(fā)事件2,刪除文本框中內容"""
self.entry_user.delete(0, "end")
self.entry_passwd.delete(0, "end")
self.text1.delete("1.0", "end")
def center(self):
"""創(chuàng )建窗口居中函數方法"""
ws = self.window.winfo_screenwidth()
hs = self.window.winfo_screenheight()
x = int((ws / 2) - (800 / 2))
y = int((hs / 2) - (600 / 2))
self.window.geometry('{}x{}+{}+{}'.format(800, 600, x, y))
def run_loop(self):
"""禁止修改窗體大小規格"""
self.window.resizable(False, False)
"""窗口居中"""
self.center()
"""窗口維持--持久化"""
self.window.mainloop()
if __name__ == '__main__':
g = GZHSpider()
g.run_loop() 查看全部

  翻頁(yè)打開(kāi)headers,開(kāi)發(fā)工具思路首先start_url==?
  由于微信流量封閉,微信內容比較難看。為了能夠在微信公眾號爬文章,有網(wǎng)友用python實(shí)現了。我們來(lái)看看他的實(shí)現思路和代碼。也許它可以使用?要知道微信公眾號里的內容不是百度上的收錄,能做到就太牛了。
  開(kāi)發(fā)工具
  思考
  首先start_url=””,掃碼注冊微信公眾平臺,有的話(huà)直接忽略?huà)叽a登錄即可。(注冊個(gè)人訂閱號即可),使用selenium自動(dòng)掃碼登錄獲取cookie值,然后使用cookie進(jìn)行響應。
  您需要先下載webdriver插件。插件下載谷歌瀏覽器對應的版本。下載后會(huì )得到chromedriver.exe,然后把這個(gè)chromedriver.exe和python解釋器的python.exe文件放在同一個(gè)目錄下。作為響應,取回網(wǎng)頁(yè)的源代碼并取回令牌值。令牌值具有時(shí)間敏感性。
  首先打開(kāi)公眾號,點(diǎn)擊圖文編輯中的超鏈接。
  https://www.daimadog.com/wp-co ... 8.png 440w, https://www.daimadog.com/wp-co ... 0.png 768w, https://www.daimadog.com/wp-co ... 3.png 1362w" />
  使用python爬取微信公眾號文章
  https://www.daimadog.com/wp-co ... 8.png 440w, https://www.daimadog.com/wp-co ... 2.png 768w" />
  使用python爬取微信公眾號文章
  https://www.daimadog.com/wp-co ... 4.png 440w, https://www.daimadog.com/wp-co ... 1.png 768w" />
  使用python爬取微信公眾號文章
  按F12查看公眾號對應的fakeid值。
  https://www.daimadog.com/wp-co ... 3.png 440w, https://www.daimadog.com/wp-co ... 9.png 768w, https://www.daimadog.com/wp-co ... 6.png 1365w" />
  使用python爬取微信公眾號文章
  https://www.daimadog.com/wp-co ... 9.png 440w, https://www.daimadog.com/wp-co ... 8.png 768w, https://www.daimadog.com/wp-co ... 6.png 1364w" />
  使用python爬取微信公眾號文章
  翻頁(yè)打開(kāi)headers,取回首頁(yè)url地址
  第二頁(yè)地址
  找到模式,上傳代碼
  # !/usr/bin/nev python
# -*-coding:utf8-*-
import tkinter as tk
from selenium import webdriver
import time, re, jsonpath, xlwt
from requests_html import HTMLSession
session = HTMLSession()
class GZHSpider(object):
def __init__(self):
"""定義可視化窗口,并設置窗口和主題大小布局"""
self.window = tk.Tk()
self.window.title('公眾號信息采集')
self.window.geometry('800x600')
"""創(chuàng )建label_user按鈕,與說(shuō)明書(shū)"""
self.label_user = tk.Label(self.window, text='需要爬取的公眾號:', font=('Arial', 12), width=30, height=2)
self.label_user.pack()
"""創(chuàng )建label_user關(guān)聯(lián)輸入"""
self.entry_user = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_user.pack(after=self.label_user)
"""創(chuàng )建label_passwd按鈕,與說(shuō)明書(shū)"""
self.label_passwd = tk.Label(self.window, text="爬取多少頁(yè):(小于100)", font=('Arial', 12), width=30, height=2)
self.label_passwd.pack()
"""創(chuàng )建label_passwd關(guān)聯(lián)輸入"""
self.entry_passwd = tk.Entry(self.window, show=None, font=('Arial', 14))
self.entry_passwd.pack(after=self.label_passwd)
"""創(chuàng )建Text富文本框,用于按鈕操作結果的展示"""
self.text1 = tk.Text(self.window, font=('Arial', 12), width=85, height=22)
self.text1.pack()
"""定義按鈕1,綁定觸發(fā)事件方法"""
self.button_1 = tk.Button(self.window, text='爬取', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_1)
self.button_1.pack(before=self.text1)
"""定義按鈕2,綁定觸發(fā)事件方法"""
self.button_2 = tk.Button(self.window, text='清除', font=('Arial', 12), width=10, height=1,
command=self.parse_hit_click_2)
self.button_2.pack(anchor="e")
def parse_hit_click_1(self):
"""定義觸發(fā)事件1,調用main函數"""
user_name = self.entry_user.get()
pass_wd = int(self.entry_passwd.get())
self.main(user_name, pass_wd)
def main(self, user_name, pass_wd):
# 網(wǎng)頁(yè)登錄
driver_path = r'D:\python\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driver_path)
driver.get('https://mp.weixin.qq.com/')
time.sleep(2)
# 網(wǎng)頁(yè)最大化
driver.maximize_window()
# 拿微信掃描登錄
time.sleep(20)
# 獲得登錄的cookies
cookies_list = driver.get_cookies()
# 轉化成能用的cookie格式
cookie = [item["name"] + "=" + item["value"] for item in cookies_list]
cookie_str = '; '.join(item for item in cookie)
# 請求頭
headers_1 = {
'cookie': cookie_str,
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36'
}
# 起始地址
start_url = 'https://mp.weixin.qq.com/'
response = session.get(start_url, headers=headers_1).content.decode()
# 拿到token值,token值是有時(shí)效性的
token = re.findall(r'token=(\d+)', response)[0]
# 搜索出所有跟輸入的公眾號有關(guān)的
next_url = f'https://mp.weixin.qq.com/cgi-bin/searchbiz?action=search_biz&begin=0&count=5&query={user_name}&token=' \
f'{token}&lang=zh_CN&f=json&ajax=1'
# 獲取響應
response_1 = session.get(next_url, headers=headers_1).content.decode()
# 拿到fakeid的值,確定公眾號,唯一的
fakeid = re.findall(r'"fakeid":"(.*?)",', response_1)[0]
# 構造公眾號的url地址
next_url_2 = 'https://mp.weixin.qq.com/cgi-bin/appmsg?'
data = {
'action': 'list_ex',
'begin': '0',
'count': '5',
'fakeid': fakeid,
'type': '9',
'query': '',
'token': token,
'lang': 'zh_CN',
'f': 'json',
'ajax': '1'
}
headers_2 = {
'cookie': cookie_str,
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/91.0.4472.77 Safari/537.36',
'referer': f'https://mp.weixin.qq.com/cgi-bin/appmsgtemplate?action=edit&lang=zh_CN&token={token}',
'sec-ch-ua': '" Not;A Brand";v="99", "Google Chrome";v="91", "Chromium";v="91"',
'sec-ch-ua-mobile': '?0',
'sec-fetch-dest': 'empty',
'sec-fetch-mode': 'cors',
'sec-fetch-site': 'same-origin',
'x-requested-with': 'XMLHttpRequest'
}
# 表的創(chuàng )建
workbook = xlwt.Workbook(encoding='gbk', style_compression=0)
sheet = workbook.add_sheet('test', cell_overwrite_ok=True)
j = 1
# 構造表頭
sheet.write(0, 0, '時(shí)間')
sheet.write(0, 1, '標題')
sheet.write(0, 2, '地址')
# 循環(huán)翻頁(yè)
for i in range(pass_wd):
data["begin"] = i * 5
time.sleep(3)
# 獲取響應的json數據
response_2 = session.get(next_url_2, params=data, headers=headers_2).json()
# jsonpath 獲取時(shí)間,標題,地址
title_list = jsonpath.jsonpath(response_2, '$..title')
url_list = jsonpath.jsonpath(response_2, '$..link')
create_time_list = jsonpath.jsonpath(response_2, '$..create_time')
# 將時(shí)間戳轉化為北京時(shí)間
list_1 = []
for create_time in create_time_list:
time_local = time.localtime(int(create_time))
time_1 = time.strftime("%Y-%m-%d", time_local)
time_2 = time.strftime("%H:%M:%S", time_local)
time_3 = time_1 + ' ' + time_2
list_1.append(time_3)
# for循環(huán)遍歷
for times, title, url in zip(list_1, title_list, url_list):
# 其中的'0-行, 0-列'指定表中的單元
sheet.write(j, 0, times)
sheet.write(j, 1, title)
sheet.write(j, 2, url)
j = j + 1
# 窗口顯示進(jìn)程
self.text1.insert("insert", f'*****************第{i+1}頁(yè)爬取成功*****************')
time.sleep(2)
self.text1.insert("insert", '\n ')
self.text1.insert("insert", '\n ')
# 最后保存成功
workbook.save(f'{user_name}公眾號信息.xls')
print(f"*********{user_name}公眾號信息保存成功*********")
def parse_hit_click_2(self):
"""定義觸發(fā)事件2,刪除文本框中內容"""
self.entry_user.delete(0, "end")
self.entry_passwd.delete(0, "end")
self.text1.delete("1.0", "end")
def center(self):
"""創(chuàng )建窗口居中函數方法"""
ws = self.window.winfo_screenwidth()
hs = self.window.winfo_screenheight()
x = int((ws / 2) - (800 / 2))
y = int((hs / 2) - (600 / 2))
self.window.geometry('{}x{}+{}+{}'.format(800, 600, x, y))
def run_loop(self):
"""禁止修改窗體大小規格"""
self.window.resizable(False, False)
"""窗口居中"""
self.center()
"""窗口維持--持久化"""
self.window.mainloop()
if __name__ == '__main__':
g = GZHSpider()
g.run_loop()

利用搜狗微信搜索抓取指定公眾號的最新一條推送

采集交流 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 111 次瀏覽 ? 2021-07-17 23:10 ? 來(lái)自相關(guān)話(huà)題

  利用搜狗微信搜索抓取指定公眾號的最新一條推送
  問(wèn)題描述
  使用搜狗微信搜索抓取指定公眾號的最新推送,并將相應網(wǎng)頁(yè)保存到本地。
  注意搜狗微信獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(由JavaScript渲染),使用requests.get()獲取的內容不收錄推送消息。這里使用selenium+PhantomJS來(lái)處理代碼
  #! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
  參考輸出
  
  
  解析鏈接獲取 首先進(jìn)入搜狗的微信搜索頁(yè)面,在地址欄中提取需要的鏈接部分,將字符串與公眾號名連接,然后生成請求鏈接。對于靜態(tài)網(wǎng)頁(yè),使用requests獲取html文件,然后使用BeautifulSoup選擇所需內容為動(dòng)態(tài)網(wǎng)頁(yè)。使用selenium+PhantomJS獲取html文件,然后使用BeautifulSoup選擇需要的內容遇到驗證碼(CAPTCHA),并輸出提示。該版本的代碼實(shí)際上并沒(méi)有處理驗證碼,需要在運行程序之前手動(dòng)訪(fǎng)問(wèn),以避免驗證碼。文件寫(xiě)入使用os.path.join()構造存儲路徑,提高通用性。例如,Windows 路徑分隔符使用反斜杠 (\),而 OS X 和 Linux 使用正斜杠 (/)。此功能可根據平臺自動(dòng)轉換。 open() 使用 b(二進(jìn)制模式)參數提高通用性(適用于 Windows),使用 datetime.now() 獲取當前時(shí)間進(jìn)行命名,并通過(guò) strftime() 格式化時(shí)間(函數名中的 f 代表格式),具體參考下表(摘自Automate the Boring Stuff with Python)
  
  參考鏈接:文件夾創(chuàng )建:異常處理的使用:enumerate的使用:open()使用b參數原因: 查看全部

  利用搜狗微信搜索抓取指定公眾號的最新一條推送
  問(wèn)題描述
  使用搜狗微信搜索抓取指定公眾號的最新推送,并將相應網(wǎng)頁(yè)保存到本地。
  注意搜狗微信獲取的地址為臨時(shí)鏈接,具有時(shí)效性。公眾號為動(dòng)態(tài)網(wǎng)頁(yè)(由JavaScript渲染),使用requests.get()獲取的內容不收錄推送消息。這里使用selenium+PhantomJS來(lái)處理代碼
  #! /usr/bin/env python3
from selenium import webdriver
from datetime import datetime
import bs4, requests
import os, time, sys
# 獲取公眾號鏈接
def getAccountURL(searchURL):
res = requests.get(searchURL)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, "lxml")
# 選擇第一個(gè)鏈接
account = soup.select('a[uigs="account_name_0"]')
return account[0]['href']
# 獲取首篇文章的鏈接,如果有驗證碼返回None
def getArticleURL(accountURL):
browser = webdriver.PhantomJS("/Users/chasechoi/Downloads/phantomjs-2.1.1-macosx/bin/phantomjs")
# 進(jìn)入公眾號
browser.get(accountURL)
# 獲取網(wǎng)頁(yè)信息
html = browser.page_source
accountSoup = bs4.BeautifulSoup(html, "lxml")
time.sleep(1)
contents = accountSoup.find_all(hrefs=True)
try:
partitialLink = contents[1]['hrefs']
firstLink = base + partitialLink
except IndexError:
firstLink = None
print('CAPTCHA!')
return firstLink
# 創(chuàng )建文件夾存儲html網(wǎng)頁(yè),以時(shí)間命名
def folderCreation():
path = os.path.join(os.getcwd(), datetime.now().strftime('%Y-%m-%d_%H-%M-%S'))
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
raise
print("folder not exist!")
return path
# 將html頁(yè)面寫(xiě)入本地
def writeToFile(path, account, title):
pathToWrite = os.path.join(path, '{}_{}.html'.format(account, title))
myfile = open(pathToWrite, 'wb')
myfile.write(res.content)
myfile.close()
base ='https://mp.weixin.qq.com'
accountList = ['央視新聞', '新浪新聞','鳳凰新聞','羊城晚報']
query = 'http://weixin.sogou.com/weixin?type=1&s_from=input&query='
path = folderCreation()
for index, account in enumerate(accountList):
searchURL = query + account
accountURL = getAccountURL(searchURL)
time.sleep(10)
articleURL = getArticleURL(accountURL)
if articleURL != None:
print("#{}({}/{}): {}".format(account, index+1, len(accountList), accountURL))
# 讀取第一篇文章內容
res = requests.get(articleURL)
res.raise_for_status()
detailPage = bs4.BeautifulSoup(res.text, "lxml")
title = detailPage.title.text
print("標題: {}\n鏈接: {}\n".format(title, articleURL))
writeToFile(path, account, title)
else:
print('{} files successfully written to {}'.format(index, path))
sys.exit()
print('{} files successfully written to {}'.format(len(accountList), path))
  參考輸出
  
  
  解析鏈接獲取 首先進(jìn)入搜狗的微信搜索頁(yè)面,在地址欄中提取需要的鏈接部分,將字符串與公眾號名連接,然后生成請求鏈接。對于靜態(tài)網(wǎng)頁(yè),使用requests獲取html文件,然后使用BeautifulSoup選擇所需內容為動(dòng)態(tài)網(wǎng)頁(yè)。使用selenium+PhantomJS獲取html文件,然后使用BeautifulSoup選擇需要的內容遇到驗證碼(CAPTCHA),并輸出提示。該版本的代碼實(shí)際上并沒(méi)有處理驗證碼,需要在運行程序之前手動(dòng)訪(fǎng)問(wèn),以避免驗證碼。文件寫(xiě)入使用os.path.join()構造存儲路徑,提高通用性。例如,Windows 路徑分隔符使用反斜杠 (\),而 OS X 和 Linux 使用正斜杠 (/)。此功能可根據平臺自動(dòng)轉換。 open() 使用 b(二進(jìn)制模式)參數提高通用性(適用于 Windows),使用 datetime.now() 獲取當前時(shí)間進(jìn)行命名,并通過(guò) strftime() 格式化時(shí)間(函數名中的 f 代表格式),具體參考下表(摘自Automate the Boring Stuff with Python)
  
  參考鏈接:文件夾創(chuàng )建:異常處理的使用:enumerate的使用:open()使用b參數原因:

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久