0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

200行代碼教你自制微信機(jī)器人

電子工程師 ? 來(lái)源:未知 ? 作者:胡薇 ? 2018-11-06 08:36 ? 次閱讀

1

當(dāng)初決定自己寫(xiě)這么個(gè)機(jī)器人有幾個(gè)原因:

1) 用一個(gè)windows客戶(hù)端工具運(yùn)營(yíng)公眾號(hào),真的很局限。雖然工具的功能很強(qiáng)大,能自動(dòng)添加好友,自動(dòng)拉好友入群,關(guān)鍵字回復(fù)等等,但是有一個(gè)繞不開(kāi)的點(diǎn),它是一款客戶(hù)端工具,一款exe軟件。

2) 我是Mac,為了用這個(gè)工具,就要開(kāi)著虛擬機(jī)去操作。

3) 為了能一直自動(dòng)添加好友,邀請(qǐng)入群,自動(dòng)回復(fù)等一系列操作,電腦就不能合上。

4) 在外面突然想到一個(gè)點(diǎn),想操作群發(fā)了,GG,無(wú)能為力。

5) 其他……

2

基于以上的原因,就想著自己來(lái)一套算了。畢竟可以定制化的話,之后想要什么就很方便了,而且在服務(wù)器端掛個(gè)python服務(wù)要比開(kāi)個(gè)windows 就為了掛一個(gè)exe要很多。

那么首先需要確定需求,wxRobot我是準(zhǔn)備長(zhǎng)期維護(hù)、迭代的,所以顯然不可能像網(wǎng)上那些個(gè)腳本一樣,一個(gè)文件打通關(guān)。

另外功能自定義,就需要有版本引入,先做什么,痛點(diǎn)是什么都需要明確。我說(shuō)下自己的選擇:

1) 痛點(diǎn)是不能自主化的管理公眾號(hào)、微信號(hào)。

2) 最急迫解決的是之前exe工具用到的功能,畢竟這也是我用這個(gè)工具的原因。那么有哪些功能呢?

群發(fā)消息

自動(dòng)添加好友

邀請(qǐng)好友入群

關(guān)鍵字回復(fù)

3

既然是個(gè)項(xiàng)目,那么該有的組件一個(gè)不能少,看一下我的目錄結(jié)構(gòu),這也是我自己總結(jié)出的common structure,大家可以參考一下,如果有好的建議歡迎大佬不吝留言。

app:項(xiàng)目業(yè)務(wù)模塊。如果有多個(gè)模塊就添加子目錄,例如:一個(gè)網(wǎng)站下的博客模塊、投票模塊等。

core:核心組件。例如:數(shù)據(jù)庫(kù)組件、類(lèi)-文件組件等。

doc:文檔。存放所有的文檔,一般我會(huì)有固定的幾個(gè):CHANGELOG.md、BUGLIST.md、TODOLIST.md。

etc:配置文件??梢约?xì)分基本配置、業(yè)務(wù)配置等。

static:靜態(tài)文件。

test:?jiǎn)卧獪y(cè)試。

tmp:不需要進(jìn)入版本控制的東西。

utility:輔助組件。和core相輔。

4

我把業(yè)務(wù)分為兩塊,filehelper算一個(gè),好友相關(guān)的算一個(gè)。

好友相關(guān)的好理解,諸如添加好友、自動(dòng)回復(fù)、邀請(qǐng)入群等。filehelper是什么呢?說(shuō)白了,我們除了簡(jiǎn)單的自動(dòng)回復(fù)、添加外,一定還希望做的更多吧?比如交互式指令。那這個(gè)filehelper就承擔(dān)了指令收發(fā)的角色。

所有的業(yè)務(wù)模塊都基于一個(gè)BaseHandle,這樣底層的一些單元我就可以統(tǒng)一管控了:

色。

classBaseHandle: def__init__(self): ''' self._meta = { 'obj':{ # 消息發(fā)送對(duì)象 'ul': [], # unlimit group 'l': [], # limit group 'r': [] # restrict }, 'reply':{ 'text': '', 'article': '', } } ''' self._usage ='' self._meta = {} self.current_cmd =None @property defusage(self): returnself._usage @property defmeta(self): returnself._meta

