久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

200 行代碼,一行行教你自制微信機器人

 zhuxrgf 2018-11-16

1.寫機器人的原因

筆者當初決定自己寫這么個機器人,,有幾個原因:

1) 用一個Windows客戶端工具運營公眾號,真的很局限,。雖然工具的功能很強大,,能自動添加好友,自動拉好友入群,關鍵字回復等等,,但是有一個繞不開的點,,它是一款客戶端工具,一款EXE軟件,。

2) 我是Mac,,為了用這個工具,,就要開著虛擬機去操作,。

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

4) 在外面突然想到一個點,,想操作群發(fā)了,,GG,無能為力,。

5) 其他……

200 行代碼,,一行行教你自制微信機器人

2.確定需求

基于以上的原因,就想著自己來一套算了,。畢竟可以定制化的話,,之后想要什么就很方便了,而且在服務器端掛個Python服務要比開個Windows就為了掛一個EXE要很多,。

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

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

1) 痛點是不能自主化的管理公眾號,、微信號。

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

  1. 群發(fā)消息
  2. 自動添加好友
  3. 邀請好友入群
  4. 關鍵字回復

3.組件構成

既然是個項目,,那么該有的組件一個不能少,,看一下我的目錄結構,這也是我自己總結出的Common structure,大家可以參考一下,。

200 行代碼,,一行行教你自制微信機器人

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

Core:核心組件,。例如:數(shù)據(jù)庫組件,、類-文件組件等。

Doc:文檔,。存放所有的文檔,,一般我會有固定的幾個:CHANGELOG.md、BUGLIST.md,、TODOLIST.md,。

ETC:配置文件??梢约毞只九渲?、業(yè)務配置等。

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

test:單元測試,。

TMP:不需要進入版本控制的東西。

Utility:輔助組件,。和core相輔,。

4.業(yè)務分塊

我把業(yè)務分為兩塊,filehelper算一個,,好友相關的算一個,。

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

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

class BaseHandle:
def __init__(self):
'''
self._meta = {
'obj':{ # 消息發(fā)送對象
'ul': [], # unlimit group
'l': [], # limit group
'r': [] # restrict
},
'reply':{
'text': '',
'article': '',
}
}
'''
self._usage = ''
self._meta = {}
self.current_cmd = None
@property
def usage(self):
return self._usage
@property
def meta(self):
return self._meta

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

自動更新群組信息的目的是因為itchat模塊會將所有聯(lián)系人以及群組信息存儲在本地的一個PKI文件中(一個用公鑰概念和技術實施和提供安全服務的具有普適性的安全基礎設施)。

如果想提升群發(fā)消息前獲取群組列表的速度,,那么就應該把數(shù)據(jù)放在內存里(反正也沒多少數(shù)據(jù)),,以下我把主要邏輯都羅列出來了,具體的代碼太長了,,暫時就不放出來了:

class FileHelper(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()
def auto_update_groups(self):
# 自動更新群組
self._th_update.start()
def _update_meta(self):
'''
初始化限時推送的群組
'''
def _filter_restrict_groups(group):
# 篩選出不能群發(fā)的群組
def _filter_limit_groups(group):
# 篩選出有時間限制的群組
def _filter_unlimit_group(groups, limit_groups):
# 篩選出不受限制的群組
while True:
time.sleep(30)
# 更新群組信息

注冊群發(fā)相關命令的思路就是做一個命令注冊器,,因為群發(fā)消息、文章,、圖片等行為類似,,針對不同的用戶群組發(fā)送不同的消息體,。

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

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

class FileHelper(BaseHandle):
...
def update_cmd(self, cmd):
# 更新命令,用于動態(tài)注冊函數(shù)
def _register_mass(func):
@functools.wraps(func)
def decorator(self, msg, *args, **kwargs):
_action, _reply, _obj = func.__name__.split('_')
if self._meta['action'][_action]:
_to_user = self._meta['obj'][_obj]
for _group in _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'])
return decorator
@_register_mass
def mass_text_ul(self, msg=None):
pass
@_register_mass
def mass_text_l(self, msg):
pass
@_register_mass
def mass_text_test(self, msg):
pass
@_register_mass
def mass_article_ul(self, msg):
pass
@_register_mass
def mass_article_l(self, msg):
pass

對比著效果圖來看看:

200 行代碼,,一行行教你自制微信機器人

5.添加好友

接下來就是添加好友部分了,,目前只支持自動接受好友,根據(jù)打招呼自動設置備注,,關鍵字回復,。

class Friend(BaseHandle):
_usage = '''
'''
def __init__(self):
super().__init__()
self._meta = {
...
}
def is_biz(self, msg):
# 判斷是不是商務合作

看下效果圖:

200 行代碼,一行行教你自制微信機器人

200 行代碼,,一行行教你自制微信機器人

6.不同版本

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

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

接著原本的BaseHandle基類太重了,,想的很好,,把itchat方法都重寫在基類里,,這樣就不用在其他地方調用itchat實例了,但是結果就是所有的子類都可以做同樣的動作,,就變成了filehelper.send_msg(), friend.send_image()了,,這樣對于同一個方法就會產(chǎn)生歧義了。

因此就把基類里所有重寫itchat方法的函數(shù)都去了,,就保留了業(yè)務代碼,,并分別移到對應的類里去,而原本itchat的方法還是用itchat實例去操作,。

接著關于itchat實例,、FileHelper實例、Friend實例等的共享問題,,容易造成重疊,,重復使用、互相引用問題,。

解決辦法目前就是把itchat實例單獨在配置文件里初始化了,,這也同時解決了上一個問題,其他業(yè)務類的實例采用單例模式,,在類外面暴露一個統(tǒng)一的實例,。

作者簡介:上海小胖,四大咨詢的Tech Lead,,MongoDB Professional獲得者,。「Python專欄」專注Python領域的各種技術:爬蟲,、DevOps,、人工智能、Web開發(fā)等,。還有「大航海計劃」,,各種內推活動。

  •    

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約