再來(lái)看看FileHandle這個(gè)類(lèi),這也是當(dāng)前版本最豐富的模塊。這里面有兩端邏輯:1.自動(dòng)更新群組信息。 2.注冊(cè)群發(fā)相關(guān)命令。

自動(dòng)更新群組信息的目的是因?yàn)閕tchat模塊會(huì)將所有聯(lián)系人以及群組信息存儲(chǔ)在本地的一個(gè)pkl文件中(pickle縮寫(xiě)?),如果想提升群發(fā)消息前獲取群組列表的速度,那么就應(yīng)該把數(shù)據(jù)放在內(nèi)存里(反正也沒(méi)多少數(shù)據(jù)),以下我把主要邏輯都羅列出來(lái)了,具體的代碼太長(zhǎng)了,暫時(shí)就不放出來(lái)了:

classFileHelper(BaseHandle): _usage =''' ''' def__init__(self): super().__init__() self._meta = { ... } self._th_update = threading.Thread(target=self._update_meta, args=(), daemon=True) self.auto_update_groups() defauto_update_groups(self): # 自動(dòng)更新群組 self._th_update.start() def_update_meta(self): ''' 初始化限時(shí)推送的群組 ''' def_filter_restrict_groups(group): # 篩選出不能群發(fā)的群組 def_filter_limit_groups(group): # 篩選出有時(shí)間限制的群組 def_filter_unlimit_group(groups, limit_groups): # 篩選出不受限制的群組 whileTrue: time.sleep(30) # 更新群組信息

注冊(cè)群發(fā)相關(guān)命令的思路就是做一個(gè)命令注冊(cè)器,因?yàn)槿喊l(fā)消息、文章、圖片等行為類(lèi)似,針對(duì)不同的用戶(hù)群組發(fā)送不同的消息體。

所以我就把注冊(cè)器的成員分成了:類(lèi)型(文字、圖片),對(duì)象(時(shí)間限制群組、無(wú)限制群組),行為(群發(fā)、單發(fā))。

被裝飾器注冊(cè)的函數(shù)就成為了某個(gè)具有單獨(dú)意義的指令了。

classFileHelper(BaseHandle): ... defupdate_cmd(self, cmd): # 更新命令,用于動(dòng)態(tài)注冊(cè)函數(shù) def_register_mass(func): @functools.wraps(func) defdecorator(self, msg, *args, **kwargs): _action, _reply, _obj = func.__name__.split('_') ifself._meta['action'][_action]: _to_user = self._meta['obj'][_obj] for_groupin_to_user: instance.send_msg(msg, _group['UserName']) time.sleep(random.randrange(0,20)) self._meta['action'][_action] =False self._current_cmd =None instance.send_msg('群發(fā)消息發(fā)送完畢', self._meta['extra']['UserName']) returndecorator @_register_mass defmass_text_ul(self, msg=None): pass @_register_mass defmass_text_l(self, msg): pass @_register_mass defmass_text_test(self, msg): pass @_register_mass defmass_article_ul(self, msg): pass @_register_mass defmass_article_l(self, msg): pass

對(duì)比著效果圖來(lái)看看:

5

接下來(lái)就是添加好友部分了,目前只支持自動(dòng)接受好友,根據(jù)打招呼自動(dòng)設(shè)置備注,關(guān)鍵字回復(fù)。

classFriend(BaseHandle): _usage =''' ''' def__init__(self): super().__init__() self._meta = { ... } defis_biz(self, msg): # 判斷是不是商務(wù)合作

看下效果圖:

6

講完核心代碼后,再來(lái)講下中間經(jīng)歷的幾個(gè)看不到的版本吧。

最一開(kāi)始就是實(shí)現(xiàn)功能咯,沒(méi)想很多,但是發(fā)現(xiàn)代碼重復(fù)太多了,邏輯都差不多,一堆代碼太丑了。優(yōu)化后的代碼就是第一版中的群發(fā)注冊(cè)器函數(shù)。

接著原本的BaseHandle基類(lèi)太重了,想的很好,把itchat方法都重寫(xiě)在基類(lèi)里,這樣就不用在其他地方調(diào)用itchat實(shí)例了,但是結(jié)果就是所有的子類(lèi)都可以做同樣的動(dòng)作,就變成了filehelper.send_msg(), friend.send_image()了,這樣對(duì)于同一個(gè)方法就會(huì)產(chǎn)生歧義了。因此就把基類(lèi)里所有重寫(xiě)itchat方法的函數(shù)都去了,就保留了業(yè)務(wù)代碼,并分別移到對(duì)應(yīng)的類(lèi)里去,而原本itchat的方法還是用itchat實(shí)例去操作。

接著關(guān)于itchat實(shí)例、FileHelper實(shí)例、Friend實(shí)例等的共享問(wèn)題,容易造成重疊,重復(fù)使用、互相引用問(wèn)題。解決辦法目前就是把itchat實(shí)例單獨(dú)在配置文件里初始化了,這也同時(shí)解決了上一個(gè)問(wèn)題,其他業(yè)務(wù)類(lèi)的實(shí)例采用單例模式,在類(lèi)外面暴露一個(gè)統(tǒng)一的實(shí)例。

7

好了,這回是真花了功夫把這套代碼講完了,雖然還是相對(duì)簡(jiǎn)陋了,但迫于時(shí)間關(guān)系,先發(fā)出來(lái)了。之后會(huì)繼續(xù)優(yōu)化、健碩它。

今天也和一位大佬討論了下這個(gè)項(xiàng)目,有很多值得思考的地方。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 機(jī)器人
    +關(guān)注

    關(guān)注

    210

    文章

    28012

    瀏覽量

    205613
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4700

    瀏覽量

    68113

原文標(biāo)題:200行代碼,一行行教你自制微信機(jī)器人

文章出處:【微信號(hào):rgznai100,微信公眾號(hào):rgznai100】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    手把手教你制作機(jī)器人

    手把手教你制作機(jī)器人
    發(fā)表于 08-12 09:52

    C51步行機(jī)器人

    C51步行機(jī)器人 內(nèi)含教程和相關(guān)程序和器件清單
    發(fā)表于 07-05 18:12

    ARDUINO基礎(chǔ)入門(mén),帶你進(jìn)入自制智能機(jī)器人的時(shí)代

    本帖最后由 shmily53 于 2013-9-14 17:46 編輯 ARDUINO基礎(chǔ)入門(mén),帶你進(jìn)入自制智能機(jī)器人的時(shí)代上傳部分資料:其余的資料到網(wǎng)盤(pán)下載吧網(wǎng)盤(pán)地址:[hide]http://shmily53.400gb.com/[/hide]覺(jué)得好加下群:?jiǎn)纹?/div>
    發(fā)表于 09-14 12:18

    有沒(méi)有diy機(jī)器人的大神~小生想定制一個(gè)機(jī)器人~有償求幫助~?。?/a>

    想送給弟弟一個(gè)生日禮物,但是自己研究了很久還是個(gè)菜鳥(niǎo),達(dá)不到心里的設(shè)想,所以想求助自制機(jī)器人的大神幫忙~絕對(duì)有報(bào)酬~有意者請(qǐng)聯(lián)系我~機(jī)器人要求:400mm——200mm高度;人形
    發(fā)表于 09-06 12:49

    【Nanopi NEO試用體驗(yàn)】【機(jī)器學(xué)習(xí)/計(jì)算機(jī)視覺(jué)/NLP進(jìn)階篇】34代碼搞定機(jī)器人

    的故事。我有一個(gè)tk1,一直以來(lái)都是用nat穿透來(lái)進(jìn)行控制,之前有說(shuō)到,但是公眾號(hào)本身又限制較多,不想去搞,于是突發(fā)奇想,通過(guò)來(lái)交
    發(fā)表于 11-13 12:55

    聊天機(jī)器人+平臺(tái)檢測(cè)環(huán)境,方案分享啦

    聊天機(jī)器人+平臺(tái)檢測(cè)環(huán)境,方案分享回饋論壇的幫助,也順便給自己拉拉票,第一季創(chuàng)客作品征集大賽,求點(diǎn)贊??!這是鏈接,有項(xiàng)目介紹:http://srfitnesspt.com/project
    發(fā)表于 02-22 19:46

    智能掃地機(jī)器人解決方案

    起步較晚,隨著掃地機(jī)器人功能更完善,智能化程度更高,預(yù)計(jì)未來(lái)中國(guó)沿海發(fā)達(dá)地區(qū)掃地機(jī)器人滲透率水平會(huì)達(dá)到美國(guó)掃地機(jī)器人目前的滲透率水平。2.本文編寫(xiě)目的本文主要介紹通過(guò)智能WiFi控制技術(shù)實(shí)現(xiàn)手機(jī)
    發(fā)表于 05-27 13:31

    控制的家庭智能機(jī)器人(附語(yǔ)音聊天、人臉檢測(cè)、自主巡航等)

    ,或者對(duì)機(jī)器人進(jìn)行一個(gè)部署。并且會(huì)報(bào)警處理一些事情,例如降溫功能,人臉檢測(cè)報(bào)警等。當(dāng)用戶(hù)在家時(shí),機(jī)器人可以為用戶(hù)播放音樂(lè)、電影、語(yǔ)音識(shí)別聊天等,而且還會(huì)抓取網(wǎng)絡(luò)新聞、發(fā)送
    發(fā)表于 09-30 14:33

    工業(yè)機(jī)器人仿真與編程

    目錄概述行走軸模型拆分行走軸模型導(dǎo)入仿真軟件創(chuàng)建行走軸機(jī)械裝置外部軸配置向?qū)Р寮惭b虛擬機(jī)器人系統(tǒng)創(chuàng)建行走軸系統(tǒng)配置機(jī)器人安裝到行走軸行走軸運(yùn)動(dòng)控制文已經(jīng)首發(fā)在個(gè)人公眾號(hào):工業(yè)
    發(fā)表于 09-07 08:57

    教你在Mathematica軟件中搭建機(jī)器人的仿真環(huán)境

    完美的教程,沒(méi)有之一,收藏學(xué)習(xí)。目的   本文手把手教你在 Mathematica 軟件中搭建機(jī)器人的仿真環(huán)境,...
    發(fā)表于 09-07 09:14

    智能機(jī)器人

    關(guān)于ros智能機(jī)器人,就是一個(gè)寫(xiě)智能機(jī)器人代碼的一個(gè)虛擬機(jī),
    發(fā)表于 10-13 19:20

    DIY機(jī)器人系列:工程師自制藍(lán)光呼吸WIFI機(jī)器人

    DIY機(jī)器人系列:工程師自制藍(lán)光呼吸WIFI機(jī)器人,“Shy ”是一個(gè)采用LINUX開(kāi)源系統(tǒng)-Openwrt制作的WIFI機(jī)器人
    發(fā)表于 08-27 09:32 ?3.3w次閱讀
    DIY<b class='flag-5'>機(jī)器人</b>系列:工程師<b class='flag-5'>自制</b>藍(lán)光呼吸WIFI<b class='flag-5'>機(jī)器人</b>

    自制不倒機(jī)器人

    源碼,原理圖自制不倒機(jī)器人,兩輪的平衡小車(chē)再次升級(jí),給你全新的感覺(jué)自制不倒機(jī)器人,兩輪的平衡小車(chē)再次升級(jí),給你全新的感覺(jué)
    發(fā)表于 04-14 18:07 ?14次下載

    DIY:簡(jiǎn)簡(jiǎn)單單自制平衡機(jī)器人

    DIY:簡(jiǎn)簡(jiǎn)單單自制平衡機(jī)器人
    發(fā)表于 01-18 20:40 ?25次下載

    手把手教你用Python創(chuàng)建機(jī)器人

    python關(guān)于開(kāi)發(fā)的庫(kù)主要有itchat和wxpy,而wxpy底層是調(diào)用的itchat,所以如果你只是要使用的話建議使用wxpy庫(kù),它比其他的庫(kù)都要優(yōu)雅,更面向?qū)ο?,而且深度整合了圖靈機(jī)器人和小i
    的頭像 發(fā)表于 04-28 11:16 ?3526次閱讀
    手把手<b class='flag-5'>教你</b>用Python創(chuàng)建<b class='flag-5'>微</b><b class='flag-5'>信</b><b class='flag-5'>機(jī)器人</b>